Solidity

無法重現 0.6.6 合約的 Etherscan 驗證編譯

  • October 8, 2020

我正在嘗試在 Etherscan 上重現以下合約編譯:https ://etherscan.io/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#code 。


執行時字節碼鏈上

eth_getCode我可以通過從連接到主網的 JSON RPC 客戶端呼叫合約地址來獲取鏈上的執行時字節碼。

這是我得到的字節碼:

60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114...

執行時字節碼 (Etherscan)

在這裡,查看上面連結中的 etherscan 合約資訊,我注意到 3 個關鍵內容:編譯器版本 ( 0.6.6)、優化執行 (999999) 和 evm 版本 (istanbul)。

所以我設置了 Solidity 編譯如下:

{
   "language": "Solidity",
   "sources":
   {
       "uniswap.sol":
       {
           "urls":
           [
               "./uniswap.sol"
           ]
       }
   },
   "settings": {
       "optimizer": {
           "runs": 999999
       },
       "evmVersion": "istanbul",
       "outputSelection": {
           "*": {
               "*": [ "evm.deployedBytecode" ]
           }
       }
   }
}

並執行:

solc --standard-json --allow-paths .

但我得到的字節碼略有不同:

60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e337001461131e578063f305d71914611406578063fb3bdb4114...

複製中可能有什麼問題,我該如何修改?如果使用不可變值,建構子參數可以更改執行時字節碼嗎?

經過一些評論後,我們發現優化器沒有啟用

必須修改優化器的設置以添加 a "enabled",所以它看起來像這樣:

"settings": {
   "optimizer": {
       "enabled": true,
       "runs": 999999
   },
   ....
}

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