http://www.tnmanning.com

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


...


witness 是所有对象的签名:包罗 tx_hash、长度和 witness 值、input_group中其他定位的 witness的长度和值。
我们知道 CKB 与 UTXO 模子很是雷同,这意味着假如没有任何预缓存,就无法得知任何地点的当前状态。构成当前状态的信息大概分手在链上差异的 cell 中。可参考 Cell model 相识 CKB 的数据模子。有两种要领可举办 cell collect:



详细的签名进程和关于如何布置差异剧本组的见证的约定可参考:如何对生意业务签名 url.cn/5yfunBR
  out_point:      OutPoint,

不外抛开这些缺点,让我们从这个要领开始,以更好地领略单位收集是如何事情的。CKB 节点中默认封锁此成果。要打开它,请按如下所示手动变动设置文件并从头启动 CKB 节点:
  outputs_data:   BytesVec,
· 用 0 暗示 code ,这意味着可以直接利用cell data


  lock:                   BytesOpt,          // Lock args
譬喻:你可以查察默认的 lock cell,并利用 dep group 成果将 secp256k1 库分成两个 cell 来存储乘法表和代码。区块巨细是有限的,假如数据太大不能放入一个块中,它可以存储在单独的 cell 中并在运行时一起加载。


如何做?
· cell 收集的顺序是什么?先进先出,按巨细顺序,最佳模子等等

  cell_deps:      CellDepVec,
结构生意业务
[rpc]
  code_hash:      Byte32,
# List of API modules: ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Indexer", "Experiment"]
}
  outputs:        CellOutputVec,
}
在 mckb.toml 中变动以下设置:
当 witness 尚未生成时,如何签名 witness?ckb lock 的方案是配置所有 0 的签名举办签名,然后包围witness。
建设你本身的 Cell 收集处事有什么长处?


