EVM基本原理及执行智能合约的步骤
·
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 控制机制,确保智能合约安全、可控地执行。它逐条解释字节码指令,并将执行结果反映到全局状态中,从而实现以太坊的去中心化逻辑计算。
更多推荐



所有评论(0)