Coût du gaz pour définir une variable d'état à la même valeur
Selon cette spécification , régler une variable d'état à la même valeur consomme 200 gaz.
Cependant, j'ai effectué un test sur ganache-core v2.10.2, et le résultat était plus proche de 800 gaz:
Contrat de solidité:
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();
}
}
Test Truffle 5.x:
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());
}
});
});
L'impression est de 816 pour chaque itération, et en supposant que l' gasleft()
opération dans la dernière ligne de la fonction de contrat coûte 16 gaz, le stockage de la même valeur semble coûter 800 gaz.
Je soupçonne que le coût du gaz dans la spécification s'applique aux anciennes versions d'EVM (avant Istanbul ou quelque chose du genre), où SLOAD coûtait 200 gaz.
Dans la version actuelle d'EVM, SLOAD est passé à 800 gaz, donc je pense que le cas de SSTORE de la même valeur peut également avoir changé en 800 gaz.
Quelqu'un a-t-il une idée de cet écart?
Réponses
Ce coût d'un non-changement a SSTORE
été changé en 800
gaz comme proposé par EIP-2200 et EIP-1884 (que je ne trouve nulle part pour une raison quelconque). Je suppose que la 200
valeur est là pour la compatibilité ascendante. Si vous recherchez dans vos spécifications, vous trouverez les valeurs SloadGasEIP1884
et SloadGasEIP1884
. Lorsqu'un nouveau nœud se synchronise et vérifie toutes les transactions, il doit également être capable de comprendre les anciennes règles de consensus, ce qui explique probablement pourquoi il y est inclus. Personnellement, il peut également s'agir d'un ancien code non refactoré, je ne suis pas trop familier avec la base de code geth.
Pour l'avenir, je recommanderais l' IDE Web de remix pour vérifier et déboguer les détails de bas niveau tels que le coût du gaz. Remix a le meilleur débogueur que je connaisse, vous permettant de parcourir l'exécution de chaque code d'opération individuellement.