contract A {
uint8 a = 0;
}
kostet 20150 + 2000 Gas während der Erstellung.
verglichen mit
contract A {
uint a = 0; // or uint256
}
kostet 5050 + 2000 Gas während der Erstellung
Es ist seltsam, dass eine Variable, die weniger Speicherplatz benötigt, mehr Benzin kostet. Warum ist das so?
Das EVM arbeitet mit 256-Bit/32-Byte-Wörtern (umstrittene Designentscheidung). Jede Operation basiert auf diesen Basiseinheiten. Wenn Ihre Daten kleiner sind, sind weitere Operationen erforderlich, um von 256 Bit auf 8 Bit herunterzuskalieren, weshalb Sie erhöhte Kosten sehen.
Übrigens, wenn Sie die "Details" im Online-Solidity-Compiler umschalten, erhalten Sie den genauen Assembly-Dump, aus dem die zusätzlichen Opcodes stammen. Ich hatte jetzt keine Zeit, sie zu interpretieren, aber wenn Sie dies tun und feststellen, dass es etwas Zusätzliches gibt, bin ich sicher, dass das Solidity-Team gerne Optimierungen hinzufügen würde, um sie zu umgehen.
Es sollte jedoch beachtet werden, dass uint8 in einer Struktur aufgrund der engen Packungsfunktion weniger kostet als ein herkömmliches uint. Stellen Sie außerdem sicher, dass Ihre Uints neben Ihren anderen Uints und Bytes neben Bytes usw. liegen. Dies erhöht die dicht gepackten Funktionen weiter.
struct
sollte in a uints
nacheinander auch auf andere Typen definiert werden und warum? @ VoR0220SOLC 0.4.18: Jetzt ist der Unterschied gering
https://ethfiddle.com/6lt852gx7K
Vertrag A mit uint8
Kosten von 75414 für die Bereitstellung
Vertrag B mit uint256
Kosten von 73867 für die Bereitstellung
Ein Unterschied von 1547 Gas.
Update im Dezember 2021:
Wenn Sie so etwas testen: 5 Variablen statt nur 1, was eher einem realen Szenario mit mehreren Variablen ähneln könnte, nicht nur einer.
contract A {
uint8 a = 0;
uint8 b = 0;
uint8 c = 0;
uint8 d = 0;
uint8 e = 0;
}
Dann ist es billiger als seine uint256-Version.
Aus dem Remix:
uint8: 69484gas uint256: 78420gas
Update Juni 2022 (0.8.15)
uint8: 83524gas uint256: 90183gas
Sie sparen also Gas, wenn Sie Uint mit geringerer Größe verwenden, wie andere Kommentare sagen, wenn es sich um Arrays handelt, sparen Sie mehr.
uzyn
uint256
. Nächste Frage Ich frage mich, ob es dann immer sinnvoll ist, sich einfach an uint256 zu halten und niemals kleiner zu werden.Nick Johnson
Alper
uint32
in astruct
statt erstellenuint256
und sie in ein Array schieben, kostet es viel weniger Gas.