EVM学习笔记(一):初识EVM

什么是EVM?

EVM(Ethereum Virtual Machine,以太坊虚拟机)是以太坊区块链的核心计算引擎,负责执行智能合约并维护全网状态的一致性。它是去中心化应用(DApps)运行的底层环境,通过确定性、隔离性和可验证性,确保所有节点在相同输入下产生相同输出。

1. EVM的核心定义

2. EVM的架构与组件

EVM的执行模型基于栈(Stack)、内存(Memory)和存储(Storage),三者分工明确:

3. EVM的执行流程

以一笔调用合约方法的交易为例,EVM的执行步骤如下:

  1. 交易验证

    • 节点验证交易签名、发送方余额和Gas限制。
    • 若交易合法,将其加入待处理交易池。
  2. 初始化状态

    • 复制当前区块链状态(如账户余额、合约存储)到临时环境,避免直接修改主状态。
  3. 执行字节码

    • 按顺序解析合约字节码,操作栈、内存和存储。
    • 示例:执行a = 1 + 2(假设a为合约变量):
      • PUSH1 0x01 → 栈顶压入1
      • PUSH1 0x02 → 栈顶压入2
      • ADD → 栈顶两数相加,结果3留在栈顶。
      • STORE → 将栈顶值3存入存储变量a的地址。
  4. 状态更新与Gas结算

    • 若执行成功,将临时状态变更写入新区块,并扣除发送方Gas。
    • 若执行失败(如revert或Gas不足),回滚所有变更,但已消耗的Gas不退还(部分场景除外)。
  5. 全网同步

    • 新区块通过共识机制(如PoS)被全网接受,所有节点更新本地状态,确保一致性。

4. EVM的关键特性

5. EVM的局限性

6. EVM与Web3生态的关系

总结

EVM是以太坊的“心脏”,通过虚拟化计算环境、确定性执行和Gas机制,实现了智能合约的可靠运行和全网状态一致。尽管存在性能和成本限制,但其设计哲学(如去中心化、抗审查)深刻影响了Web3的发展方向。随着Layer 2和EVM升级的推进,EVM将继续作为去中心化应用的核心基础设施,推动区块链技术的普及与创新。


EVM在做什么?

在Web3中,EVM(以太坊虚拟机)是智能合约执行的核心引擎,其运行机制与区块链的底层逻辑紧密交织。以下从技术原理和核心概念出发,分点解析问题:

1. EVM在执行什么?

EVM执行的是编译后的智能合约字节码。开发者用Solidity等语言编写合约,编译后生成EVM可识别的1字节操作码(Opcodes),如ADD(加法)、STORE(存储数据)等。EVM通过栈式模型逐条解析这些指令,操作内存、存储和状态变量,最终完成合约逻辑。例如:

2. 一笔交易从哪来?

交易来源可分为两类:

所有交易需包含:

3. 谁在执行合约?

所有全节点(包括矿工/验证者)均会执行合约。当交易被打包进区块后:

  1. 节点验证交易签名和余额。
  2. 模拟执行EVM字节码,更新本地状态(如修改合约存储变量)。
  3. 若执行成功,将状态变更写入新区块;若失败(如revert),回滚状态。

关键点:EVM的确定性(Determinism)确保所有节点执行相同指令序列后,状态变更完全一致。

4. 为什么每个节点结果一样?

EVM通过以下机制保证结果一致性:

5. 核心概念解析

总结

EVM通过确定性执行和状态机复制机制,确保所有节点对同一交易的处理结果一致。交易作为状态变更的载体,其来源、数据(calldata)和调用者(msg.sender)共同决定了合约的执行逻辑。理解这些核心概念,是深入掌握Web3开发的关键。


EVM的数据存在哪里?

EVM(以太坊虚拟机)的三大存储结构——Stack(栈)、Memory(内存)、Storage(存储),是智能合约执行的核心数据管理机制。它们分工明确,分别处理临时数据、中间计算结果和永久状态,共同确保合约逻辑的正确性和区块链的不可篡改性。以下是详细解析:

1. Stack(栈)

核心特性

典型场景

限制与注意事项

2. Memory(内存)

核心特性

典型场景

限制与注意事项

3. Storage(存储)

核心特性

典型场景

限制与注意事项

三大存储结构的对比总结

特性 Stack(栈) Memory(内存) Storage(存储)
生命周期 函数执行期间 函数执行期间 永久上链
存储内容 临时操作数、中间结果 动态数据、中间计算结果 合约状态变量、持久化数据
扩展性 固定深度(1024) 按需扩展 固定槽位(32字节/槽)
Gas成本 极低(3 Gas/操作) 中等(3 Gas + 扩展成本) 极高(20,000 Gas/首次写入)
访问速度 最快(CPU寄存器级) 较快(内存访问) 最慢(区块链I/O)
典型操作码 PUSH, POP, ADD MLOAD, MSTORE, MSIZE SLOAD, STORE

实际应用建议

  1. 优先使用栈
    简单计算和逻辑判断应尽量在栈上完成,避免内存/存储开销。
  2. 谨慎使用内存
    处理动态数据时预分配内存,避免频繁扩展;敏感数据需手动清零。
  3. 最小化存储修改
    将高频更新数据(如计数器)放在内存中,仅在必要时同步到存储;使用mapping替代数组降低访问成本。

通过合理利用三大存储结构,可以显著优化合约的Gas效率和执行性能,同时确保状态管理的正确性。