Das Aufrufen einer Funktion zum Nullen von Strukturdaten in einem Mapping kostet mehr Gas als andere Aufrufe und verursacht einen Gasfehler

Ich arbeite mit den folgenden Funktions- und Zustandsvariablen:

struct TimeRestriction {
   uint256 fromTime;
   uint256 toTime;
}

mapping (address => TimeRestriction) public whitelist;

function modifyWhitelist(address _investor, uint256 _fromTime, uint256 _toTime) public withPerm(WHITELIST) {

    //Passing a _time == 0 into this function, is equivalent to removing the _investor from the whitelist

    whitelist[_investor] = TimeRestriction(_fromTime, _toTime);
    emit LogModifyWhitelist(_investor, now, msg.sender, _fromTime, _toTime);
}

Ich kann diese Funktion derzeit erfolgreich aufrufen und in die Blockchain schreiben. Ich kann es sogar aufrufen und die Werte auf einen beliebigen Zeitstempel aktualisieren. Aber aus irgendeinem seltsamen Grund schlägt es fehl, wenn ich versuche, 0-Werte an diese Funktion zu übergeben. Ich bekomme folgenden Fehler:

Error: Transaction dry run failed: Invalid JSON RPC response: {"id":470,"jsonrpc":"2.0"}.

Als ich mich dann weiter damit befasste, bekam ich diesen Fehler:

Error:Returned error: base fee exceeds gas limit.

Wenn ich dann die Tx-Gasmenge um 25% erhöhe, sehe ich:

Error:Returned error: VM Exception while processing transaction: out of gas

Und wenn ich dann die Tx-Gasmenge um 100% erhöhe, funktioniert es tatsächlich. (Beachten Sie, dass ich die web3-Schätzgasfunktion von web3 1.0.0-beta.30 verwende)

Weiß jemand was hier los ist? Es scheint mir, als würde das Setzen dieser Werte auf Null erheblich mehr Benzin kosten, aber nach dem Lesen scheint es, dass das Setzen auf Null das Gas zurückerstatten und Sie weniger kosten soll.

Hat es etwas damit zu tun, dass es sich um eine Struktur innerhalb einer Zuordnung handelt? Ich bin hier in eine Sackgasse geraten

Hier ist meine Umgebung: Ganache CLI v6.1.0 (ganache-core: 2.1.0) Chrome Version 65.0.3325.181 Truffle Version 4.1.3^

Antworten (1)

Ich habe es aufgespürt, siehe eine detaillierte Liste der Probleme von Ganache, Geth und Metamask hier: https://github.com/PolymathNetwork/polymath.js/issues/6

Aber im Grunde verwendet Ganache nicht die binäre Suche nach Gasschätzungen, die Geth und Metamask verwenden. Die Gasschätzung gibt die tatsächliche Gasschätzung zurück, die aufgrund der Rückerstattung niedriger ist. Das EVM verlangt jedoch, dass Sie gasEstimated + gasRefunded mit der Transaktion senden, und Sie erhalten dann eine Rückerstattung, wenn sie abgeschlossen ist.

Ganache schätzt also am Ende einen korrekten Wert mit implementierter Rückerstattung, aber die EVM akzeptiert das nicht.