table Transaction {
  output_type:            BytesOpt,          // Type args for output

struct CellDep {

witness

你知道如安在 CKB 上构建验证生意业务吗?本日,CKB 开拓者 luochao 就来和各人聊一聊如何用最常见最简朴的方法在 CKB 上构建验证生意业务,快来查察吧。
此刻我们可以开始构建生意业务了。开始之前你需要相识一些配景常识,包罗构建witness,生意业务费的计较和一些小能力。
· 「type」用 1 暗示,code_hash 意味着 lock cell 的 type script hash



CKB 包括的 index 处事不能很好地满意这些需求,而且它不能机动适配将来大概增加的特别需求。最有效的要领是本身构建 cell 收集成果。
  witnesses:      BytesVec,
  index:          Uint32,
生意业务费是序列化生意业务(molecule)的巨细和执行的指令的耗损的总和。默认的巨细单元是 1,000 shannons / KB(千字节)。(Shannon 是 1/100,000,000 CKByte)
这里先容一种标识指定地点的信息(如 live_cell 数量、生意业务数量、总容量)的简朴要领,而不需要任何其他操纵。请留意,由于基于 CKB 节点的 indexer 函数,此要领只合用于基本用法。别的此要领也不支持查找更具体的信息(譬喻,无法定位合约 cell),并且还将耗损 CKB 节点自己的资源。
cell_deps 和 input 是一系列指向链上 live cell 的指针。差异之处在于,dep 是一个引用(只读),在生意业务中利用 input。index 布局为:
· 选择 cell 后是否需要过滤/确认?
· 用 1 暗示 dep group,这意味着这个 cell 中的 data 是一个重定向字段,需要理会 n 个 cell(此处不答允递归),dep group data 用 dVector OutPointVec <OutPoint> 列出所有需要的要点。
  header_deps:    Byte32Vec,


· 「data」用 0 暗示,code_hash 意味着,lock cell的 data hash


我们都知道,生意业务包罗建设和销毁任意数量的 cell,这是生意业务的最简朴界说。由于 cell 利用的机动性,任何有意义的数据都可以存储在 cell 的 data 字段中,各类范例的合约都可以用 type script 暗示。因此,每个用户或用例大概对 cell 收集有差异的需求。
此刻,所有 RawTransacion 字段已经配置完成,来看 witness 字段。这个字段是为了确保生意业务不能改动其他生意业务,而且这个字段还答允包括一些合约大概需要的姑且变量。它由一系列的 witness 构成:
table RawTransaction {
modules = ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Experiment"]

}

· 可以利用哪种 cell?特定的幸运数字或任意的
你可以看到的第 0 个区块的第二个输出的 type script,这是一个 TypeID script,这意味着,假如您宣布的库也绑定这个 typeid script,它将生成一个独一的 id(code hash)用于索引数据,你可以一连更新这个库的内容而不改变typeid。引用库的合约不会因库变动而无效。这是更新链上库的办理方案。

因为签名动静的长度只能是 65 个字符,所以我们首先对要签名的内容举办 blake2b-hash,然后对 hash 举办签名。
b.建设你本身的 Cell 收集处事

  raw:            RawTransaction,
table WitnessArgs {


}
  dep_type:       byte,

利用 ckb run -C<path>  重启 CKB 节点后,通过 RPC 要领 index_lock_hash 注册需索引的地点。请留意:index_from 参数节制索引的起始点,null 值从 chain tip(当前块)开始索引,而 0 值从 genesis 块开始索引。
code_hash 和 hash_type 用于指定 lock cell,args 是 lock script 所需的参数。hash_type 有两个值:
outputs 和 outputs_data 是两个一对一的列表。output 中只有容量和 type/lock script。输出数据放在与索引对应的 outputs_data 中。


header_dep 是已往区块头哈希的列表,这些区块头的头数据可以通过 CKB scripts 会见。
a.利用 ckb indexer 处事
最初,input 需要一个 witness 来验证,但这是低效的,所以当 VM 验证生意业务时,利用 script group,将生意业务剧本中一致的 input/output  cell 归并到一个 script group 中,而且只执行一次验证。
很容易将 hash_type 领略为 code,可是 type 有什么用呢?CKB 的默认 lock 是按 type 索引的。这对合约开拓者意味着什么?


假如不再需要 index 处事,可以通过 RPC 注销监督列表,封锁处事,并从 ckb.toml 中的数组中删除「Indexer」。
样式和生意业务费

然而,矿工可以修改这个默认单位。假如需要查察及时事务用度预计,可以利用 hestimate_fee_rate 通过 RPC 举办查察。

实际上有很多问题有待摸索,每个问题按照差异的用例都大概有差异的谜底:
要害词: CKB  witness  

table Script {
  args:           Bytes,
2. 结构生意业务
struct OutPoint {

既然已经表明白生意业务的简朴布局,此刻让我们摸索稍微巨大一点的布局:
当一个新的区块上链时,区块中作为 input 的 cell 必需从 live cell 会合移除,而区块中的 output 必需添加到 live cell 会合。由于在 PoW 大发3d中常常产生短分叉,当分叉使以前吸收的区块无效时,必需回滚该块的 input 和 output 以变动。缓存设计可有助于加快同步,譬喻,缓存链中的最后 N 个块并删除这些块中利用的 live cell。
如何估算生意业务费?
· 是否有任何 cell data 或 type 需要非凡处理惩罚?

}

1. Cell Collet




  hash_type:      byte,

此刻,期待从头构建 index 处事,然后利用 index 处事的 RPC 接口来查察相应地点的 live_cell/transaction/capacity 值。
tx_hash 和 outputs_index 用于定位 cell。 dep 有一个特另外 dep_type 字段,用于暗示 cell 中的 data 是 code 照旧 dep_group。(请留意,可以利用 dep_group 成果组合多个 cell 中的代码)


  version:        Uint32,

  tx_hash:        Byte32,
modules = ["Net", "Pool", "Miner", "Chain", "Stats", "Subscription", "Experiment", "Indexer"]

在 CKB,任何生意业务必需包括至少一条 input 和一条 output。为告终构生意业务,首先需要定位 input,我们将其称为「cell collect」。




script group 的利益是提高了验证速度,淘汰了验证的耗损,减小了 witness 的巨细。相应的缺点是生成 witness 的法则要巨大得多。

假如需要耗费最低的用度,可以不绝地调解 input capacity 和 output capacity之间的差别,然后利用二分查找要领从头生成生意业务,直到满足为止。
script

  inputs:         CellInputVec,

可看出 indexer 处事默认没有启动。要打开该成果,请向数组 modules 中添加「Indexer」。

所有范例都基于 molecule(一个序列化系统)举办序列化,焦点布局体是:
}

通过以上进程,我们获得了一个完整的生意业务布局。此时,假如需要接管最低用度的生意业务,我们需要对现有的生意业务做一些回归测试和修改。
  input_type:             BytesOpt,          // Type args for input

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。