http://www.www.tnmanning.com

CKB 的交易结构

在本篇文章中,让我们和 CKB 开发者 Ian 一起深入探究 CKB 基本的数据结构——交易。

这篇文章分成两个部分。第一个部分包含了核心的交易特征,而第二部分介绍一些扩展内容。在撰写本文时,对应的 CKB 版本是 v0.25.0,在未来的版本中交易结构还可能有所变动。您可以点击阅读原文,查看最新版本。

CKB 的交易结构

上图是关于交易结构的概览。有别于逐字逐句的解释各个名词,我将会介绍 CKB 转账能够提供的各种特殊结构,以及这些名词在其中的具体意思。

Part I:核心特征

价值储存

CKB 采用的是 UTXO 模型。一笔交易销毁了一些在先前交易下创建的输出(作为输入),并且创建一些新的输出,我们在 CKB 中将此交易输出称做一个 Cell。因此在这里的 Cell 和交易输出是可以替换的。

下图显示了在此层中会出现的专有名词。

CKB 的交易结构

此交易销毁了 inputs 中的 Cell,同时创建了在 outputs 中的 Cell。

CKB 主链将交易打包成块。我们可以在区块中利用从零(也就是创世区块)开始递增的非负整数(编号),作为区块编号来关联链上的区块。在区块中的交易也是按照顺序排列的。我们可以说编号较小的区块是较早(old)的区块,如果一个交易在较早的区块上,或者它所在的区块的位置早于其它区块,那么它也会是比较早的交易。在下面的示例中,区块 i 比区块 i+1 早。交易 tx1 要比 tx2 早,也比 tx3 早。

CKB 的交易结构

在所有先前的交易中,一个可用(Live)的 Cell 会以输出而非输入的形式出现。一个被销毁(Dead)的 Cell 代表它是以输入的形式在其它较早的交易中被使用过。一个交易只能以可用的 Cell 作为输入。

我们可以从除了 witnesses 之外的所有交易字段计算交易的哈希。关于如何计算交易哈希的更多信息,可以参阅附录 A。

交易哈希是独一无二的。因为一个 Cell 总是被一个交易创建出来,而每个新的 Cell 在交易输出的数组中都有他自己的位置,所以我们可以通过交易哈希以及输出索引去指向一个 Cell。OutPoint 结构是一种引用类型。交易在输入时会使用 OutPoint 来指向先前被创建的 Cell,而非嵌入其中。

CKB 的交易结构

Cell 将 CKB 代币存储在字段 capacity 中。一个交易不能够凭空铸造 capacity,所以交易必将符合以下规则:

sum(cell's capacity for each cell in inputs)
≥ sum(cell's capacity for each cell in outputs)

在输入中每个 Cell 容量的总和要大于等于在输出中每个 Cell 容量的总和。

矿工可以收取这两者之间的价差做为手续费。

fee = sum(cell's capacity for each cell in inputs)- sum(cell's capacity for each cell in outputs)

如果你熟悉一分PK10,那么就会发现在价值储存层都是相似的,但是一分PK10缺乏锁定脚本来保护交易输出的所有权。CKB 正好有这个特征,但是在我们探讨这个话题之前,让我们先来谈谈 Cell Data 和 Code Locating 层吧,这是任何 CKB 中脚本特征的依据。

Cell Data

除了能够存储价值通证以外,CKB Cell 还能储存任意数据。

CKB 的交易结构

字段 outputs_data 是输出的并行数组。在 outputs 中第 i 个 Cell 的数据对应的是 outputs_data 中的第 i 项。

Cell 中的 capacity 不只代表通证的数量,也代表能够存储数据的限制。这也是它如此命名的原因,因为它代表 Cell 的存储容量。

capacity 不仅能用于存储数据,它还需要涵盖 Cell 中的所有字段,包括  data、 lock、type 以及 capacity 本身。

计算占用容量的规范请参考:

https://github.com/nervosnetwork/ckb/wiki/Occupied-Capacity

交易势必会创建一个占用容量小于(输入) Cell 容量的输出 Cell。

occupied(cell) ≤ cell's capacity

代码定位

Cell 中有两个字段的类型是 Script。CKB-VM 会运行所有输入 Cell 中的 lock 脚本,还会运行所有输入和输出 Cell 中的 type 脚本。

我们区分了代码和脚本这两种术语:

· 脚本具有脚本结构
· 代码是 RISC-V (可运行的)二进制
· 一个代码 Cell 是其数据为代码的 Cell

脚本并没有直接包含代码。看看下面的脚本结构。现在我们可以忽略哈希类型的 Type 以及 args 字段。

CKB 的交易结构

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