Einführung in MultiChain-Streams

Quellknoten: 1213525

Für gemeinsam genutzte unveränderliche Schlüsselwert- und Zeitreihendatenbanken

Heute sind wir stolz darauf, die neueste Version von MultiChain zu veröffentlichen, die eine wichtige neue Reihe von Funktionen namens "Streams" implementiert. Streams bieten eine natürliche Abstraktion für Blockchain-Anwendungsfälle, die sich eher auf das allgemeine Abrufen, Zeitstempeln und Archivieren von Daten als auf die Übertragung von Assets zwischen Teilnehmern konzentrieren. Streams können verwendet werden, um drei verschiedene Arten von Datenbanken in einer Kette zu implementieren:

  1. Eine Schlüsselwertdatenbank oder ein Dokumentenspeicher im Stil von NoSQL.
  2. Eine Zeitreihendatenbank, die sich auf die Reihenfolge der Einträge konzentriert.
  3. Eine identitätsgesteuerte Datenbank, in der Einträge nach ihrem Autor klassifiziert werden.

Diese können als "Was", "Wann" und "Wer" einer gemeinsam genutzten Datenbank betrachtet werden.

Streams Grundlagen

In einer MultiChain-Blockchain können beliebig viele Streams erstellt werden. Jeder Stream fungiert als unabhängige Sammlung von Elementen, die nur an Anhänge gebunden sind. Jedes Element in einem Stream weist die folgenden Eigenschaften auf:

  • Ein oder mehrere Verlag die diesen Artikel digital signiert haben.
  • Ein optionales Schlüssel zum bequemen späteren Abrufen.
  • Manche technische DatenDies kann von einem kleinen Textstück bis zu vielen Megabyte roher Binärdatei reichen.
  • A Zeitstempel, die aus dem Header des Blocks entnommen wird, in dem der Artikel bestätigt wird.

Hinter den Kulissen wird jedes Element in einem Stream durch eine Blockchain-Transaktion dargestellt. Entwickler können jedoch Streams lesen und schreiben, ohne diesen zugrunde liegenden Mechanismus zu kennen. (Fortgeschrittene Benutzer können verwenden Rohtransaktionen in mehrere Streams schreiben, Assets ausgeben oder übertragen und / oder Berechtigungen in einer einzigen atomaren Transaktion zuweisen.)

Streams lassen sich auf verschiedene Weise in das Berechtigungssystem von MultiChain integrieren. Erstens können Streams nur von Personen erstellt werden, die dazu berechtigt sind, genauso wie Assets nur von bestimmten Adressen ausgegeben werden können. Wenn ein Stream erstellt wird, ist er geöffnet oder geschlossen. Offene Streams können von jedem geschrieben werden, der die Berechtigung zum Senden einer Blockchain-Transaktion hat, während geschlossene Streams auf eine veränderbare Liste zulässiger Adressen beschränkt sind. Im letzteren Fall verfügt jeder Stream über einen oder mehrere Administratoren, die diese Schreibberechtigungen im Laufe der Zeit ändern können.

Jede Blockchain hat einen optionalen 'root'-Stream, der in ihrem definiert ist Parameter und existiert ab dem Moment, in dem die Kette erstellt wird. Auf diese Weise kann eine Blockchain sofort zum Speichern und Abrufen von Daten verwendet werden, ohne darauf zu warten, dass ein Stream explizit erstellt wird.

So wie ich vorher besprochenVertraulichkeit ist die größte Herausforderung in einer Vielzahl von Blockchain-Anwendungsfällen. Dies liegt daran, dass jeder Knoten in einer Blockchain eine vollständige Kopie des gesamten Ketteninhalts sieht. Streams bieten eine natürliche Möglichkeit, verschlüsselte Daten in einer Blockchain wie folgt zu unterstützen:

  1. Ein Stream wird von den Teilnehmern verwendet, um ihre öffentlichen Schlüssel für jedes Kryptografieschema mit öffentlichen Schlüsseln zu verteilen.
  2. Ein zweiter Datenstrom wird zum Veröffentlichen von Daten verwendet, wobei jedes Datenelement mithilfe der symmetrischen Kryptografie mit einem eindeutigen Schlüssel verschlüsselt wird.
  3. Ein dritter Stream bietet Datenzugriff. Für jeden Teilnehmer, der ein Datenelement sehen soll, wird ein Stream-Eintrag erstellt, der den geheimen Schlüssel dieser Daten enthält, der mit dem öffentlichen Schlüssel dieses Teilnehmers verschlüsselt ist.

