Contract-Development
估算氣體上的操作碼無效
這是我的契約
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])); } }