Möglicherweise sind Sie schon auf einige Solidity-Tipps gestoßen, mit denen Sie Ihre Programmierkenntnisse verbessern und so etwas Gas sparen können. Heute möchte ich mich jedoch mehr darauf konzentrieren, wie Sie durch das Verständnis der Ethereum Virtual Machine effektiv Gaskosten für Ihre Smart Contracts sparen können.

Da wir uns näher mit Ethereum befassen, lasse ich hier einen Ausschnitt des Yellow Papers stehen, in dem die Gaskosten der Opcodes angegeben sind, und wir werden im weiteren Verlauf des Artikels darauf Bezug nehmen.



Tipp Nr. 1: Kalter Zugang vs. warmer Zugang

GKaltlast: 2100 Gas

Gwarmaccess: 100 Gas

Hier haben wir unsere ersten OPCODES. Der erste gibt an, wie viel es kostet, zum ersten Mal auf eine Variable zuzugreifen (oder Kaltzugriff), während der zweite angibt, wie viel es kostet, ein zweites Mal und darüber hinaus auf die Variable zuzugreifen (Warmzugriff). Wie Sie sehen, ist der Preisunterschied ziemlich groß. Wenn Sie dies verstehen, kann dies einen großen Unterschied bei den Kosten der Transaktionen Ihres Smart Contracts ausmachen. Sehen wir uns ein Beispiel an.





Das Zwischenspeichern der Daten innerhalb einer Funktion in Solidity kann zu einem geringeren Gasverbrauch führen, selbst wenn mehr Codezeilen erforderlich sind. In diesem Fall geschieht dies, indem der Speicherort des Arrays geändert wird. Anstatt es aus dem Speicher zu verwenden und daher bei jeder Schleife kalt darauf zuzugreifen, wird das Array im Speicher gespeichert, wo der Zugriff günstiger ist.

Tipp Nr. 2: Null- vs. Nicht-Null-Werte und Gasrückerstattungen

Gsset = 20.000 Gas

Rsclear = {Rabatt auf den Ausführungspreis}

Das Ändern eines Werts von 0 auf ungleich null in der Ethereum-Blockchain ist teuer, wie wir am Preis von Gsset sehen, aber das Ändern eines Werts von ungleich null auf 0 kann Ihnen gemäß dem Opcode Rsclear eine Rückerstattung des Gaswerts einbringen. Um die Rückerstattung nicht in Anspruch zu nehmen, ist festgelegt, dass Sie nur bis zu maximal 20 % der gesamten Transaktionskosten erstattet bekommen können.

Ein solches Szenario findet sich in einem sehr häufigen Szenario auf Blockchain, nämlich der Aktualisierung des Adressbestands in Smart Contracts. Sehen wir uns jeweils ein Beispiel an:





  • Im ersten Beispiel des ZeroToNonZero-Vertrags: ungleich Null bis ungleich Null (5.000 Gas*) + Null bis ungleich Null (20.000 Gas) = ​​25.000 Gas

  • Im zweiten Beispiel des NonZeroToZero-Vertrags gilt: Von Null bis Null (5.000 Gas*) + von Null bis von Null (20.000 Gas) – Rückerstattung (4.800 Gas) = ​​21.200 Gas

*2.100 (Gcolssload) + 2.900 (Gsreset) = 5.000 Gas

Tipp Nr. 3: Die Reihenfolge der Zustandsvariablen ist wichtig

Der Speicher ist wie eine Schlüssel-Wert-Datenstruktur, die die Zustandsvariablenwerte eines Solidity-Smart-Vertrags enthält.

Sie können sich den Speicher als Array vorstellen, was Ihnen dabei hilft, dies zu visualisieren. Jeder Platz in diesem Speicher-„Array“ wird als Slot bezeichnet und enthält 32 Bytes (256 Bits) an Daten. Jede im Smart Contract deklarierte Statusvariable belegt je nach ihrer Deklarationsposition und ihrem Typ einen Slot.

Nicht alle Datentypen belegen die gesamten 32 Bytes jedes Steckplatzes, da es einige Datentypen (bool, uint8, Adresse usw.) gibt, die weniger belegen.

Der Trick dabei besteht darin, dass der Compiler von Solidity versucht, zwei/drei oder mehr Variablen, die zusammen 32 Bytes oder weniger groß sind, in einem einzigen Steckplatz zusammenzupacken. Diese Variablen müssen jedoch nebeneinander definiert werden.





Hier verwenden wir die Datentypen bool (1 Byte), address (20 Byte) und uint256 (32 Byte). Wenn Sie die Größe dieser Variablen kennen, können Sie also leicht verstehen, dass im ersten Beispiel im TwoSlots-Vertrag bool und address zusammen haben (1 + 20 = 21 Byte, also weniger als 32 Byte), und diese einen Slot belegen. Im ThreeSlots-Vertrag können bool und uint256 nicht im selben Slot sein (1 + 32 = 33 Byte, also mehr als die Slot-Kapazität), und wir verwenden insgesamt drei Slots.

Warum ist das so wichtig?

Der Opcode SLOAD kostet 2100 Gas und wird zum Lesen aus Speichersteckplätzen verwendet. Wenn Sie also die Variablen in weniger Steckplätzen speichern können, sparen Sie letztendlich etwas Gas.

Tipp Nr. 4: uint256 ist günstiger als uint8

Wir haben in Tipp Nr. 3 gelernt, dass uint256 (256 Bit = 32 Byte) selbst einen Slot belegt und wir haben auch gelernt, dass uint8 kleiner als 32 Byte ist. Obwohl es also ziemlich klar ist, dass 8 Bit kleiner als 256 Bit sind, warum ist uint256 günstiger?

Um das zu verstehen, ist es wichtig zu wissen, dass, wenn eine Variable nicht den gesamten Slot ausfüllt und dieser Slot nicht von einer anderen Variablen ausgefüllt wird, das EVM die restlichen Bits mit „0“en füllt, um es manipulieren zu können.

Diese vom EVM durchgeführte „0“-Addition kostet Gas. Das bedeutet, dass es zum Einsparen von Transaktionsgas besser ist, uint256 statt uint8 zu verwenden.

__________________

Hoffentlich haben Sie beim Lesen dieser Tipps zur Reduzierung der Gaskosten in Ihren Smart Contracts auch ein wenig über die Funktionsweise des EVM gelernt.

__________________

Twittern Sie @TheBlockChainer, um weitere tägliche Updates zu Smart Contracts, Web3-Sicherheit, Solidity, Auditing von Smart Contracts und mehr zu erhalten.

__________________