Remix
false 交易被探勘但執行失敗
我試圖使用 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]