Solidity Gas Optimization: So reduzieren Sie den Gasverbrauch
Gas wird verwendet, um die Rechenressourcen zu bezahlen, die zur Ausführung eines Smart Contracts erforderlich sind. Je komplexer und rechenintensiver Ihr Smart Contract ist, desto mehr Gas verbraucht er und desto teurer ist er.
Darüber hinaus sind Gasgebühren ein Anreiz für Ethereum-Miner, Transaktionen zur Blockchain hinzuzufügen. Wenn Sie eine Transaktion senden, erhöht die Festlegung eines höheren Limits für den Gasverbrauch die Wahrscheinlichkeit, dass Ihre Transaktion in den nächsten Block aufgenommen wird.
Allerdings ist es oft schwierig abzuschätzen, wie viel Gas Ihr Smart Contract verbrauchen wird. Der Gaspreis wird auf der Grundlage vieler verschiedener Faktoren bestimmt, darunter Angebot, Nachfrage und der schwankende Ethereum-Preis . Daher ist es besonders wichtig, Smart Contracts richtig zu optimieren, um ihren Gasverbrauch überhaupt zu reduzieren.
Smart Contract-Gasschätzung vs. Optimierung
Viele Smart-Contract-Ingenieure nutzen unterschiedliche Tools zur Schätzung des Gasverbrauchs, um zu vermeiden, dass für Gas zu wenig oder zu viel bezahlt wird. Allerdings sind diese Schätzungen nicht immer genau, da viele unterschiedliche Faktoren den Gaspreis beeinflussen. Beispielsweise erschweren unterschiedliche Blockgrößen, Blockzeiten, Blockausbreitungszeiten oder Vergleiche mit aktuellen Blöcken eine genaue Schätzung des möglichen Mindestgaspreises für den folgenden Block.
Aus diesem Grund ist die Optimierung intelligenter Verträge unerlässlich, damit Ingenieure ihren Code schreiben und verbessern können, um den Gasverbrauch zu reduzieren. Bei der Ethereum-Gasoptimierung müssen Sie sicherstellen, dass Ihr Code wie vorgesehen ausgeführt wird und dabei weniger Rechenressourcen verbraucht. Und das wird mit Tenderly Gas Profiler einfacher.
So optimieren Sie den Smart Contract-Gasverbrauch mit Tenderly Gas Profiler
Gas Profiler bietet einen detaillierten Überblick darüber, wie viel Gas eine Transaktion bei der Ausführung in der Kette oder außerhalb der Kette verbraucht hat. Die Funktion verwendet Flammendiagramme als visuelle Darstellung des Gasverbrauchs während der gesamten Transaktion. Anschließend können Sie den Gasverbrauch auf einzelne Funktionsaufrufe herunterbrechen und sehen, welche Teile Ihres Codes für die Ausführung am meisten Gas verbraucht haben.
Sie können ganz einfach auf Gas Profiler zugreifen, indem Sie ein Tenderly-Konto erstellen , eine Transaktion öffnen und dann in der Navigationsleiste auf die Registerkarte Gas Profiler klicken.
Warum Gas Profiler verwenden?
Viele Gasprofiler auf dem Markt sind eigentlich Gasschätzer und konzentrieren sich hauptsächlich auf die Anzeige des durchschnittlichen Gasverbrauchs in Smart Contracts. Dies kann hilfreich sein, bietet aber in den meisten Fällen nicht den Detaillierungsgrad, den Ingenieure benötigen.
Andererseits können Ingenieure mit Tenderly Gas Profiler ganz einfach untersuchen, wie viel Gas jede aufgerufene Funktion für die Ausführung einer Transaktion aufgewendet hat. Es ist ein unverzichtbares Tool zur Analyse von Smart Contracts und ein guter Ausgangspunkt für die weitere Codeoptimierung. Mit Gas Profiler können Sie den Gasverbrauch auf einer umfassenden Ebene verstehen und anschließend tief in die Ausführung interner Funktionen eintauchen, um einen detaillierten Einblick zu erhalten.
So optimieren Sie den Smart Contract-Gasverbrauch in Tenderly
Nachdem Sie die benötigten Informationen im Abschnitt „Gas Profiler“ gesammelt haben , können Sie die Funktion, die Sie überprüfen möchten, in Tenderly Debugger öffnen , indem Sie auf die Schaltfläche „Im Debugger anzeigen“ klicken.
Sobald Sie sich im Debugger befinden, können Sie die Codezeile mithilfe von Stack- und Ausführungs -Traces weiter untersuchen , um zusätzliche Informationen zu erhalten. Anhand dieser detaillierten Eingaben können Sie dann ermitteln, welche Code-Anpassungen Sie vornehmen können, um den Gasverbrauch zu senken.
Um zu beurteilen, ob die ermittelten Anpassungen den Gasverbrauch tatsächlich optimieren, können Sie den Tenderly Simulator verwenden . Bevor Sie die Simulation ausführen, können Sie die Vertragsquelle bearbeiten, um diese Anpassungen in den Code aufzunehmen, und die Ausführung mit der geänderten Quelle simulieren.
Der nächste Schritt besteht also darin, auf die Schaltfläche „Neu simulieren“ zu klicken. Klicken Sie in der nächsten Ansicht auf „Vertragsquelle bearbeiten“, um ein Fenster zu öffnen, in dem Sie die rechenintensive Codezeile optimieren können.
Sobald Sie die erforderlichen Änderungen vorgenommen haben, klicken Sie auf die Schaltfläche „Änderungen übernehmen“ und dann auf „Transaktion simulieren“. Sie erhalten eine neue Transaktionsausgabe mit aktualisiertem Gasverbrauch. Sie können zu Gas Profiler zurückkehren, um zu sehen, wie viel Gas Ihr aktualisierter Code verbraucht hat und ob Ihre Optimierung erfolgreich war.
Welche Codierungspraktiken gibt es für die Gasoptimierung in Solidity?
Nachdem Sie den Gasverbrauch mit Gas Profiler analysiert und die Ansicht „Vertragsquelle bearbeiten“ geöffnet haben, können Sie Ihren Smart Contract-Code optimieren, indem Sie effizientere Lösungen implementieren.
Hier sind einige der besten Codierungspraktiken, die Sie ausprobieren können:
1. Optimieren Sie die Speichernutzung
Die Anzahl der Speicherplätze und die Art und Weise, wie Sie Ihre Daten in Ihrem Smart Contract darstellen, wirken sich stark auf den Gasverbrauch aus. Hier einige Empfehlungen:
Begrenzen der Speichernutzung : Da Speicher die teuerste Art von Speicher ist, müssen Sie ihn so wenig wie möglich nutzen, was nicht immer einfach ist. Verwenden Sie Storage nur für die wesentlichen Daten, nicht mehr. Versuchen Sie, die Nutzung von Blockchain-Speicher zu reduzieren. Beispielsweise können vorübergehende (nicht permanente) Daten im Speicher gespeichert werden. Verhindern Sie außerdem Speicheränderungen, indem Sie Zwischenergebnisse im Speicher oder auf einem Stapel speichern. Weisen Sie Ergebnisse den Speichervariablen erst zu, nachdem alle Berechnungen abgeschlossen sind.
Packvariablen : Die Mindestspeichermenge in Ethereum ist ein 256-Bit-Slot. Auch wenn die Slots nicht voll sind, müssen Sie für eine ganze Zahl bezahlen. Um dies zu vermeiden, können Sie die variable Packtechnik verwenden. Der Compiler packt mehrere aufeinanderfolgende Variablen, deren Gesamtlänge 256 oder weniger beträgt, in einen einzigen Slot. Verwenden Sie diese Technik auch beim Definieren von Strukturen. Deklarieren Sie außerdem nacheinander die Speichervariablen desselben Datentyps, wenn Sie sie definieren. Der Solidity-Compiler packt sie automatisch. Beachten Sie jedoch, dass dies nicht für Speicher und Anrufdatenspeicher gilt, da deren Variablen nicht gepackt werden können.
2. Optimieren Sie die Speichernutzung
Die Wahl der Datentypen ist ein weiterer Faktor, der die Arbeit bestimmt, die die Ethereum Virtual Machine (EVM) im Hintergrund ausführt, um sie zu lesen, zu schreiben und zu bearbeiten. Dies trägt direkt zum Gasverbrauch bei, sodass eine sorgfältige Auswahl zur Optimierung des Gasverbrauchs beiträgt.
Uint* vs. Uint256 : Die EVM führt Operationen in 256-Bit-Blöcken aus, daher verbraucht die Konvertierung eines uint* (vorzeichenlose Ganzzahlen kleiner als 256 Bit) in uint256 zusätzliches Gas. Wenn Sie mehr Variablen in einen einzelnen Slot packen, verwenden Sie vorzeichenlose Ganzzahlen, die kleiner oder gleich 128 Bit sind. Wenn das nicht möglich ist, verwenden Sie uint256-Variablen.
Zuordnung vs. Array : Eine Liste von Daten wird in Solidity nur durch zwei Datentypen dargestellt: Arrays und Karten. Zuordnungen sind effizienter und kostengünstiger, während Arrays iterierbar und packbar sind. Es ist eine gute Idee, Zuordnungen zum Verwalten von Datenlisten zu verwenden, es sei denn, eine Iteration ist erforderlich oder es ist möglich, Datentypen zu komprimieren. Dies ist sowohl für die Speicherung als auch für den Speicher von Vorteil. Die Zuordnung kann zum Verwalten einer geordneten Liste verwendet werden, indem ein ganzzahliger Index als Schlüssel bereitgestellt wird.
Feste Größe : Jede Variable mit fester Größe in Solidity ist günstiger als eine Variable mit variabler Größe. Verwenden Sie nach Möglichkeit ein Array mit fester Größe anstelle eines dynamischen.
Standardwert : Wenn Variablen initialisiert werden, ist es eine gute Praxis, ihre Werte festzulegen, aber dabei wird Gas verwendet. In Solidity sind alle Variablen standardmäßig auf 0 gesetzt. Wenn der Standardwert einer Variablen daher 0 ist, legen Sie sie nicht explizit auf diesen Wert fest.
Konstanten : Für unveränderliche Daten verwenden Sie Konstanten anstelle von Variablen.
3. Betriebsabläufe optimieren
Nicht alle Implementierungen einer Lösung sind im Hinblick auf den Gasverbrauch gleich effizient. Die Art und Weise, wie Sie einen Funktionsaufruf oder einen komplexen logischen Ausdruck implementieren, kann sich auf die verbrauchte Gasmenge auswirken. Hier sind einige Fälle, in denen eine optimalere Lösung den Gasverbrauch reduzieren kann:
Interne Funktionsaufrufe: Der Aufruf einer öffentlichen Funktion dauert viel länger als der Aufruf einer internen, da alle Parameter in den Speicher kopiert werden. Verwenden Sie stattdessen nach Möglichkeit interne Funktionsaufrufe, bei denen Argumente als Referenzen übergeben werden. Ihre Ausführung ist zwar etwas teurer, aber sie sparen bei mehrfacher Verwendung eine Menge doppelten Bytecode ein.
Weniger Funktionen : Versuchen Sie, die Anzahl der internen und privaten Funktionen auf ein Minimum zu beschränken, um die Komplexität und Menge der Funktionen auszugleichen. Dies wiederum hilft Ihnen, die Gasgebühren bei der Ausführung zu senken, indem die Anzahl der Funktionsaufrufe reduziert wird. Bedenken Sie jedoch, dass zu große Funktionen das Testen erschweren und sogar die Sicherheit gefährden. Achten Sie also darauf, die Anzahl der Funktionen nicht zu sehr zu reduzieren.
Kurzschluss: Wenn es um logische Ausdrücke geht, versuchen Sie, komplexe Ausdrücke so weit wie möglich zu vereinfachen. Schreiben Sie sie so, dass die Wahrscheinlichkeit einer unnötigen Auswertung des zweiten Ausdrucks minimiert wird. Denken Sie daran, dass, wenn der erste Ausdruck in einer logischen Disjunktion (OR/||) wahr ist, der zweite nicht ausgeführt wird. Beachten Sie außerdem, dass nachfolgende Ausdrücke nicht ausgewertet werden, wenn der erste Ausdruck in einer logischen Disjunktion (AND/&) als falsch ausgewertet wird.
Begrenzende Modifikatoren: Der Code der Modifikatoren wird in eine modifizierte Funktion eingefügt, was deren Größe und Gasverbrauch erhöht. Um dies zu vermeiden, reduzieren Sie die Anzahl der Modifikatoren.
Einzeiliger Austausch: In einer Anweisung können Sie die Werte zweier Variablen austauschen. Verwenden Sie: (a, b) = (b, a), anstatt eine Hilfsvariable zum Austauschen zu verwenden.
4. Informieren Sie sich über einige allgemeine Empfehlungen
Zusätzlich zur Implementierung einiger spezifischer Lösungen können Sie auch versuchen, einige Praktiken zu vermeiden, die zu höheren Gasgebühren führen können:
Minimieren Sie den direkten Zugriff auf Speichervariablen : Versuchen Sie, über lokale Variablen (Speicher und Aufrufdaten) auf Speichervariablen zuzugreifen. Anstatt wiederholt in eine Speichervariable zu lesen/schreiben, kopieren Sie sie in eine lokale Variable und verwenden Sie sie stattdessen. Schreiben Sie nur in die Speichervariable, wenn das Endergebnis berechnet wird.
Verwenden Sie Schleifen so wenig wie möglich : Verwenden Sie Schleifen in Ihrem Smart Contract nur, wenn dies unbedingt erforderlich und unvermeidbar ist.
Eliminieren Sie unnötige Berechnungen: Versuchen Sie, die effizientesten Algorithmen zur Durchführung von Berechnungen zu finden. Entfernen Sie Berechnungen, wenn Ihr Algorithmus deren Ergebnisse direkt verwendet. Mit anderen Worten: Eliminieren Sie ungenutzte Berechnungen.
Ineffiziente Datenstrukturen : Versuchen Sie, effizientere und geeignetere Strukturen zur Darstellung Ihrer Daten zu finden. Bevorzugen Sie beispielsweise Zuordnungen gegenüber Arrays für direkte Indizierungsvorgänge, wenn Sie die Daten nicht nacheinander durchlaufen müssen.
5. Verwenden Sie Lösungen mit geringerem Stromverbrauch
Es gibt noch einige weitere Optionen, die Ihnen helfen können, Smart Contracts zu optimieren und ihren Gasverbrauch zu reduzieren. Erwägen Sie die Verwendung von:
Vorkompilierte Verträge, sofern verfügbar.
Optimierte Bibliotheken.
Komprimierbare Datenstrukturen.
ZK-SNARKs reduzieren die Datenmenge, die in der Kette gespeichert und berechnet werden muss.
Die Optimierung intelligenter Verträge beginnt mit Informationen zum Gasverbrauch
Obwohl es unterschiedliche Vorgehensweisen zur Optimierung von Smart Contracts gibt, benötigen Sie zunächst ein tiefgreifendes Verständnis dafür, wie Ihr Code Gas nutzt. Tenderly Gas Profiler ermöglicht Ihnen einen Einblick in die Komplexität des Gasverbrauchs, indem er ihn granular in einzelne Funktionsaufrufe aufschlüsselt. Sobald Sie über Informationen und die richtigen Tools verfügen, können Sie mit der Smart Contract-Optimierung herumexperimentieren und eine Lösung finden, die Ihnen hilft, die Gasgebühren zu senken.
🌟 Eine Initiative, um die Web3-Bildung für die nächste Generation
zugänglicher zu machen. 🌟
🌟 Feel free to check out:
my.bio/blockliv3
Social Media: @blockliv3
E-Mail: blockliv3.nft@ud.me