Dies bietet eine effiziente Möglichkeit, Daten in einer Blockchain zu archivieren und sie nur für bestimmte Teilnehmer sichtbar zu machen.

Abrufen aus Streams

Der Kernwert von Streams liegt in der Indizierung und dem Abruf. Jeder Knoten kann auswählen, welche Streams abonniert werden sollen. Die Blockchain garantiert, dass alle Knoten, die einen bestimmten Stream abonnieren, dieselben Elemente darin sehen. (Ein Knoten kann auch so konfiguriert werden, dass er jeden neu erstellten Stream automatisch abonniert.)

Wenn ein Knoten einen Stream abonniert hat, können Informationen auf verschiedene Arten aus diesem Stream abgerufen werden:

  • Abrufen von Elementen aus dem Stream in der angegebenen Reihenfolge.
  • Elemente mit einem bestimmten Schlüssel abrufen.
  • Abrufen von Elementen, die von einem bestimmten Verlag signiert wurden.
  • Auflisten der in einem Stream verwendeten Schlüssel mit Anzahl der Elemente für jeden Schlüssel.
  • Auflisten der Herausgeber in einem Stream mit Anzahl der Elemente.

Wie eingangs erwähnt, ermöglichen diese Abrufmethoden die Verwendung von Streams Schlüsselwertdatenbanken, Zeitreihendatenbanken und identitätsgesteuerte Datenbanken. Alle Retrieval-APIs bieten Anfang und zählen Parameter, mit denen Unterabschnitte langer Listen effizient abgerufen werden können (wie eine LIMIT-Klausel in SQL). Negative Werte für Anfang Ermöglichen das Abrufen der neuesten Elemente.

Streams können mehrere Elemente mit demselben Schlüssel enthalten. Dies löst natürlich die Spannung zwischen der Unveränderlichkeit der Blockchain und der Notwendigkeit, eine Datenbank zu aktualisieren. Jedem effektiven Datenbankeintrag sollte in Ihrer Anwendung ein eindeutiger Schlüssel zugewiesen werden, wobei jede Aktualisierung dieses Eintrags durch ein neues Stream-Element mit seinem Schlüssel dargestellt wird. Die Stream-Retrieval-APIs von MultiChain können dann verwendet werden, um: (a) die erste oder letzte Version eines bestimmten Eintrags abzurufen, (b) einen vollständigen Versionsverlauf für einen Eintrag abzurufen, (c) Informationen zu mehreren Einträgen abzurufen, einschließlich des ersten und des letzten Versionen von jedem.

Beachten Sie, dass aufgrund der Peer-to-Peer-Architektur einer Blockchain Elemente in einem Stream in unterschiedlichen Reihenfolgen an verschiedenen Knoten ankommen können und MultiChain das Abrufen von Elementen ermöglicht, bevor sie in einem Block "bestätigt" werden. Daher bieten alle Abruf-APIs die Wahl zwischen globaler (Standard) oder lokaler Reihenfolge. Die globale Reihenfolge garantiert, dass alle Knoten, sobald die Kette einen Konsens erreicht hat, dieselben Antworten von denselben API-Aufrufen erhalten. Die lokale Reihenfolge garantiert, dass sich für einen bestimmten Knoten die Reihenfolge der Elemente eines Streams zwischen API-Aufrufen niemals ändert. Jede Anwendung kann die richtige Wahl für ihre Bedürfnisse treffen.

Streams und die MultiChain-Roadmap

