讲者:金程鑫,ChainX核心开发者,原金链盟FISCO-BCOS核心开发者。
作为以太坊的隐形大脑,Gavin Wood曾经为以太坊模型构建做出了巨大贡献,以太坊的许多模型体系实际上是由Gavin Wood提出。在substrate中,Gavin Wood延续了以太坊中的很多设计。对于整个发张体系,可以总结为: 以太坊的“账户状态区块链”到substrate的“状态区块链”,而使用substrate开发的区块链比如ChainX,称为“功能区块链”。
对于以太坊这样在区块链体系上提出图灵完备的运行体系,运行DApp,我们将其称呼为具备逻辑功能的区块链。 将这类区块链与计算机程序相比,可以总结为: 计算机程序由 指令和数据 组成,程序运行于操作系统当中,接受输入并产生输出 而这类区块链与计算机程序的结构相对应,由 链上代码和链上存储 组成,运行于区块链的平台上,一般使用虚拟机作为运行环境,接受交易的调用作为输入,由于是异步的,用户可以查询执行后的数据作为输出 区块链节点下层则封装好分布式系统需要的组件,连接其所有的区块链节点。
因此将上页提出的结构与实际使用的区块链进行对应,以太坊的链上代码就是智能合约,链上存储就是世界状态,substrate在此基础上进一步抽象,其链上代码就是substrate的runtime,链上存储就是substrate维护的数据状态。而Runtime和数据状态共同构成了使用substrate开发的链的功能。
以太坊作为账户状态区块链,其存储状态的结构称为“世界状态”,由于以太坊中账户与合约都是账户,所以世界状态分为上层的账户数与合约内部存储的存储树,如图所示在从区块1000到1001的过程中,其中合约1下的存储的kv有变化,账户2的状态如以太坊数量等有变化。
在以太坊一笔交易的执行过程中,首先要区分其是账户或是合约,然后分别执行相应功能。
在substrate中对其做了抽象,移除了账户的概念,只保留了状态树。而状态树就是用来存储 k-v的数据,换句话说,可以把substrate的状态存储看做一个 k-v数据库 从区块链1000到1001的过程中, key1 和 key3产生了变化,因此在1001块的时候存储了新的key1和key3对应的值。
在交易执行中,不再区分账户合约的概念,直接使用交易(extrinsic) 调用了 Runtime的接口。
总结以上概念,可以看出在 链上存储部分, substrate与以太坊相比移除了账户的概念,直接抽象成为了 k-v 存储的概念,方便开发人员开发。 对于链上代码而言,substrate将其放在了核心的地位,而不是像以太坊一样只有合约才具备链上功能。 因此substrate比以太坊的抽象层次更高 那么substrate提出的Runtime就是一个实现链上功能的概念,甚至连原来以太坊智能合约的概念也可以纳为Runtime中的一个组件。
而ChainX就是在Runtime中开发了自己的功能。例如ChainX中由图中的这些模块组成。
这里择几个简单的例子介绍。 如在资产模块中,可以看到我们使用 AssetBalance 这个 map 的k-v管理的用户的资产数据 对外的接口提供了 register_asset注册资产,transfer转账等等。
在比特币轻节点中,存储了比特币的区块头与相关的交易对外提供了一些相应的接口。
而在substrate中一些模型不符合我们的需求,我们对其进行了适配,比如我们将手续费单独成为一个模块进行处理,并且在交易中添加了类似gasprice的“手续费加速”的概念。
substrate的rpc提供可访问的部分比较底层,因此我们对其进行了改造,使ChainX能够提供我们这条链独有的rpc接口。
由于许多第三方如区块链,钱包等需要保留一份链外的全局状态数据,因此我们修改了一些substrate的源码,使其能在运行过程中将转台数据导出来如存储到redis当中。
此外还有许多改造,篇幅受限,只展示了部分。