Forge in Action

  • 85 浏览

JeanChen

2019/05/29 发布于 技术 分类

ArcBlock  Forge  blockchain  Guide  Developer 

文字内容
1. 是 Forge 什什么 犹如Rubyonrails是⼀一套构建web应⽤用的框架 forge是⼀一套构建区块链dapps的框架 区块链可以 公开 可验证的去中⼼心化数据库 简单地理理解成数据库 ⼀一个 㔪 or 点 1⾯面 or 焦灿 个传统的应⽤用将数据存在数据库中 ⼀一 个dam去中⼼心化应⽤用将数据存在区块链中 ⼀一 协议等⼀一系列列底层的架构 要先搭好 设算法 ⽹网络 构建⼀一个dapp⽐比较 于传统的应⽤用要复杂许多 P2P共 实现业务需求 然后 才写⽤用户逻辑来 个构建基于区块链的dapp框架将底层的⼤大量量⼯工作 Forge作为⼀一 已经 做好 并且提供了了⼀一套接⼝口供应⽤用程序调⽤用 所以对于⼀一名应⽤用程序的开发者 只需关⼼心 ⾃自⼰己 业务 逻辑 的 forge会将数据保存 在区块链中供应⽤用程序使⽤用 什什么 区块链是 源于区块链 ⽽而区块链对于 很多开发者并不不是很熟悉 这⾥里里简单介绍⼀一下 有⼀一些概念是 中 Forge 理理解 ⼀一些最基本的概念 以助于之后开发的 区块 链 blockchain ⼝口 -1 block2 blockI - 1 - blocks 区块链就是条由区块 组成的链 它其实 是⼀一种数据结构 ⻓长的样⼦子有点像linkedlist链表 11 - 12 1丑 我们⽤用链 什什么 表可以 存些简单的数据 ⽐比如 ⼼心了了 那区块链中存储的数据是 呢 答案是 transaction
2. Transition是 什什么 存储 为⽐比 是 在每⼀一个区块中的数据 Transition交易易简写 head 或 - block 由区块头和内容组成 头中保存了了块⾼高 上个块的哈 希等信息 ⽽而内容则是⼀一个个的切 个区块 ⼀一 因为世界上第⼀一 个区块链项⽬目⽐比特币中 为什什么区块 中存的数据要叫做transition交易易呢 链项⽬目都⽤用交易易 每⼀一个区块中存的就是⼀一笔 ⼀一笔的⽐比特币交易易记录 所以后续的各种区块 即transaction来作为存在区块中的数据 中的⽊木既念 Forge 当我们要做⼀一个有⽤用的应⽤用程序时通常会涉及到⽤用户 ⽤用户 进⾏行行 会 创建⼀一些资产并将这些资产 交易易 ⾏行行为 等 将这些⾏行行为抽象成2个最基本的概念 Forge - account帐号 - asset 资产 传统 帐户的概念 只不不过 在 创建 应⽤用 的应⽤用中 ⼀一个⽤用户帐号是 ⽤用⽤用户名和密码来 就是传统 中⽤用户 的 ⽽而在区块链的世界中⽤用户帐户是由钱包地址和私钥来创建的 Account ⽤用户名 1 钱包 地址 密码 私钥 为啥 ⽤用⽤用户名密码来 不不 创建⽤用户帐户呢 因为 在区块链的世界中其实 是没有⼀一个⽤用户登录的概念的 我们知道在 应⽤用 中⽤用户登录 成功 传统 进⾏行行⼀一些 后可以 之间 操作⽐比如转帐发 微博等在⽐比特币 中 ⽤用户 如何 是 在不不登录帐号的情况下进⾏行行转帐的呢 答案 是通过数字签名 即将转帐的交易易⽤用⽐比特币 钱包的私钥 进⾏行行签名后 发到区块链上之后这个签名过的交易易经由别⼈人验证后就算是有效的了了 这样 ⼀一 笔转帐的交易易就算是完成了了 所以钱包的概念也是由⽐比特币引进 Asset资产则⽤用 来表示任何东⻄西 可以是⼀一 ⽂文章 篇 张图⽚片⼀一张 创建 地图或是⼀一个证书 资产可以由某个⽤用户 或者应⽤用 程序 创建 ⼀一旦创建好后可以 来 进⾏行行 ⽤用来 交易易使⽤用等⾏行行为具体做什什么是取决 于应⽤用程序 ⼀一
3. 中的transaction Forge ⽀支持 前⾯面说到 ⽐比特币 中的有且仅有的⼀一 transition就是转帐 forge作为⼀一个全 功能框架原⽣生 种 种 ⼗十⼏几 transactions 包括 创建帐号创建资产 转帐 等 每⼀一次事件的发⽣生都等价成⼀一个⼀一个的⽐比发布到链上 所以 若开发者想在区块链上做开发 归根结底就是通过forge在区块链上发布⼀一个 说 州的transaction 我们知道当扣 ⽕火启动之后 便便是个单独的操作系统进程 开发者开发的应⽤用程序如何与forge 交互 来告之其应当发什什么transaction呢 Forge提供了了两 ⽅方式 种 Graph⼮巛和 gpn 如何与Forge交互 提供了了两种与其交互的⽅方式 本身 Forge - GraphQL - gRPC ⼀一样 我们平⽇日接解的API调⽤用 这可能与我们平时调⽤用某个服务提供的API不不太 呢 ⽤用 展开 不不过 会简单介绍⼀一下这⼆二种技术 原因很简单 效率 关于Grapnel和8叭的优点 这⾥里里不不再 获取⼀一些资源 请求访问某个胆来 通过 ⼤大都是 扣⼉儿发送⼀一些http 为什什么 没有 JSONAPI forge ⽤用 Graph QL怎么 ⾼高效快捷地向服务器器获取资源 帮助⽤用户更更 的 项技术旨在 是 Graphat facebook开源 ⼀一 difhgff fares_eeo cn 12协议的71051请求 服务器器接收从 11-1或http raphe在⽹网络的应⽤用层⽤用的是http 客户端发 处理理后返回 ⼀一个加⼉儿的结果 来的query请求 经过 客户端能发送的请求 分三类 - query ⽤用来读取资源 ⽤用来创建或改变资源 - subscription ⽤用 来订阅事件 - mutation 在forge中 query⼀一般⽤用作查询链上的数据mutation⼀一般⽤用作向链发送transition subscription⽤用来订阅 链上发⽣生的事件
4. gkpc怎么⽤用 gnpc是google出的 ⼀一套 Rn框架 简单来说 gRPLiprotobufthttplz ⼀一 序列列化标准 protcatbuffer 简称protobut 也是google⾃自家出的 个序列列化反 定义好⼀一个 pro to⽂文件 通过预先 是⽐比XML JSON更更加⾼高效的序列列化⽅方式 它是 有哪些key以及它们的编号之后序列列化时候只对value 记录 了了要传输的message都 如下 进⾏行行编码 以达到节省空间的⽬目的 使⽤用⽅方法 ① proto 避 之 cpp ex py Hellola 1 I了了 I l ots so 8 I 序列列化 反 I ①⽤用户定义要传输的信息有哪些字段写到⼀一个proto⽂文件中 然后⽤用官⽅方或社区提供的 成 cpp或ex或 in⽂文吽 你要⽤用的语⾔言的插件将其编译 ②在你的程序中⽤用刚才⽣生成出来的模块提供的序列列化函数将⼀一个struct转化 序列列化 函数 收到的⼆二进制转化 成⼆二进制以便便在⽹网络中进⾏行行传输接收⽅方⽤用反 将 回struct ⽤用protobut进⾏行行对数据的序列列化能很⼤大程度上节省空间这样传输在⽹网络上的数据 变少了了 请求也就更更⾼高效了了但是需要付出的代价就是 1 ⾸首先要有服务端定义的 proto⽂文件 but编译 器器的插件 2 你要⽤用的语⾔言需要有proton官⽅方提供的proto forge所有 ⽂文件都 ⽤用到的prote 仓库 在 anbody 下提供 forgeabi这个 google官⽅方 ⽀支持 中去找了了 at c goJava python的插件 其它的语⾔言则要到社区 那么 8RPC是啥呢 看图说话 client server profiles http 12 𨶹
5. ⼀一 端定义好 套请求1响应的加在⽂文件 ⾸首先 服务器器 服务器器 客户端把 要发的请求通过加6but序列列化成⼆二进制后通过http12协议发给 之然后再以proto 服务器器收到谳 处理理 but序列列化的⼆二进制发回响应 - 序列列⽐比 拿到结果 客户端收到响应后 反 之所以 ⽤用Htpk协议⽽而不不再⽤用http 是为了了更更⾼高效地传输数据 同时 需要⽤用⼀一个官⽅方提供的或是社区 提供的gm的库来使⽤用gRPC GraphQl还是 gRPC forge提供了了Graph⽐比和8吅 两种⽅方式来与其交互那么到底⽤用哪个好呢 上稿单 只需要⽤用⼀一个http客户端和⼀一个Jsow的库就能收发数据了了 Graph⽐比 ⽽而812⽐比上⼿手复杂需要了了解pwtbuf 并⽤用⼀一个8121裤才能收发数据 其实⽤用 起来 更更灵活 ⽽而 上⼿手难点但是 我们推荐⽤用812⽐比 虽然看起来 ⼀一些简单的查询 简单 适合⽤用于 Graphat上⼿手 Forge 中如何发送transition 前⾯面讲了了 若开发者想在区块链上做开发 归根结底就是通过forge在区块链上发布⼀一个州的transaction ⼜又讲了了forge提供Graphat和812⼏几的⽅方式来交互 接下来就讲⼀一下如何在九吐中 通过8Rn发送transaction client forge ⼗十 _ 问 怎么样 发送的流程简单吧 就是把forge中定义的transaction通过gRn发给forge之后forge会返回 个哈 希作为结果 ⼀一 好的那么接下来 我们就来看⼀一下forge中定义的transition⻓长什什么样
6. Forge 中的transaction l 实例例 的定义可以在 arcblaklforgeabilliblprotobufltypeproto 下⾯面找到 Forge 中对于transaction message Transaction string from⼆二⼯工 以⽐比4 nonce bytes pk 4i 这个 ⼤大是谁发的 2 递增发送 来防⽌止重纹攻击每次需要 none⽤用 ⼤大发送 ⾄至的链的id 发⽐比的钱包1的公钥 string chainid⼆二了了 bytes signature 如的钱包的签名 13 sigsignatures 14 repeated Multi my itx googleprotebuf 了了 即钱包地址 15 多⽅方 签名 具体 innertransaction 这个⽐比 是⼲干啥的 这个transaction后 将 我们需要做的事情就是抅选出来 其发送给forge 接下来我们会⽤用⼀一个具体的例例⼦子来演示如何在链上创建个钱包帐号 ⼀一 钱包 Forge中的 创建钱包分 2步 ⼈人在本地 创建⼀一个钱包 ⽤用户 帐号的创建 这个 钱包申明 declare 到链上去 这样就算完成了了 2把 所以说 了了 东⻄西呢 这么 个什什么 久 钱包究境是 定义 其实就是⼀一个 钱包 ⽉月1地址的⼀一个数据结构 被 存储了了公钥私午 于protobut中 fol message WalletIn bytes sk 2 私钥 Pk 了了 公钥 bytes Stringaddress 了了 4 DID 地址 可选 有3个选项 我们的钱包是⼀一 个⽀支持DID规范的钱包 ⾥里里⾯面 message wallet Type l - roletype ⻆角⾊色 Typekey I key - key_type Encoding Typeaddress - hash type 哈 希算法 Hash Typehash 2 私钥算法 了了 这⾥里里的细节请参考 arcblocklabt didspec⾥里里⾯面关于创建叿⼝口的⽂文档 Role Type role- 4 3
7. 代码⽤用的是我们已经开源的frge elixir dk的库 以下的参考 代码为Elixir account AbiWallet wallet_type Forge Typenew role role wallet key d25519 hash sha 了了 Forge SdkWalletUtil create wallettype EyeAbiWalletIntol 啊地址⾥里里⾯面包含了了私钥类型哈希算法及⻆角⾊色 address zlmwonwqt pk 85199 sk cat9 21 248 公午⽇日 32字节 字节 私钥 我们⽤用的ed 25519 私钥 包括 地址 地址共64 公铜 了了 了了 好的 这样我们创建的钱包是在本地创建的 还需要把它申明到链上去 还记得之前说的 要在链上搞事情就得需要发⼀一个transaction message Transaction string from⼆二⼯工 以⽐比4 nonce bytes pk 4 2 string chainid 了了 bytes signature 13 sigsignatures 14 repeated Multi my itx 15 googleprotebuf 了了 要构建⼀一个⼤大 即是做定型填空就⾏行行了了 看出现在哪些是我们已经可以填进去的 message Transaction string from⼆二⼯工 aint 64 nonce 2 string chainid 3 bytes pk 4i walletaddress I forge walletpk bytes signature 13 sigsignatures 14 repeated Multi my itx googleprotebuf 了了 还剩下signature signatures和it 未填 在看签名之前我们先来看下 以 15 是 这步还⽤用不不到 不不⽤用管它 signatures 多⽅方 签名我们 ⼀一
8. 什什么 forge中的 itx是 已经 有了了tx 为啥还要有以呢 itx是innertransaction的缩写 都 ⼆二 国 做个⽐比喻 这个就 好像写信⼀一样每封信都有标题抬头 政 ⽇日期和签名竺 但是不不同的信的正⽂文内容是不不同的 ⽐比就是信的模版 包括寄信⼈人 标题签名 i ⽽而成则是信的正⽂文 代表了了具体的内容 种⽐比 也就是说 有⼗十⼏几种itx 我们要收的将刚创建的钱包申明上链的 itx叫做declare 中⽀支持了了⼗十⼏几 Forge Tx l message Declare 表示 这个 钱包 帐户的别名 I string moniker 了了 这⾥里里 忽视了了其它⼀一些⽤用不不上的字段 定义的 以类型 那么 如何 将这个declaretx创建成⼀一个it x呢 我们再来看⼀一下Transaction中 my ìtx 15 googleprotebuf 类型 名字⼀一样是 专⻔门 给 它的类型是 googleprotebufmy 这个是google提供的种 如它的 任意类型⽤用的⼀一种通⽤用的类型 它的定义如下 ⼀一 message Any I value 21 stringtypeurl 3 bytes 什什么 ⻤鬼 这个其实是给应⽤用 表示不不就好了了吗 type 吼是个 既然是任意类型那只⽤用value来 ⼀一 程序⽤用的 告诉它这个任意类型到底是 个什什么类型 90096设计的本意是这个type nu是个 ⽐比 但是 我们并 不不需要它是个吼 可以是任意字符串串 这样 中定义的type ur ⻓长 forge fg - t n declare 缩写 type forge no it类型
9. declare Forge AbiDeclareTxnew moniker on snow value⼆二 Forge node declare AbiDeclare Tye itx GoogleProtoAnynew typeurl Yg t declare value value 了了 value lnlajon sn.ws declare typeurl fg t GoogleProtoAny 这个 but编码 的declare吙 就是 ⽤用Proto 好 现在再看⼀一下我们的tx message Transaction walletaddress string from⼆二 ⼯工 aint 64 nonce 2 string chainid⼆二了了 bytes pk 4i I forge wallet.pk 13 bytes signature sig signatures 14 repeated Multi google.protebuf.my itx 15 itx 了了 现在就差最后⼀一步 签名了了 forge中如何给tx签名 签名 线数字签名算法 ed25519和Secp256⼼心 所谓的数字 forge中的钱包⽀支持2种椭圆区 哈 做⼀一个签名 之后别⼈人可以⽤用其公钥进⾏行行验证 就是⽤用钱包的私钥对⼥女女的 希 signature sk 这⾥里里是 钱包的私钢 这⾥里里 为⽐比序列列化 后的⼆二进制的哈希 sign data hash 了了 Forge Mcryptohash1 shall AbiTransactionencode tx Sig Mcryptosign tx 了了 Ed255191 hash wallet.sk ltxl signature sig了了 完成并且 ⾄至此我们的⽐比终于算是构造 签好名了了 接下来只需把这个⼤大发送给forge啦
10. 如何向forge发送⽐比 化的服务就⾏行行了了 因为 我们只 我们⽤用和⽐比与forge进⾏行行交互 所以 需使⽤用⼀一个9RPC提供的发送 ⼀一切定义 这个 服务在forge中叫send to中 r abilliblpnotobuflsenie pro 在anblockl foge 操作需要 参考你 进⾏行行这项 所⽤用的语⾔言的81212⼈人的库的⽂文档 在Elixir中这样做 Forge Sdksend⼀一⼤大 tx tx 482651313 哈希即是这个⼤大在链上的哈希喽 ⽤用这个哈希就可以在链上查到其状态了了 之后返回的 会做⼀一系列列的检查包括发送⽐比的钱包地址是否有效签名是否有效等 当我们把⽐比发送给forge后 forge 加⽕火会把这个⽐比发送给下层的共识引挚 并且⼴广播到吅⽹网络中最后会被打包到新的区块中 之后 这样⼦子我们发的⽐比相当于成功上链 啦 当然上链并不不代表这个⼤大就是成功了了的 还需要捡查 这个⺾艹的状态才⾏行行喔 forge中常⽤用的⼤大 ⽅方才我们学习 了了如何构建并 成功将 其发送给forge 这样 签名⼀一个declare⽐比 并且 成功 我们 地在 上创建了了⼀一个钱包帐户 接下来我们来看⼀一下 forge中有哪些常⽤用的⽐比 forge 扣失现已⽀支持⼗十⼏几种tx 包括创建钱包帐户创建资产 转帐 交易易 质押签到升级节点等 我们来看⼀一下常⽤用的⽐比 假设 有如下场景 ⽤用户 地图 A创建了了⼀一个帐户后签到⼀一次得到 了了⼀一些token 之后创建了了⼀一个资产 游戏 并 将这个资产免费转让了了另⼀一位⽤用户13之后⽤用阳⽤用⼀一些token向⽤用户13购买了了该资产完成了了⼀一次交换 这⾥里里 ⾯面涉及到的⽐比有 ⼀一 declare - poke 帐户 创建钱包 签到领取25 个token - create_asset 创建资产 - transfer 转让 - exchange 交换 declare之前 我们已经 看了了 接下来看poke 过
11. poke tx 是签到领取25个token ⼀一天只能领⼀一次 pole就是戳下 作⽤用 我们知道发送⼤大时 ⽐比的结构都是⼀一样的 不不同的反之是以的内容及签名 我们再来看下⼤大的结构 message Transaction walletaddress string from⼆二⼯工 aint 64 nonce 2i string chainid⼆二了了 bytes 注意 来说nona要⽤用 对于 poke O pk 4i forge wallet.pk 13 bytes signature sigsignatures 14 repeated Multi google.protebuf.my itxt itx 15 改⽤用poketx 了了 poketx的定义如下 Tx l message Poke stringdate I string 了了 poke value itx address 2 签到的⽇日期 ⽤用当天 向哪个钱包地址签到这个是固定的地址 i Forge AbiPokeTxnew date 0190528 address 222 t her 36 个z zzz.it node poke Forge AbiPokeTye GoogleProtoAnynew typeurl GoogleProtoAny Yg t Poke value value ltypeurl fg t poke value ㄍ10,10.50 之后 然后把这个以塞到上⾯面的 tx中 签名 Forge Sdksend⼀一⼤大 发到链上吧 tx tx 66313 AFB 成功以后去链上查询⼀一下 此时我们的Jon snow 帐号就多了了25 个token啦 好的 现在我们的钱包创建了了并且 有325个token 接下来看 之 如何创建⼀一个资产
12. tx createasset 代表任何可 asset表示 交易易的物体这⾥里里 资产 可以 我们⽤用 游戏地回举例例 ⼦子 先 看々create_asset的定义 Assets message Create l stringmoniker⼆二⼯工 google.pro tobutAnydata bool read only boot transferable uintn.ttl 5 了了 这个资产 的别名 2 地回的数据放这⾥里里 3 4 是否 可转让 string parent 6 string address⼆二下 资产 地址 这⾥里里 了了7个 定义 字段 我们只关⼼心其中的4 个其余的可以不不⽤用管 butAnylvalue thisismymap'S map asset GoogleProto 元 1rge AbiCreateAssetTxnewtransferabletrue moniker 接下来 还有asset 中的地址为空我们需要⾃自⼰己将它算出来 data map mapI 中的所有东⻄西的id forge 都是⽀支持吅标准 对于asset的地址也是⼀一个DID 那么asset 地址怎么算呢 hashe Mcrypto hash1 Sha 313 Asset encode Forge AbiCreate Tx 之后的步骤 参考abtdid.pe 対 当中 的步骤这⾥里里 算出的哈 请 it 希做为第5步的输⼊入 并且 在选roletype时要选asset 地址算好后填到上⾯面的asset中 value⼆二 Forge AbiCreateAsset7 encodeasset itx GoogleProtoAnynew typeurl typeurl fg t GoogleProtoAny Yg t create_asset create_asset value value value ⼼心4log 接下来就是流⽔水线作业将以塞⼊入⽐比中 签名 发送 成功后 个asset就创建好啦 ⾥里里⾯面的内容放的是⼗十屷 ismymap ⼀一 Ok 接下来我们要把该资产转移给另⼀一个 帐户 这 会⽤用到transfer ty
13. transfer tx 转让transfer是⼀一个 单⽅方⾯面的⽤用户⾏行行为 ⽤用户 ⽉月可以向⽤用户13 转钱或者转资产 所以我们 需要先 创建第⼆二个钱包帐户 account AbiWallet wallet_type Forge Typenew role role key d25519 hash sha 了了 Forge SdkWalletUtil create wallettype wallet2 诤其申明到链上去 这⾥里里就不不再洋写了了 之后⽤用declare ⼗十 看transfer ⽐比的定义 接下来 Tx message Transfer stringto⼆二⼯工 Vintvalue 2 Big ⽬目标 钱包 地址 给多少钱 repeatedstringassets⼆二 了了 有 哪些资产 i 了了 我们 这⾥里里只 转让⼀一个刚才创来的地图资产 只需要asset地址即可 mapI ⼆二 zjdqNCmy transfer value itx Forge Txnew to wallet2address assetsi ImapI了了 AbiTransfer node transfer Forge AbiTransfer Tye GoogleProtoAnynew typeurl Yg ttransfer Her value ttypeurl fg thn GoogleProtoAny 之后 ⽼老老套路路 value value ⼼心了了5 122 以放⼊入⼤大中签名 发送上链 之后 本来 成功 属于⽤用户A的资产现在便便 属于 ⽤用户 13了了 最后来看 ⼀一下exchuytx exchange ⽐比 之前 所有讲 过的⼤大 都只需要 个签名 ⽽而 ⼀一 exchange 签名 因为是交换资产 tx则需要 2个 所以必须要由交换的双⽅方都同意才⾏行行 ⽇日 Iasset 器器 ⼝口 A花2个token向13买1个asset
14. 看⼀一下exchange ⽐比的定义 Tx l message Exchange string to⼆二⼯工 与哪个地址交换 Info her 2 发送信息 Info receiver 3j 接收 信息 Exchange Exchange i 了了 messageExchange Info 交换 的⾦金金额 Bigont value ⼆二⼯工 repeatedstring assets 2 交换的资产 了了 messageBig Ont 了了 bytes value l I 因为 ⾦金金额是 ⼤大整数所以我们⽤用bytes 表示 来 构建⼀一个itx exchange Forge AbiExchangeTxnew to wallet2address Sender fairer value itx Forge Abilingayencode yeAbi ExchangeInfonewvalue Forge Abitokenteu.it 2 AbiExchangeInfonewassets Forge ImapI exchange GoogleProtoAnynew typeurl Yg texchange value value 接下来⽼老老套路路 以放进⽐比 签名 ⾄至此我们的⼤大还差最后⼀一块 也是 我们之前⼀一直 没⽤用过的Multi 签名 Sig多⽅方 message Transaction string from⼆二 ⼯工 aint 64 nonce 2 string chainid⼆二了了 bytes pk 4i bytes signature walletaddress I forge wallet.pk 13 signature sig signatures 14 tobutAny ìtx 15 ìtx google.pro repeated Multi 了了
15. 看下multiSig的定义 message Multi sig ⽤用户 13的地址 stringsigner⼆二⼯工 byte pk 2 bytes signature ⼆二了了 ⽤用户 13的公钥 ⽤用形的签名 g 这个 multi 如何构建 呢 sig该 名就⾏行行啦 很简单 将⽤用户13的地址和公朔填⼊入再塞进⼤大中然后⽤用户⼝口签个 mnlitisigiFo getbiMuHisig new signeriwallet2 address tx 灰 创建⼀一个 multi ⾏行行的map ltxl signatures innitis们 将其放⼊入成的signatures字段中注意现在这个mnlitisig的签名还 为空哦 signature⼆二 Forge SdkWallet Utilsign multi sig pk wallet2pk muisgl Signature ltxl signatures wallet2 Fong Abin Fans encode notion tx 将该⼤大让⽤用户13签名 签好之后把签名改⼊入mulitisly的map中 imulti sig放⼊入⼤大中 sign 最后将签好名的multi signature了了 ⾄至此我们的⽐比就被⽤用户A和13都签了了名了了 可以将其发到链上去了了 成功后 资产被转到A的名下 A⽀支付给B 2个token 交换完成 整个 过程的图示 圝 It ll B