1

ganache と testRPC に問題がありout of gas、web3 プロバイダーを使用している場合にのみエラーが発生し続けますが、Javascript VM を使用している場合やトリュフの 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;

そして、スローするメソッド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];
}

delete2行をコメントアウトすると、正常に実行されます。ただし、それらを使用するdeleteか、単に再割り当てしても失敗します。

これを Truffle のテスト スイートで実行すると機能し、Javascript VM を使用して Remix を介してこれらのアクションを手動でコミットするときにも機能します。testRPC または 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 に答える