在 CKB 上如何用最简单的方法构造验证交易

2020-02-15 12:16 栏目:经验之谈 来源: 查看()
你知道如何在CKB建立验证交易吗?今天,CKB开发商骆超来和你讨论如何以最普通、最简单的方式在CKB建立一个验证交易。快去看看。 1.细胞夹头 在CKB,任何交易必须包含至少一个输入和一个输出。为了构造一个事务,我们首先需要定位输入,我们称之为“单元收集”。 我们知道CKB非常类似于UTXO模型,这意味着如果没有任何预缓存,任何地址的当前状态都是未知的。构成当前状态的信息可能分散在链上的不同单元中。参考细胞模型可以理解CKB的数据模型。细胞收集有两种方法: A.使用ckbinderservice 这里有一个简单的方法来识别指定地址的信息(例如live_cell的数量、事务的数量和总容量),而不需要任何其他操作。请注意,由于索引器功能基于CKB节点,此方法仅适用于基本用法。此外,这种方法不支持查找更详细的信息(例如,无法定位合同单元),并且还会消耗CKB节点本身的资源。 然而,尽管有这些缺点,让我们从这个方法开始,以更好地理解单元集合是如何工作的。在CKB节点中,该功能默认关闭。要打开它,请手动更改配置文件并重新启动CKB节点,如下所示: 在mckb.toml中更改以下配置: [rpc] . #美国石油学会模块列表: ['网','池','矿工','链','统计','订阅','索引器','实验'] 模块=['网','池','矿工','链','统计','订阅','实验'] 可以看出,索引器服务默认情况下不启动。要启用此功能,请向阵列模块添加“索引器”。 模块=['网','池','矿工','链','统计','订阅','实验','索引器'] 在重新启动CKB节点后,注册要用RPC方法索引的地址。请注意,index_from参数控制索引的起点,空值从链尖(当前块)开始,0值从起源块开始。 现在,等待索引服务重建,然后使用索引服务的RPC接口查看相应地址的live_cell/transaction/capacity值。 如果不再需要索引服务,您可以通过RPC注销监视列表,关闭该服务,并从ckb.toml中的数组中删除“索引器” B.创建您自己的手机收藏服务 创建自己的细胞收集服务有什么好处? 众所周知,交易包括创造和摧毁任何数量的细胞,这是交易最简单的定义。由于单元格使用的灵活性,任何有意义的数据都可以存储在单元格的数据字段中,各种类型的合同都可以用类型脚本来表示。因此,每个用户或用例可能对单元收集有不同的要求。 事实上,有许多问题需要探索,根据不同的用例,每个问题可能有不同的答案: 细胞收集的顺序是什么?先入先出,按大小、最佳型号等顺序排列 可以使用哪个单元格?特定的幸运数字或任意数字 是否有任何细胞数据或类型需要特殊处理? 选择单元格后是否需要过滤/确认? CKB的索引服务不能很好地满足这些要求,也不能灵活地适应将来可能增加的额外要求。最有效的方法是建立细胞收集功能。 怎么做? 当一个新块被链接时,输入块中的单元必须从活动单元集中移除,并且块中的输出必须被添加到活动单元集中。由于短分支经常出现在功率区块链中,当分支使先前接收的块无效时,该块的输入和输出必须回滚以改变。缓存设计有助于加快同步,例如,缓存链中的最后N个块,并删除这些块中使用的活动单元。 2.构建交易 现在我们可以开始达成交易了。在你开始之前,你需要了解一些背景知识,包括证人的构造,交易费用的计算和一些小技巧。 构建交易 所有类型都基于分子进行序列化(序列化系统)。核心结构是: 表RawTransaction { version : Uint 32,cell _ deps: CellDepVec,header _ deps: Byte32Vec,inputs: CellInputVec,outputs: CellOutputVec,outputs _ data: BytesVec, } 表事务{ raw: RawTransaction,witnesses: BytesVec, } Cell_deps和input是指向链上活动单元的一系列指针。不同之处在于dep是一个引用(只读),输入用于 struct CellDep { out _ point : OutLoint,dep_type:字节, } Tx_hash和outputs_index用于定位单元。Dep有一个附加的dep_type字段,用于指示单元格中的数据是代码还是dep_group。(请注意,多个单元格中的代码可以使用dep_group函数进行组合) 代码由0表示,这意味着单元格数据可以直接使用。 Dep组数据由1表示,这意味着该单元格中的数据是一个重定向字段,需要解析n个单元格(这里不允许递归)。depgroupdata用d vectoroutpointveccoutpoint列出所有必要的点。 例如,您可以查看默认的锁定单元,并使用dep group函数将secp256k1库分成两个单元来存储乘法表和代码。块大小是有限的。如果数据太大,无法放入块中,可以将其存储在单独的单元中,并在运行时一起加载。 输出和输出数据是两个一对一的列表。输出只有容量和类型/锁定脚本。输出数据放在对应于索引的outputs_data中。 Header_dep是过去块头哈希的列表,其头数据可以通过CKB脚本访问。 既然我们已经解释了事务的简单结构,让我们来探索一个稍微复杂一点的结构: 脚本 表脚本{ code_hash: Byte32,hash_type: byte,args: Bytes, } 代码哈希和哈希类型用于指定锁单元,参数是锁脚本所需的参数。哈希类型有两个值: :“数据”由0表示,code_hash表示锁单元的数据散列。 :“类型”由1表示,code_hash表示锁定单元格的类型脚本哈希 将hash_type理解为代码很容易,但是类型有什么用呢?CKB的默认锁是按类型索引的。这对签约开发商意味着什么? 您可以看到块0的第二个输出的类型脚本,它是一个typeid脚本,这意味着如果您发布的库也绑定到这个typeid脚本,它将生成一个唯一的id(代码哈希)用于索引数据,并且您可以连续更新这个库的内容而不更改TypeID。引用库的合同不会因库更改而无效。这是在链上更新库的解决方案。 见证 现在所有的RawTransacion字段都已经设置好了,让我们看看见证字段。此字段用于确保交易不会干扰其他交易,并且它还允许合同可能要求的一些临时变量。它由一系列证人组成: 表witnesseeargs { Lock : Bytesopt,//Lock args input _ Type : Bytesopt,//Type args for input output _ Type : Bytesopt,//Type args for output } 最初,输入需要一个见证来验证,但这是低效的,因此当虚拟机验证一个事务时,脚本组用于将事务脚本中一致的输入/输出单元合并到一个脚本组中,并且只执行一次验证。 脚本组的优点是提高了验证速度,减少了验证的消耗,减少了见证的大小。相应的缺点是生成见证的规则要复杂得多。 见证是所有内容的签名:tx_hash、长度和见证值、位于input_group中其他位置的见证的长度和值。 尚未生成见证时,如何对其进行签名?Ckb lock的解决方案是将所有0签名设置为签名,然后覆盖见证。 由于签名消息的长度只能是65个字符,我们首先对要签名的内容进行blake2b哈希,然后对哈希进行签名。 具体签约流程及如何安排不同脚本组见证的约定,请参见:交易如何签约url.cn/5yfunBR 风格和交易费用 通过上述过程,我们获得了一个完整的交易结构。此时,如果我们需要以最低的成本接受交易,我们需要对现有交易进行一些回归测试和修改。 如何估计交易费用? 事务费是序列化事务的大小和执行指令消耗的总和。默认大小单位为1,000千字节/千字节。(香农是1/100,000,000千字节) 但是,矿工可以修改这个默认单位。如果您需要查看实时交易成本估计,您可以使用hestimate_fee_rate通过RPC查看它们。 如果需要最低的成本,输入能力和输出能力之间的差异可以连续调整,然后可以使用二进制搜索方法重新生成事务,直到它被满足。
微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发