http://www.yzthzm.com

CKB 交易验证初探

我们都知道 Nervos CKB 是一个以状态为中心的架构,并且用交易表示状态更改和迁移。而且 Nervos CKB 提供基于 Cell Model 和 CKB VM 的编程模型。在这个模型中,去中心化的应用逻辑被分成两个部分:状态生成和状态验证。

状态生成逻辑在客户端运行,新的状态被打包成交易,验证通过后广播到整个网络。简单来说 CKB 的编程模型分成如下三部分:

· 状态生成:链下
· 状态验证:CKB VM
· 状态存储:Cell Model

之前 CKB 开发者 luochao 给大家介绍了如何用最常见最简单的方法在 CKB 上构建交易——也就是状态生成。在本篇文章中,CKB 开发者 DingWei Zhang 和 luochao 将继续分别为大家讲解状态验证的开发细节:「CKB 交易验证的生命周期」和「CKB VM 验证规则」。 

CKB 交易验证生命周期

CKB 交易验证初探

RPC

首先,发送方会构造一笔交易,通过 RPC 提交。交易由提交到的 outputs_validator (从 0.27.0 版本引入)进行验证。

默认的验证逻辑包括检查各种东西:

transaction.outputs.all{ |output|
    let script = output.script
    (script.code_hash == secp256k1_blake160_sighash_all && script.hash_type == "type" && script.args.size == 20) ||
    (script.code_hash == secp256k1_blake160_multisig_all && script.hash_type == "type" && (script.args.size == 20 || (script.args.size == 28 && script.args[20..28].is_valid_since_format))
}
transaction.outputs.all{ |output|
    let script = output.type
    script.is_null || script.code_hash == dao && script.hash_type == "type"
    || (script.has_lock_period() && since.is_absolute())
}

此验证旨在防止格式不正确的交易,例如在 Common Gotchas 中提到的交易。
https://github.com/nervosnetwork/ckb/wiki/Common-Gotchas#nervos-dao

此外,可以将其配置为 passthrough 以跳过此验证。

交易提交到本地节点后,节点还会输出交易 id,您可以使用该 id 跟踪交易的状态。

验证

在广播交易并进入 mempool 之前,交易将在本地验证和执行。

步骤 1——Resolve

本质上,交易 input 只是指针,如下所示:

struct OutPoint {
    tx_hash:        Byte32,
    index:          Uint32,
}

我们在交易执行之前通过指针收集引用的数据,这个过程称为「解析交易」。我们还需要检查这个交易的所有输入都是有效的(没有重复或双花)。

步骤 2——验证

验证步骤需要检查如下要素: 

1、版本(目前必须是 0)
2、serialized_size 必须小于如下限制:

pub fn serialized_size(&self) -> usize {    // the offset in TransactionVec header is u32
    self.as_slice().len() + molecule::NUMBER_SIZE
    // molecule::NUMBER_SIZE = size_of::<u32>() 4
}

3、inputs 不是空的

inputs().is_empty() || outputs().is_empty()

4、inputs 是成熟的

对于每个 input 和 dep,如果引用的 output 交易是 cellbase,那么它必须至少经过 4 个 epoch 确认。

5、capacity

input capacity 的和必须小于或等于 output capacity

6、duplicate_deps

deps 不能重复

7、outputs_data_verifier

「output data」字段的数量必须等于 outputs 的数量

8、since

since 值必须遵循 RFC:Transaction valid since
https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0017-tx-valid-since/0017-tx-valid-since.md

CKB VM 将执行交易脚本,并输出所消耗的 cycles 个数。

向网络广播

如果验证成功,当前节点将交易(带有 cycles 值)广播给它的所有对等节点(它所连接的节点)。

在验证失败的情况下,将不再广播交易。交易流经各个「完整节点」,这些节点重复前面步骤中描述的验证过程,并检查 cycle 值是否与验证交易时使用的实际 cycle 相匹配。

Tx-pool

CKB 交易验证初探

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