1

我在使用 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但它仍然提供了气体错误。

4

1 回答 1

0

正如@AdamKipnis 建议的那样,我们可以使用更高的gasLimit 来解决这个问题。这目前在 Remix 本身内是不可能的,但是在与该方法交互时从 MetaMask 指定额外的 50-100k gasLimit 确实解决了问题并为当前状态下的问题提供了解决方法。然而,这仍然只是一个创可贴,需要更深入的测试才能找到解决核心问题的合适方法。

于 2018-03-09T19:17:45.077 回答