Wie läuft ein Smart Contract unter der Haube „auf einer Blockchain“ ab?

Ich bin ziemlich neu in der Blockchain-Technologie und würde gerne einige Konzepte verstehen, für die ich online keine ausführliche Erklärung finden konnte. Alle Ressourcen, die ich bisher untersucht habe, erklären das Thema auf einer extrem hohen Ebene, und es gibt keine technische Erklärung des Prozesses, in dem das System funktioniert, insbesondere Ethereum.

Ich werde erklären, was ich über das System weiß, und dann, was ich nicht weiß. Es könnte sein, dass meine Frage etwas weit gefasst ist, aber ich kann sie einfach nicht in einzelne Fragen aufteilen, da die Konzepte so miteinander verwoben sind!

Vereinfacht sieht eine Blockchain so aus (ich werde unten einige Ideen dazu haben):

Geben Sie hier die Bildbeschreibung ein

Nehmen wir an, wir haben einen Smart Contract, der eine Liste von Knotenadressen speichert. Jedes Mal, wenn ein Knoten die Vertragsfunktion auslöst iWasHere(), wird die Adresse des Knotens zu einer Liste hinzugefügt, und man kann die Liste der Adressen lesen, indem man die whoWasHere()Funktion aufruft.

Ich hätte gerne ein tieferes Verständnis dafür, was genau bedeutet, dass ein Smart Contract auf einer Blockchain ausgeführt wird und was genau unter der Haube passiert.

Folgendes verstehe ich von dem Konzept:

  • Ein Smart Contract kann die gleichen Fähigkeiten haben wie eine normale Person: er kann Geld empfangen, Geld senden, bestimmte Ereignisse abhören und mit anderen Smart Contracts interagieren.

  • Eine menschliche Person kann über eine Frontend-Schnittstelle mit dem Smart Contract interagieren, sodass vollwertige Anwendungen auf dieser „Backend“-Schnittstelle aufgebaut werden können.

  • Intelligente Verträge werden in Bytecode kompiliert, dh EVM-Montageanweisungen, die auf der EVM ausgeführt werden, und jede Anweisung enthält Gas.

Was ich an dem Konzept nicht verstehe:

  • Was passiert eigentlich, wenn man „einen Smart Contract auf der Blockchain einsetzt“? Ist es an einen Block an einem neu abgebauten Block angehängt, z. B. n + 17? Wie greift man dann auf diesen Vertrag zu? Sie scannen einfach die ganze Kette nach Smart Contracts mit einer bestimmten Vertragsadresse?

  • Was passiert genau unter der Haube, wenn beispielsweise eine zufällige menschliche Person eine Smart-Contract-Funktion auslöst iWasHere()? Der EVM-Bytecode, der dem Code entspricht, der von diesem Funktionsaufruf ausgeführt werden muss, wird einer Transaktion hinzugefügt und dann im Block aufgezeichnet? Wer führt die Codeausführung an sich aus (dh welcher Knoten führt die tatsächlichen Prozessorzyklen aus, die zum Ausführen des Codes auf der tatsächlichen Hardware erforderlich sind, dh zB eine menschliche CPU), der Knoten, der die Funktion aufruft, oder alle Knoten im Netzwerk? Wenn alle Knoten im Netzwerk den Code ausführen, wie ist dies skalierbar? Was passiert, wenn 10.000 Anwendungen gleichzeitig auf blochcain laufen? Ist das nicht dasselbe wie 10.000 Anwendungen, die auf jedem Knoten im Netzwerk laufen?

Kann jemand erklären oder mich auf eine Dokumentation verweisen, die diese Konzepte erklärt? Das Web ist voll von Erklärungen auf hoher Ebene, wie das System funktioniert, konnte aber nichts auf der niedrigen technischen Ebene finden.

Antworten (3)

Lassen Sie uns für den Anfang Smart Contracts nicht mit Menschen gleichsetzen, das ist eine sehr OOP-Idee und verwirrt meiner Meinung nach nur das gesamte Thema.

Ich stimme definitiv zu, dass technische Dokumentation und Unterrichtsmaterial wie dieses sehr fehlen. Sie erhalten oft sehr oberflächliche Informationen.

kann bestimmte Ereignisse anhören