Mit der Veröffentlichung von Streams haben wir die letzte wichtige Arbeit für MultiChain 1.0 abgeschlossen und sind nun fest auf dem Weg zur Beta. Wir gehen davon aus, dass wir in den nächsten Monaten unsere interne Testsuite (bereits ziemlich umfangreich!) Erweitern, die Windows- und Mac-Ports fertigstellen, weitere nützliche APIs hinzufügen und die aktualisieren werden Erkunden für Streams, Optimierung von Aspekten des Konsensmechanismus, Veröffentlichung unserer Web-Demo und allgemeines Aufräumen von Code- und Hilfemeldungen. Vor allem werden wir weiterhin alle Fehler beheben, sobald sie entdeckt werden, damit unsere Fehler Ihre Arbeit nicht unterbrechen.

Wo passen Streams längerfristig in die MultiChain-Roadmap? MultiChain tritt einen Schritt zurück und bietet nun drei Bereiche mit hoher Funktionalität:

  • Berechtigungen um zu steuern, wer eine Verbindung herstellen, Transaktionen durchführen, Assets / Streams erstellen, abbauen / validieren und verwalten kann.
  • Details einschließlich Ausgabe, Neuausstellung, Übertragung, Atomaustausch, Treuhandkonto und Zerstörung.
  • Streams mit APIs zum Erstellen von Streams, Schreiben, Abonnieren, Indizieren und Abrufen.

Wie geht es nach der Veröffentlichung von MultiChain 1.0 (und einer Premium-Version) in dieser Liste weiter? Wenn Sie sich die ansehen API-Befehl Beim Erstellen von Streams werden Sie einen scheinbar überflüssigen Parameter mit einem festen Wert von bemerken stream. Mit diesem Parameter kann MultiChain künftig andere Arten von Entitäten auf hoher Ebene unterstützen.

Mögliche zukünftige Werte für den Parameter sind evm (für ein Ethereum-kompatible virtuelle Maschine), sql (für eine Datenbank im SQL-Stil) oder sogar wiki (für gemeinsam bearbeiteten Text). Jede gemeinsam genutzte Entität, deren Status durch eine geordnete Reihe von Änderungen bestimmt wird, ist ein potenzieller Kandidat. Jede solche Entität benötigt: (a) APIs, die die richtige Abstraktion zum Aktualisieren ihres Status bereitstellen, (b) geeignete Mechanismen für abonnierte Knoten, um diesen Status zu verfolgen, und (c) APIs zum effizienten Abrufen eines Teils oder des gesamten Status. Wir warten darauf zu erfahren, welche anderen übergeordneten Entitäten am nützlichsten sind, um von uns oder von Dritten über eine Plug-in-Architektur implementiert zu werden.

Was ist mit intelligenten Verträgen?

Im Allgemeinen verfolgt MultiChain den Ansatz, in dem technische Daten ist unveränderlich in eine Blockchain eingebettet, aber die Code zum Interpretieren dieser Daten befindet sich in der Knoten- oder Anwendungsschicht. Dies unterscheidet sich bewusst von dem Paradigma der „intelligenten Verträge“, wie es beispielsweise bei Ethereum dargestellt wird, bei dem Code in die Blockchain eingebettet ist und in einer virtuellen Maschine ausgeführt wird. Theoretisch, weil intelligente Verträge sind Turing komplettkönnen sie das Verhalten von MultiChain oder einer anderen Blockchain-Plattform reproduzieren. In der Praxis weisen intelligente Verträge im Ethereum-Stil jedoch viele schmerzhafte Mängel auf:

  • Jeder Knoten muss jede Berechnung durchführen, ob sie von Interesse ist oder nicht. Im Gegensatz dazu entscheidet in MultiChain jeder Knoten, welche Streams abonniert werden sollen, und kann die von anderen enthaltenen Daten ignorieren.
  • Die für intelligente Verträge verwendete virtuelle Maschine weist eine drastisch schlechtere Leistung auf als Code, der für eine bestimmte Computerarchitektur nativ kompiliert wurde.
  • Der intelligente Vertragscode ist unveränderlich in eine Kette eingebettet, sodass keine Funktionen hinzugefügt und Fehler behoben werden können. Dies wurde in der Tod des DAO.
  • Transaktionen, die an einen intelligenten Vertrag gesendet wurden kann nicht aktualisiert werden Der Zustand einer Blockchain, bis ihre endgültige Reihenfolge bekannt ist, aufgrund der Art der Allzweckberechnung. Dies führt zu Verzögerungen (bis eine Transaktion in einem Block bestätigt wird) sowie zu möglichen Umkehrungen (im Falle einer Gabelung in der Kette). Im Gegensatz dazu kann MultiChain jede Art von unbestätigter Transaktion auf die geeignete Weise behandeln: (a) Eingehende Assets aktualisieren sofort den unbestätigten Kontostand eines Knotens, (b) Eingehende Stream-Elemente sind sofort verfügbar, und ihre globale Reihenfolge wird anschließend abgeschlossen. (C) Berechtigungsänderungen werden sofort angewendet und dann in eingehenden Blöcken wiedergegeben.

