Kluge Verträge: Die Guten, die Schlechten und die Faulen

Warum private Blockchains nicht darauf aus sein sollten, Code auszuführen

Ich bin kein Fan des Begriffs „intelligente Verträge“. Zunächst wurde es von so vielen Menschen für so viele verschiedene Dinge verwendet, dass wir es wahrscheinlich einfach komplett verbieten sollten. Zum Beispiel ist die erste bekannte Referenz aus dem Jahr 1997, als Nick Szabo sie verwendete, um physikalische Objekte zu beschreiben, die ihr Verhalten ändern basierend auf einigen Daten. In jüngerer Zeit wurde der Begriff für das genaue Gegenteil verwendet: um die Berechnung in einer Blockchain zu beschreiben was beeinflusst wird durch äußere Ereignisse wie das Wetter. Lassen Sie uns zunächst beide Bedeutungen beiseite legen.

Ich möchte mich hier auf „intelligente Verträge“ im Sinne einer allgemeinen Berechnung konzentrieren, die in einer Blockchain stattfindet. Diese Bedeutung wurde von populär gemacht Ethereum, deren WHITE PAPER trägt den Untertitel „Ein intelligenter Vertrag und eine dezentrale Anwendungsplattform der nächsten Generation“. Infolge der Aufmerksamkeit, die Ethereum erhalten hat, ist diese Bedeutung zur vorherrschenden geworden, da Banken (und andere) an intelligenten Vertragsnachweisen arbeiten. Da es sich um regulierte Finanzinstitute handelt, handelt es sich natürlich hauptsächlich um private oder genehmigte Blockchains mit einer begrenzten Anzahl identifizierter Teilnehmer. Aus Gründen, die jetzt sind gut verstandenÖffentliche Blockchains sind trotz ihres Genies noch nicht für Unternehmenszwecke geeignet.

Ist die Zukunft für intelligente Verträge in privaten Blockchains also vielversprechend? Na ja, irgendwie, aber nicht wirklich. Sie sehen, das Problem ist:

In privaten Blockchains kombinieren intelligente Verträge vier gute Ideen mit einer schlechten.

Was sind die guten Ideen? (a) Ausdrücken der Geschäftslogik als Computerprogramm, (b) Darstellen der Ereignisse, die diese Logik auslösen, als Nachrichten an das Programm, (c) Verwenden digitaler Signaturen, um zu beweisen, wer die Nachrichten gesendet hat, und (d) Anlegen aller oben genannten Elemente eine Blockchain.

Und der Böse? Ausführen jedes Programms für jede Nachricht auf jedem Blockchain-Knoten. Mit anderen Worten, machen die Ausführung von allen Programmen die Aufgabe der Blockchain, anstatt sie nur als zu verwenden Lagerung für die Programme und Nachrichten. Und doch ist diese globale Ausführung der ganze Grund, warum Ethereum entwickelt wurde.

Wenn Sie sich der bewusst sind deterministischer Charakter der Berechnung, wissen über die Problem zu stoppenund verstehe wie Datenabhängigkeiten Verhindern Sie Parallelität, dann können Sie bereits überzeugt sein. Aber wenn nicht, machen Sie sich einen Kaffee, atmen Sie tief ein und folgen Sie mir durch das Kaninchenloch…

Ethereum verstehen

Um intelligente Verträge im Ethereum-Stil zu verstehen, müssen wir mit Bitcoin beginnen, der ersten (und immer noch beliebtesten) öffentlichen Blockchain. Die Bitcoin-Blockchain wurde ursprünglich nur für eine Sache entwickelt: das Verschieben der Bitcoin-Währung von einem Eigentümer zu einem anderen. Aber sobald es betriebsbereit war, begannen die Leute, „Metadaten“ in Transaktionen einzubetten, um anderen Zwecken zu dienen, wie z Digitale Vermögenswerte und Beglaubigung von Dokumenten. Während einige Bitcoiner gekämpft diese Anwendungen, ein offizieller Mechanismus für Metadaten wurde im März 2014 mit Verwendung eingeführt exponentiell wachsen seitdem.

Neben Projekten, die auf der Bitcoin-Blockchain basieren, wurden viele öffentliche Blockchains der nächsten Generation entwickelt und gestartet, wie z Nxt, Bitshares, Ripple und Stellar. Diese wurden von Grund auf so konzipiert, dass sie ein breiteres Spektrum von Aktivitäten unterstützen, z. B. von Nutzern erstellte Vermögenswerte, dezentraler Austausch und besicherte Kreditaufnahme. Jede dieser Blockchains verfügt über unterschiedliche Funktionen, die von den Entwicklern festgelegt wurden, und jede muss von allen Benutzern aktualisiert werden, wenn eine neue Funktion hinzugefügt wird. Die Dinge wurden ziemlich chaotisch.

An einigen dieser Projekte beteiligt gewesen zu sein, Vitalik Buterin stellte eine einfache, aber brillante Frage: Anstelle vieler anwendungsspezifischer Blockchains sollten Sie eine einzige öffentliche Blockchain verwenden, für die dies programmiert werden kann was auch immer wir wollen? Diese Über-Blockchain wäre unendlich erweiterbar und nur durch die Vorstellungskraft der Benutzer begrenzt. Die Welt der Krypto-Enthusiasten war von dieser kraftvollen Idee fast einstimmig überzeugt. Und so mit Crowdfunding in Höhe von 18 Millionen US-Dollar und zu großer Aufregung wurde Ethereum geboren.

