Zum Beispiel habe ich zwei ganze Zahlen: eine ist uint128, eine andere ist uint64. Ich möchte diese beiden Ganzzahlen speichern, indem ich sie in bytes24 umwandele. Und wenn ich sie verwende, parse die bytes24 zu uint128 und uint64.
Wie mache ich das?
Lagerkosten
Es ist eine gute Idee, Daten von Variablen, die kleiner als 32 Bytes sind, vor dem Speichern zu kombinieren! SSTORE
ist mit 20 Kilogas pro EVM-Wort (32 Bytes) sehr teuer. Glücklicherweise erledigt Solidity dies unter der Haube für Sie, wenn Sie mit kompilieren solc --optimize
. Wie das funktioniert, erfahren Sie im Abschnitt „Weitere Optimierung“ dieses Artikels zum EVM . Vielleicht lassen Sie auch den Compiler die Arbeit für Sie erledigen.
Transaktionsdatenkosten
Das separate Einsenden der Parameter ist mit eigenen Gaskosten verbunden. Dies sollte jedoch nicht ganz oben auf Ihrer Liste der Bedenken stehen: Es kostet nur 68 Gas pro Byte ungleich Null. Das klingt nach viel für ein volles 32-Byte-Uint, aber wenn Sie kleinere Werte übergeben, haben sie viele Nullen (nur zum Preis von 4 Gas pro Byte).
Es stellt sich heraus, dass Sie durch die Kombination der Felder nur 128 Gas an Transaktionsdatenkosten sparen würden, da Sie nur die Anzahl der gesendeten Nullen reduzieren, die billig sind. Dieses eingesparte Gas beinhaltet nicht einmal die zusätzlichen Kosten für die erneute Aufteilung der Daten in Solidity. Dies ist den Aufwand eindeutig nicht wert und wirkt sich wahrscheinlich negativ auf die Gaskosten aus.
Ohne die Felder zu kombinieren:
fieldA = 0x00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
fieldB = 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF
transaction non-zero bytes = (128 + 64) / 8 = 24
transaction zero bytes = (128 + 192) / 8 = 40
gas cost for parameters = 68 * 24 + 4 * 40 = 1792
Mit der Kombination der Felder:
fieldC = 0x0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
transaction non-zero bytes = (128 + 64) / 8 = 24
transaction zero bytes = 64 / 8 = 8
gas cost for parameters = 68 * 24 + 4 * 8 = 1664
Kevin
Schnitzer
Kevin