文中提到的下面一些词,中英文是等价的:
- 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的主人会发生变化。
Account 模型
账户模型类似于我们现实世界中的银行模型,以太坊(Ethereum)和其它很多区块链都在用它。
有两种账户:外部账户和合约账户。
外部账户的主人一般是现实中的人,由人持有的私钥来觉得所有权;合约账户的主人是在合约的代码中指定的。
转账的时候,ETH会从转账人的账户余额中减掉然后加到接收人的账户余额中。
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。
Cell包含四个字段:Capacity, Data, Lock, 和 Type。一个Cell的主人可以直接更新Cell的state,而对于Account模型来说是无法做到这一点的(只能通过合约的代码来实现)。
CKB很好地体现了一种基于状态的编程模型,这样的模型更加适合分层架构,Layer 1只是一个状态层,而不是计算层,把所有的计算都放到Layer 2去解决。
另外一个好处是,在CKB中不需要区分状态(state)和代码(code)了,状态和代码都可以存储到CKB中的data
字段中,然后可以互相引用,如下图所示。
因此,再也不用像Account模型一样将状态和代码混合在一起去管理了,开发者可以直接加载data
字段,根据data的属性进行解释,如果是代码就可以执行,如果是数据就可以进行读写操作。Simple and powerful!
在每一个Cell中都通过lock
字段来指定Cell的所有者,因此让让状态所有权的表达更加容易。如果当前状态对应的是一个资产,那也让实现了First-class Asset。
CKB First-class Asset
从上图我们可以看到,用户自定义的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区块链中的一等资产