The-Dao

TheDAO v1 字節碼中的額外字節

  • August 30, 2019

我嘗試使用 disasm 反編譯TheDAO v1 字節碼,但對我來說似乎失敗了。我在這裡輸入了 TheDAO 字節碼,發現最後一條指令是:

[10836] PUSH16 0xc84ba6bc95484008f6362f93160ef3e5

如您所見,字節碼以結尾,f3e5並且似乎忽略了最後一個字節63。當我從 TheDAO 字節碼中刪除最後一個字節並嘗試再次通過 disasm 執行它時,它可以正常工作。

有人可以解釋最後一個字節(63)的目的是什麼嗎?

我在 1.3.6 版中使用與 ethereum-go 一起打包的 disasm。

這是我通過 disasm 執行 DAO 字節碼時遇到的錯誤:

<code>...
10819  CODESIZE
10820  PUSH16  => c84ba6bc95484008f6362f93160ef3e5
10837  PUSH4panic: runtime error: slice bounds out of range   
goroutine 1 [running]:
panic(0x598e80, 0xc42000c110)
       /usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
       /root/go-ethereum/build/_workspace/src/github.com/ethereum/go-ethereum/cmd/disasm/main.go:45 +0x43e
</code>

這是 evm disasm v1.6.0 的錯誤 - https://pastebin.com/zx48s5ax

程式碼的結尾可能被用作“數據區”,即從未執行但可能被讀取的程式碼。例如,Solidity 優化器有一個階段,它查看所有常量(即 PUSH 指令)並嘗試幾種方法來優化它們。其中之一是將常量移動到程式碼的末尾並使用 CODECOPY 來檢索它。如果在許多地方使用相同的長常數,這將特別有效。

引用自:https://ethereum.stackexchange.com/questions/15050