Ein Smart Contract kann keine Ereignisse abhören.

Ein Smart Contract ist eine passive statische Sache. Du rufst es auf, etwas zu tun, und es wird die Sache tun. Es macht nie etwas von alleine. Es kann unterschiedlich reagieren, je nachdem wie viel Zeit vergangen ist oder Blockhöhe oder ähnliches. Oder abhängig vom Status anderer Smart Contracts, die möglicherweise als Teil Ihrer Anfrage abgefragt werden.

Eine menschliche Person kann über eine Frontend-Schnittstelle mit dem Smart Contract interagieren, sodass vollwertige Anwendungen auf dieser „Backend“-Schnittstelle aufgebaut werden können.

Richtig. Im Grunde ist eine Blockchain nur eine unveränderliche Datenbank, die "im Internet" dezentralisiert ohne einen einzigen Standort lebt. Und im Falle von Smart-Contract-Ketten kann es auch Code enthalten.

Intelligente Verträge werden in Bytecode kompiliert, dh EVM-Montageanweisungen, die auf der EVM ausgeführt werden, und jede Anweisung [kostet] Gas.

Rechts.

Ist es an einem Block an einem neu abgebauten Block befestigt?

Es ist! Alles ist Blöcke, also ist alles auf der Kette auf den Blöcken. Ich denke, ein Vertrag könnte technisch zwischen Blöcken aufgeteilt werden, da es eine begrenzte Blockgröße gibt, bin mir aber nicht sicher.

Wie greift man dann auf diesen Vertrag zu? Sie scannen einfach die ganze Kette nach Smart Contracts mit einer bestimmten Vertragsadresse?

Bei der Bereitstellung, bei der es sich um eine EVM-Aktion handelt, die mit einer bestehenden Ethereum-Adresse durchgeführt wird und Benzin kostet, erhalten Sie eine Adresse. An dieser Adresse finden Sie den Smart Contract. Ähnlich wie bei einer Hashmap ist der Zugriff sehr schnell.

eine Transaktion und dann auf dem Block aufgezeichnet

Es gibt zwei Arten von Funktionsaufrufen in Solidität auf Ethereum-Ansichtstypen und normalen. ein Aufruf vom Typ View, schreibt nichts in die Kette und kostet kein Benzin. Normale schon. Die Gaskosten entsprechen der Menge und den Kosten von EVM-Anweisungen, die zum Abschließen des gesamten Anrufs benötigt werden. Es wird also nur aufgezeichnet, wenn Sie tatsächlich in die Kette schreiben, nicht beispielsweise, wenn Sie nur eine Variable löschen.

Beachten Sie, dass für einige Ansichtsaufrufe noch eine gewisse Verarbeitung erforderlich ist, z. B. das Durchlaufen einer Schleife, sagen wir, und es kostet tatsächlich kein Gas, dies zu tun. Dies ist relevant für den nächsten Punkt.

Wer führt die Codeausführung per se durch

Ich denke, das ist eine sehr wichtige Frage.

Zunächst einmal ist die Art und Weise, wie diese Blockchains konzipiert sind, so: Sie betreiben selbst einen Knoten und verwenden ihn, um mit der Kette zu kommunizieren.

In Wirklichkeit verwenden die meisten Leute einen Drittanbieter, sagen wir Metamask oder Infura oder andere. Aber diese Drittanbieter betreiben nur selbst Knoten und geben Ihnen die gesuchte Antwort, sie müssen immer noch einen Knoten betreiben, so wie Sie es selbst tun können. Diese Dienste speichern normalerweise alle Blockchain-Daten in einer schnelleren und bequemeren Datenbank.

(Vieles davon scheint magisch zu sein, da wir solche praktischen Dienste verwenden, aber in Wirklichkeit betreiben Sie nur einen Knoten, der alle Blöcke sammelt und mit der Blockchain kommunizieren kann, die wiederum nur eine riesige Datenbank ist.)

Wenn Sie einen VIEW-Aufruf tätigen, gehe ich davon aus , dass Sie die EVM-Anweisungen selbst auf Ihrem Knoten ausführen, weshalb es kein Benzin kostet.

