Sui生态项目|集隐私通信、移动钱包、链上朋友圈和红包功能一体的社交应用ComingChat

news2024/11/26 1:50:52

ComingChat是在Sui网络上构建的去中心化社交平台,功能众多,其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议,这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。 

ComingChat在Sui上提供了全面的生活体验。它将ChatGPT增强的生产力、社交互动与全链钱包相结合,为用户提供了广泛的功能和应用。

除了其可信和可验证的特性外,ComingChat选择Signal协议作为其加密通信的基础,这与Sui网络的账户系统完全兼容。

聊天模式

ComingChat的聊天模块为用户提供了三种不同的模式,以满足其不同的隐私和安全需求。这些模式包括:

  • 私密聊天:此模式在两个用户之间提供一对一的通信。Signal协议对这些对话进行加密,保持其机密性。
  • 加密群聊:此模式允许群体进行通信,同时保持较高水平的安全性和隐私性。与私密聊天类似,Signal协议对加密群聊中的消息进行加密。
  • 非加密群聊:在此模式中,消息没有加密,但该群组支持最多1000人,易于设置和管理,但对消息内容的保护水平较低。

Signal协议的实施发生在ComingChat的聊天基础设施中,该基础设施使用了Decentralized Moments(Dmens)协议。该协议支持常见的聊天功能,如发帖、点赞和回复,还集成了红包功能,使用户可以向彼此发送tokens或NFTs。

实施加密

ComingChat的加密聊天功能基于Signal协议的双棘轮算法,该算法提供端到端加密,确保用户之间的通信安全。