Ethereum ist eine neue öffentliche Blockchain mit einer zugehörigen Kryptowährung namens "Ether" hunderte was davor kam. Im Gegensatz zu anderen Blockchains ermöglicht Ethereum jedem, einen „Vertrag“ innerhalb der Blockchain zu erstellen. Ein Vertrag ist ein Computerprogramm mit einer zugehörigen Miniaturdatenbank, die kann nur von dem Programm geändert werden, dem es gehört. Wenn ein Blockchain-Benutzer eine Datenbank ändern möchte, muss er eine digital signierte Nachricht an seinen Vertrag senden. Der Code im Vertrag untersucht diese Nachricht, um zu entscheiden, ob und wie zu reagieren ist. (Dies "Verkapselung”Von Code und Daten ist auch eine Grundlage von objektorientiert Programmierung.)

Ethereum-Verträge können in einer von mehreren neuen Programmiersprachen geschrieben werden, z Solidität und Schlange. Wie die meisten Programmiersprachen sind dies Turing komplettDies bedeutet, dass sie jede allgemeine Berechnung ausdrücken können. Ein wesentliches Merkmal von Turing komplette Sprachen ist das Schleifenstruktur, der wiederholt eine Operation ausführt, bis eine Bedingung erfüllt ist. Beispielsweise kann eine Schleife verwendet werden, um die Zahlen von eins bis zu einer Million zu drucken, ohne dass eine Million Codezeilen erforderlich sind. Aus Gründen der Effizienz sind Programme für Ethereum geschrieben kompiliert (dh umgewandelt) in kompakter Bytecode bevor sie an der Kette gelagert werden. Ethereum-Knoten führen diesen Bytecode dann innerhalb von a aus virtuellen MaschineDies ist im Wesentlichen ein simulierter Computer, der in einem realen Computer ausgeführt wird.

Wenn ein Ethereum-Vertrag in der Blockchain erstellt wird, wird der Anfangszustand seiner Datenbank eingerichtet. Dann hört es auf und wartet höflich, bis es aufgerufen wird. Wenn ein Benutzer der Blockchain (oder eines anderen Vertrags) eine Nachricht in einer Transaktion sendet, wird der Vertrag aktiv. Abhängig vom darin enthaltenen Code kann es die Quelle der Nachricht identifizieren, andere Verträge auslösen, seine Datenbank ändern und / oder eine Antwort an den Anrufer zurücksenden. Alle diese Schritte werden unabhängig voneinander ausgeführt auf jedem Knoten im Netzwerkmit identischen Ergebnissen.

Zum Beispiel ein einfaches Ethereum Unterwährungsvertrag verwaltet eine Datenbank mit Benutzersalden für ein bestimmtes Asset. Wenn es eine Nachricht erhält, um Geld von Alice an Bob zu überweisen, wird es (a) überprüfen, ob die Nachricht von Alice signiert wurde, (b) prüfen, ob Alice über genügend Geld verfügt, (c) Geld von Alice auf Bobs Konto in der Datenbank überweisen und (d) antworten, dass die Operation erfolgreich war. Natürlich brauchen wir dafür kein Ethereum, denn eine einfache Blockchain im Bitcoin-Stil mit native Asset-Unterstützung kann das gleiche tun. Ethereum kommt für komplexe mehrstufige Geschäftslogiken wie Crowdfunding, dezentralen Austausch und hierarchische Governance-Strukturen voll zur Geltung. Zumindest so Das Versprechen geht.

Zerlegung

Nachdem wir nun wissen, wie intelligente Verträge von Ethereum funktionieren, können wir sie in fünf Bestandteile aufteilen:

  1. Geschäftslogik als Computerprogramme ausdrücken.
  2. Darstellung der Ereignisse, die diese Logik auslösen, als Nachrichten an die Programme.
  3. Verwenden digitaler Signaturen, um zu beweisen, wer die Nachrichten gesendet hat.
  4. Platzieren der Programme, Nachrichten und Signaturen in einer Blockchain.
  5. Ausführen jedes Programms für jede Nachricht auf jedem Knoten.

Um das zu wiederholen, was ich zu Beginn gesagt habe, glaube ich, dass die Teile 1 bis 4 sehr gute Ideen sind. Beginnen wir mit den ersten beiden (die übrigens sind nicht neu). Im Gegensatz zu gesetzlichen Verträgen, die haben können Unterschiede in der Interpretation, Computerprogramme sind eindeutig. Für jedes Programm in einer genau definierten Programmiersprache führt dieselbe Eingabe immer zu derselben Ausgabe. Wenn also eine Geschäftslogik als Computerprogramm ausgedrückt wird und Ereignisse als Nachrichten an dieses Programm dargestellt werden, ist das Geschäftsergebnis in Stein gemeißelt. In der Tat macht diese deterministische Eigenschaft der Berechnung Zufälligkeit ein heikles Problem in der Informatik, und selbst die Geeks bei Google können falsch verstehen.

Was ist mit digitalen Signaturen und Blockchains? Dadurch muss keine zentrale Behörde festlegen, welche Nachrichten in welcher Reihenfolge und von wem gesendet wurden. Stattdessen erstellt jeder Teilnehmer ein Paar von private und öffentliche Schlüsselund verteilt seinen öffentlichen Schlüssel einmal an die anderen Teilnehmer. Danach folgen sie Schild jede Nachricht mit ihrem privaten Schlüssel, bevor diese Nachricht über das Netzwerk verteilt wird. Die anderen Teilnehmer können dann die Quelle der Nachricht nur mit dem öffentlichen Schlüssel des Absenders überprüfen. Es ist kluges kryptografisches Zeug. Schließlich können wir durch Platzieren des Programms und der signierten Nachrichten in einer Blockchain sicherstellen, dass jeder Teilnehmer eine identische Ansicht darüber hat, wer was wann getan hat. In Kombination mit deterministischer Berechnung bedeutet dies Die Teilnehmer können sich nicht über das endgültige Geschäftsergebnis streiten.

Aber was ist mit der letzten Idee, dass jeder Knoten jedes Programm für jede Nachricht ausführt? Hier kommen wir zum umstrittenen Teil. Denn während diese globale Ausführung schön sein mag, ist sie auch nicht notwendig. Da die Berechnung deterministisch ist, spielt es keine Rolle, ob ein Programm von einem Knoten, jedem Knoten oder einem externen Prozess ausgeführt wird. Es spielt auch keine Rolle, ob dies in Echtzeit, auf Anfrage oder 10 Jahre später geschieht. Das Ergebnis der Berechnung ist immer das gleiche. Und wenn dies aus irgendeinem Grund nicht der Fall ist, kann dies nur an a liegen Problem in der Blockchain-Software oder im Netzwerk.

Das Problem mit der Berechnung

Wenn es keine Rolle spielt, wo eine Berechnung stattfindet, warum? nicht überall machen Nun, es stellt sich heraus, dass Computerprogramme sind unvorhersehbar. So unschuldig sie auch aussehen mögen, es kann lange dauern, bis sie rennen. Und manchmal rennen sie für immer weiter. Betrachten Sie das folgende klassische Beispiel (bekannt als LCG):

  1. Sept x auf eine einstellige Nummer Ihrer Wahl
  2. Sept y zu 123 * x + 567
  3. Sept x zu den letzten beiden Ziffern von y, Ie y modulo 100
  4. If x ist mehr als 2 Fahren Sie dann mit Schritt 2 fort
  5. Andernfalls stoppen Sie und geben Sie den Wert von aus x

Einfach genug, oder? Hier ist eine Frage an Sie: Wird dieses Programm jemals beendet? Oder wird es in einem stecken bleiben Endlosschleife? Nicht so sicher? Nun, lass mich dich aus deinem Elend befreien: Dies hängt vom Anfangswert von x ab.

If x is 0, 1, 2, 5, 6, 7 or 8Das Programm stoppt ziemlich schnell. Aber falls x is 3, 4 or 9geht es auf unbestimmte Zeit weiter. Glaubst du mir nicht? Öffnen Sie Excel und probieren Sie es selbst aus (Sie benötigen die Funktion „MOD“).

Wenn Sie das nicht vorhersagen können, indem Sie sich den Code ansehen, fühlen Sie sich nicht schlecht. Weil das nicht nur für die Menschen schwer ist, Für Computer ist das unmöglich. Das Problem, festzustellen, ob ein bestimmtes Programm die Ausführung beendet, wird als bezeichnet Problem zu stoppen. Im Jahr 1936, Alan Turing, von "Turing complete" und The Imitation Game Ruhm, bewiesen, dass es nicht für den allgemeinen Fall gelöst werden kann. Abgesehen von trivialen Ausnahmen ist dies die einzige Möglichkeit, herauszufinden, ob ein Programm beendet wird ist es, es so lange laufen zu lassen, wie es dauertund das könnte für immer sein.

Für diejenigen von uns, die lieber ohne leben würden blaue Bildschirme des Todes und Strandbälle drehenEs ist alles ziemlich unpraktisch. Aber wir leben damit und bemerkenswerterweise funktioniert die meiste Software die meiste Zeit reibungslos. Wenn nicht, schützen uns moderne Betriebssysteme wie Windows vor außer Kontrolle geratenem Code, indem wir Programme manuell beenden können. Das Gleiche kann jedoch nicht mit einer Blockchain wie Ethereum gemacht werden. Wenn wir einzelnen Knoten erlauben würden, Berechnungen nach Belieben zu beenden, hätten verschiedene Knoten unterschiedliche Meinungen über das Ergebnis dieser Berechnungen. Mit anderen Worten, die Netzwerkkonsens würde zusammenbrechen. Was kann eine Blockchain tun?

Die Antwort von Ethereum basiert auf Transaktionsgebühren, auch bekannt als Gas. Der Absender jeder Transaktion Land Für die Berechnungen wird es ausgelöst, und diese Zahlung wird vom Bergmann eingezogen, der sie in einem Block bestätigt. Genauer gesagt gibt jede Ethereum-Transaktion im Voraus an, wie viel des „Äthers“ des Absenders für die Verarbeitung ausgegeben werden kann. Die Gebühr wird schrittweise ausgegeben, wenn der Vertrag Schritt für Schritt innerhalb der Ethereum Virtual Machine ausgeführt wird. Wenn eine Transaktion keine Gebühren mehr hat, bevor die Ausführung abgeschlossen ist, werden alle Datenbankänderungen zurückgesetzt und die Gebühr nicht zurückerstattet. Wenn eine Transaktion erfolgreich abgeschlossen wurde, wird die verbleibende Gebühr an den Absender zurückerstattet. Auf diese Weise können Transaktionen das Netzwerk nur insoweit belasten, als sie bereit sind, dafür zu zahlen. Es ist zweifellos eine ordentliche wirtschaftliche Lösung, aber Es erfordert eine native Blockchain-Währung, um zu funktionieren.

Intelligente Verträge gegen Parallelität

Wenn Gas außer Kontrolle geratene Berechnungen verhindern kann, erhalten intelligente Verträge grünes Licht? Nun, nicht so schnell, denn es gibt ein weiteres Problem mit intelligenten Verträgen, über das wir sprechen müssen:

Intelligente Verträge funktionieren schlecht für einen hohen Transaktionsdurchsatz.

Nebenläufigkeit ist eines der grundlegendsten Probleme in der Computerarchitektur. Ein System weist eine gute Parallelität auf, wenn mehrere Prozesse gleichzeitig und in beliebiger Reihenfolge ausgeführt werden können. Gleichzeitige Systeme reduzieren Verzögerungen und ermöglichen insgesamt einen viel höheren Durchsatz, indem Technologien wie z Prozessplanung, parallele Verarbeitung und Datenpartitionierung. So sucht Google 30 Billion US$ Webseiten fast 100,000 mal pro Sekunde.

In jedem Computersystem kann eine Reihe von Transaktionen nur gleichzeitig verarbeitet werden, wenn sie nicht voneinander abhängen oder sich gegenseitig stören. Andernfalls können unterschiedliche Verarbeitungsaufträge zu völlig unterschiedlichen Ergebnissen führen. Denken Sie nun daran, dass einem intelligenten Vertrag eine Datenbank zugeordnet ist und dass er eine allgemeine Berechnung einschließlich Schleifen durchführt. Dies bedeutet, dass ein intelligenter Vertrag als Antwort auf eine bestimmte Nachricht möglicherweise jede einzelne Information in seiner Datenbank liest oder schreibt. Wenn es beispielsweise eine Unterwährung verwaltet, kann es beschließen, jedem Inhaber dieser Währung Zinsen zu zahlen. Dies wird natürlich nicht immer der Fall sein. Das Problem ist jedoch: Vor dem Ausführen des Vertragsprogramms für eine bestimmte Nachricht ein Blockchain-Knoten kann nicht vorhersagen Welche Teilmenge der Vertragsdatenbank wird verwendet? Es kann auch nicht festgestellt werden, ob diese Teilmenge unter verschiedenen Umständen unterschiedlich gewesen sein könnte. Und wenn ein Vertrag einen anderen auslösen kann, erstreckt sich dieses Problem auf die gesamter Inhalt jeder Datenbank jedes Vertrags. Daher muss jede Transaktion so behandelt werden, als ob sie sich gegenseitig stören könnte. In Bezug auf die Datenbank erfordert jede Transaktion eine globale Sperre.

Denken Sie jetzt an die Welt, in der ein Blockchain-Knoten lebt. Transaktionen kommen von verschiedenen Peers in keiner bestimmten Reihenfolge, da es keine zentral verwaltete Warteschlange gibt. Zusätzlich kommt in durchschnittlichen Intervallen zwischen 12 Sekunden (Ethereum) und 10 Minuten (Bitcoin) ein neuer Block herein, der eine Reihe von Transaktionen in einer bestimmten Reihenfolge bestätigt. Ein Knoten hat wahrscheinlich bereits die meisten Transaktionen eines Blocks gesehen, aber einige sind möglicherweise neu. In beiden Fällen ist es unwahrscheinlich, dass die Reihenfolge der Transaktionen im Block die Reihenfolge widerspiegelt, in der sie einzeln angekommen sind. Und da die Reihenfolge der Transaktionen das Ergebnis beeinflussen kann, bedeutet dies Transaktionen können erst verarbeitet werden, wenn ihre Bestellung in der Blockchain bestätigt wurde.

Nun ist es wahr, dass eine unbestätigte Bitcoin-Transaktion möglicherweise aufgrund von a rückgängig gemacht werden muss doppelte Ausgaben. Aber eine unbestätigte Ethereum-Transaktion hat überhaupt kein vorhersehbares Ergebnis. In der Tat verarbeiten aktuelle Implementierungen von Ethereum nicht einmal unbeschränkte Transaktionen. Aber wenn ein Ethereum-Knoten wurde Um Transaktionen sofort zu verarbeiten, müssten sie immer noch zurückgespult und in der richtigen Reihenfolge wiedergegeben werden, wenn ein Block eingeht. Diese Wiederaufbereitung ist eine enorme Verschwendung von Aufwand und verhindert, dass externe Prozesse ausgeführt werden gleichzeitig Lesen der Ethereum-Datenbank, während es weitergeht. (Um fair zu sein, sollte beachtet werden, dass Bitcoin's Referenzimplementierung spult auch Transaktionen zurück und spielt sie wieder ab, wenn ein Block eingeht, was jedoch nur auf mangelnde Optimierung zurückzuführen ist.)

Was ist also mit dem Transaktionsmodell von Bitcoin, das eine Ausführung außerhalb der Reihenfolge ermöglicht? In Bitcoin jede Transaktion ausdrücklich angegeben seine Beziehung zu anderen Transaktionen. Es verfügt über eine Reihe von Ein- und Ausgängen, bei denen jeder Eingang mit dem Ausgang einer vorherigen Transaktion verbunden ist, die er „ausgibt“. Es gibt keine weiteren Abhängigkeiten, über die Sie sich Sorgen machen müssen. Solange (a) zwei Bitcoin-Transaktionen nicht versuchen, dieselbe Ausgabe auszugeben, und (b) die Ausgabe einer nicht zur Eingabe eines anderen führt, kann ein Bitcoin-Knoten sicher sein, dass die Transaktionen unabhängig sind, und es kann sie in beliebiger Reihenfolge verarbeiten. Ihre endgültigen Positionen in der Blockchain spielen überhaupt keine Rolle.

Um formale Informatik-Terminologie zu verwenden, müssen Ethereum-Transaktionen sein streng komplett bestelltDies bedeutet, dass die relative Reihenfolge zwischen jedem Transaktionspaar definiert werden muss. Im Gegensatz dazu bilden Bitcoin-Transaktionen eine gerichteter azyklischer Graph das ist nur teilweise bestelltDies bedeutet, dass einige Unklarheiten bei der Transaktionsreihenfolge zulässig sind. Wenn es um Parallelität geht, macht dies den Unterschied in der Welt aus.

Um es in der Praxis zu betrachten, wurde viel über private Blockchains im Unternehmen gesprochen. Aber eine private Blockchain ist nur eine verteilte Datenbank mit einigen zusätzlichen Funktionen. Und wenn Sie heute versucht haben, eine Datenbank der Enterprise-Klasse zu verkaufen, die keine Parallelität unterstützt, Sie würden aus dem Raum gelacht werden. Ebenso lächerlich wäre der Vorschlag, dass ein einzelner Knoten 12 Sekunden warten muss, bevor er das Ergebnis seiner eigenen Transaktionen sieht. Als Vitalik selbst kürzlich getwittert:

Für uns bei Coin Sciences ist dies nicht nur ein akademisches Thema, sondern wir müssen entscheiden, ob und wie intelligente Verträge integriert werden sollen Multichain. Seltsamerweise trotz der Hunderte von Feature-Anfragen und Fragen Bisher haben wir nur zwei erhalten, die sich auf intelligente Verträge beziehen, und selbst dann in einer schwächeren Form als Ethereum. Während wir also offen sind, kann sich herausstellen, dass intelligente Verträge keine wirklichen Probleme für unsere Benutzer lösen.

Für Ethereum

Wenn Sie nur an einer Seite des Arguments interessiert sind, können Sie hier aufhören zu lesen. Aber Sie fragen sich vielleicht: Sind die Schöpfer von Ethereum dumm? Warum um alles in der Welt müssten sie global in einer öffentlich verteilten Datenbank ausgeführt werden, wenn jeder Knoten einfach auswählen könnte, welche Programme ausgeführt werden sollen? Gibt es gute Gründe für den Ethereum-Weg?

Wenn wir über öffentliche Blockchains sprechen, glaube ich, dass es solche gibt. Um diese Gründe zu verstehen, müssen wir jedoch über die Dynamik des Ethereum-Netzwerks selbst nachdenken.

Transaktions-Spam verhindern

Eine Blockchain wird von einem Peer-to-Peer-Netzwerk verwaltet, in dem jeder Knoten mit einer zufälligen Teilmenge der anderen Knoten verbunden ist. Wenn eine neue Transaktion auf einem Knoten erstellt wird, breitet sie sich durch einen als "Relaying" bezeichneten Prozess schnell und willkürlich auf die anderen aus. In einem offenen öffentlichen Netzwerk kann jeder Transaktionen erstellen, daher brauchen wir einen Weg, um uns davor zu schützen Transaktions-Spam das könnte das System überwältigen. Da das Netzwerk dezentralisiert ist, kann dies nur erreicht werden, indem einzelne Knoten neue Transaktionen beim Eingang bewerten und entscheiden, ob sie weitergeleitet werden sollen oder nicht. Während dieser Mechanismus einen Spammer nicht davon abhalten kann überwältigend Als einzelner Knoten schützt er das Netzwerk als Ganzes.

Wenn in einem öffentlichen Netzwerk ein Knoten entscheidet, ob eine neue Transaktion weitergeleitet werden soll, ist ein Schlüsselkriterium das Verhältnis zwischen seiner Gebühr und seinen Kosten für das Netzwerk. Im Fall von Bitcoin basieren diese Kosten hauptsächlich auf der Rohgröße der Transaktion in Bytes. In Ethereum, a komplexere Formel wird basierend auf dem Rechenaufwand verwendet, den die Transaktion verbraucht. In beiden Fällen fungieren Gebühren als marktbasierter Mechanismus zur Verhinderung von Transaktions-Spam.

Aber woher weiß ein Knoten, ob der Absender über ausreichende Mittel verfügt, um die von ihm angebotene Gebühr zu decken? Im Fall von Ethereum wird das Gleichgewicht von „Äther“ jedes Benutzers durch das Ergebnis früherer Transaktionen beeinflusst, da Verträge können Äther sowohl ausgeben als auch auszahlen. Ohne tatsächlich alle Programme für alle vorherigen Nachrichten auszuführen, kann ein Ethereum-Knoten den aktuellen Kontostand eines Benutzers nicht ermitteln. Daher kann nicht beurteilt werden, ob eine Transaktion an andere Knoten weitergeleitet werden soll. Und ohne das könnte ein offenes Netzwerk trivial zerstört werden.

Kompakte Proofs

In einer Blockchain werden Blöcke hauptsächlich durch die Transaktionen gefüllt, die sie bestätigen. Jeder Block hat jedoch auch einen kompakten „Header“, der wichtige Informationen wie einen Zeitstempel und einen Link zum vorherigen Block enthält. Für öffentliche Blockchains basierend auf Nachweis der Arbeit HashingDie Eingabe für den Hashing-Algorithmus ist allein dieser Blockheader. Dies bedeutet, dass die Autorität einer Kette von einem „Lightweight Client“ bewertet werden kann, ohne den größten Teil des Inhalts herunterzuladen. Ab November 2015 ist beispielsweise der gesamte Satz der Bitcoin-Header im Vergleich zu 30 MB groß 45 GB für die volle Kette. Dies ist ein Verhältnis von 1500: 1, was einen entscheidenden Unterschied zu Mobilgeräten mit begrenzter Bandbreite und Speicherplatz darstellt.

Der Header jedes Ethereum-Blocks enthält eine "Statuswurzel", die den Status der Kette nach der Verarbeitung der Transaktionen in diesem Block abfängt. Dieser Status deckt unter anderem den Inhalt der Datenbank jedes Vertrags ab, wobei der Fingerabdruck mithilfe von a effizient berechnet wird Baum der Einweg-Hash-Funktionen. Die geringste Änderung an der Datenbank eines Vertrags würde zu einem völlig anderen Statusstamm führen, sodass der Stamm den Inhalt der Datenbank „bindet“. (Ein äquivalenter Begriff von "UTXO-Verpflichtungen" für Bitcoin wurde diskutiert aber noch nicht implementiert.)

Die baumartige Methode zur Berechnung von Zustandswurzeln hat eine wichtige Eigenschaft: Bei einer bekannten Statuswurzel kann der Wert eines bestimmten Eintrags in einer Vertragsdatenbank effizient nachgewiesen werden. Die Größe dieses Beweises ist proportional zur Tiefe von a binärer Baum deren Blätter sind die einzelnen Datenbankeinträge, dh Protokoll2 die gesamte Datenbankgröße. Das bedeutet, dass für einen einzelnen Eintrag nur der Beweis erbracht wird Doppel in der Länge, wenn die Datenbankgröße ist kariert - die Art von Skalierbarkeit, für die Informatiker töten. Denken Sie nun daran, dass sich die Statuswurzel jedes Blocks in seinem Header befindet, den ein Lightweight-Client überprüfen kann. Infolgedessen können Lightweight-Clients jeden vollständigen Knoten im Netzwerk sicher und effizient nach einzelnen Datenbankeinträgen abfragen volle Knoten können nicht lügen.

Wenn unsere Blockchain-Header jedoch einen Statusstamm enthalten und der Statusstamm vom Inhalt der Datenbank abhängt, dann Jeder Knoten muss die Datenbank der Blockchain auf dem neuesten Stand halten. Dies bedeutet wiederum, dass jeder Vertrag für jede Nachricht ausgeführt wird, die er bisher erhalten hat. Ohne dies würde ein Mining-Knoten weder den Statusstamm kennen, der in einen Blockheader eingefügt werden soll, noch könnten andere Knoten die empfangenen Blöcke überprüfen. Das Fazit lautet: Wenn Lightweight-Clients kompakte Datenprüfungen sicher aus dem Netzwerk abrufen sollen, müssen vollständige Knoten alle durch die Daten in der Kette beschriebenen Berechnungen durchführen.

Das Urteil für private Blockchains

Lassen Sie uns diese beiden Argumente im Kontext privater Blockchains noch einmal betrachten. Das erste, was bei privaten Ketten zu beachten ist, ist, dass sie in der Regel kein natives Token oder keine Kryptowährung haben. Dies hat mehrere Gründe:

  • Unternehmen, die an privaten Ketten interessiert sind, möchten sich nicht mit einer neuen Anlageklasse befassen.
  • Das Konsensmodell für private Ketten basiert eher auf einer Vereinbarung zwischen einer Gruppe geschlossener Bergleute als auf einem Arbeitsnachweis. Die Kosten für den Bergbau sind also minimal und die Bergleute brauchen nicht viel Belohnung.
  • Da alle Teilnehmer einer privaten Kette überprüft werden, gibt es weniger Bedenken hinsichtlich Spam und Missbrauch.

Denken Sie daran, dass das erste Argument für die globale Ausführung darin bestand, jedem Ethereum-Knoten zu ermöglichen, basierend auf der angebotenen Gebühr zu entscheiden, ob eine eingehende Transaktion weitergeleitet werden soll. Nun, das Fehlen eines nativen Tokens macht diesen Grund irrelevant, denn wenn eine Blockchain kein natives Token hat, Transaktionen können keine Gebühren zahlen. Wenn Spam aus irgendeinem Grund weiterhin ein Problem darstellt, muss es auf andere Weise kontrolliert werden, z. B. durch Widerrufen der Berechtigungen des Absenders.

Betrachten wir nun das zweite Argument, um kompakte Datenprüfungen zu ermöglichen. In einer öffentlichen Blockchain haben Endbenutzer wahrscheinlich mobile oder andere leichte Geldbörsen. Dies ist jedoch bei privaten Ketten, deren Hauptfunktion darin besteht, weniger wahrscheinlich Freigabe einer Datenbank zwischen größeren Unternehmen. Und wenn die Blockchain is Der mobile Benutzer, auf den von einem mobilen Gerät aus zugegriffen wird, ist wahrscheinlich ein Kunde eines dieser Unternehmen und kann darauf vertrauen, was dieses Unternehmen ihm sagt.

Stattdessen wird in privaten Blockchains die Probleme der globalen Ausführung sind besonders akut. Wenn eine private Blockchain kein natives Token hat, haben wir keinen gasähnlichen Marktmechanismus, um außer Kontrolle geratenen Code zu verhindern. Stattdessen müssten wir eine Art festes Limit in Bezug auf Rechenschritte pro Transaktion einführen. Damit Transaktionen jedoch absichtlich viel verarbeiten können, muss diese Grenze hoch sein. Infolgedessen könnte das Netzwerk immer noch viel Energie für unbeabsichtigte Schleifen verschwenden, bevor diese endgültig heruntergefahren werden.

In Bezug auf die Parallelität ist es bei privaten Blockchains weitaus wahrscheinlicher, dass Transaktionsvolumina angezeigt werden, die eine Parallelität erforderlich machen. Die Kapazität öffentlicher Blockchains wird durch die Tatsache begrenzt, dass sie, um sinnvoll dezentralisiert zu werden, Tausende von Knoten benötigen, die von Enthusiasten mit begrenztem Budget betrieben werden. Im Gegensatz dazu verbinden private Ketten mit größerer Wahrscheinlichkeit nur ein paar Dutzend Unternehmen miteinander. In diesem Fall sind Kapazität und Geschwindigkeit von entscheidender Bedeutung.

Doppeldecker-Blockchains

Wenn also in privaten Ketten alles über intelligente Verträge Sinn macht, abgesehen von der globalen Ausführung, wo bleiben wir dann? Welche Art von Blockchain bietet uns die Leistung und Flexibilität, die wir benötigen? Um ehrlich zu sein, denke ich immer noch darüber nach. Aber eine Antwort könnte sein: eine Blockchain mit zwei Ebenen.

Die untere Ebene basiert auf Transaktionen im Bitcoin-Stil, die sofort und gleichzeitig verarbeitet werden und nicht auf Blockbestätigungen warten müssen. Diese Transaktionen können einfache Bewegungen von Vermögenswerten durchführen, einschließlich sicherer Transaktionen Atomaustausch, ohne auf intelligente Verträge zurückzugreifen. Diese untere Stufe würde aber auch als blinde Speicherschicht für die Programme und Nachrichten, die komplexere Geschäftsprozesse darstellen und als Transaktionsmetadaten eingebettet sind.

Für die obere Ebene würde jeder Netzwerkteilnehmer wählen welche Programme sie ausführen möchten. Einige entscheiden sich möglicherweise dafür, überhaupt keine auszuführen, da sie nur an einfachen Asset-Bewegungen interessiert sind. Andere führen möglicherweise eine kleine Gruppe von Programmen aus, die für ihre internen Prozesse relevant sind (mit dem Wissen, dass diese Gruppe keine Nachrichten mit Programmen außerhalb austauscht). Einige entscheiden sich möglicherweise sogar für die globale Ausführung und verarbeiten jede Nachricht für jedes Programm, genau wie Ethereum. Aber das Wichtigste wäre das Jeder Knoten führt nur den Code aus, den er benötigt. In der Informatik wird diese Technik genannt faule Bewertung, weil es darum geht, so wenig Arbeit wie möglich zu erledigen, ohne etwas Entscheidendes auszulassen. Bei einer verzögerten Auswertung werden nur die Knoten bemerkt, die dieses Programm tatsächlich ausführen, wenn eine Blockchain-Berechnung schief geht. Das Netzwerk selbst wird nichts fühlen.

Was MultiChain betrifft, bezweifle ich, dass wir die globale Ausführung implementieren werden, wenn wir letztendlich die vollständige Berechnung von Turing unterstützen. Vielleicht entscheiden wir uns für einen faulen, zweistufigen Ansatz, oder vielleicht überlegen wir uns etwas Besseres.

Intelligente Verträge in öffentlichen Blockchains

Wie ich bereits sagte, in Öffentlichkeit Turing komplette Blockchains wie Ethereum, dort sind gute Gründe für die globale Ausführung. Aber hier ist eine andere Frage: Was ist das? enterprise Anwendungsfall für diese Ketten? Stellen wir uns eine zukünftige Zeit vor, in der Unternehmen genügend Vertrauen in öffentliche Blockchains haben, um sie für echte Geschäftsprozesse zu nutzen. Wenn eine Gruppe von Unternehmen eine Rechenlogik in eine öffentliche Blockchain einbetten möchte, haben sie zwei Möglichkeiten: (1) Verwenden einer Blockchain im Ethereum-Stil mit globaler Ausführung oder (2) Verwenden jedem Blockchain als einfache Speicherschicht und Ausführung des Codes selbst. Und angesichts dieser Optionen, warum sollten sie wählen (1)?

Die rationale Wahl wäre die öffentliche Blockchain mit (a) dem günstigsten Preis pro Speicherbyte und / oder (b) dem höchsten Sicherheitsniveau basierend auf der gesamten Bergbauleistung. Da die Berechnung deterministisch ist, müssen die Unternehmen nur das Netzwerk bezahlen speichern ihren Vertrag und Nachrichten, nicht wirklich Prozessdefinierung Sie. Darüber hinaus können sie eine Blockchain nur zur Speicherung verwenden jede Programmiersprache, die sie wollen. Dies könnte der Ethereum-Bytecode sein. JavaScript / ECMAScript für die Lesbarkeit oder sogar Maschinensprache für hohe Leistung. In der Tat Verträge Ethereum kann bereits gespeichert werden Verwenden von Metadaten in der Bitcoin-Blockchain. Dies ist genau der zweistufige Ansatz, den ich vorgeschlagen habe.

Diese Diskussion bezieht sich auf den Begriff von Abstraktionsschichten, berühmt gemacht durch die OSI-Netzwerkmodell. Für eine optimale Zuverlässigkeit und Flexibilität sollte jede Schicht eines Systems so weit wie möglich von den anderen Schichten abstrahiert (dh unabhängig) sein. Zum Beispiel möchten wir nicht, dass unsere Festplattencontroller Code zum Rendern von JPEG-Bildern enthalten. Warum sollte eine Blockchain die darin gespeicherten Programme ausführen? In den meisten Anwendungsfällen profitieren wir nicht davon, und dies ist mit erheblichen Kosten verbunden.

Epilog

Wenn die globale Ausführung in privaten Blockchains keinen Sinn ergibt, warum arbeiten dann alle an diesem Zeug? Ich denke, dies kann zumindest teilweise durch ein Missverständnis darüber erklärt werden, was Blockchains tun können in der echten Welt. Sie sehen, öffentliche Blockchains wie Bitcoin können Bewegen Sie einen realen Vermögenswert direkt (nämlich ihre Heimatwährung), weil die Blockchain definiert das Eigentum an dieser Währung. Dies führt zwei Aspekte von Vermögenswerten zusammen, die normalerweise unterschiedlich sind: (a) ein Hauptbuch, in dem aufgezeichnet wird, wem der Vermögenswert gehört, und (b) sein tatsächlicher physischer Standort. Dies macht Kryptowährungen zum ultimativen TrägerinstrumentJe nachdem, wen Sie fragen, schaffen Sie eine schöne neue Welt oder ein Paradies für Geldwäscher.

Für andere Assets, die unabhängig von einer Blockchain existieren, kann eine Kette nur a halten Rekord von wem sie sollte gehören. Dies wird so lange so bleiben, bis wir das sehen Erstausgabe von Assets auf eine Blockchain, wobei das rechtliche Eigentum an diesem Asset in Bezug auf die Datenbank der Kette definiert ist. Für den institutionellen Finanzsektor ist dieser Tag meines Erachtens noch weit entfernt, nicht zuletzt aufgrund der erforderlichen regulatorischen Änderungen. Bis dann, Es wird immer einen zusätzlichen Schritt gebenvertraglich und verfahrenstechnischzwischen dem, was die Blockchain sagt und dem, was in der realen Welt passiert. Dieser Schritt könnte genauso gut einen vollständigen Turing-Code enthalten, der im letztmöglichen Moment träge ausgeführt wird.

Dieses Problem wird durch den Fall von „Smart Bonds“ hervorgehoben, von denen wir so viel gehört haben. Eine intelligente Anleihe wird direkt auf eine Blockchain ausgegeben, wobei die Blockchain sicherstellt, dass Couponzahlungen zu den entsprechenden Zeiten an die Anleihegläubiger erfolgen. Alles schön und gut. Aber was passiert, wenn der Anleiheemittent nicht genügend Guthaben auf seinem Blockchain-Konto hat, um eine fällige Zahlung abzudecken? Die Blockchain kann sicherlich eine Flagge setzen, um zu sagen, dass etwas nicht stimmt. aber es kann nichts anderes tun. Wir brauchen immer noch eine Armee von Anwälten und Buchhaltern, um das ganze Durcheinander zu regeln, sei es durch einen Haarschnitt, eine Umschuldung, einen Verfall oder einen völligen Bankrott. Zusamenfassend:

Wenn intelligente Verträge ihr Versprechen nicht einhalten können, warum zahlen wir dann ihren Preis?

Vielen Dank für das Lesen.

Zeitstempel:

Mehr von Multikette