2. 智能合约引擎HyperVM

HyperVM 是Hyperchain自主研发的可插拔智能合约引擎通用框架,允许不同智能合约执行引擎接入。如下图所示是HyperVM的架构示意图,HyperVM的架构图提供了智能合约编译、执行等相关主要组件。其中,Compiler提供了智能合约编译相关功能,Interpreter和Executor则提供了智能合约解释以及执行相关功能,State组件赋予智能合约操作区块链账本的相关功能。Guard模块提供智能合约安全保障相关机制。

_images/hypervm.png

2.1 HyperEVM

为了最大程度利用开源社区在智能合约技术方面的研究和积累,提高智能合约的可重用性以及兼容性。HyperEVM的实现采用了完全兼容Ethereum的智能合约规范,使用Solidity作为智能合约开发语言,底层使用了优化了的Ethereum虚拟机EVM。 如下图所示为HyperEVM智能合约执行流程图:

hyperevm-flow

hyperevm-flow

HyperEVM执行一次交易之后会返回一个执行结果,系统将其保存在被称为交易回执的变量中,之后平台客户端可以根据本次的交易哈希进行交易结果的查询。HyperEVM的执行流程如下:

  1. HyperEVM接收到上层传递的transaction,并进行初步的验证;
  2. 判断transaction类型,如果是部署合约则执行3,否则执行4;
  3. HyperEVM新建一个合约账户来存储合约地址以及合约编译之后的代码;
  4. HyperEVM解析transaction中的交易参数等信息,并调用其执行引擎执行相应的智能合约字节码;
  5. 指令执行完成之后,HyperEVM会判断其是否停机,否的话跳转步骤2,否则执行步骤6;
  6. 判断HyperEVM的停机状态是否正常,正常则结束执行,否则执行步骤7;
  7. 进行Undo操作,状态回滚到本次交易执行之前。

执行指令集模块是HyperEVM执行模块的核心,指令的执行模块有两种实现,分别是基于字节码的执行以及更加复杂高效的即时编译(Just-in-time compilation)。 字节码执行的方式比较简单,HyperEVM实现的虚拟机会有指令执行单元。该指令执行单元会一直尝试执行指令集,当指定时间未执行完成,虚拟机会中断计算逻辑,返回超时错误信息,以此防止智能合约中的恶意代码执行。

JIT方式的执行相对复杂,即时编译也称为及时编译、实时编译,是动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态直译。静态编译的程序在执行前全部被翻译为机器码,而直译执行的则是边翻译边执行。即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。JIT模式执行智能合约主要包含以下步骤:

  1. 将所有同智能合约相关的信息封装在合约对象中,然后会通过该代码的哈希值去查找该合约对象是否已经存储编译。合约对象有四个常见状态,即:合约未知,合约已编译,合约准备好通过JIT执行,合约错误。
  2. 如果合约状态是合约准备好通过JIT执行,则HyperEVM会选择JIT执行器来执行该合约。执行过程中虚拟机将会对编译好的智能合约进一步编译成机器码并对push、jump等指令进行深度优化。
  3. 如果合约状态是合约未知的情况下,HyperEVM首先需要检查虚拟机是否强制JIT执行,如果是则顺序编译并通过JTI的指令进行执行。否则,开启单独线程进行编译,当前程序仍然通过普通的字节码编译。下次虚拟机执行过程中再次遇到相同编码的合约时,虚拟机会直接选择经过优化的合约。这样合约的指令集由于经过了优化,该合约的执行和部署的效率能够获得较大的提高。