构建加密聊天功能需要以下步骤:

  1. 实现双棘轮算法,为消息启用端到端加密,确保只有预期的接收者能够解密和阅读这些消息。
  2. 将加密的消息存储在Sui网络上,以确保数据的完整性和安全性。
  3. 允许用户交换公钥以进行安全通信,并使用扩展三次椭圆曲线Diffie-Hellman(X3DH)密钥协议建立安全会话。

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 RedPacketInfo<phantom CoinType> has key,store {
	id: UID, 
	remain_coin: Balance<CoinType>, 
	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 create<CoinType> (
	config: &mut Config,
	coins: vector<Coin<CoinType>>, 
	count: u64, 
	total_balance: u64, 
	ctx: &mut TxContext
) {
	// 1. check args
	…

}

public entry fun open<CoinType> (
	info: &mut RedPacketInfo<CoinType>, 
	lucky_accounts: vector<address>, 
	balances: vector<u64>, 
	ct: &mut TXContext
) {
…
}

public entry fun close<CoinType> (
	info: RedPacketInfo CoinType>, 
	ctx: &mut TxContext
) {
…
}

public entry fun withdraw<CoinType> (
	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。

这些情境包括:

  1. KOL向粉丝发行有价值的NFT,以增加粉丝的参与、忠诚度和收入。
  2. 项目发行权益证明NFT,用于运营活动,以增加用户参与度、忠诚度,并促进生态系统的发展。
  3. 内容创作者通过付费NFT模型将其内容变现,实现更好的内容变现和更多的收入。
  4. 艺术家将他们的数字艺术品转化为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,
		// Post's 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: Option<address>,
		// app-specific metadata. We do not enforce a metadata format and delegate this to app layer.
		metadata: vector<u8>,
	}

	/// Simple Chat.text getter.
	public fun text (chat: &Chat): String {
		chat.text
	}

	/// Mint (post) a Chat object.
	fun post internal (
		app_id: address, 
		text: vector<u8>, 
		ref_id: Option<address>, 
		metadata: vector<u8>, 
		ctx: &mut TxContext,
	) {
		…
	}


	/// Mint (post) a Chat object without referencing another object.
	public entry fun post (
		app_identifier: address, 
		text: vector<u8>, 
		metadata: vector<u8>, 
		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 vector<u8>' for text instead of String' for the same reason.
	public entry fun post_with_ref 
		app_identifier: address, 
		text: vector<u8>, 
		ref_identifier: address, 
		metadata: vector<u8>, 
		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 == ')) then
	redis.call('xadd', KEYS[1], '*', ARGV[1], ARGV[3]) 
	redis.call ('set', KEYS[2], ARGV[3])
end
return true

索引器在接收到用户提交的每条消息时经历以下过程:

定时

  1. 查询所有消费者的故障消息,从queue_message表中查询。
  2. 根据主题重新消费。如果工作超过重新消费的阈值,必须停止并手动访问。

消费者

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|中文Twitter|Discord|英文电报群|中文电报群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/912578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Echarts 柱状图-值为0时柱状图数据

需求是这样的&#xff1a;当数据为0时&#xff0c;鼠标悬浮也需要展示对应的数据&#xff0c;当值很小&#xff0c;也需进行占位&#xff0c;所以要加barMinHeight 刚开始以为没有对应方案呢&#xff0c;然后在官网死磕&#xff0c;最后还是找到解决方案了. 打开官网地址 解决方…

软件测试工程师的职业发展方向,别迷茫了,振作起来

软件测试在职业发展上&#xff0c;可以概括分为“管理”和“技术”两大类。另外&#xff0c;软件测试还可以在质量领域发展。 1. 软件测试在管理上的发展 软件测试管理是大家比较熟悉的软件测试职业发展路线之一&#xff0c;比较流行的职位包括测试组长、测试经理、测试代表、…

删除ubuntu开始菜单中的图标

背景 本来是很好看干净的界面 更新谷歌浏览器后出现了Gmail&#xff0c;幻灯片&#xff0c;谷歌硬盘等跟谷歌相关的乱七八糟东西搞得界面就很丑 解决问题 删掉那个图标 输入命令 sudo nautilus /usr/share/applicationssudo nautilus ~/.local/share/applications可以…

风险变化快,业务人员如何快速增加风控规则?

目录 什么是风控规则&#xff1f; 风控规则的来源 如何在风控引擎中配置规则&#xff1f; 今年暑假&#xff0c;博物馆和演出会门票被黄牛抢走。主办方、博物馆如果拥有风控系统&#xff0c;可以制订一系列规则来识别和拦截潜在的黄牛行为。 在制订规则时&#xff0c;需考虑…

什么是负载均衡

前提概述 关于负载均衡&#xff0c;我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期&#xff0c;由于用户量较少、业务需求也比较简单。对于软件应用&#xff0c;我们只需要…

code论坛系统测试

目录 一 项目介绍**项目名称****项目介绍****项目功能****项目展示** 二 测试用例设计和功能测试1.测试用例设计**①登录页面****②注册页面****③首页****④发布帖子页面****⑤修改个人信息页面** 2.功能测试环境3.实际执行功能测试的部分操作**①登录页面****②注册页面****③…

Apple Pay 内购项目价格异常相关

通过 Apple Pay 内购商品子项的实际支付价格与 App Store Connect 配置中的存在差异; 经过已经排查过后发现是参照转换汇率的基准方式导致; 在 App 内购买项目 > 价格时间表 > App 内购买项目定价 > 所在国家或地区 一栏中,官方默认配置是以美国(USD)换算为基准 解决办…

优思学院|车间管理的五大基本方法

车间管理对于任何制造型企业来说都是至关重要的一环。有效的车间管理可以帮助企业提高生产效率&#xff0c;降低成本&#xff0c;改善产品质量&#xff0c;以及增强员工士气。在这篇文章中&#xff0c;我们将探讨车间管理的五大基本方法&#xff0c;这些方法可以帮助企业更好地…

NOIP 2011 提高组复赛真题及题解(day1 day2) Pascal语言

题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有n 张地毯&#xff0c;编号从1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设&#xff0c;后…

FreeCAD傻瓜式教程之约束设定、构建实体、开孔、调整颜色、透明度、参考距离、任意修改尺寸、保持开孔居中等

本内容基于官方教程中的绘制简单的零件中的体会&#xff0c;在初次绘制的时候&#xff0c;总是无法完成&#xff0c;几经尝试才发现其关键点所在&#xff0c;以此文记录&#xff0c;用以被查资料&#xff0c;同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开…

GEEMAP 基本操作(二)如何对 Landsat 进行全色锐化

遥感全色锐化的目标是从图像中获得最高级别的视觉清晰度和细节&#xff0c;通过结合全色波段图像的高空间分辨率和多光谱&#xff08;Landsat 为 B8 全色&#xff09;图像的宽光谱范围&#xff0c;全色锐化能够生成质量更清晰的最终彩色图像。 全色锐化过程涉及应用数学算法&a…

IDC发布《亚太决策支持型分析数据平台评估》报告,亚马逊云科技位列“领导者”类别

日前&#xff0c;领先的IT市场研究和咨询公司IDC发布《2023年亚太地区&#xff08;不含日本&#xff09;决策支持型分析数据平台供应商评估》1报告&#xff0c;亚马逊云科技位列“领导者”类别。IDC认为&#xff0c;亚马逊云科技在解决方案的协同性、敏捷性、完整性、及时性、经…

Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xf…

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介&#xff1a; keepalivedlvsnginx高并发集群&#xff0c;是通过LVS将请求流量均匀分发给nginx集群&#xff0c;而当单机nginx出现状态异常或宕机时&#xff0c;keepalived会主动切换并将不健康nginx下线&#xff0c;维持集群稳定高可用 1.L…

浏览器安装selenium驱动,以Microsoft Edge安装驱动为例

Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行&#xff0c;模拟真实用户对浏览器进行操作。利用selenium&#xff0c;可以驱动浏览器执行特定的动作&#xff0c;比如&#xff1a;点击、下拉等等&#xff0c;还可以获取浏览器当前呈现的页面的源代码…

【数据结构与算法】总结关于二叉树题型经典面试题

【数据结构与算法】二叉树题型经典面试题 1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的最近公共祖先4.二叉搜索树与双向链表5.从前序与中序遍历序列构造二叉树6.从中序与后序遍历序列构造二叉树7.二叉树的前序遍历(非递归方法)8.二叉树的中序遍历(非递归方法)9.二叉树的…

SpringBoot接收参数的8种方式

文章目录 1. 直接把请求参数写在方法的形参中2. 封装一个bean直接来接收3. 原生的HttpServletRequest接收4. PathVariable获取rest风格路径参数5. RequestParam绑定请求参数到方法形参6. RequestBody绑定请求参数到方法形参7. RequestHeader8. CookieValue 1. 直接把请求参数写…

唯一受邀参会通信服务商!融云出席数字经济头部盛会「中数大会」并发言

8 月 16 日-18日&#xff0c;“2023 中国数字经济创新发展大会”&#xff08;下简称“中数大会”&#xff09;在广东省汕头市举办。关注【融云 RongCloud】&#xff0c;了解协同办公平台更多干货。 中数大会由工业和信息化部、广东省人民政府联合主办&#xff0c;以“聚数联侨…

C++ new运算符开辟空间

1 内存四区介绍 代码区&#xff1a;存放函数的二级制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等堆区&#xff1a; 由程序员分配和释放&…

点云平面拟合和球面拟合

一、介绍 In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model. 二、代码 #include <iostream> #include <thread> #include <pcl/point_types.h> #include <pcl/common/io.…