Solidity
無法重現 0.6.6 合約的 Etherscan 驗證編譯
我正在嘗試在 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 }, .... }