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?
Wie könnte ich es gaseffizienter machen?
Sie können die Bitgröße Ihres uint
's-Befehls ändern.
Wenn Sie verwenden, verwenden uint256
Sie einen ganzen 32-Byte-Block. Wenn Sie uint128
beispielsweise verwenden, könnten Sie mehr Daten in einen SSTORE
Vorgang 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.