Solidity

來自主網和測試網 Ropsten 上的 ERC20 代幣合約的approvalAndCall ()

  • January 2, 2019

怎麼可能:相同程式碼中的相同功能,可以在 MainNet 上呼叫,並且在 TestNet 上嘗試通過相同的乙太坊錢包啟動時,我收到以下消息:

看來這筆交易會失敗。如果您送出它,它可能會消耗您提供的所有gas。預計費用消耗:合約不允許執行此交易

乙太坊錢包顯示 Ropsten 5.271 乙太每百萬氣體的氣體價格:

在此處輸入圖像描述

測試網合約https://ropsten.etherscan.io/address/0x47d55ec9E1d5DEb893D3943e6d84011E488b1A37#code>,主網合約<https://etherscan.io/address/0x684282178b1d61164febcf9609ca195bef9a33b5#code呼叫 的approveAndCall()函式基於來自https://ethereum.org的模型。令牌(在舊版本中) 將哪個地址用作參數似乎沒有區別。

我認為問題可能出在此函式的第三個參數上:‘bytes _extraData’,正如https://ethereum.stackexchange.com/a/11771/1964上所討論的那樣,‘Analysis’ 中的 Remix 也認為這不好:

函式 Corporation.approveAndCall(address,uint256,bytes) 的氣體需求未知或不恒定。

如果一個函式的gas需求高於block gas limit,它就不能被執行。請避免在修改大面積儲存的函式或操作中出現循環(這包括清除或複制儲存中的數組)”

哪裡可能有問題?如何讓在 MainNet 上執行的程式碼也可以在 Ropsten TestNet 上執行?我想讓使用者在開始在 MainNet 上工作之前在 TestNet 上測試合約成為可能。

我相信這是因為在主網合約編譯器版本是:v0.3.5,而在測試網上它是:v0.4.8。造成整體差異的關鍵變化是(在 0.4.0 中引入):

Contracts now throw if ... no function matches the signature.

Function call throws if target contract does not have code.

所以在這種情況下,對沒有定義函式的簡單地址或合約進行approveAndCall receive,會導致0.4.8的拋出,而在0.3.5中被忽略。考慮部署相同的字節碼以獲得相同的結果。

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