试图理解 solc 发出的 EVM 字节码

问题描述

我正在尝试理解 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输出中,因此它不是反汇编程序错误。这些字节的用途是什么?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)