Solidity

在solidity中繼承但相同的契約的不同,不一致的編譯

  • January 24, 2017

考慮以下solidity源文件A.sol

pragma solidity ^0.4.8;

contract A {}

B.sol

pragma solidity ^0.4.8;

contract A {}

contract B is A {}

使用 solc 0.4.8 版本,為兩個版本的合約 A 生成的程式碼並不相同:

$ solc --bin A.sol 

======= A =======
Binary: 
6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058201f05fd362367eb20b594d9537e2d735626b1fc0909c76826b94103a678da6cf10029
$ solc --bin B.sol 

======= A =======
Binary: 
6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058207dd14680c4efdd761b8db9a748045c916aff2f0a11c4ee7b82731d287045f0540029

======= B =======
Binary: 
6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a72305820942c33894954b0c78b1da86869a47c578755a698e26f671c5b4450476a3d56bc0029

如果您掃描到5820A 的編譯中的字節,您會發現兩個版本緊隨其後。

我希望 solc 編譯是可重複的(這對於驗證區塊鏈上的程式碼是否與公共原始碼一致似乎很重要),並且不明白為什麼這兩個版本的 A 應該不同。我錯過了什麼?

非常感謝您的任何見解!

**更新:**我在這裡使用空合約作為範例,但我首先遇到了不一致的編譯與不那麼瑣碎的合約。這不僅僅是空契約的一個怪癖。

我沒有完整的答案,但我會分享我的發現。我使用Browser Solidity編譯合約,並使用Etherscan 的反彙編程序幫助我得到結果。

當我contract A {}在 Browser Solidity 中編譯時,我查看了“Assembly”(您需要“Toggle Details”)。表明:

。程式碼
PUSH 60 合約 A {\n}
// 一些東西...
JUMPI 合約 A {\n}
標籤 1 合約 A {\n}
JUMPDEST 合約 A {\n}
// 解包部署合約...
返回合約 A {\n}
。數據
0:
// 現在我們在這裡部署了合約
。程式碼
PUSH 60 合約 A {\n}
PUSH 40 合約 A {\n}
MSTORE 合約 A {\n}
標籤 1 合約 A {\n}
JUMPDEST 合約 A {\n}
PUSH [ErrorTag] 合約 A {\n}
JUMP 合約 A {\n}
。數據
// 哦,這裡沒什麼可展示的了,但這就是我們感興趣的地方。

然後我把“執行時字節碼”的內容粘貼到反彙編器中。

這些行:

[17] PUSH6 0x627a7a723058
[18] SHA3 // 它的操作碼是 0x20

對應於xxxxx5820您確定的。你猜怎麼著:

> web3.toUtf8("0x627a7a723058")
“bzzr0X”

然後緊隨其後的是81ef35e9ce2010474897d82da20c73d954e24c1e93fceaca1da5d1ed75650a2632 個字節,如果您返回 Solidity,則與“元數據位置”下的相同。

所以我的理解是合約的程式碼沒有改變;只有它的 Swarm 地址有。合約驗證者需要將這部分抽像出來。

編輯:我剛剛在字節碼中找到了元數據雜湊的編碼

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