以太坊虚拟机(EVM)
以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个基于栈的虚拟机,基于特定的环境数据,执行一系列的字节代码形式的指令,以修改系统状态。EVM目前提供了11类,140个指令。
EVM是一个准图灵机,这个“准”的限定来源于其中的运算是通过参数gas来限制的,也就是限定了可以执行的运算总量。EVM的具体逻辑定义为代码执行函数(Ξ):
( σ ′ , g ′ , A , o ) ≡ Ξ ( σ , g , I ) (\boldsymbol{\sigma}', g', A, \mathbf{o}) \equiv \Xi(\boldsymbol{\sigma}, g, I) (σ′,g′,A,o)≡Ξ(σ,g,I)
其中,函数的参数部分,σ表示状态,g表示可用gas,I表示执行环境数据;函数的返回值部分,σ’表示计算后的状态,g’表示剩余gas,A表示累积子状态,o表示结果输出。
EVM的具体实现逻辑包含:
- 基本定义: 对环境、指令集、EVM状态的定义
- 合约代码执行: 将合约字节代码解析为一系列指令及其参数,并循环执行。
- 指令执行: 根据执行环境和EVM状态,对单条指令进行解析、计费、执行
- 指令解析: 获取将字节码解析为指令及参数
- GAS计费: 计算指令执行所要消耗的gas数量,并校验gas是否充足
- 栈操作: 出入栈操作,及其校验
- 内存操作: 读写内存操作,内存分配等
- 指令运算: 执行指令的具体逻辑
- 异常停止: 因Gas不足、栈溢出等问题导致的程序执行终止。
- 正常停止: 按照代码逻辑完成指令的执行,并正常退出和输出结果。
- 指令执行: 根据执行环境和EVM状态,对单条指令进行解析、计费、执行