以太坊虚拟机
以太坊虚拟机(EVM)是运行智能合约的环境,运行在每一个节点上,类似于一个独立的沙盒,严格控制了访问权限;也就是说,合约代码在EVM中运行时是不能接触网络、文件或者其他进程的。EVM模块主要分为三大模块:编译合约模块、Ledger模块和EVM执行模块。
编译合约模块主要是对底层Solc编译器进行一层封装,提供RPC接口给外部服务,对用Solidity编写的智能合约进行编译。编译后将会返回二进制码和相应的合约ABI,ABI可以理解为合约的手册,通过ABI可以知道合约的方法名、参数、返回值等信息。
Ledger模块主要是对区块链账户系统进行修改和更新,账户一共分为两种,分别是普通账户和智能合约账户,调用方如果知道智能合约地址则可以调用改合约,账户的每一次修改都会被持久化到区块链中。
EVM执行模块作为核心模块,主要功能是对交易中的智能合约代码进行解析和执行,一般分为创建合约和调用合约两部分,同时为了提高效率,EVM执行模块除了支持普通的字节码执行外,还支持JIT模块的指令执行,普通的字节码执行主要是对编译后的二进制码直接执行其指令,而JIT模式会对执行过程中的指令进行优化,如把连续的push指令打包成一个切片,方便程序高效执行。EVM执行流程图:
(1)EVM执行收到Transaction信息,然后判断Transaction类型是部署合约还是执行合约。如果是部署合约,执行指令集,来存储合约地址和编译后的代码:如果是执行合约或是调用合约,则使用EVM来执行输入指令集。
(2)执行上一条指令集之后,判断EVM是否停机,如果停机则判断是否正常停机,正常停机则更新合约状态到区块链,否则会滚合约状态。如果不停机则回到上一步(1)进行判断。
(3)执行完的合约会返回一个执行结果,EVM会将结果存储在Receipt回执中,调用者可以通过Transaction的哈希来查询结果。