Contract-Development

估算氣體上的操作碼無效

  • March 1, 2018

這是我的契約

pragma solidity ^0.4.20;

contract Test {
   struct TestStruct {
       bytes32 name;
       mapping(uint => address) tesMapping;
   }

   TestStruct[] public testStructs;

   function Test(bytes32[] names) {
       for (uint i = 0; i < names.length; i++) {
           testStructs[i] = TestStruct(names[i]);
       }
   }
}

我正在使用 web3 v1.0。我創建了一個新的契約實例:

c = new web3.eth.Contract(abi, from, { 
   data: data
});

其中 abi、from 和 data 之前以正確的方式定義。

當我嘗試以這種方式估計部署所需的氣體時:

c.deploy({ 
   data: data, 
   arguments: myArgs
}).estimateGas(console.log);

我收到此錯誤:

Error: Returned error: VM Exception while processing transaction: invalid opcode

如果我刪除建構子的主體(我將建構子留空),我得到null.

建構子中的for循環有問題嗎?

您正在寫超出數組的末尾。

TestStruct[] public testStructs;

function Test(bytes32[] names) {
   for (uint i = 0; i < names.length; i++) {
       testStructs[i] = TestStruct(names[i]);
   }
}

testStructs是一個動態大小的數組,初始大小為 0。循環的第一次迭代,您嘗試寫入testStructs[0],這是超出範圍的。

改用push

TestStruct[] public testStructs;

function Test(bytes32[] names) {
   for (uint i = 0; i < names.length; i++) {
       testStructs.push(TestStruct(names[i]));
   }
}

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