Solidity

在建構子呼叫期間,智能合約在區塊鏈上不可用

  • June 13, 2022

我有以下範常式式碼:

// 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
   }
}

我可以檢查已部署的合約並在建構子呼叫期間驗證 byteCodeaddress(this)是否為空。這就是為什麼IERC20(address(this)).totalSupply();必須在建構子中失敗。

它沒有任何使用意義IERC20 token = IERC20(address(this));,這只能在您使用界面的地方使用。

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