Wie kombiniere ich Ganzzahlen, um Gas bei Transaktionsdaten und Speicherplatz zu sparen?

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?

Antworten (1)

Lagerkosten

Es ist eine gute Idee, Daten von Variablen, die kleiner als 32 Bytes sind, vor dem Speichern zu kombinieren! SSTOREist 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
Nach meinem Verständnis ist ein Param billiger als zwei Params?
Verstanden, ich habe einen Abschnitt über die Gaskosten für das Senden von Parametern in einer Transaktion hinzugefügt. Bitte akzeptieren Sie, wenn dies Ihre Frage beantwortet.
Vielen Dank, ich verstehe. Ich mache viele Tests, jetzt entscheide ich mich, die beiden Parameter in einer Struktur zu speichern.