我试图理解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
,因此这不是反汇编程序错误。这些字节的目的是什么?
谢谢。