我最近在重新学以太坊opcodes,也写一个“WTF EVM Opcodes极简入门”,供小白们使用。
所有代码和教程开源在github: github.com/WTFAcademy/WTF-Opcodes
之前,我们介绍了堆栈指令中的PUSH和POP,这一讲我们将介绍另外两个指令:DUP和SWAP。
DUP
在EVM中,DUP是一系列的指令,总共有16个,从DUP1到DUP16,操作码范围为0x80到0x8F,gas消耗均为3。这些指令用于复制(Duplicate)堆栈上的指定元素(根据指令的序号)到堆栈顶部。例如,DUP1复制栈顶元素,DUP2复制距离栈顶的第二个元素,以此类推。
我们可以在极简EVM中增加对DUP指令的支持:
现在,我们可以尝试运行一个包含DUP1指令的字节码:0x6001600280(PUSH1 1 PUSH1 2 DUP1)。这个字节码将1和2推入堆栈,然后进行DUP1复制栈顶元素(2),堆栈最后会变为[1, 2, 2]。
SWAP
SWAP指令用于交换堆栈顶部的两个元素。与DUP类似,SWAP也是一系列的指令,从SWAP1到SWAP16共16个,操作码范围为0x90到0x9F,gas消耗均为3。SWAP1交换堆栈的顶部和次顶部的元素,SWAP2交换顶部和第三个元素,以此类推。
让我们在极简EVM中增加对SWAP指令的支持:
现在,我们可以尝试运行一个包含SWAP1指令的字节码:0x6001600290(PUSH1 1 PUSH1 2 SWAP1)。这个字节码将1和2推入堆栈,然后进行SWAP1交换这两个元素,堆栈最后会变为[2, 1]。
总结
这讲过后,我们已经介绍了EVM中最基础的四种堆栈操作:PUSH,POP,DUP,和SWAP,理解它们有助于更深入地理解EVM的工作原理。我们写的极简EVM也已经支持了111/144个操作码。