通过以太坊EVM谜题深入学习EVM , 破解谜题 7
通过以太坊 EVM 谜题深入学习 EVM,了解 EVM 可以帮助我们写出更高效的代码。
学习Solidity 的同学,欢迎订阅我的另一个专栏Ethernaut 题库闯关, 了解常用的 Hacker 方法,可以帮助我们写出更安全的代码。
00 36 CALLDATASIZE
01 6000 PUSH1 00
03 80 DUP1
04 37 CALLDATACOPY
05 36 CALLDATASIZE
06 6000 PUSH1 00
08 6000 PUSH1 00
0A F0 CREATE
0B 3B EXTCODESIZE
0C 6001 PUSH1 01
0E 14 EQ
0F 6013 PUSH1 13
11 57 JUMPI
12 FD REVERT
13 5B JUMPDEST
14 00 STOP
以上是 EVM 谜题 7 的操作码,这个挑战引入了一些新的操作码和更多的复杂性。让我们回顾一下每一个新的操作码,并尝试把所有的内容分成几部分:
CALLDATACOPY: 从堆栈中弹出3个值作为输入,并从交易数据中复制calldata值到内存中。
destOffset
: 内存中的字节偏移量,复制操作的结果将被复制到这里。offset
: 字节偏移量,你想从calldata中哪个位置开始复制。size
: 你想在内存中复制的calldata数据的字节大小CREATE: 部署一个新的合约。它从堆栈中弹出3个值,作为部署操作的输入。该操作的结果是部署合约的地址(address), 它会被推到堆栈中的。
value
: 发送给新账户的价值offset
: 字节偏移量,你想从内存中哪个位置开始复制新合约的代码。size
: 从内存偏移量开始复制的指令的字节大小extcodesize: 从堆栈中弹出一个值,作为20字节的地址使用。这个地址将被用来作为参数 "查询"目标合约,并得到合约代码的字节大小作为结果。该结果被推回堆栈。
让我们试着理解所有这些操作码在执行时的作用。
00 36 CALLDATASIZE
01 6000 PUSH1 00
03 80 DUP1
04 37 CALLDAT...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!