CKB/CKB-VM/理解 Cell 模型
如果你来自比特币或以太坊的世界, 你可能会习惯于 UTXO 或者账户余额的概念. 但在 CKB 的世界里, 用于管理资产和状态的基本单位是 Cell.
不要被这个新概念吓到, 其实它比你想象的要直观得多.
如果你了解过比特币的 UTXO 模型, 那么你已经有了理解 Cell 的基础: Cell 的概念基于 UTXO, 并在其上添加了一些小小的点缀.
Cell 是什么
简单来说, Cell 是 CKB 账本中的基本单位. 如果把 CKB 比作一个巨大的, 永不停止运转的档案馆, 那么 Cell 就是其中的一个个抽屉. 每个抽屉里都可以存放一些东西, 每个抽屉都被上锁了, 并且每个抽屉有不同的大小和形状. 锁决定了谁能打开它, 大小和形状决定了它能存放什么以及存放多少.
核心定义
在 CKB 协议中, 一个 Cell 包含四个主要字段:
- Capacity(容量): 代表这个 Cell 的大小(以字节为单位). 它也代表了你拥有的 CKB 代币数量. 在 CKB 中, 你拥有多少 CKB 代表着你能在链上存储多少字节数据.
- Data(数据): Cell 里面存放的实际内容(比如一段代码, 一个状态, 或者一段文字). 你不总需要装满这个抽屉, 例如你拥有 1024 CKB, 但你只用其中的 64 字节来存储数据, 那么剩下的空间就空着. 绝大部分人的钱包里的 Cell 里都是空的, 因为他们只是用来存储价值而不是数据.
- Lock Script(锁定脚本): 决定了谁拥有这个 Cell. 所谓的拥有并不是说你在链上有一个账户, 而是说你有一把钥匙可以打开这个 Cell 的锁.
- Type Script(类型脚本): 定义了 Cell 中数据的约束, 例如我们可以规定这个 Cell 里只能存储整数而不能存储字符串. 这就像是抽屉的形状, 只有符合特定形状的物品才能放进去.
一个直观的图形表示如下:
+------+-------------+------------------------------------------------------+
| | Capacity | Defines the maximum size of the cell, 1 ckb = 1 byte |
| +-------------+------------------------------------------------------+
| | Data | Any binary data, can be empty |
| Cell +-------------+------------------------------------------------------+
| | Lock Script | Defines who can unlock this cell |
| +-------------+------------------------------------------------------+
| | Type Script | Defines the rules for the data in this cell |
+---------------------------------------------------------------------------+
你可以见到, 相比起比特币的 UTXO 模型, CKB 的 Cell 多了 Data 和 Type Script 这两个字段. 这使得 Cell 不仅仅是一个价值载体, 还可以承载状态和逻辑, 从而实现了图灵完备的智能合约能力. 如果你将 CKB 的一个 Cell 的 Data 和 Type Script 设置为空, 那么它就退化成了一个普通的 UTXO, 这也是为什么说 CKB 的 Cell 模型是对 UTXO 模型的扩展.
大多数钱包里的 Cell 的 Data 和 Type Script 都是空的, 因为他们只是用来存储价值而不是数据. 但对于开发者来说, Cell 的 Data 和 Type Script 是实现各种复杂应用的关键.
Cell 的命名来源
在生物学中, 细胞是生命的基本单位, 它们包含了 DNA(信息), 并且可以通过新陈代谢进行演变. CKB 的 Cell 也是如此, 它是携带状态, 逻辑和价值的最小载体.
这个命名非常精妙.
生物体内的细胞会进行新陈代谢, CKB 的 Cell 就像生物细胞一样, 也是通过不断地被销毁和重建来实现状态的更新和价值的转移. 同时, 已分化的细胞通常是不可变的, CKB 的 Cell 也是如此. 你不能直接修改一个已存在的 Cell 里的数据: 你只能销毁这个 Cell, 然后创建一个新的 Cell 来替代它.
Cell 构建的交易
一笔典型的 CKB 交易包含:
- 输入: 指向一些现有的, 处于未花费状态的 Cell.
- 输出: 创建一些全新的 Cell.
如果你想把 Cell A 里的数据从 1 改成 2, 你会发起一笔交易, 在输入中引用 Cell A, 然后在输出中创建一个内容为 2 的新 Cell B. 一旦这笔交易被确认, Cell A 就被销毁了, Cell B 就诞生了. 这是 CKB 中状态更新的基本机制.
Cell 碎碎谈
在 CKB 中, 1 CKB 代币等于 1 字节的链上存储空间. 如果你有一个 100 CKB 的 Cell, 意味着这个 Cell(包括所有字段)总共不能占用超过 100 字节的空间. 这是一种非常有意义的设计: 它将资产所有权与链上资源占用直接挂钩. 如果你想在链上存储更多数据, 你就需要拥有更多的 CKB. 这是 CKB 真正的底层价值来源: CKB 的价值源于公众愿意为在链上存储数据支付的费用.
CKB 钱包里显示的 CKB 余额其实就是你拥有的链上存储空间的大小, 这是一种权限和资源的双重体现.
Cell 里的 Lock Script 是你的钥匙孔, 当你想要消费一个 Cell 时, 你必须提供符合这个 Lock Script 要求的证明(通常是密码学签名). 没有正确的钥匙, 谁也动不了你的抽屉.
Type Script && Data 的组合则是 CKB 的魔法所在. 这是 CKB 最强大的地方. Data 可以存储任何二进制数据, 而 Type Script 则是规则. 比如, 如果你想发行一种代币, 你可以编写一个 Type Script 规定: 这个 Cell 里的 Data 必须是一个数字, 且输入里的数字总和必须等于输出里的数字总和. 这样, 你就可以在链上实现一个简单的代币系统. 大多数复杂的智能合约逻辑都可以通过巧妙地设计 Type Script 和 Data 来实现, 这也是 CKB 的核心竞争力: 在比特币 UTXO 模型的基础上实现了图灵完备的智能合约能力.
习题
例: 如果一个 Cell 的 Capacity 数值是 64, 它的 Lock Script 占用了 53 字节, Type Script 为空. 你还能在这个 Cell 里存更多数据吗?
答: 可以. 因为 Cell 的总容量是 64 字节, 其中 Capacity 自身以 uint64 表示, 需要占用 8 字节, 另外 53 字节被 Lock 占用, 所以剩下的空间只有 3 字节, 这意味着你只能在 Data 字段存储最多 3 字节的数据.
一个直观的图形表示如下:
+------+-------------+----+
| | Capacity | 8 |
| +-------------+----+
| | Data | 3 |
| Cell +-------------+----+
| | Lock Script | 53 |
| +-------------+----+
| | Type Script | 0 |
+------+-------------+----+
| Total | 64 |
+-------------+----+
例: 为什么说比特币的 UTXO 模型和 CKB 的 Cell 模型比以太坊的账户模型更利于并行处理交易?
答: 这类似现金支付和银行账户排队结账的区别. 现金支付允许多个交易同时进行, 因为每笔交易只涉及特定的现金, 不会互相干扰. 账户模型则需要对账户余额进行全局锁定, 导致交易必须串行处理.