Ethereum虚拟机
- 基于栈的虚拟机,一次调用产生一个实例
- 每个栈的元素大小是32字节
- 大小无限制,调用深度上线是1024
- 临时存储指存在于本实例中,永久存储指存储在MPT中的变量
Ethereum组成
指令集
指令集定义了以太坊虚拟机(EVM)能理解并执行的所有操作。
每一条指令就是一种操作,例如:
指令 | 功能 |
---|---|
ADD | 加法 |
MUL | 乘法 |
SSTORE | 写入存储 |
CALL | 调用其他合约 |
SHA3 | 哈希运算 |
代码
代码是部署在以太坊合约账户上的字节码(Bytecode)。
流程:
- 用 Solidity/Vyper 等高级语言编写
- 用编译器(如 solc)编译成 EVM 字节码
- 部署到区块链上,变成固定数据
特点:
- 部署后不可修改(除代理合约例外)
- EVM 按字节逐条执行
- 支持跨合约调用
全局状态
全局状态表示以太坊上所有账户(普通地址和合约地址)的当前快照 。
记录每个账户的:
- 余额(Balance)
- Nonce(交易次数)
- 存储(Storage)
- 代码(Code)
全局状态通过 Merkle Patricia Trie(MPT) 组织,确保高效、可验证。
执行环境
执行环境描述了一次交易/调用时的上下文信息,例如:
- 当前合约地址(address)
- 调用者地址(caller)
- 传入的 ETH 数量(value)
- 区块相关信息(timestamp、number)
- Gas 限制(gas limit)
- 输入数据(calldata)
每次交易或合约调用都有自己独立的执行环境。
虚拟机实例状态
执行过程中,EVM会维护一个临时的内部状态,包括:
- 栈(Stack):存放中间数据,最大 1024 个元素
- 内存(Memory):可变长度的字节数组(临时的)
- 存储(Storage):持久化存储,属于全局状态
- 程序计数器(PC):记录当前执行到哪条指令
- 剩余 Gas(Remaining Gas)
这些状态只在执行期间存在,执行完成后销毁。
定价策略
定价策略定义了每种操作所需消耗的 Gas 量。
操作 | Gas 消耗 |
---|---|
加法(ADD) | 3 Gas |
存储写入(SSTORE) | 高达 20,000 Gas |
合约创建(CREATE) | 极高 Gas 消耗 |
预编译合约
预编译合约是由以太坊内置、预先优化好的常用功能模块,具有固定地址。
常见的预编译合约:
地址 | 功能 |
---|---|
0x01 | ecrecover(签名恢复) |
0x02 | sha256 哈希 |
0x03 | ripemd160 哈希 |
0x04 | identity(返回输入) |