1

我试图理解solc. 我的源程序如下;分配dummy = 0x1234567890z = 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

我的问题:

  1. 偏移量 0x6d 处的 JUMPI 指令似乎以 0x59 作为其目标,但偏移量 0x59 处没有指令。偏移量不是从 0 开始计算的吗?还是我正在查看创建字节码而不是部署的字节码的问题?
  2. 生成的代码包含不解码为有效操作码 ( INVALID) 的字节。这些也显示在输出中solc --opcodes,因此这不是反汇编程序错误。这些字节的目的是什么?

谢谢。

4

0 回答 0