evm-opcodes完全指南:以太坊虚拟机指令从入门到精通
evm-opcodes完全指南:以太坊虚拟机指令从入门到精通
【免费下载链接】evm-opcodes 项目地址: https://gitcode.com/gh_mirrors/ev/evm-opcodes
以太坊虚拟机(EVM)是以太坊区块链的核心组件,而EVM指令(opcodes)则是智能合约运行的基础。本指南将带你从入门到精通,全面了解EVM指令的奥秘,掌握这些强大工具的使用方法。
什么是EVM指令?
EVM指令是以太坊虚拟机执行的基本操作单元,类似于计算机的汇编语言。每个指令都有特定的操作码(opcode)和功能,它们共同构成了智能合约的运行逻辑。理解这些指令对于编写高效、安全的智能合约至关重要。
EVM指令基础
EVM数据单位
在EVM中,一个"字"(word)的大小是256位,这是EVM中数据处理的基本单位。所有指令操作都围绕这个基本单位展开。
核心指令分类
EVM指令可以分为以下几大类:
- 算术运算指令:如ADD、SUB、MUL等
- 比较指令:如LT、GT、EQ等
- 位运算指令:如AND、OR、XOR等
- 栈操作指令:如PUSH、POP、DUP等
- 内存操作指令:如MLOAD、MSTORE等
- 存储操作指令:如SLOAD、SSTORE等
- 控制流指令:如JUMP、JUMPI、JUMPDEST等
- 环境指令:如ADDRESS、BALANCE、BLOCKHASH等
- 日志和创建指令:如LOG0-LOG4、CREATE等
- 调用指令:如CALL、CALLCODE、DELEGATECALL等
常用EVM指令详解
算术运算指令
ADD (0x01)
ADD指令用于执行加法操作。它从栈中取出两个元素,将它们相加,然后将结果推回栈中。
伪代码:push(s[0]+s[1])
Gas消耗:3
MUL (0x02)
MUL指令用于执行乘法操作。它从栈中取出两个元素,将它们相乘,然后将结果推回栈中。
Gas消耗:5
栈操作指令
PUSH系列 (0x60-0x7f)
PUSH系列指令用于将数据压入栈中。根据后面跟随的字节数不同,分为PUSH1到PUSH32。例如,PUSH1会将接下来的1个字节的数据压入栈中,而PUSH32则会将接下来的32个字节(完整的字)压入栈中。
Gas消耗:3
DUP系列 (0x80-0x8f)
DUP系列指令用于复制栈中的元素。DUP1复制栈顶元素,DUP2复制栈中第二个元素,依此类推,最高到DUP16。
Gas消耗:3
控制流指令
JUMP (0x56)
JUMP指令用于修改程序计数器,实现无条件跳转。它从栈中取出一个值作为目标位置,然后跳转到该位置执行。
Gas消耗:8
JUMPI (0x57)
JUMPI指令用于条件跳转。它从栈中取出两个值,第一个作为条件,第二个作为目标位置。如果条件为真(非零),则跳转到目标位置执行。
Gas消耗:10
JUMPDEST (0x5b)
JUMPDEST指令用于标记有效的跳转目标位置。只有标记为JUMPDEST的位置才能作为JUMP或JUMPI的目标。
Gas消耗:1
EVM指令表
以下是EVM主要指令的汇总表:
| Opcode | Name | Description | Gas |
|---|---|---|---|
0x00 | STOP | 停止执行 | 0 |
0x01 | ADD | 加法操作 | 3 |
0x02 | MUL | 乘法操作 | 5 |
0x03 | SUB | 减法操作 | 3 |
0x04 | DIV | 整数除法操作 | 5 |
0x05 | SDIV | 有符号整数除法操作 | 5 |
0x10 | LT | 小于比较 | 3 |
0x11 | GT | 大于比较 | 3 |
0x14 | EQ | 等于比较 | 3 |
0x20 | KECCAK256 | 计算Keccak-256哈希 | 30* |
0x30 | ADDRESS | 获取当前执行账户地址 | 2 |
0x31 | BALANCE | 获取指定账户余额 | 700 |
0x50 | POP | 从栈中移除元素 | 2 |
0x51 | MLOAD | 从内存加载数据 | 3* |
0x52 | MSTORE | 保存数据到内存 | 3* |
0x54 | SLOAD | 从存储加载数据 | 800 |
0x55 | SSTORE | 保存数据到存储 | 20000** |
0x60 | PUSH1 | 将1字节数据压入栈 | 3 |
0x80 | DUP1 | 复制栈顶元素 | 3 |
0x90 | SWAP1 | 交换栈顶两个元素 | 3 |
0xf0 | CREATE | 创建新账户 | 32000 |
0xf1 | CALL | 调用其他合约 | 复杂 |
0xf3 | RETURN | 返回数据 | 0 |
0xfd | REVERT | 回滚状态 | 0 |
0xff | SELFDESTRUCT | 自毁合约 | 5000* |
注:带*的Gas成本可能会根据参数有所变化,**表示SSTORE的Gas成本在不同情况下会有很大差异。
如何使用本项目
要开始使用evm-opcodes项目,首先需要克隆仓库:
git clone https://gitcode.com/gh_mirrors/ev/evm-opcodes
项目中的README.md文件提供了完整的EVM指令参考,包括操作码、名称、描述和Gas成本等信息。
总结
EVM指令是以太坊智能合约的基础,掌握这些指令对于理解和编写智能合约至关重要。本指南介绍了EVM指令的基本概念、分类和常用指令的详细说明,希望能帮助你更好地理解和使用EVM指令。
无论是区块链开发者、智能合约审计师,还是对以太坊技术感兴趣的爱好者,深入了解EVM指令都将为你的区块链之旅提供强大的助力。
参考资料
项目的完整EVM指令参考可以在README.md中找到,其中包含了所有EVM指令的详细信息和最新更新。
【免费下载链接】evm-opcodes 项目地址: https://gitcode.com/gh_mirrors/ev/evm-opcodes
更多推荐
所有评论(0)