Solidity
在solidity中繼承但相同的契約的不同,不一致的編譯
考慮以下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
如果您掃描到
5820
A 的編譯中的字節,您會發現兩個版本緊隨其後。我希望 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”
然後緊隨其後的是
81ef35e9ce2010474897d82da20c73d954e24c1e93fceaca1da5d1ed75650a26
32 個字節,如果您返回 Solidity,則與“元數據位置”下的相同。所以我的理解是合約的程式碼沒有改變;只有它的 Swarm 地址有。合約驗證者需要將這部分抽像出來。
編輯:我剛剛在字節碼中找到了元數據雜湊的編碼