Gaskosten für das Setzen einer Zustandsvariablen auf den gleichen Wert
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
Diese Kosten für eine unveränderte Änderung SSTORE
wurden in 800
Gas umgewandelt, wie von EIP-2200 und EIP-1884 vorgeschlagen (die ich aus irgendeinem Grund nirgendwo finden kann). Ich nehme an, der 200
Wert dient der Abwärtskompatibilität. Wenn Sie in Ihrer Spezifikation suchen, finden Sie die SloadGasEIP1884
und 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.