Koszt gazu ustawienia zmiennej stanu na tę samą wartość

Nov 20 2020

Zgodnie z tą specyfikacją ustawienie zmiennej stanu na tę samą wartość zużywa 200 gazu.

Przeprowadziłem jednak test na ganache-core v2.10.2 i wynik był bliżej 800 gazu:

Umowa solidarności:

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());
        }
    });
});

Wydruk to 816 na każdą iterację i zakładając, że gasleft()operacja w ostatniej linii funkcji kontraktu kosztuje 16 gazu, przechowywanie tej samej wartości wydaje się kosztować 800 gazu.

Podejrzewam, że koszt gazu w specyfikacji dotyczy starszych wersji EVM (wcześniejszy Stambuł czy coś w tym rodzaju), gdzie SLOAD kosztował 200 gazu.

W obecnej wersji EVM SLOAD zmienił się na 800 gazu, więc uważam, że przypadek SSTORE o tej samej wartości mógł się również zmienić na 800 gazu.

Czy ktoś ma pojęcie o tej rozbieżności?

Odpowiedzi

2 MrClottom Nov 20 2020 at 21:32

Ten koszt niezmienny SSTOREzostał zmieniony na 800gaz zgodnie z propozycjami EIP-2200 i EIP-1884 (których z jakiegoś powodu nie mogę nigdzie znaleźć). Przypuszczam, że 200istnieje wartość dla wstecznej kompatybilności. Jeśli wyszukasz w specyfikacji, znajdziesz wartości SloadGasEIP1884i SloadGasEIP1884. Kiedy nowy węzeł synchronizuje i weryfikuje wszystkie transakcje, musi również być w stanie zrozumieć stare reguły konsensusu, co jest prawdopodobnie przyczyną ich uwzględnienia. Osobiście może to być po prostu stary, nierefaktorowany kod, nie jestem zbyt zaznajomiony z bazą kodu geth.

Na przyszłość polecam remix web IDE do sprawdzania i debugowania szczegółów niskiego poziomu, takich jak koszt gazu. Remix ma najlepszy debugger, jaki znam, pozwalający przejść przez wykonanie każdego kodu operacyjnego indywidualnie.