做门户网站的公司,网站一般做多大像素,嵌入式开发要学哪些,android应用开发教程ComingChat是在Sui网络上构建的去中心化社交平台#xff0c;功能众多#xff0c;其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议#xff0c;这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。
ComingChat在Sui上提供了全面的…
ComingChat是在Sui网络上构建的去中心化社交平台功能众多其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。
ComingChat在Sui上提供了全面的生活体验。它将ChatGPT增强的生产力、社交互动与全链钱包相结合为用户提供了广泛的功能和应用。
除了其可信和可验证的特性外ComingChat选择Signal协议作为其加密通信的基础这与Sui网络的账户系统完全兼容。
聊天模式
ComingChat的聊天模块为用户提供了三种不同的模式以满足其不同的隐私和安全需求。这些模式包括
私密聊天此模式在两个用户之间提供一对一的通信。Signal协议对这些对话进行加密保持其机密性。加密群聊此模式允许群体进行通信同时保持较高水平的安全性和隐私性。与私密聊天类似Signal协议对加密群聊中的消息进行加密。非加密群聊在此模式中消息没有加密但该群组支持最多1000人易于设置和管理但对消息内容的保护水平较低。
Signal协议的实施发生在ComingChat的聊天基础设施中该基础设施使用了Decentralized MomentsDmens协议。该协议支持常见的聊天功能如发帖、点赞和回复还集成了红包功能使用户可以向彼此发送tokens或NFTs。
实施加密
ComingChat的加密聊天功能基于Signal协议的双棘轮算法该算法提供端到端加密确保用户之间的通信安全。
构建加密聊天功能需要以下步骤
实现双棘轮算法为消息启用端到端加密确保只有预期的接收者能够解密和阅读这些消息。将加密的消息存储在Sui网络上以确保数据的完整性和安全性。允许用户交换公钥以进行安全通信并使用扩展三次椭圆曲线Diffie-HellmanX3DH密钥协议建立安全会话。 ComingChat的加密聊天架构允许用户选择私密聊天发送方将发送给对方的消息进行加密接收方接收后解密这些消息以便可以阅读它们。
双棘轮算法
双棘轮算法被两个参与方用于基于共享密钥交换加密消息。通常这些参与方会使用诸如X3DH之类的密钥协议来协商共享密钥。在达成协议后这些参与方将使用双棘轮来发送和接收加密消息。
参与方为每个双棘轮消息派生新的密钥以便无法从后来的密钥中计算出之前的密钥。参与方还会将Diffie-Hellman公共值附加到其消息中。Diffie-Hellman计算的结果被混入派生密钥中以便无法从之前的密钥中计算出后来的密钥。这些特性在某种程度上保护了在某方密钥遭受威胁的情况下之前或之后的加密消息。
增强隐私的红包功能
“红包”这一安全在线交易术语源来自于中国节假日和特殊场合向他人赠送现金的实际做法通常使用红色信封。ComingChat使用这个术语来表示加密聊天功能中的安全消息数据包。
Sui Move语言允许ComingChat在开发红包合约时与Core Move存在一些独特的差异。特别是Sui Move需要对交易状态同步返回进行编程调整这有助于对聊天消息进行排序以及对入口函数参数进行处理这需要一个对象ID。
Sui红包不具有增量的红包ID但它们具有红包对象ID因为Sui的数据模型要求所有对象都有一个ID。
在发出打开/关闭交易后Sui红包无需异步获取状态红包状态可以根据交易返回数据中的事件进行更新。
服务器端节点需要异步获取用户创建的红包的创建状态因为该用户的节点可能与服务器端节点不同。
下面的核心合约代码展示了ComingChat如何考虑Sui Move的独特功能和要求。Config对象包含了发送者、接收者和管理员的地址同时定义了交易费用。RedPacketInfo对象包括coin额度、发送的token以及接收者的地址。RedPacketEvent对象用于跟踪token额度。
// Copyright 2022-2023 ComingChat Authors. Licensed under Apache-2.0 License.
module rp::red_packet {…struct Config has key {id: UID, admin: address, beneficiary: address, owner: address, count: u64, fees: Bag
}struct RedPacketInfophantom CoinType has key,store {id: UID, remain_coin: BalanceCoinType, remain count: u64, beneficiary: address
}// Event emitted when created/opened/closed a red packet.
struct RedPacketEvent has copy, drop {id: ID, event_type: u8, remain_count: u64, remain balance: u64// One-Time-Witness for the module.
struct RED_PACKET has drop {}fun init (otw: RED_PACKET, ct: mut TxContext
) {…
}public entry fun createCoinType (config: mut Config,coins: vectorCoinCoinType, count: u64, total_balance: u64, ctx: mut TxContext
) {// 1. check args…}public entry fun openCoinType (info: mut RedPacketInfoCoinType, lucky_accounts: vectoraddress, balances: vectoru64, ct: mut TXContext
) {
…
}public entry fun closeCoinType (info: RedPacketInfo CoinType, ctx: mut TxContext
) {
…
}public entry fun withdrawCoinType (config: Smut Config, ctx: mut TxContext
) {
…
}
在提交Sui红包的打开/关闭交易时交易结果将直接在响应中获得并更新数据库和缓存状态无需从浏览器中异步获取交易状态。
在用户创建红包后系统会异步查询创建交易的状态并基于事件获取红包数据包括金额、数量和红包ID。 在ComingChat app中将“创建红包”事件发送给Sui网络作为智能合约并根据接收者的操作处理该合约的状态。
红包状态变更
在ComingChat发送Sui交易后它直接获取交易结果无需进行异步任务来更新打开/关闭状态因此
在触发打开条件后管理员调用打开交易并根据打开交易状态直接将记录设置为成功。在触发关闭条件后管理员调用关闭交易并根据关闭交易状态将其直接设置为已关闭或关闭失败。
如果打开/关闭交易失败需要记录该失败以防止交易重试这会产生额外的gas费。 ComingChat会监控交易状态要么关闭成功的交易要么确认失败的状态并停止自动重试以避免不必要的gas费。
Dmens协议
ComingChat在Sui上构建了Dmens协议作为SDK提供用户身份识别、内容共享和价值共享等功能。该协议使用Sui来管理用户数据和内容并使用SUI支付gas费。用户可以创建个人资料、发布内容、关注其他用户并与他们互动。该协议还允许用户将其创建的内容转化为独特的NFT并针对不同的情境发行不同类型的NFT。
这些情境包括
KOL向粉丝发行有价值的NFT以增加粉丝的参与、忠诚度和收入。项目发行权益证明NFT用于运营活动以增加用户参与度、忠诚度并促进生态系统的发展。内容创作者通过付费NFT模型将其内容变现实现更好的内容变现和更多的收入。艺术家将他们的数字艺术品转化为NFT并将其出售给收藏家或投资者。
Dmens架构
在ComingChat中设计了Dmens以支持公共和私密聊天功能。总体而言当用户创建一条消息可以是新消息或回复消息时它会在Sui上启动ComingChat的聊天功能。ComingChat使用GraphQL来查询链下存储的用户资料并使用Dmens索引器模块确保消息被正确排序。 Dmens架构使用了Sui、GraphQL和Dmens索引器来处理用户操作例如创建个人资料或发布新消息。在这里GraphQL充当了存储资料的数据库查询工具。
在下面的智能合约代码中定义了Chat对象该对象允许用户发布消息、转发其他消息、点赞消息以及其他典型的聊天功能。
//chat.move
module chat::chat {/// Sui Chat NFT (i.e., a post, retweet, like, chat message etc).struct Chat has key, store {id: UID,// The ID of the chat app.app_id: address,// Posts text.text: String,// Set if referencing an another object (i.e., due to a Like, Retweet, Reply etc).// We allow referencing any object type, not only Chat NFTs.ref id: Optionaddress,// app-specific metadata. We do not enforce a metadata format and delegate this to app layer.metadata: vectoru8,}/// Simple Chat.text getter.public fun text (chat: Chat): String {chat.text}/// Mint (post) a Chat object.fun post internal (app_id: address, text: vectoru8, ref_id: Optionaddress, metadata: vectoru8, ctx: mut TxContext,) {…}/// Mint (post) a Chat object without referencing another object.public entry fun post (app_identifier: address, text: vectoru8, metadata: vectoru8, ctx: mut IxContext,) {post_internal(app_identifier, text, option::none (), metadata, ctx);}/// Mint (post) a Chat object and reference another object (i.e., to simulate retweet, reply, like, attach)./// TODO: Using address as app_identifier ref_identifier type, because we cannot pass ID to entry functions. Using vectoru8 for text instead of String for the same reason.public entry fun post_with_ref app_identifier: address, text: vectoru8, ref_identifier: address, metadata: vectoru8, ctx: mut TxContext,) {post_internal(app_identifier, text, some (ref_identifier), metadata, ctx);}/// Burn a Chat object.public entry fun burn (chat: Chat) {let Chat { id, app_id: _, text: _ , ref_id: _, metadata: _ } chat;object::delete (id);}
}
上面代码片段中的Chat结构表示聊天消息。它有包括ref_id在内的ID字段允许聊天消息转发、回复或点赞另一条消息这在代码中表示为一个对象。实际的聊天消息是结构中的文本字符串。
post internal函数创建了一条新的聊天消息因为它是用于在模块内部调用的它被标记为”internal”。由此函数创建的对象具有ID字段和实际消息的文本字符串。ref_id允许它引用另一个对象例如作为对现有聊天的回复或点赞。
类似地还有post public entry函数它调用post internal来创建新的聊天。然而它将ref_id设置为none因为此函数旨在供人们发起新的聊天。
Dmens索引器结构设计
ComingChat的加密聊天模块使用Redis一个开源的流式数据库作为链下存储。它处理消息队列确保聊天消息以有序方式显示。
对于Redis流首先初始化客户端。
func (r *BaseRedisCustomer) InitCustomer ( ) error {...
}
Redis将数据存储在内存中因此需要适当和定期地修剪队列数据。在下面的代码片段中定义了一个修剪队列的函数。
func (r *BaseRedisCustomer) TrimQueueList (ct context.Context) {r.wg.Add (1)defer funct( ) { r.wg.Done ( )} ( )for {select {case -ctx.Done ( ) :return}…
}The listener code filters transactions by contract address. The function in the code below is a good example of how to integrate traditional off-chain storage with a Web3 app.
下面的代码片段中的监听器代码通过合约地址过滤事务。下面的函数是将传统的链下存储与Web3 app集成的很好示例。
func (1 *ListenLastIxByCycle) cycleFetchTransactionNum(ct context. Context, tx chan-TxDigest) {var (cursor *types.TransactionDigest)…
}
下面的代码片段将每个新的事务摘要推送到一个名为transaction-analyze的队列中。rpip.Evalsha (r.Context (), r.script[pushNewT×DigestToStream ],[ ]string{topic, fmt.Sprintf(PrefixChainLastDigest, chain, packageId) },data, preDigest, digest,)
ComingChat使用Lua服务器端脚本将多个Redis命令组合在一起确保事务摘要的连续性。
local lastDigest redis.call( get, KEYS[2])
local result false
if (lastDigest ~ false) and (lastDigest ARG[2])) or ((lastDigest false) and (ARGVI 21 )) thenredis.call(xadd, KEYS[1], *, ARGV[1], ARGV[3]) redis.call (set, KEYS[2], ARGV[3])
end
return true
索引器在接收到用户提交的每条消息时经历以下过程
定时
查询所有消费者的故障消息从queue_message表中查询。根据主题重新消费。如果工作超过重新消费的阈值必须停止并手动访问。
消费者
1. 分析交易
查询受此交易影响的对象但不包括货币对象将受影响的对象推送到队列中
2. 对象更新
获取对象详细信息并在object_list表上创建或更新它过滤个人资料对象过滤调用ChatGPT的推文
3. 分析个人资料
解码个人资料对象
4. GPT回复
获取Dmens推文内容并使用正则表达式匹配GPT机器人地址
结束语
加密聊天在Signal、WhatsApp和微信等应用中已经被证明非常受欢迎。ComingChat中的这一功能与基于Sui社交平台的现有构想非常契合。加密为用户提供了隐私保护确保不良行为者无法窃听他们的对话。加密聊天还与Sui的功能相吻合为用户的在线生活提供了一个独立且安全的平台。
ComingChat的技术实现利用了值得信赖的Signal协议的双棘轮算法展示了现有技术如何应用于Web3平台。本文介绍的Dmens、红包和聊天机器人等高级功能的加入可以在ComingChat提供了丰富的用户体验。 关于 Sui Network
Sui是基于第一原理重新设计和构建而成的L1公有链旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言并具有水平可扩展性让开发者能够快速且低成本支持广泛的应用开发。获取更多信息https://linktr.ee/sui_apac
官网英文Twitter中文TwitterDiscord英文电报群中文电报群