EVM Principle Analysis

一些关于ETH和EVM的笔记

以太坊知识体系

mindmap
  root((以太坊知识体系))
    核心概念
      区块链基础
      什么是智能合约?
      以太坊虚拟机 (EVM)
      账户与钱包
        EOA vs 合约账户
        私钥、公钥、地址
      Gas 机制
    技术实践
      开发工具链
        Remix IDE
        Hardhat / Foundry
      智能合约开发
        Solidity 语言
        测试与部署
      Web3 前端
        ethers.js / web3.js
        与DApp交互
    生态与应用
      去中心化金融 (DeFi)
        去中心化交易所 (DEX)
        借贷协议
      非同质化代币 (NFT)
        标准: ERC-721, ERC-1155
        市场与应用
      去中心化自治组织 (DAO)
      第二层扩展方案 (L2)
        Rollups
        侧链
    安全与最佳实践
      常见安全漏洞
      代码审计
      安全开发模式

核心数据结构

  • 状态树
  • 交易树
  • 收据树
  • 数据结构使用 MPT(Modified-Merkle-Paricia-Trie)

以太币(ETH):以太坊的原生加密货币。它有两个主要用途:

  1. 支付交易手续费(Gas Fee):在网络上执行任何操作(如转账、运行智能合约)都需要支付Gas费,以ETH计价
  2. 价值存储:类似于比特币,它也被视为一种数字资产

单位

下表从上到下,每个单位是下一个的 1,000倍 (10³)

名称 换算关系 以 Wei 为单位 主要用途与说明
Wei - 1 Wei 最基本单位,智能合约和底层交易处理时使用
Kwei / Babbage = 1,000 Wei 10³ Wei 较少使用
Mwei / Lovelace = 1,000,000 Wei 10⁶ Wei 较少使用
Gwei / Shannon = 1,000,000,000 Wei 10⁹ Wei 最常用、最重要的单位,主要用于表示 Gas 价格
Szabo = 1,000 Gwei 10¹² Wei 较少使用,1 Szabo = 10⁶ Wei
Finney = 1,000 Szabo 10¹⁵ Wei 接近一个ETH的单位,1 Finney = 10⁻³ ETH
Ether (ETH) = 1,000 Finney 10¹⁸ Wei 标准交易单位,我们在交易所买卖、用于标价的就是它

账户和钱包

  • 外部拥有账户(EOA)和合约账户(主要代码控制)

关于EVM

EVM (Ethereum Virtual Machine), Watch this video, It’s very helpful,https://www.youtube.com/watch?v=kCswGz9naZ,EVM负责管理以太坊的全局状态。它根据输入(交易)和预定义规则(智能合约代码),从一个状态计算出下一个新的有效状态

EVM Introduce: https://ethereum.org/zh/developers/docs/evm/

基础架构

flowchart TD
    subgraph A [EVM 执行上下文]
        direction TB
        TX[交易数据] --> EVM
        SC[智能合约字节码] --> EVM
        B[区块链状态
Block Number, Coinbase, etc.] --> EVM subgraph EVM [EVM 核心运行时] direction LR Stack[堆栈 Stack
LIFO, 1024深度] --> M[内存 Memory
易失性, 按字扩展] M --> Stack end EVM -- 读写 --> Storage[持久化存储 Storage
合约账户状态] end Gas[Gas 供给] -- 为每条指令消耗 --> EVM EVM -- 执行完毕 --> R[结果状态变更或回滚]

EVM数据区域详解

区域 生命周期 Gas成本 用途
堆栈 (Stack) 执行期间 执行计算和操作的主要场所。存放局部变量、函数参数。
内存 (Memory) 单次交易执行 需要支付(扩展时) 用于存储临时数据,如数组、结构体,或传递给外部调用的数据。
存储 (Storage) 永久(直到修改) 非常昂贵 存储合约的关键状态变量。写入操作尤其耗Gas。
Calldata 单次交易执行 只读,成本低 存储传入交易的原始输入数据,通常是函数选择器和参数。
代码 (Code) 永久 只读,成本低 存储当前合约的不可执行字节码。

EVM状态转换函数
$$
Y(S, T)= S’
$$

EVM执行流程

  1. 交易触发:一笔交易(来自用户或另一个合约)被发送到合约地址
  2. 上下文设置:EVM创建一个新的执行上下文,包括:
    • 剩余 Gas
    • calldata(输入数据)
    • 发送者 (msg.sender)、价值 (msg.value) 等全局变量
  3. 字节码解释:EVM读取合约的字节码,并开始逐条解释执行操作码(OPCODE)
  4. Gas 检查:在执行每条指令前,EVM检查剩余Gas是否足够。如果不足,将抛出 “out of gas” 错误,并回滚所有状态变更(但已消耗的Gas费不退)
  5. 执行循环
  6. 执行结束:当遇到 STOPRETURNREVERT 指令时,执行停止
    • STOP/RETURN:正常结束,状态变更被确认
    • REVERT:主动回滚,状态变更无效,但剩余Gas退回
底部图片