Solidity

無法在 etherscan.io 上驗證 Solidity 合約程式碼

  • May 15, 2021

我知道這個問題已經被問過很多次了。我已經閱讀了大量的答案,但似乎沒有什麼對我有用。我首先嘗試驗證一個更大、更複雜的合約的原始碼,但沒有成功,所以我在 Solidity 中編寫了一個非常簡單的小合約:

pragma solidity ^0.4.17;

contract SimpleTest
{
   string public blablabla;
   function SimpleTest() public
   {
       blablabla = "Hello world!";
   }
}

如您所見,我沒有使用任何建構子參數、導入語句或庫。我在 Parity 內部使用 Solidity 0.4.17 編譯和部署了它。優化已啟用。我沒有使用其中一個夜間版本。

合約創建交易:

https://etherscan.io/tx/0x2d8615c8bfc548a210781443c872737d890f6c4a5aa373c3d6d20bbaac941b8d

有問題的契約:

https://etherscan.io/address/0x5a8b57a6cf17a196e000eca4481257d5d3025636

驗證頁面連結:

https://etherscan.io/verifyContract?a=0x5a8b57a6cf17a196e000eca4481257d5d3025636

我從 etherscan.io 得到的錯誤消息是:

對不起!“SimpleTest”的編譯合約字節碼與合約創建程式碼不匹配

$$ 0x5a8b57a6cf17a196e000eca4481257d5d3025636 $$ 找到契約名稱:“SimpleTest”

此時無法驗證契約。

我稍微分析了字節碼,發現:

  • 合約創建交易的輸入數據與我從 Parity 得到的字節碼完全一致。
  • etherscan.io 驗證器生成的字節碼類似於 Parity 的字節碼,因此也類似於合約創建交易的輸入數據。
  • etherscan.io 合約頁面上的字節碼比其他字節碼短得多。
  • 所有字節碼都包含2個00字節的大字元串,除了etherscan.io合約頁面上的字節碼,它只包含1個00字節的大字元串。

我真的不知道這裡發生了什麼。任何人都可以幫忙嗎?

從 remix 編譯時,我能夠驗證打開優化的契約:

https://ethereum.github.io/browser-solidity/

出於某種原因,即使您選擇相同的編譯器版本和相同的優化設置,它也會生成與 Parity 不同的字節碼。

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