Wie kann man diese Funktion gaseffizienter machen?

Ich habe diese Funktion:

function foo(uint256 _a, uint256 _b, uint256 _c) {
    require(map[msg.sender].a == 1);
    require(map[msg.sender].b < 1);
    require(map[msg.sender].c > 1);

    deposits[msg.sender].a = _a;
    deposits[msg.sender].b = _b;
    deposits[msg.sender].c = _c;
}

Ist das extrem verschwenderisch?

Wie könnte ich es gaseffizienter machen?

Antworten (1)

Wie könnte ich es gaseffizienter machen?

Sie können die Bitgröße Ihres uint's-Befehls ändern.

Wenn Sie verwenden, verwenden uint256Sie einen ganzen 32-Byte-Block. Wenn Sie uint128beispielsweise verwenden, könnten Sie mehr Daten in einen SSTOREVorgang einpassen (aufgrund der Solidity-Compiler-Optimierung).


Lassen Sie mich einige Beispiele für den Gasverbrauch geben:


Funktion:

function getVariables() public {
    deposits[msg.sender].a = 1;
    deposits[msg.sender].b = 1;
    deposits[msg.sender].c = 1;
}

uint256 struct

struct demo {
        uint256 a;
        uint256 b;
        uint256 c;
    }

Ausführungskosten: 60455 Gas

uint128 struct

struct demo {
        uint128 a;
        uint128 b;
        uint128 c;
    }

Ausführungskosten: 46264 Gas

uint64-Struktur

struct demo {
        uint64 a;
        uint64 b;
        uint64 c;
    }

Ausführungskosten: 31314 Gas


Wenn der Solidity-Compiler die Größe von Speichervariablen ermitteln kann, legt er sie einfach nacheinander im Speicher an. Wenn möglich, packt der Compiler die Daten eng in Blöcke von 32 Bytes.

Vom Eintauchen in die Ethereum VM Teil 2 .