
Autor: Gimer Cervera, Ethereum Smart Contract Develation Translation: Shan Oubba, Bitchain Vision World
einführen
In diesem Artikel werden in den Virtual Machines (EVM) und der Solidity -Montage von Ethereum Virtual Machines (Depeth Ethereum „untersucht, um intelligente Vertragsoptimierung und -sicherheit zu erreichen.
Ethereum Virtual Machine (EVM) ist die Kernkomponente des Ethereum -Netzwerks.EVM ist eine Software, die die Bereitstellung und Ausführung von intelligenten Verträgen in fortgeschrittener Sprache (z. B. Solidität) ermöglicht.Kompilieren Sie ihn nach dem Schreiben des Vertrags in Bytecode und stellen Sie ihn für EVM ein.EVM läuft auf jedem Knoten des Ethereum -Netzwerks.
Die Solidity Assembly ist eine Programmiersprache mit niedriger Ebene, mit der Entwickler Code auf der Ebene an EVM selbst schreiben können.Es bietet eine detailliertere Kontrolle über die Ausführung von Smart -Verträgen und ermöglicht eine Optimierung und Anpassung, die nicht über den Soliditätscode mit höherem Level erreicht werden kann.
Die in der Solidität für die inneren Gelenkzusammenstellung verwendete Sprache wird YUL genannt.Die Programmiersprache wird als Vermittler des EVM -Bytecode kompiliert.Es ist als Sprache mit niedriger Ebene konzipiert, mit der Entwickler die Ausführung intelligenter Verträge feiner kontrollieren können.Es kann im unabhängigen Modus oder in Solidität verwendet werdenInterne Union CompilationWesenYul ist als Stapelsprache mit niedriger Ebene konzipiert, sodass Entwickler optimiertere und effizientere Code schreiben können.Vor der Erläuterung der Soliditätsbaugruppe müssen wir verstehen, wie EVM -Komponenten funktionieren.
EVM ist a准 图 灵 灵 灵 灵Statusmaschine.In diesem Fall der Begriff„erlauben“Dies bedeutet, dass die Ausführung des Prozesses auf die Berechnungsschritte der begrenzten Zahl beschränkt ist, abhängig von einer der Gasgrößen, die von einem bestimmten intelligenten Vertrag ausgeführt werden können.Dies ist der Weg, um mit der Suspendierung des Stopps und der Möglichkeit der Ausführung (böswillig oder unfall) für immer umzugehen.Auf diese Weise wird die Ethereum -Plattform vermieden.
Gas ist ein Konzept zur Berechnung der Berechnung, die zur Abschließung der Transaktion in Ethereum erforderlich ist.Die Transaktionskosten werden von Ethereum bezahlt und hängt mit dem Preis von Gas und Gas zusammen.Unser Ziel in diesem Prozess ist es, zu lernen, wie die Gesamtmenge des Gasverbrauchs minimiert werden kann, ohne die Sicherheit zu beeinflussen.
Code -Optimierungsproblem
Die interne Gelenkanordnung ist eine Methode zum Zugriff auf EVM auf einer niedrigeren Ebene.Es umgeht mehrere wichtige Sicherheitsfunktionen und Inspektionen der Solidität.Die korrekte Verwendung der inneren Gelenkbaugruppe kann die Implementierungskosten erheblich senken.Sie sollten es jedoch nur verwenden, um seine Aufgabe zu benötigen, und nur, wenn Sie wissen, was Sie tun.Die Verwendung des inneren Lianhui -Optimierungscode kann Ihrem Code neue Sicherheitsprobleme bringen.Um die interne Versammlung zu beherrschen, müssen wir die Arbeitsprinzipien von EVM und ihrer Komponenten verstehen.
In EVM müssen Sie für jedes Mal eine Speichervariable besuchen„kalt“Besuche dauert 2100 Gas.Die zweite oder aufeinanderfolgende Zeit wird genannt„heiß“Zugang, es dauert 100 Gas.
Der folgende Code ist ein Beispiel dafür, wie wir den Code mit YUL optimieren.FunktionSetdata1Verwenden Sie Solidität auf traditionelle Weise als globale VariableSetzen Sie den neuen Wert.Wir müssen 22.514 Gas ausgeben, wenn es diesen neuen Wert zum ersten Mal zuteilt.Die zweiten Kosten sind viel geringer, dh 5414 Gas.
>
Funktionsetdata2Interne Baugruppe realisieren.Der innere Devisenblock wird von der Montage {…} gekennzeichnet, wobei der Code in der Klammer der Code der Yul -Sprache ist.Der Quellcode muss derzeit nicht verstehen. Denken Sie daran, dass die Software auf einer niedrigeren Ebene auf den Speicherplatz zugreift.Daher sind die Ausführungskosten niedriger.
In unserem Beispiel kostet die erste Änderung dieses Wertes 22.484 Gas.Mehrmals in Folge betragen die Kosten 5384 Gas.Der Unterschied scheint nicht signifikant zu sein, aber wir sollten berücksichtigen, dass dieser Code tausende Male ausgeführt werden kann.
>
Warum ist es so teuer?Denken Sie daran, wir befinden uns in einer dezentralen Welt.Wenn zukünftige Transaktionen zugegriffen oder geändert werden müssen, muss sie auch für jeden Knoten im Netzwerk leicht verwendet werden.Die Gesamtkosten der Daten entsprechen dem, den sie verbrauchten Speicherplatz und die Summe der Berechnung der Daten im gesamten Netzwerk.
EVM -Stack, Speicher und Speicher
EVM ist ein stapelbasiertes Gerät, das auf der Datenstruktur als Stack ausgeführt wird, die den Wert spart und den Betrieb ausführt.EVM verfügt über eigene Anweisungen (als Betriebscodes bezeichnet), um Aufgaben wie das Lesen und Schreiben von Speichern, das Aufrufen anderer Verträge und die Ausführung mathematischer Operationen auszuführen.Stapel nachSpäter zuerst (LIFO)Führen Sie den Weg aus, siehe Abbildung 1, was bedeutet, dass das kürzlich eingefügte Element oben im Stapel gespeichert ist und das erste Element ist, das gelöscht wird.
>
Bei der Ausführung intelligenter Verträge erstellt EVM einen Ausführungskontext, der verschiedene Datenstrukturen und Zustandsvariablen enthält.Nach Abschluss der Ausführung wird der Kontext verworfen und sich auf den nächsten Vertrag vorbereiten.Während der Ausführung wird EVM ein vorübergehendes Gedächtnis beibehalten, und es wird keine kontinuierliche Existenz zwischen der Existenz von Transaktionen geben.EVM führt eine Stapelmaschine mit einer Tiefe von 1024 Elementen aus.Jedes Projekt ist ein 256 -Bit -Wort.
EVM hat die folgenden Komponenten, wie in Abbildung 2 gezeigt:
-
Stack: Der Stapel von EVM ist eine Datenstruktur (LIFO) (LIFO) (LIFO) im Weg, der zum Speichern von temporären Werten während der Ausführung intelligenter Verträge verwendet wird.
-
Speicherung: Die dauerhafte Lagerung ist Teil des Ethereum -Zustands, der erst zum ersten Mal auf Null initialisiert wird.
-
Speicher: Einfach zu verlieren, dynamisch -grized Byte -Array, wird verwendet, um Zwischendaten während der Ausführung von Verträgen zu speichern.Jedes Mal, wenn Sie einen neuen Ausführungskontext erstellen, wird der Speicher auf Null initialisiert.
-
CallData: Dies ist auch ein einfacher Datenspeicherbereich, ähnlich wie der Speicher.Es speichert jedoch keine variablen Daten.Ziel ist es, Daten zu speichern, die als Teil einer Smart Contract -Transaktion gesendet werden.
-
Programmzähler: Programmzähler (PC) zeigt auf die nächsten Anweisungen, die von EVM ausgeführt werden sollen.PC fügt normalerweise nach der Ausführung einer Anweisung ein Byte hinzu.
-
Virtual ROM: Smart Contracts werden in der Gegend als Bytecode gespeichert.Virtual ROM ist nur gelesen.
>
EVM -Stack
In dieser Architektur werden die Anweisungen und Daten des Programms im Speicher gespeichert, und die Ausführung des Programms istStapelzeigersteuerung.Der Stapelzeiger, der den nächsten Wert oder die nächste Anweisung verfolgt, wird auf dem Stapel gespeichert oder abgerufen.Wenn das Programm ausgeführt wird, fügt es den Wert zum Stapel hinzu und führt den vorhandenen Wert durch.Wenn der Code die beiden Zahlen hinzufügen möchte, drückt er die Zahl in den Stapel und führt dann die beiden Werte oben durch.Dann kehren Sie zum Stapel zurück.
>
Eine der wichtigsten Funktionen, die auf der Stapelarchitektur basieren, ist, dass es eine sehr einfache und effiziente Ausführung von Betrieb ermöglicht.Da der Stack eine LIFO -Datenstruktur ist, können Daten und Anweisungen die Daten und Anweisungen einfach verarbeiten.
EVM hat einen eigenen Anweisungen, der als Betriebscode bezeichnet wird.Der Betriebscode wird verwendet, um Aufgaben wie das Lesen und Schreiben von Speichern, das Aufrufen anderer Verträge und die Ausführung mathematischer Operationen auszuführen.Der EVM -Befehlssatz bietet die meisten Vorgänge, die Sie möglicherweise erwarten, einschließlich:
-
Stack -Betrieb: Pop, Push, DUP, Tausch
-
Arithmetik/Vergleich/Rezept: Hinzufügen, Sub, GT, LT und, oder
-
Umgebung: Anrufer, CallValue, Nummer
-
Speichervorgang: Moad, MStore, MStore8, MSIZE
-
Speichervorgang: STOAD, SSTORE
-
Programmzähler -bezogenem Betriebscode: Sprung, Jumpi, PC, Jumpdest
-
Betriebscode stoppen: Stoppen, zurückkehren, zurückkehren, ungültig, selbstimprotiert werden
EVM -Speicher
EVM -Speicher ist ein nicht vorgezogener Raum, der 256 -Bit -& GT;Die Gesamtzahl der Aufbewahrungsschlitze im Vertrag beträgt 2, was eine sehr große Anzahl von Slots entspricht.Jeder intelligente Vertrag auf der Blockchain verfügt über einen eigenen Speicherplatz.
Während des Funktionsaufrufs wird Speicher für Daten verwendet, die zwischen Funktionsaufrufen in Erinnerung bleiben müssen.Es wird verwendet, um verfügbare Variablen und Datenstrukturen zu speichern, die auch nach der Ausführung intelligenter Verträge verfügbar sein können.
>
Der Betriebscode für den Zugriff auf Speicher ist: Sload und Sstore
Dieser Kontospeicher ist eine dauerhafte Datenspeicherung, die nur von intelligenten Verträgen verwendet wird.Das Konto (EOA) hat keinen Code und der Speicherplatz ist leer.
EVM -Speicher
Der Speicher ist ein einfacher Speicher in der Architektur, und seine Daten dauern nicht in der Blockchain.Der Speicher ist eine Datenstruktur für Zufallszugriffsdaten, die temporäre Daten während der Ausführung intelligenter Verträge speichert.
>
Der Speicher ist in vier Teile unterteilt: 2 Rillen werden für den temporären Speicherplatz verwendet. 1 Slot wird für kostenlose Speicherzeiger, 0 Rillen und 1 Schlitzpunkt für verfügbare freie Speicher verwendet.Der erste 64. Byteraum wird nach der Laiditätsmethode verwendet.
Kostenloser Speicherzeiger ist nur ein Zeiger auf den Beginn des freien Speichers.Es stellt sicher, welche Speicherpositionen in intelligenten Verträgen verfolgt werden und welche noch verfügbar sind.Dies verhindert die Vertragsabdeckung aus einem bestimmten Speicher, der einer anderen Variablen zugewiesen wurde.Abbildung 6 zeigt, wie das Gedächtnis geteilt wird:
>
Speicher wird verwendet, um Variablen und Datenstrukturen zu speichern, die nicht im Speicher gespeichert werden müssen.Die Speichergröße kann während der Ausführung des intelligenten Vertrags angepasst werden, aber die Zugangsgeschwindigkeit ist langsamer und die Kosten sind höher als der Stapel.
Wenn man bedenkt, dass der Speicher Null -In -Initialisierung ist, lautet der Betriebscode für den Zugriff auf Speicher: MLOAD, MSTORE, MSTORE8
Zusammenfassen
In diesem Artikel überprüfen wir einige grundlegende Konzepte im Zusammenhang mit der Ethereum Virtual Machine (EVM).Um den internen Montagecode zu realisieren, müssen Sie EVM in -Tepth verstehen.Dies liegt daran, dass wir mit einigen Komponenten von EVM interagieren.In zukünftigen Kursen werden wir andere EVM -Elemente im Detail analysieren, z. B. Speicher, Speicher und CallData.Darüber hinaus werden wir die wichtigen Konzepte wie Bytecode, Gas und Anwendung Binary Interface (ABI) überprüfen.Schließlich werden wir das Arbeitsprinzip des Betriebskodex und weitere interne und Devisenbeispiele diskutieren, um die Ausführung intelligenter Verträge sicher zu optimieren.