Nervos CKB提出了一种与传统的以太坊区块链不同的解决方案

随着用户的增长,以太坊区块链性能和可扩展性不足的劣势逐渐凸显

在以太坊区块链上,所有智能合约的计算都被放到链上进行,这导致一个合约会被全网的全节点执行无数次进行验证

而在CKB中,则采用了链下计算、链上验证的方式,降低区块链的运行成本

除此之外,CKB使用的RISC-V的虚拟机,尽可能提升程序的执行效率,并能让我们使用底层语言自由的实现各种复杂算法而不必担心虚拟机的效率

基本概念

在CKB中,没有像以太坊一样的合约账户等概念。但仍然可以像以太坊一样方便的发行用户自定义代币。这得益于CKB中一个独特的概念——Cell。一个Cell是存储数据的单元,其既可以存储状态数据,也可以是用户持有某种代币或者财产的凭证。

每个Cell有一定的Capacity,即容量,1Byte的容量即对应一个CKB代币。

Cell对应有2个重要的数据结构,Type Script和Lock Script。

Lock Script决定谁能改变Cell的状态。如果一个用户想要改变一个Cell的状态,则必须满足Lock Script的要求。Lock Script是允许开发者自行实现的,这也就给了开发者极大的自由性。例如开发者可以在Lock Script中使用C语言实现以太坊的账户哈希算法,那么就可以允许自己运行在CKB网络上的应用完全兼容以太坊的钱包和地址。

而Type Script则决定了Cell变化的规则。例如在以太坊中,我们可以将自己的某种代币锁定到某个特定的合约中,以便获取收益。但是在CKB不存在这样的合约账户。但可以通过修改Cell的Type Script实现这样的限制,虽然Cell仍然保存在用户的账户中,但处于锁定状态。这样的实现方式不需要把所有财产都转移到一个合约账户中,具有更好的抵抗黑客攻击的能力。

例如,下图为测试网络上水龙头产生的10000CKB的对应Cell,这里使用的Lock Script即是CKB网络的哈希算法,用户必须拥有私钥才能解锁Cell:

image-20210418153728104

一个简单的合约部署实验

从理论上讲,CKB网络上没有智能合约的概念。但我们可以将智能合约作为Cell的Type Script,在Cell产生和转移时都会触发这个Script的执行。

为了简单起见,这里使用CKB Studio进行实验:https://github.com/ObsidianLabs/CKB-Studio

  1. 在左下角钥匙串中添加两个测试账号

    image-20210418154513383

  2. 在右上角NetWork-Local中启动本地测试链,并指定矿工为test2账号

    image-20210418154427997

  3. 创建一个Project,使用最简单的代码如下:

    int main(int argc, char* argv[])
    {
      if (argc == 3) {
        return -2;
      } else if (argc == 5 ) {
       return -3;
      } else {
       return 0;
      }
    }

    上述代码的含义很简单,在CKB中,只有main函数返回值为0才能成功执行,否则交易回滚,因此参数的数目不为3或者5即可成功执行交易

  4. 点击编译按钮将其编译为.o文件

  5. 进入TX Constructor,并在右侧下拉中选择test2账号

    image-20210418154921027

  6. 接下来在下方Live Cell中可以发现挖矿获得的大量Cell奖励

    image-20210418155030405

  7. 点击New Cell,选择文件,即刚刚编译好的.o文件,直接提交交易,可以得到一个交易哈希和对应的Code Hash

    image-20210418155631893

  8. 接下来再创建一个交易,容量任意,将Type Script指定为刚刚的Code Hash,并将上面得到的Cell拖入交易的Deps,即可执行这个Type Script。如果在args中指定多个参数,则可以发现交易失败,因为Type Script返回不为0。