当前位置: 首页 > news >正文

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协议的双棘轮算法,该算法提供端到端加密,确保用户之间的通信安全。

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

  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 == ')) thenredis.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|英文电报群|中文电报群

相关文章:

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

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

I2S/PCM board-level 约束及同步(latencyskewbitsync)

I2S/PCM是典型的低速串口&#xff0c;在两个方向上分别有两组信号&#xff0c;我们已soc为视角分为soc-adif和外设audio-codec。 那么adif输入&#xff1a; sclk_i, ws_i, sdi 当然并不是三个输入信号同时有效&#xff0c;只有adif RX slave时&#xff0c;三个输入都会有效…...

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年&#xff0c;英国科学家图灵在一篇论文中预言&#xff0c;人类有可能创造出具有真正智能的机器。 著名的「图灵测试」就此诞生&#xff1a;如果一台机器能够与人类展开对话&#xff0c;而不被辨别出其机器身份&#xff0c;那么称这台机器具有智能。 也是从那时…...

2308C++协程流程

参考 #include <常用> #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 同步{共针<T>值;同步(共针<T>p):值(p){输出<<"构建同步"<<行尾;//.8}同步(常 同步&s):值(s.值){输出<<&…...

C#实现稳定的ftp下载文件方法

当使用C#实现稳定的FTP下载文件的方法时&#xff0c;我们可以使用FtpWebRequest类来执行FTP操作&#xff0c;并根据需要添加错误处理和重试机制。下面是一个示例代码&#xff1a; using System; using System.IO; using System.Net;public class FTPDownloader {private const…...

八股文之计算机网络

TCP/IP 网络模型有哪几层 该模型用来解决不同设备间的进程通信&#xff0c;就需要网络通信&#xff0c;该模型就应运而生。首先是应用层&#xff0c;我们所接触的App都是在这一层实现的&#xff0c;当不同的设备需要通信时&#xff0c;就需要把数据发给传输层&#xff0c;传输…...

kotlin 比较 let apply

let 和 apply 是 Kotlin 标准库中的两个非常有用的函数&#xff0c;它们用于在代码中实现更简洁和可读的操作。它们通常在函数式编程和链式调用中使用&#xff0c;以简化代码并提高可维护性。下面是关于这两个函数的详细解释&#xff1a; let let 函数是一个作用域函数&#…...

springboot跨域踩坑笔记

事情是这样的&#xff0c;我在进行前后端联调的时候&#xff0c;发送了跨域拦截 马上在spring项目中创建一个CorsConfig类 package com.example.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.an…...

基于STM32+FreeRTOS的四轴机械臂

目录 代码&#xff1a; 注释写的较少&#xff0c;但本文出现的代码都有注释&#xff0c;所以请直接在本文里看注释 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码 2…...

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…...

redux的介绍、安装、三大核心与执行流程

redux的介绍、安装、三大核心与执行流程 一、redux的基本介绍二、redux的安装三、redux核心概念3.1 action3.2 reducer3.3 store 四、Redux代码执行流程五、加减案例练习 一、redux的基本介绍 redux中文官网Redux 是 React 中最常用的状态管理工具&#xff08;状态容器&#x…...

Redis 5环境搭建

一、环境搭建 如果是Centos8&#xff0c;yum 仓库中默认的 Redis版本就是5&#xff0c;直接yum install即可。如果是Centos7&#xff0c;yum 仓库中默认的 Redis版本是3系列&#xff0c;比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…...

stm32红绿灯源代码示例(附带Proteus电路图)

本代码不能直接用于红路灯&#xff0c;只是提供一个思路 #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

折线图&#xff1a; #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界面

基本方法 在默认的前端页面中使用检查工具确定要修改的部分的选择器名称&#xff0c;然后在block_css中对其修改&#xff0c;并在启动网页时传入参数&#xff1a;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,以及使用脚本开机自启(亲测)

前言 因为不想每次启动虚拟机都要手动启动一遍这些东西&#xff0c;所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容&#xff0c;注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...