我在使用 ganache 和 testRPC 时遇到问题,out of gas
只有在使用 web3 提供程序时才会出现错误,但在使用 Javascript VM 或 truffle javascript 测试时不会出现错误。
我的映射设置如下:
mapping (uint => address) public reservers;
mapping (uint => Reservation) public reservations;
mapping (uint => address) public bidders;
mapping (uint => Bid) public bids;
mapping (uint => uint) public lastSoldFor;
抛出 a 的方法VM Exception while processing transaction: out of gas
是:
function sell(uint rId) public {
reservations[rId].publicKey = bids[rId].publicKey;
reservers[rId] = bidders[rId];
lastSoldFor[rId] = bids[rId].price;
delete bids[rId];
delete bidders[rId];
}
如果我注释掉这两delete
行,它就会成功运行。但是,如果我使用delete
或者即使我只是重新分配它们,它们也会失败。
通过 Truffle 的测试套件运行它时,它可以工作,并且当使用 Javascript VM 通过 Remix 手动提交这些操作时,它也可以工作。只有当它连接到 testRPC 或 ganache 时才会失败。
其他所有方法似乎也可以从 ganache 中正常工作,只是删除似乎有问题。我也看到了一些关于此的参考,因为 gas 已退还,而且由于这种方法的 gas 价格相当低,它会在 ganache 中引起一些怪异。有没有一种解决方法,它不会让我每次想要进行更改时都必须将合同上传到测试网络?
编辑:似乎我可以证明这与低耗气量无关,而是与映射索引的清除有关。我在方法中添加了一些大量的气体消耗,它仍然以同样的气体错误退出。
新状态变量:
uint[] memorysink;
然后在我添加的方法中
memorysink.push(200000000);
memorysink.push(200000000);
memorysink.push(200000000);
memorysink.push(200000000);
memorysink.push(200000000);
这将气体消耗量从43279
到 ,141513
但它仍然提供了气体错误。