Solidity
在建構子呼叫期間,智能合約在區塊鏈上不可用
我有以下範常式式碼:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract ERC20TotalSupplyTest is ERC20 { event Msg(address addr); constructor() ERC20('simple', 'TST') { emit Msg(address(this)); totalSupply(); IERC20 token = IERC20(address(this)); token.totalSupply(); //this line reverts the transaction } }
我可以編譯智能合約。如果我省略最後一行,則契約部署良好。最後一行,由於部署已恢復,我無法部署契約。
在我的實際項目中,建構子正在呼叫另一個智能合約,然後將 ERC20 智能合約轉換為 IERC20 介面並在其上呼叫一個方法。
有人可以解釋為什麼在執行沒有問題的情況下
token.totalSupply();
會導致智能合約的部署被還原嗎?totalSupply();
Msg 事件記錄合約的最終地址。如果此地址可用於活動,我想正確的地址必須可用於 IERC20 演員?或者 IERC20(address(this)) 轉換是否假設合約已經部署到區塊鏈,但現在還不是這樣?
如果我將契約修改如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract ERC20TotalSupplyTest is ERC20 { event Msg(address addr); bytes public byteCode; uint public byteCodeLength; constructor() ERC20('simple', 'TST') { emit Msg(address(this)); totalSupply(); byteCode = address(this).code; byteCodeLength = byteCode.length; //IERC20 token = IERC20(address(this)); //token.totalSupply(); //this line reverts the transaction } }
我可以檢查已部署的合約並在建構子呼叫期間驗證 byteCode
address(this)
是否為空。這就是為什麼IERC20(address(this)).totalSupply();
必須在建構子中失敗。
它沒有任何使用意義
IERC20 token = IERC20(address(this));
,這只能在您使用界面的地方使用。