Remix

false 交易被探勘但執行失敗

  • December 3, 2021

我試圖使用 Remix IDE 將我的智能合約部署到 Kovan 測試網路,雖然它編譯成功但是當我嘗試部署它時,我收到了這個錯誤消息

“錯誤的交易被探勘,但執行失敗”

我的交易雜湊是“ 0x1e15c237c4329c63d74f7a3e63e3c9a2b3921d4eaf4bce304baf734a6c35df68

智能合約程式碼是多個合約的扁平化版本。粘貼箱上看到它。

這是一個創建合約的事務,因此由於它失敗,問題出在建構子中。

constructor(
   address[] memory _components,
   int256[] memory _units,
   address[] memory _modules,
   IController _controller,
   address _manager,
   string memory _name,
   string memory _symbol
)
   public
   ERC20(_name, _symbol)
{
   controller = _controller;
   manager = _manager;
   positionMultiplier = PreciseUnitMath.preciseUnitInt();
   components = _components;

   // Modules are put in PENDING state, as they need to be individually initialized by the Module
   for (uint256 i = 0; i < _modules.length; i++) {
       moduleStates[_modules[i]] = ISetToken.ModuleState.PENDING;
   }

   // Positions are put in default state initially
   for (uint256 j = 0; j < _components.length; j++) {
       componentPositions[_components[j]].virtualUnit = _units[j];
   }
}

該交易消耗了所有可用的 10,000,000 gas。這種類型的錯誤主要是由一個assert()或訪問一個數組越界引起的。

建構子非常簡單,沒有可能失敗的斷言或要求(ERC20 的建構子也被呼叫,但它也很簡單)。

對數組_modules和的訪問_components是正確的,但對數組的訪問_units從不檢查其長度。程式碼隱含地需要_units.length == _components.length.

解析建構子參數,我們可以看到最後一個要求失敗了。有一個單元和三個組件。

所以這條線失敗了j = 1

componentPositions[_components[j]].virtualUnit = _units[j]

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