文中提到的下面一些词,中英文是等价的:

  • state:状态
  • asset:资产
  • First-class:一等
  • Account:账户

从一等函数到一等资产

一等函数(First-class Function):函数编程中,函数可以赋值给一个变量,可以当做参数传递给另外一个函数,也可以从一个函数当做返回值返回。这时候函数和数据也没什么区别,所以我们叫它“一等公民(First-class Citizen)”。这样的函数就是一等函数。

CKB的Cell模型用来构建整个区块链的状态,Cell模型的设计是和目前区块链都不同的一种设计模式,从这个模式中,用户定义的加密资产就像“一等公民”一样。后面我们一步步详细解释。

状态模型

在解释CKB的状态模型前,有必要先了解目前常见的两种状态模型:

  • UTXO 模型
  • Account 模型

UTXO

UTXO全称是Unspent Transaction Output,比特币就是典型的一个例子,每一个UTXO可以看做是一个带有一定面值的单元,这个面值表示未来是可以花掉的,谁可以花掉它呢?这个面值的主人是在UTXO的锁定脚本(lock script)中指定的。

比特币区块链中,所有的UTXO是由全节点来维护的,当前所有的UTXO被称为比特币账本的当前状态。当有转账发生时,则一些UTXO的主人会发生变化。

Nervos CKB区块链中的一等资产-Rebase

 

Account 模型

账户模型类似于我们现实世界中的银行模型,以太坊(Ethereum)和其它很多区块链都在用它。

有两种账户:外部账户和合约账户。

外部账户的主人一般是现实中的人,由人持有的私钥来觉得所有权;合约账户的主人是在合约的代码中指定的。

转账的时候,ETH会从转账人的账户余额中减掉然后加到接收人的账户余额中。

Nervos CKB区块链中的一等资产-Rebase

 

First-class Coin

coin在UTXO模型中是一等公民,每个UTXO都有一个唯一的标识符。用户可以直接操作coin,操作coin的行为会被作为交易发送到网络中,会最终改变UTXO集合/状态。而UTXO中的账户概念只存在于钱包等应用中,他们实际上是用户可以操作的coin的总和。coin在UTXO模型中是First-class Citizen,所以可以被称为First-class Coin。

对于Account模型来说,Account是First-class Citizen,是用户直接交互的对象。如果用户想转账,那用户就会直接和Account这个object来对话。转账的时候会构造一笔交易,交易中有一个字段msg.value表明了转账的数目,这个value只是针对ETH而言的。因为ETH是一种资产(Asset),所以我们称ETH为First-class Asset。

对于用户自己定义的资产,比如我发了一个ERC20 token叫CatCoin,CatCoin这个资产存在于智能合约中,智能合约在这里更像是第三方账本,这个第三方的账本可能会是这样的,通过mapOwnerToBalance这样的数据结构来记录每个address所对应的余额是多少,然后每当转账发生时,我只需要修改这个数据结构就好了。

mapping (address => unit256) public mapOwnerToBalance;

我无法直接给你转10个CatCoin,因为上面提到的msg.value只是针对ETH而不能是用户自定义的资产。

因此ETH是First-class Asset,而用户自定义的资产不是First-class Asset。

CKB / First-class State

要保证First-class Asset,前提是Asset对应的state必须是First-class State。

Nervos CKB是一个具有全球共识的网络,通过把CKB的state划分成更小的单元可以更好的组织state,这个更小的单元叫做Cell,和UTXO类似每个Cell都有一个唯一的标识符,可以被引用或者作为参数传递到别的脚本。Cell在CKB中是First-class Citizen,这也说明了state在CKB中是First-class State。

Nervos CKB区块链中的一等资产-Rebase

 

Cell包含四个字段:Capacity, Data, Lock, 和 Type。一个Cell的主人可以直接更新Cell的state,而对于Account模型来说是无法做到这一点的(只能通过合约的代码来实现)。

 

CKB很好地体现了一种基于状态的编程模型,这样的模型更加适合分层架构,Layer 1只是一个状态层,而不是计算层,把所有的计算都放到Layer 2去解决。

 

另外一个好处是,在CKB中不需要区分状态(state)和代码(code)了,状态和代码都可以存储到CKB中的data字段中,然后可以互相引用,如下图所示。

Nervos CKB区块链中的一等资产-Rebase

 

因此,再也不用像Account模型一样将状态和代码混合在一起去管理了,开发者可以直接加载data字段,根据data的属性进行解释,如果是代码就可以执行,如果是数据就可以进行读写操作。Simple and powerful!

 

在每一个Cell中都通过lock字段来指定Cell的所有者,因此让让状态所有权的表达更加容易。如果当前状态对应的是一个资产,那也让实现了First-class Asset。

CKB First-class Asset

Nervos CKB区块链中的一等资产-Rebase

 

从上图我们可以看到,用户自定义的asset在系统中是一个独立的对象。每一个asset都是一个Cell,可以看做是UTXO模型的一种泛化。

 

CKB的First-class Asset模型有以下优点:

  • 资产的 Cell可以作为参数传入到其他合约中
  • 资产定义Cell和资产State Cell分开。资产定义的Cell是由资产发布者拥有的,而每一个资产Cell是由用户拥有的。所有权完全由Lock来定义,First-class Asset完全由用户掌控,而不是掌握在资产发行方或者合约中。
  • 解决了状态存储经济模型的难题。在以太坊的合约中,因为所有用户的状态都混合在一起,所以很难去要求每个用户支付存储费用,如果某个用户没有支付,那显然不能把整个合约删除。而对于Cell模型,整个Cell都是属于用户自己的,所以非常容易去收取这个费用。
  • 资产的定义可以非常容易地升级而对其它部分没有影响,因为数据和代码是分开的,资产定义和用户的资产所有权也是分开的。

总结

Cell模型是一个高度抽象的模型,不同于UTXO和Account模型。除了其特有的状态模型外,CKB也将计算部分从链上去掉,而只做状态的验证。相信这种特有的状态模型和计算-验证分离将开启新的DApp架构和设计模式。

文中提到的技术已经在Nervos CKB上实现出来了,感兴趣参考下面的链接:

  • https://github.com/nervosnetwork/ckb-demo-ruby-sdk
  • https://github.com/nervosnetwork/ckb
  • https://github.com/nervosnetwork/ckb-vm

本文主要翻译自 First-class Asset,另外还参考了:

  • Bitcoin Transaction: https://en.bitcoin.it/wiki/Transaction
  • Looking at ownership in the EVM: https://medium.com/@kelvinfichter/looking-at-ownership-in-the-evm-6e6914d341d

 

原文始发于微信公众号(Rebase社区):Nervos CKB区块链中的一等资产