链眼社区:专注于区块链安全,区块链数据分析, 区块链信息整合,区块链技术服务和区块链技术咨询。

使用 Cell 模型将 UTXO 实现为用户定义的令牌
扫地僧
2022-06-19 16:31:10

一. 使用 Cell 定义标记

如果我们要创建一个名为 SatoshiCoin 的 UDT(用户定义代币),它的状态传输必须符合以下约束:

  1. 用户必须证明自己是输入代币的所有者;

  2. 每笔交易的输入代币数量必须大于或等于输出代币数量。

第一个约束可以用一个锁脚本来表示,类似于比特币中的scriptPubKey。(如果你对此感兴趣,可以在这里查看示例代码。)第二个约束被硬编码到比特币的底层架构中,但在 CKB 中是由 Cell 的类型脚本实现的。

一个 Cell 中“持有”的 SatoshiCoin 数量是一种状态。它的结构由类型定义为保存在 SatoshiCoin Cell 数据中的 8 字节字符串,“数量”是存储在这 8 字节中的序列化整数:

{ 
“amount”: “Bytes[8]”// 序列化整数
}

类型脚本可以包含管理用户新定义类型的所有逻辑。我们希望 SatoshiCoin 能够像比特币一样验证交易,因此需要在所有用作交易输入的 Cell 上执行类型脚本(请记住,CKB 通过销毁 Cell 并创建新 Cell 来更改状态)。可以使类型脚本包含确保替换输入单元的新创建的单元不会铸造新的 SatoshiCoin 的逻辑。

附加的示例类型脚本代码在验证交易时会查看所有 SatoshiCoin 单元。(https://github.com/nervosnetwork/ckb-ruby-scripts/blob/a75b5df8fdf833b7316bbd9213f73436401c86a5/udt/unlock.rb)

我们创建了一个简单的类似 UTXO 的令牌,只需定义锁定和类型脚本。(这里需要注意的是,一个具有 SatoshiCoin 所需最小容量的单元不能用于制造两个也具有相同状态容量的新单元。)

Lock 和 type 脚本不仅可以读取保存在自己 Cell 中的状态,还可以引用和读取保存在其他 Cell 中的状态。因此 CKB 提出了一个有状态的编程模型。值得一提的是,有状态的编程模型而不是图灵完备性是使以太坊如此强大的原因。

我们可以将类型脚本保存在一个独立的 Cell 中,并在每个 SatoshiCoin Cell 的类型中引用它。好处是同类型的脚本只需要占用一个存储空间。存储数字资产定义的 Cell 称为 ADC(资产定义单元)。SatoshiCoin 实现的另一个特点是资产及其所有者的详细记录被拆分并保存在多个独立的 Cell 中,可由开发人员提供给用户。这些单元归用户自己所有,甚至可以出租给用户。只有明确共识空间的所有权,用户才能真正拥有自己cell中保存的资产(任何cell的数据都可以是资产)。由于允许用户在 CKB 上拥有共识空间,他们也可以拥有保存在其中的数字资产(以房地产为例:

Cell模型作为一种抽象的状态验证模型,提供了一个内部非结构化的存储空间(数据),并支持任何状态验证规则(类型)和所有权验证规则(锁)。我们可以模拟 UTXO 模型在 Cell 模型中的工作方式(如 SatoshiCoin 所示),或者在其中构建 Account 模型。

交易输入的验证需要执行锁定脚本,确保用户对输入的所有权和销毁相应 Cell 的权利。交易输出的验证需要执行类型脚本,确保用户生成的新状态符合类型脚本的约束,并正确创建新的 Cell。

CKB 的编程模型与以太坊有很大的不同,因为它采用了独特的状态模型,将计算和验证分开。因此,需要进一步探索以寻找 CKB 编程模型的最佳实践。