Gaskosten für das Setzen einer Zustandsvariablen auf den gleichen Wert

Nov 20 2020

Gemäß dieser Spezifikation verbraucht das Setzen einer Zustandsvariablen auf den gleichen Wert 200 Gas.

Ich habe jedoch einen Test über Ganache-Core v2.10.2 durchgeführt, und das Ergebnis lag näher bei 800 Gas:

Soliditätsvertrag:

pragma solidity 0.6.12;

contract MyContract {
    uint256 public gasUsed;
    uint256 public storageSlot;
    function func(uint256 x) public {
        storageSlot = x;
        uint256 gasLeft = gasleft();
        storageSlot = x;
        gasUsed = gasLeft - gasleft();
    }
}

Trüffel 5.x Test:

const MyContract = artifacts.require("MyContract");

contract("MyContract", () => {
    it("test", async () => {
        const myContract = await MyContract.new();
        for (let x = 0; x < 10; x++) {
            await myContract.func(x);
            const gasUsed = await myContract.gasUsed();
            console.log(gasUsed.toString());
        }
    });
});

Der Ausdruck ist 816 für jede Iteration, und unter der Annahme, dass der gasleft()Vorgang in der letzten Zeile der Vertragsfunktion 16 Gas kostet, scheint das Speichern des gleichen Werts 800 Gas zu kosten.

Ich vermute, dass die Gaskosten in der Spezifikation für ältere EVM-Versionen gelten (vor Istanbul oder so ähnlich), bei denen SLOAD früher 200 Gase gekostet hat.

In der aktuellen EVM-Version hat sich SLOAD auf 800 Gas geändert, daher glaube ich, dass sich der Fall von SSTORE mit demselben Wert möglicherweise auch auf 800 Gas geändert hat.

Hat jemand eine Ahnung von dieser Diskrepanz?

Antworten

2 MrClottom Nov 20 2020 at 21:32

Diese Kosten für eine unveränderte Änderung SSTOREwurden in 800Gas umgewandelt, wie von EIP-2200 und EIP-1884 vorgeschlagen (die ich aus irgendeinem Grund nirgendwo finden kann). Ich nehme an, der 200Wert dient der Abwärtskompatibilität. Wenn Sie in Ihrer Spezifikation suchen, finden Sie die SloadGasEIP1884und SloadGasEIP1884-Werte. Wenn ein neuer Knoten alle Transaktionen synchronisiert und überprüft, muss er auch in der Lage sein, alte Konsensregeln zu verstehen, weshalb er wahrscheinlich dort enthalten ist. Persönlich könnte es auch nur alter, nicht überarbeiteter Code sein, ich bin mit der Geth-Codebasis nicht allzu vertraut.

Für die Zukunft würde ich die Remix-Web-IDE empfehlen, um Details auf niedriger Ebene wie die Gaskosten zu überprüfen und zu debuggen. Remix hat den besten mir bekannten Debugger, mit dem Sie die Ausführung jedes Op-Codes einzeln durchlaufen können.