你告诉如何在 CKB 上建构检验交易吗?今天,CKB 开发者 luochao 就来和大家闲谈一聊如何用最少见最简单的方式在 CKB 上建构检验交易,慢来查阅吧。1. Cell Collet在 CKB,任何交易必需包括最少一条 input 和一条 output。为了结构交易,首先必须定位 input,我们将其称作「cell collect」。
我们告诉 CKB 与 UTXO 模型十分类似于,这意味著如果没任何实内存,就无法获知任何地址的当前状态。构成当前状态的信息有可能集中在链上有所不同的 cell 中。可参照 Cell model 理解 CKB 的数据模型。
有两种方法可展开 cell collect:a.用于 ckb indexer 服务这里讲解一种标识登录地址的信息(如 live_cell 数量、交易数量、总容量)的非常简单方法,而不必须任何其他操作者。请注意,由于基于 CKB 节点的 indexer 函数,此方法只限于于基础用法。
另外此方法也不反对查询更加详尽的信息(例如,无法定位合约 cell),而且还将消耗 CKB 节点本身的资源。不过充满著这些缺点,让我们从这个方法开始,以更佳地解读单元搜集是如何工作的。CKB 节点中配置文件重开此功能。要关上它,请求按如下右图手动变更配置文件并重新启动 CKB 节点:在 mckb.toml 中变更以下配备:[rpc]...# List of API modules: ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Indexer", "Experiment"]modules = ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Experiment"]可显现出 indexer 服务配置文件没启动。
要关上该功能,请求向数组 modules 中加到「Indexer」。modules = ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Experiment", "Indexer"]用于 ckb run -Cpath 重新启动 CKB 节点后,通过 RPC 方法 index_lock_hash 登记须要索引的地址。
请注意:index_from 参数掌控索引的接续点,null 值从 chain tip(当前块)开始索引,而 0 值从 genesis 块开始索引。现在,等候新的建构 index 服务,然后用于 index 服务的 RPC 模块来查阅适当地址的 live_cell/transaction/capacity 值。
如果仍然必须 index 服务,可以通过 RPC 吊销监控列表,重开服务,并从 ckb.toml 中的数组中移除「Indexer」。b.创立你自己的 Cell 搜集服务创立你自己的 Cell 搜集服务有什么益处?我们都告诉,交易还包括创立和封存给定数量的 cell,这是交易的最简单定义。由于 cell 用于的灵活性,任何有意义的数据都可以存储在 cell 的 data 字段中,各种类型的合约都可以用 type script 回应。
因此,每个用户或用例有可能对 cell 搜集有有所不同的市场需求。实质上有许多问题尚待探寻,每个问题根据有所不同的用例都有可能有有所不同的答案:· cell 搜集的顺序是什么?先进先出,按大小顺序,最佳模型等等· 可以用于哪种 cell?特定的幸运地数字或给定的· 否有任何 cell data 或 type 必须类似处置?· 自由选择 cell 后否必须过滤器/证实?CKB 包括的 index 服务无法很好地符合这些市场需求,并且它无法灵活性兼容未来有可能减少的额外市场需求。最有效地的方法是自己建构 cell 搜集功能。如何做到?当一个新的区块上链时,区块中作为 input 的 cell 必需从 live cell 集中于去除,而区块中的 output 必需加到到 live cell 集中于。
由于在 PoW 区块链中常常再次发生较短末端,当末端使以前接管的区块违宪时,网卓新闻网,必需回滚该块的 input 和 output 以变更。内存设计可有助加快实时,例如,内存链中的最后 N 个块并移除这些块中用于的 live cell。2. 结构交易现在我们可以开始建构交易了。
开始之前你必须理解一些背景科学知识,还包括建构witness,交易酬劳的计算出来和一些小技巧。结构交易所有类型都基于 molecule(一个序列化系统)展开序列化,核心结构体是:table RawTransaction { version:Uint32, cell_deps: CellDepVec, header_deps:Byte32Vec, inputs:CellInputVec, outputs:CellOutputVec, outputs_data: BytesVec,}table Transaction { raw:RawTransaction, witnesses: BytesVec,}cell_deps 和 input 是一系列指向链上 live cell 的指针。不同之处在于,dep 是一个提到(读入),在交易中用于 input。index 结构为:struct OutPoint { tx_hash:Byte32, index: Uint32,}struct CellDep { out_point: OutPoint, dep_type: byte,}tx_hash 和 outputs_index 用作定位 cell。
dep 有一个额外的 dep_type 字段,用作回应 cell 中的 data 是 code 还是 dep_group。(请注意,可以用于 dep_group 功能人组多个 cell 中的代码)· 用 0 回应 code ,这意味著可以必要用于cell data· 用 1 回应 dep group,这意味著这个 cell 中的 data 是一个重定向字段,必须解析 n 个 cell(此处不容许迭代),dep group data 用 dVector OutPointVec OutPoint 所列所有必须的要点。例如:你可以查阅配置文件的 lock cell,并用于 dep group 功能将 secp256k1 库分为两个 cell 来存储乘法表和代码。
区块大小是受限的,如果数据过于大无法放进一个块中,它可以存储在分开的 cell 中并在运营时一起读取。outputs 和 outputs_data 是两个一对一的列表。
output 中只有容量和 type/lock script。输入数据放到与索引对应的 outputs_data 中。
header_dep 是过去区块头哈希的列表,这些区块头的头数据可以通过 CKB scripts 采访。既然早已说明了交易的非常简单结构,现在让我们探寻略为简单一点的结构:scripttable Script { code_hash: Byte32, hash_type: byte, args: Bytes,}code_hash 和 hash_type 用作登录 lock cell,args 是 lock script 所需的参数。
hash_type 有两个值:· 「data」用 0 回应,code_hash 意味著,lock cell的 data hash· 「type」用 1 回应,code_hash 意味著 lock cell 的 type script hash很更容易将 hash_type 解读为 code,但是 type 有什么用呢?CKB 的配置文件 lock 是按 type 索引的。这对合约开发者意味著什么?你可以看见的第 0 个区块的第二个输入的 type script,这是一个 TypeID script,这意味著,如果您公布的库也初始化这个 typeid script,它将分解一个唯一的 id(code hash)用作索引数据,你可以持续改版这个库的内容而不转变typeid。提到库的合约会因库变更而违宪。
这是改版链上库的解决方案。witness现在,所有 RawTransacion 字段早已设置已完成,来看 witness 字段。这个字段是为了保证交易无法伪造其他交易,并且这个字段还容许包括一些合约有可能必须的临时变量。
它由一系列的 witness 构成:table WitnessArgs { lock: BytesOpt, // Lock args input_type:BytesOpt, // Type args for input output_type:BytesOpt, // Type args for output}最初,input 必须一个 witness 来检验,但这是陈旧的,所以当 VM 检验交易时,用于 script group,将交易脚本中完全一致的 input/output cell 拆分到一个 script group 中,并且只继续执行一次检验。script group 的优点是提升了检验速度,增加了检验的消耗,增大了 witness 的大小。适当的缺点是分解 witness 的规则要简单得多。witness 是所有东西的亲笔签名:还包括 tx_hash、长度和 witness 值、input_group中其他定位的 witness的长度和数值。
当 witness 仍未分解时,如何亲笔签名 witness?ckb lock 的方案是设置所有 0 的亲笔签名展开亲笔签名,然后覆盖面积witness。因为亲笔签名消息的长度不能是 65 个字符,所以我们首先对要亲笔签名的内容展开 blake2b-hash,然后对 hash 展开亲笔签名。明确的亲笔签名过程和关于如何决定有所不同脚本组的亲眼的誓约可参照:如何对交易亲笔签名 url.cn/5yfunBR样式和交易酬劳通过以上过程,我们获得了一个原始的交易结构。
此时,如果必须拒绝接受低于费用的交易,我们必须对现有的交易做到一些重返测试和改动。如何估计交易酬劳?交易酬劳是序列化交易(molecule)的大小和继续执行的指令的消耗的总和。
配置文件的大小单位是 1,000 shannons / KB(千字节)。(Shannon 是 1/100,000,000 CKByte)然而,矿工可以改动这个配置文件单元。
如果必须查阅动态事务费用估算,可以用于 hestimate_fee_rate 通过 RPC 展开查阅。如果必须花费低于的费用,可以大大地调整 input capacity 和 output capacity之间的差异,然后用于二分查询方法新的分解交易,直到失望为止。
本文来源:gd55光大在老品牌-www.jzhyly.com