4. 虚拟机¶
交易的执行是区块链节点上的一个重要的功能。是把交易中的智能合约二进制代码取出来,用执行器(Executor)执行。在交易的执行过程中,会对区块链的状态(State)进行修改,形成新区块的状态储存下来(Storage)。执行器在这个过程中,类似于一个黑盒,输入是智能合约代码,输出是状态的改变。
随着技术的发展,人们开始关注执行器的性能和易用性。一方面,人们希望智能合约在区块链上能有更快的执行速度,满足大规模交易的需求。另一方面,人们希望能用更熟悉更好用的语言进行开发。进而出现了一些替代传统的执行器(EVM)的方案,如:JIT、 WASM_甚至JVM。然而,传统的EVM是耦合在节点代码中的。首先要做的,是将执行器的接口抽象出来,兼容各种虚拟机的实现。因此,EVMC被设计出来。
EVMC (Ethereum Client-VM Connector API),是以太坊抽象出来的执行器的接口,旨在能够对接各种类型的执行器。FISCO BCOS目前采用了以太坊的智能合约语言Solidity,因此也沿用了以太坊对执行器接口的抽象。
在节点上,共识模块会调用EVMC,将打包好的交易交由执行器执行。执行器执行时,对状态进行的读写,会通过EVMC的回调反过来操作节点上的状态数据。泰岳链将逐步支持EVMC,以适应更高效,易用性更强的执行器。
4.1. EVM虚拟机¶
以太坊虚拟机(environment virtual machine,简称EVM),作用是将智能合约代码编译成可在以太坊上执行的机器码,并提供智能合约的运行环境。它是一个对外完全隔离的沙盒环境,在运行期间不能访问网络、文件,即使不同合约之间也有有限的访问权限。以太坊虚拟机提供了面向合约的高级编程语言solidity,这使得开发者可以专注于应用本身,更方便、快捷的开发去中心化应用程序,同时也大大降低了开发难度。
EVM是一种基于栈的虚拟机(区别于基于寄存器的虚拟机),用于执行智能合约,同时EVM是图灵完备的,EVM操作数栈调用深度为1024,EVM机器码长度一个字节,最多可以有256个操作码,目前已经定义了144个操作码,还有100多个操作码可以扩展,每个操作码都根据其弹栈数、压栈数定义了相应的gas消耗数量。泰岳链应用了以太坊EVM机制来实现智能合约,并增加了对国密算法的支持(SM3)。
4.2. 预编译合约¶
预编译合约提供一种使用原生(c++,go)编写合约的方法,合约逻辑与数据分离,相比于solidity合约具有更好的性能,可以通过修改底层代码实现合约升级。 预编译合约使用固定地址,并由原生代码编译后执行,而普通合约则由solidity编写而成,使用的地址是在部署时生成,在EVM虚拟机中执行。
EVM虚拟机有一整套Gas机制来衡量每笔交易上链消耗的CPU、内存和存储资源。泰岳链支持预编译合约功能,支持原生内置合约,为了提升安全性和扩展性,泰岳链提供了gas机制和无gas机制增加链的灵活性,此外,EVM原始的Gas机制中,交易的主要Gas消耗来源于存储,泰岳链也会在之后的版本中调整gas消耗在cpu和内存中的占比。