Wenn ein Anruf geschrieben wird, muss ein Miner ihn tatsächlich abbauen. Schürfen Sie den Block, hängen Sie Ihre Sachen an den Block an, führen Sie Code aus, falls vorhanden, und schreiben Sie das Ergebnis in den Block.

Hier wird es für mich neblig: Der Konsensmechanismus stellt sicher, dass die Daten korrekt sind, und indem mehr Knoten die von Ihnen produzierten Blöcke aufnehmen, werden sie akzeptiert. Aber es wird nur einmal geschrieben.

Dies geht zum Beispiel in das Gebiet der Wissensnachweise, wenn Sie sich weiter damit befassen möchten.

Aber du schreibst nur einmal, ein Miner macht es. Danach stellen wir per Konsens per Konsensalgorithmus fest, dass dieser Schreibvorgang korrekt war und Sie das System nicht ausgetrickst haben.

Vielen Dank für diese umfassende Antwort. Ich habe daraus gelernt!
Ich denke, es wäre schwierig, in einer StackExchange-Antwort näher darauf einzugehen. Kennen Sie einige Bücher, die dieses Thema in seinen technischen Details behandeln?
Ich habe es noch nicht gelesen, aber ich vermute, dass „Mastering Ethereum“ von Andreas Antonopoulos sehr gut ist.

Man könnte ein ganzes Buch schreiben, das alle Fragen beantwortet, die Sie sich gestellt haben, aber lassen Sie mich einen Versuch in 50.000 Fuß wagen:

  1. Verträge sind nicht an die Blockchain angehängt, sie SIND Teil der Blockchain, da sich der Code innerhalb des Blocks selbst befindet. Dies ist der Teil, der abgebaut wird, damit Sie wissen, dass er später nicht von einer böswilligen Partei angehängt wird. (Es wird in EVM-Assembly/Binärcode kompiliert.)

  2. Verträge sind in der Tat passive Entitäten. Sie sitzen einfach da, es sei denn, jemand versucht, eine Funktion zu verwenden, die in die Blockchain schreibt. (Verträge, die für die Interaktion mit der Außenwelt entwickelt wurden, existieren automatisch, sie werden Orakel genannt (nicht zu verwechseln mit der Datenbank))

  3. Jeder Knoten (auch bekannt als „Miner“) führt im Wesentlichen jeden Vertrag auf einmal aus. Der Grund für die Skalierbarkeit (auf zunächst unintuitive Weise) liegt darin, dass niemand die Ergebnisse einer Berechnung fälschen kann, ohne dass so ziemlich jeder andere Knoten „NO WAY“ sagt, sodass diese Ergebnisse verworfen werden.

  4. Wenn Sie wirklich einfache Beschreibungen der Funktionsweise wünschen, müssen Sie wahrscheinlich Code knacken und anfangen, Dinge selbst auszuprobieren!

Was passiert eigentlich, wenn man „einen Smart Contract auf der Blockchain einsetzt“? Ist es

Sie senden eine Transaktion an die Adresse 0x00000...0 mit dem EVM-Bytecode Ihres Vertrags. Dies führt zur Bereitstellung des Vertrages in einer Adresse, die aus der Absenderadresse und der Absenderadresse abgeleitet wird.

was genau unter der Haube passiert, wenn eine zufällige menschliche Person eine intelligente Vertragsfunktion auslöst, zum Beispiel iWasHere().

Jede Solidity-Funktion hat einen Selektor .

  • Wenn die Transaktion eine Schreibtransaktion ist, dann sendet der Benutzer eine Transaktion an die Smart-Contract-Adresse, wobei das DataFeld mit dem 4-Byte-Selektor der Funktion gefüllt ist. Jeder JSON-RPC-Knoten von Ethereum kann eine Transaktionsnutzlast für P2P-Netzwerkübertragungen aufnehmen. Schließlich wird ein Block abgebaut, der Miner wählt diese Transaktion aus dem Mempool aus, führt sie aus und das Ergebnis wird in dem Block gespeichert, den der Miner gerade abgebaut hat.

  • Wenn es sich bei der Transaktion um einen schreibgeschützten Aufruf handelt, führt die JSON-RPC-API des Ethereum-Knotens die Funktion direkt in EVM aus, wobei der zuvor bereitgestellte Bytecode verwendet wird