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

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协议的双棘轮算法,该算法提供端到端加密,确保用户之间的通信安全。
构建加密聊天功能需要以下步骤:
- 实现双棘轮算法,为消息启用端到端加密,确保只有预期的接收者能够解密和阅读这些消息。
- 将加密的消息存储在Sui网络上,以确保数据的完整性和安全性。
- 允许用户交换公钥以进行安全通信,并使用扩展三次椭圆曲线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。
这些情境包括:
- 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,// 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 == ')) 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|中文Twitter|Discord|英文电报群|中文电报群
相关文章:
Sui生态项目|集隐私通信、移动钱包、链上朋友圈和红包功能一体的社交应用ComingChat
ComingChat是在Sui网络上构建的去中心化社交平台,功能众多,其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议,这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。 ComingChat在Sui上提供了全面的…...
I2S/PCM board-level 约束及同步(latencyskewbitsync)
I2S/PCM是典型的低速串口,在两个方向上分别有两组信号,我们已soc为视角分为soc-adif和外设audio-codec。 那么adif输入: sclk_i, ws_i, sdi 当然并不是三个输入信号同时有效,只有adif RX slave时,三个输入都会有效…...
vue 富文本编辑器
安装 1、npm install wangeditor/editor --save 2、npm install wangeditor/editor-for-vue --save使用 .vue文件//展示<div style"border: 1px solid #ccc;width: 95%;"><!-- 工具栏 --><Toolbar style"border-bottom: 1px solid #ccc" …...
为什么说ChatGPT还不是搜索引擎的对手
一 前言 1950年,英国科学家图灵在一篇论文中预言,人类有可能创造出具有真正智能的机器。 著名的「图灵测试」就此诞生:如果一台机器能够与人类展开对话,而不被辨别出其机器身份,那么称这台机器具有智能。 也是从那时…...
2308C++协程流程
参考 #include <常用> #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 同步{共针<T>值;同步(共针<T>p):值(p){输出<<"构建同步"<<行尾;//.8}同步(常 同步&s):值(s.值){输出<<&…...
C#实现稳定的ftp下载文件方法
当使用C#实现稳定的FTP下载文件的方法时,我们可以使用FtpWebRequest类来执行FTP操作,并根据需要添加错误处理和重试机制。下面是一个示例代码: using System; using System.IO; using System.Net;public class FTPDownloader {private const…...
八股文之计算机网络
TCP/IP 网络模型有哪几层 该模型用来解决不同设备间的进程通信,就需要网络通信,该模型就应运而生。首先是应用层,我们所接触的App都是在这一层实现的,当不同的设备需要通信时,就需要把数据发给传输层,传输…...
kotlin 比较 let apply
let 和 apply 是 Kotlin 标准库中的两个非常有用的函数,它们用于在代码中实现更简洁和可读的操作。它们通常在函数式编程和链式调用中使用,以简化代码并提高可维护性。下面是关于这两个函数的详细解释: let let 函数是一个作用域函数&#…...
springboot跨域踩坑笔记
事情是这样的,我在进行前后端联调的时候,发送了跨域拦截 马上在spring项目中创建一个CorsConfig类 package com.example.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.an…...
基于STM32+FreeRTOS的四轴机械臂
目录 代码: 注释写的较少,但本文出现的代码都有注释,所以请直接在本文里看注释 项目概述: 一 准备阶段(都是些废话) 二 裸机测试功能 1.摇杆控制 接线: CubeMX配置: 代码 2…...
【C语言】三子棋游戏——超细教学
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将结合之前的知识来实现 三子棋游戏。 目录: 🌟思路框架:测试游戏 🌟…...
redux的介绍、安装、三大核心与执行流程
redux的介绍、安装、三大核心与执行流程 一、redux的基本介绍二、redux的安装三、redux核心概念3.1 action3.2 reducer3.3 store 四、Redux代码执行流程五、加减案例练习 一、redux的基本介绍 redux中文官网Redux 是 React 中最常用的状态管理工具(状态容器&#x…...
Redis 5环境搭建
一、环境搭建 如果是Centos8,yum 仓库中默认的 Redis版本就是5,直接yum install即可。如果是Centos7,yum 仓库中默认的 Redis版本是3系列,比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…...
stm32红绿灯源代码示例(附带Proteus电路图)
本代码不能直接用于红路灯,只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…...
Qt与电脑管家4
折线图: #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…...
使用css美化gradio界面
基本方法 在默认的前端页面中使用检查工具确定要修改的部分的选择器名称,然后在block_css中对其修改,并在启动网页时传入参数:with gr.Blocks(cssblock_css, thememy_theme) as demo: 禁止修改下拉框文字 input.border-none.svelte-c0u3f0…...
Flink流批一体计算(13):PyFlink Tabel API之SQL DDL
1. TableEnvironment 创建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…...
java笔试手写算法面试题大全含答案
1.统计一篇英文文章单词个数。 public class WordCounting { public static void main(String[] args) { try(FileReader fr new FileReader("a.txt")) { int counter 0; boolean state false; int currentChar; while((currentChar fr.read()) ! -1) { i…...
点云平面拟合和球面拟合
一、介绍 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.…...
部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)
前言 因为不想每次启动虚拟机都要手动启动一遍这些东西,所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容,注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
