Evm
為什麼字節碼與 Etherscan 上的操作碼不匹配?
我只是瀏覽了這份契約的前幾個操作碼:https ://etherscan.io/address/0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e#code 。
哪些是(根據操作碼視圖):
PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x00f8
基於哪些 OPCODES 可用於乙太坊 EVM?,我希望字節碼是
0x6060604052156100f8...
.但是字節碼是:
0x60606040526002610108...
,我正在閱讀0x60 0x60 ;; PUSH1 0x60 0x60 0x40 ;; PUSH1 0x40 0x52 ;; MSTORE 0x60 0x02 ;; PUSH1 0x02??? 0x61 0x01 x08 ;; PUSH2 0x01 0x08???
我究竟做錯了什麼?
“契約創建程式碼”(包括前面的建構子)和部署的字節碼之間存在差異。“字節碼視圖”向您展示了完整的合約創建程式碼,前面有建構子;“操作碼視圖”僅向您顯示實際部署的合約程式碼。建構子僅在合約部署時執行一次,以創建和設置部署的程式碼;它根本不會出現在部署的字節碼中。這在 Etherscan 使用者界面上並不明顯!據我所知,實際部署的程式碼從字節 0x01bf 開始(大建構子)。
您可以通過訪問實際部署的字節碼來驗證這一點
web3.eth.getCode('0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e');
,您會發現其輸出與 Etherscan 上的 Opcodes 視圖相匹配。