Trotzdem wie ich sagte vorherWir schließen intelligente Verträge als nützliches Paradigma für Blockchain-Anwendungen sicherlich nicht aus, wenn wir starke Anwendungsfälle sehen. In MultiChain würden intelligente Verträge jedoch in einer Stream-ähnlichen Schicht über der Blockchain und nicht auf der niedrigsten Transaktionsebene implementiert. Dadurch bleibt die überlegene Leistung von MultiChain für einfachere Blockchain-Entitäten wie Assets und Streams erhalten, und es wird eine langsamere Berechnung in der Kette angeboten, wenn dies wirklich erforderlich ist. Aber es gibt weniger solche Fälle als Sie vielleicht denken.

 

Bitte posten Sie Kommentare auf LinkedIn.

 

Technischer Nachtrag

Alle Befehle, die sich auf Streams beziehen, sind im vollständig dokumentiert MultiChain API-Seite, aber hier ist eine kurze Zusammenfassung:

  • Erstellen Sie einen Stream mit create stream or createfrom ... stream
  • Fügen Sie einem Stream mit ein Element hinzu publish or publishfrom
  • Rufen Sie eine Liste der Streams mit ab liststreams
  • Starten oder beenden Sie die Verfolgung eines Streams mit subscribe und unsubscribe
  • Abrufen von Stream-Elementen mit liststreamitems, liststreamkeyitems und liststreampublisheritems
  • Listen Sie Stream-Schlüssel und Publisher mit auf liststreamkeys und liststreampublishers
  • Rufen Sie bei großen Stream-Elementen die vollständigen Daten mit ab gettxoutdata (sehen maxshowndata unten)
  • Steuern Sie die Berechtigungen pro Stream mit Anrufen wie grant [address] stream1.write
  • Zeigen Sie die Berechtigungen eines Streams mit an listpermissions stream1.*

Einige andere Entwicklerhinweise zu Streams:

  • Das create Mit der Berechtigung kann eine Adresse Streams erstellen.
  • Relevante Pro-Stream-Berechtigungen sind write, admin und activate
  • Neu Blockchain-Parameter: root-stream-name (für niemanden leer lassen), root-stream-open, anyone-can-create, admin-consensus-create, max-std-op-returns-count
  • Neu Laufzeitparameter: autosubscribe um automatisch neue Streams zu abonnieren und maxshowndata um die Datenmenge in API-Antworten zu begrenzen (siehe gettxoutdata über).
  • Die maximale Größe der Daten eines Stream-Elements wird durch die festgelegt max-std-op-return-size Blockchain-Parameter sowie der kleinere der maximum-block-size und max-std-tx-size Werte minus einige hundert Bytes.
  • Knoten, die das alte Wallet-Format verwenden, können keine Streams abonnieren sollte aktualisiert werden.

 

Zeitstempel:

Mehr von Multikette