EVM(Ethereum Virtual Machine,以太坊虚拟机)执行的原理可以总结为以下几个关键点:


1. 总体架构与角色

EVM 是一个运行在以太坊网络上的沙盒式虚拟机,负责执行以太坊中的智能合约。它将合约代码(通常是 Solidity 编写并编译成字节码)加载到虚拟机中,并逐条执行其中的指令。


2. 执行流程

1. 交易触发
  • 以太坊中的一切状态变化都是由交易(Transaction)触发的。交易可以是:

  • 发送以太币(ETH)。

  • 部署智能合约。

  • 调用已部署的智能合约。

2. 交易打包
  • 交易被矿工或验证者打包到区块中,EVM 会验证交易的合法性,包括:

  • 签名验证。

  • 账户余额检查(是否有足够的 ETH 支付交易费用)。

3. 字节码加载
  • 智能合约的字节码被加载到 EVM 中,EVM 会根据操作码(Opcode)逐条执行。这些操作码是底层的二进制指令。


3. 核心组件

1. 栈(Stack)
  • EVM 是基于栈的架构,每次执行指令时会将操作数压入栈中,操作完成后将结果重新压入栈。栈深限制为 1024 层。
2. 内存(Memory)
  • 内存是按字节分配的临时存储空间,仅在交易执行期间有效,交易完成后会被清空。
3. 存储(Storage)
  • 存储是持久化的,负责存储合约的状态数据。每次修改存储都会消耗大量的 Gas。
4. 程序计数器(Program Counter,PC)
  • 指示当前正在执行的操作码的位置,每执行一条指令,PC 都会自增。
5. Gas 管理
  • 每次指令执行都会消耗一定的 Gas。Gas 是限制交易计算量和防止资源滥用的重要机制。Gas 用完后,EVM 会停止执行并回滚交易。


4. 指令执行过程

EVM(Ethereum Virtual Machine)的指令执行过程可以分为以下几个步骤:

1. 智能合约部署
  • 在EVM中,智能合约是用Solidity(或其他语言)编写的,并通过evm指令部署到区块链上。
  • 部署合约时,会将字节码(Bytecode)上传到以太坊网络的某个账户地址,这个账户成为合约的所有者。
2. 交易提交
  • 当用户或合约执行者发起交易时,交易数据被发送到以太坊网络,包括交易的目标地址、交易数据(字节码或调用数据)、Gas限额、交易费用等。
  • 交易数据中的调用信息可以是合约的函数调用、参数等。
3. 交易进入内存池
  • 交易首先进入内存池(Mempool),等待矿工(或验证者)进行打包。
  • 如果交易是合约调用,会将数据包括函数选择器(Function Selector)传入到EVM执行引擎。
4. EVM解析交易
  • 在执行过程中,EVM会首先解析交易中的字节码或调用数据。
    • 字节码:智能合约的代码(已经被编译成字节码)。
    • 函数调用:交易数据中的前4个字节是函数选择器,用于识别调用的函数,其余部分是传递给函数的参数。
5. EVM执行字节码
  • EVM将开始执行合约的字节码,逐步解析和执行每条指令。
  • EVM支持基于栈(stack-based)的执行模型,所有的运算、数据存取和条件判断都是通过栈来实现的。
    • 加载指令(如PUSH)将数据压入栈中。
    • 算术指令(如ADD、MUL)操作栈顶的数据。
    • 存储指令(如SSTORE)和读取指令(如SLOAD)分别处理合约的存储变量。
  • EVM的指令集包括但不限于:
    • PUSH:将指定字节数据压入栈中。
    • ADD、SUB、MUL等:对栈上的值进行数学运算。
    • CALL、DELEGATECALL、STATICCALL:执行外部合约的调用。
    • RETURN、REVERT:返回结果或回滚事务。
    • SSTORE、SLOAD:读取和写入合约存储。
6. Gas计费和消耗
  • 在EVM执行过程中,每条指令的执行都需要消耗Gas。Gas用于限制计算量和防止无限循环。
  • 每次指令执行时,都会检查当前Gas是否足够。
  • 如果Gas不足,交易会失败并回滚。
7. 执行结束与交易确认
  • 如果合约执行完毕且没有错误,EVM将根据结果进行状态更新(例如写入存储、转账等),并将交易结果返回。
  • 如果发生错误(例如调用的合约函数抛出异常),EVM会回滚所有操作,并且不会更新区块链状态。
8. 区块链记录
  • 一旦交易被矿工(或验证者)确认并包含在区块中,交易的结果(如合约存储的变化)就会被永久记录在区块链上。
9. 状态更新
  • 每个合约的状态(如存储变量)都是持久的,并在交易执行完后更新。
  • 例如,当合约修改存储数据时,通过SSTORE指令更新状态,新的状态值会在以太坊网络上同步。


5. 执行结果与状态更改

  • 如果执行成功,EVM 会将交易的结果应用到全局状态中,包括账户余额、合约存储等。

  • 如果执行失败(如运行超出 Gas 限制或发生异常),所有状态更改会被回滚,但 Gas 仍会被消耗。


6. 安全与隔离

  • EVM 运行在沙盒环境中,与外部系统隔离,确保智能合约执行不影响区块链之外的系统。

  • 合约之间可以通过消息调用(Message Call)交互,但每个调用都有独立的 Gas 限制,防止无限递归调用导致系统崩溃。


总结

EVM 通过栈、内存、存储等组件和 Gas 控制机制,确保智能合约安全、可控地执行。它逐条解释字节码指令,并将执行结果反映到全局状态中,从而实现以太坊的去中心化逻辑计算。

更多推荐