问题描述
我正在尝试理解 solc
发出的字节码。我的源程序如下;赋值 dummy = 0x1234567890
和 z = 0xdeadbeef
是为了更容易识别生成的字节码中函数的开头。
pragma solidity ^0.8.4;
contract C {
function f(uint x,uint y) public pure {
uint dummy = 0x1234567890;
uint z = 0xdeadbeef;
if (x != 0) {
z = x * y;
}
}
}
这是我使用 solc --bin --asm --opcodes --optimize tmp.sol -o .
得到的字节码:
0000: 60 PUSH1 0x80
0002: 60 PUSH1 0x40
0004: 52 MSTORE
...
0056: 56 JUMP
0057: 5b JUMPDEST
0058: 60 PUSH1 0x3e
005a: 56 JUMP
005b: 5b JUMPDEST
005c: 00 STOP
005d: 5b JUMPDEST // <-- start of function f() (?)
005e: 64 PUSH5 0x1234567890
0064: 63 PUSH4 0xdeadbeef
0069: 83 DUP4
006a: 15 ISZERO // x != 0 check?
006b: 60 PUSH1 0x59
006d: 57 JUMPI // <<< Q1: no instruction at 0x59???
006e: 60 PUSH1 0x56
0070: 83 DUP4
...
00c3: 5b JUMPDEST
00c4: 50 POP
00c5: 02 MUL
00c6: 90 SWAP1
00c7: 56 JUMP
00c8: fe INVALID // <<< Q2: why an invalid opcode?
00c9: a2 LOG2
00ca: 64 PUSH5 0x6970667358
00d0: 22 INVALID // <<< Q2: why an invalid opcode?
00d1: 12 SLT
00d2: 20 KECCAK256
我的问题:
- 偏移量 0x6d 处的 JUMPI 指令似乎以 0x59 作为其目标,但偏移量 0x59 处没有指令。偏移量不是从 0 开始计算的吗?还是我正在查看创建字节码而不是部署的字节码的问题?
- 生成的代码包含未解码为有效操作码 (
INVALID
) 的字节。这些也显示在solc --opcodes
的输出中,因此它不是反汇编程序错误。这些字节的用途是什么?
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)