之前咱们介绍过了,CKB 的主要任务是存储数据,数据是存放到 Cell 中的。但是我们也知道 Cell 里面除了数据,还存储了脚本,那么脚本的的执行环境是什么呢?这就要说到了 CKB 区块链的除了 Cell 之外的另外一个组成部分,CKB VM ,也就是 CKB 虚拟机。
VM 的作用是执行 Cell 中存储的脚本,所以 VM 对于整条区块链的发挥作用,取决于脚本中的内容。
每个 Cell 都有一个 lock 脚本,脚本的内容是验证交易发起人是否有权力对 Cell 进行操作。具体原理是这样,Cell 的所有人,通过发起交易的时候,要提供私钥签名。各个节点收到交易的时候会去验证这个私钥签名是否是这个 Cell 的所有人签署的。那么这个验证过程当然就是去执行一段代码了,首先代码本身来自 Cell 中,每个节点都本地存储了区块链,所以当然可以拿到这个脚本的代码,那么这个执行环境是什么呢?是在节点自己的 CPU 硬件上直接执行吗?不是的。而是在区块链上执行。每个安装了 CKB 客户端的计算机,都同时安装了 CKB VM 。VM 说白了就是用软件模拟出来的硬件机器,上面也是可以跑代码的。于是 CKB VM 执行 lock 脚本的内容,就可以验证交易是否有效了。
同时每个 Cell 都有 type 脚本,里面可以添加更为丰富的智能合约代码。type 里面的脚本内容就更为灵活了,Cell 的主人可以任意的去添加各种代码。要知道 CKB 的设计目标是成为一个强大的智能合约平台,而不是只是像比特币那样服务于相对简单的转账操作。这就要求 CKB 的 VM 上面能够安全的去执行逻辑丰富的代码。实际上 CKB VM 是模拟了一个真正的硬件 CPU ,上面可以执行任意语言写的任意代码的,这一点稍后我们详细来讲解。
![https://img.haoqicat.com/2019063001.jpg]
到这里,CKB VM 的基本作用就说清楚了,总结起来就是,用户发出交易,会触发 Cell 中的脚本,而 CKB VM 就是脚本的执行环境。
CKB VM 从功能上相当于一个 RISC-V 架构的 CPU 。
先介绍一下 RISC-V 。RISC-V 是跟 X86 并行的概念,是一套计算机指令集,CKB VM 实现了这套指令集,也就意味着功能上跟一个硬件 CPU 没啥区别了。但是 RISC-V 是开源指令集,可以放心使用,不会受到专利问题的打扰。同时,使用硬件指令集去实现软件虚拟机的好处是稳定,硬件指令集一旦固化,将来修改的可能性就比较低了。而区块链恰好也是不适合改来改去的系统,虽然它是软件实现的。
使用硬件指令集做 VM 有两个明显的好处。第一,可以用任意语言开发智能合约,不管是用 C 还是 Python ,只要用合适的编译器编译成 RISC-V 的二进制格式,都是可以执行的。第二,代码运行的时候可以精确的算出 CPU cycle ,方便矿工合理的根据运算量收取手续费。
CKB 设计目标之一是拥有强大的灵活性。保证即使密码学有了革命性的发展,当下使用的哈希函数或者签名方法过时之后,CKB 依然可以不用通过硬分叉继续安全运行。灵活性的达成也跟 CKB VM 有直接的关联,下面来分析一下具体逻辑。
首先补一下背景知识,看看密码学原语在比特币中是如何发挥作用的。密码学原语,英文叫 crypto primitive ,是的是密码学领域常用的一些算法,例如加密算法或者签名算法。比特币虽然叫做加密货币,但是其实也没用加密算法,而是主要使用了椭圆曲线签名算法这个密码学原语。Schnorr 签名算法对比椭圆曲线算法有着各种优势,所以比特币开发团队正在考虑切换到 Schnorr 。但是由于比特币的密码学原语是直接写死到客户端代码中的,修改了密码学原语就相当于修改了客户端。虽然如果矿工都同意升级客户端,升级 Schnorr 本身只是一次软分叉的过程。但是那么多节点想统一步调升级客户端,毕竟不是一件简单的事情。
之前 Cell 那部分我们聊过了,Cell 上可以上任意的锁。相对比特币,CKB 的用户就幸福多了。每个人都可以在 Cell 脚本中指定自己的密码学原语。如果我想在自己的项目中使用 Schnorr ,那么只需要修改项目相关的那些 Cell 就可以了,不但可以随时升级原语,而且对他人没有影响。实际上 CKB 客户端中是没有任何内置的密码学原语的,每个用户都可以根据自己的需要去指定密码学原语,形成了良好的可插拔性。这里是官方给的脚本的例子 https://github.com/nervosnetwork/ckb-system-scripts ,里面可以看到集成了椭圆曲线签名算法。
当然任意的锁也意味着,你甚至也可以不用密码学方法来解锁 Cell ,例如你可以规定,用若干位数密码来解锁。所以之前提过的发起交易要出示签名指的是通常的情形,而不是全部交易都是这样。
关于 CKB VM 的基本情况就是这些了。总结起来,CKB VM 是一个兼容 RISC-V 指令集的虚拟机,主要作用是执行 Cell 中用户写入的脚本内容。Cell 和 VM 配合,可以实现极大的灵活性,让用户在不影响他人的情况下自由的定义解锁逻辑和升级密码学原语。
参考: