Dies ist eine maschinelle Ăbersetzung. Das Original in Englisch ist hier: Update 30 September, 2021
Wie wir vor einigen Wochen erwĂ€hnt wurde der alte Sequence-Datentyp fĂŒr verĂ€nderliche Daten durch Register ersetzt. Register können alles, was Sequence in Bezug auf das Speichern frĂŒherer Versionen kann, mit dem zusĂ€tzlichen Vorteil, dass es auch ParallelitĂ€t verarbeiten kann. Diese Woche lĂŒftet David Rusu den Deckel der mysteriösen Welt von Merkle Registers.
Allgemeiner Fortschritt
David Rusu hat die grundlegende FunktionalitĂ€t fĂŒr den Kunden, der das Spentbook schreibt, ziemlich abgeschlossen. Sobald es vollstĂ€ndig eingerichtet ist, wird die Aufgabe der MĂŒnzprĂ€geanstalt schreibgeschĂŒtzt: Die MĂŒnzstĂ€tte muss nur das Spentbook auf DBC-Transaktionsverpflichtungen ĂŒberprĂŒfen, um zu ĂŒberprĂŒfen, ob alle Eingaben fĂŒr dieselbe Transaktion festgeschrieben sind, und die Transaktionssalden validieren.
@Chris.connelly kĂ€mpft weiter mit qp2p. Viele der Aufgaben, die es in Bezug auf eingehende Nachrichten ausfĂŒhrt, sind wahrscheinlich veraltet, da wir den Verbindungspool nicht mehr verwenden, um Verbindungen offen zu halten, und Verbindungen und die Behandlung eingehender Nachrichten in das safe_network-Repository zu bringen, sollte die StabilitĂ€t verbessern. Es ist aber ein bisschen Arbeit!
Chris hat auch einen seit langem bestehenden Fehler in den qp2p-Tests identifiziert, der nun behoben ist.
@lionel.faber konzentriert sich auf CI/CD- und Launch-Tools und hat die Automatisierungstools aktualisiert, um auf einer Cloud-VM aufzubauen, um ein vollwertiges Testnetz zu starten. Jeder kann dieses Tool verwenden, vorausgesetzt, er verfĂŒgt ĂŒber die erforderlichen Anmeldeinformationen fĂŒr AWS und Digital Ocean. Das Tool ist konfigurierbar und kann nach Bedarf ausgelöst werden. Intern verwenden wir manuelle Trigger und einen speziellen launch-testnet
-Kommentar in PR-Rezensionen.
Die Arbeit an der CLI und API wird fortgesetzt, um sie mit der neuesten safe_network-Version kompatibel zu machen ⊠es geht dahin, aber wie @Chriso am Dienstag erwĂ€hnte, nagen immer noch einige Gremlins an Kabeln, einschlieĂlich einiger Probleme beim Dateiabruf mit der CLI.
Wir haben einige grundlegende Testnet-Log-Asserts eingerichtet, die dazu beitragen sollten, sicherzustellen, dass wir keine Nachrichten mehr wiederholen (und haben tatsĂ€chlich bereits einige kleinere NachrichtenverstĂ€rkungen festgestellt). Dies ist immer noch nicht zusammengefĂŒhrt, da wir weiterhin an StabilitĂ€ts-EckfĂ€llen hacken.
Diese Woche haben wir die Client-Wiederholungen neu ausgerichtet, um vernĂŒnftiger zu sein, was geholfen hat. Wir haben einige falsche Fehler beseitigt, die gelegentlich produziert wurden, was darauf zurĂŒckzufĂŒhren war, dass wir uns auf tokio-Fehler verlieĂen (wenn die eigentliche Aufgabe selbst gut abgeschlossen war). Und @yogesh hat damit begonnen, das Client-Bootstrapping zum Netzwerk zu verbessern, das derzeit fĂŒr jeden erreichbaren Knoten gilt, aber nicht versucht, den Zustand des Netzwerks zu ermitteln, was spĂ€ter zu mehr AE-Nachrichten als nötig fĂŒhrt.
##Merkle-Registrierung
Diese Woche möchten wir uns eingehend mit dem Merkle-Register befassen, einem der beiden primitiven Datentypen im sicheren Netzwerk (der andere sind unverÀnderliche Blöcke).
Das Merkle-Register ist ein neuartiges CRDT, das wir entwickelt haben, um den verĂ€nderlichen Zustand im sicheren Netzwerk zu modellieren. Es unterstĂŒtzt gleichzeitige SchreibvorgĂ€nge und das Durchlaufen der Historie. Sie werden in NRS hĂ€ufig verwendet, um Namenszuordnungen zu verwalten, um Versionen einer Datei(en) und jeder App zu verfolgen, die einen Ă€nderbaren Status benötigt.
Das Register CRDT-Familie
Register werden verwendet, um einen Wert zu schreiben und zu lesen, denken Sie an CPU-Register. Existierende Register-CRDTs sind das Multi-Value-Register (MVReg) und das Last-Write-Wins-Register (LWWReg). Unser Merkle Register (MerkleReg) ist ein weiteres CRDT in dieser Familie.
Alle Register folgen einer Àhnlichen API.
# Sie können den/die im Register gespeicherten aktuellen Wert(e) ablesen
read(reg) -> val(s)
# Sie können mithilfe eines kausalen Kontexts einen Wert in ein Register schreiben
write(reg, val, ctx) -> reg
# Zwei Register zusammenfĂŒhren
merge(reg1, reg2) -> fusioniert-reg
Das MerkleReg baut auf einem Merkle DAG auf. Der Merkle-DAG ist eine Verallgemeinerung des Merkle-Baums, die Knoten entspannt, um mehrere Eltern zu haben und Daten an jedem Knoten zu platzieren.
Mit Merkle Trees ordnen wir Daten an den BlÀttern eines BinÀrbaums an und hashen sie paarweise, um die nÀchste Knotenebene zu erhalten. Wir wiederholen dies, indem wir Paare dieser Hashes hashen, bis wir die Wurzel erreichen. Es ist eine unglaublich flexible Datenstruktur, die in vielen dezentralen Systemen verwendet wird. Merkle DAGs entfernen die BinÀrbaumbeschrÀnkung. Wir können jetzt Daten an jedem Knoten platzieren und jeder Knoten kann mehrere Eltern haben.
Die Art und Weise, wie wir das MerkleReg erstellen, besteht darin, die Wurzeln des Merkle-DAG als aktuelle Registerwerte zu verwenden. Betrachten Sie beispielsweise die folgende Reihe von Operationen.
Beginnen Sie mit dem Lesen des leeren DAG, wir erhalten den leeren Satz zurĂŒck.
lesen (â
) = {}
Schreiben Sie a
in das Register, wir verwenden die leere Menge als Kontext.
â
schreiben(â
, a, {}) = |
ein
Gleichzeitig schreibt ein anderer Client in dasselbe Register.
â
schreiben(â
, b, {}) = |
B
Sobald die beiden Clients ihren Status nach oben verschieben, können wir die beiden gleichzeitigen Register zusammenfĂŒhren.
zusammenfĂŒhren(|, |) = / \
ein b ein b
Das Lesen des zusammengefĂŒhrten Registers gibt beide gleichzeitige Werte zurĂŒck.
â
lesen ( / \ ) = {a, b}
ein b
Wir können jetzt die gleichzeitigen Werte auflösen, indem wir sowohl a
als auch b
als Schreibkontext verwenden.
â
/ \
write( / \ , c, {a, b}) = a b
ein b \ /
C
Das Lesen des letzten Registers gibt nur c
zurĂŒck.
â
/ \
lesen ( a b ) = {c}
\ /
C
Eine schöne Eigenschaft dieses MerkleReg im Vergleich zu einigen der anderen Register CRDTs ist nun, dass wir die gesamte Verzweigungsgeschichte des Registers in der Merkle DAG gefĂŒhrt haben. Wenn wir ein Dokument verfolgen, können wir seinen Verlauf durchlaufen, um zu sehen, wie es sich entwickelt hat.
MultiSets und MultiMaps
Wir können MultiSets und MultiMaps ganz einfach auf Merkle-Register aufbauen, indem wir die Funktionsweise von Schreibkontexten nutzen.
EintrĂ€ge, die mit leerem Kontext in das Register geschrieben werden, erscheinen, wenn wir die Werte zurĂŒcklesen, dies simuliert ein Set CRDT.
Beginnen Sie mit dem leeren Register.
lesen (â
) = {}
Nach dem Schreiben von âyâ mit leerem Kontext.
â
lesen ( | ) = {y}
ja
Dann schreibe x
mit leerem Kontext.
â
lesen( / \ ) = {x, y}
x y
Schreiben von z
mit leerem Kontext.
â
lesen( / | \ ) = {x, y, z}
x y z
Jetzt können wir LöschvorgĂ€nge simulieren, indem wir einen speziellen âPapierkorbâ-Knoten zuweisen:
â
read( / | \ ) = {x, y, đ}
x y
Verbinde y mit , um es zu löschen.
â
lesen( / | \ ) = {x, đ}
x y
\ /
đ
Das gibt uns ein Set CRDT mit Inserts und Removes. Um eine Map-CRDT zu erhalten, machen wir die Set-Mitglieder zu einem 2-Tupel-SchlĂŒssel:Wert:
â
read( / | \ ) = {x:1, y:2, đ}
x:1 y:2
Das Aktualisieren des Wertes von x
erfolgt, indem die aktuellen x
-EintrÀge als untergeordnete Elemente verwendet werden:
Hier aktualisieren wir x
, um 2
statt 1
zu speichern
â
read( / | \ ) = {x:2, y:2, đ}
x:1 y:2
|
x: 2
Da dies eine gleichzeitig bearbeitete Struktur ist, werden möglicherweise mehrere Werte fĂŒr einen SchlĂŒssel geschrieben (daher das Multi in Multi-Map):
Ein anderer Client schreibt gleichzeitig x:3
â
/ | \
lesen( x:1 x:3 đ ) = {x:2, x:3, đ}
|
x: 2
Diese MehrfacheintrĂ€ge können aufgelöst werden, indem ein Eintrag fĂŒr x
mit sowohl x:2
als auch x:3
als Kinder zurĂŒckgeschrieben wird.
â
/ | \
lesen( x:1 x:3 đ ) = {x:3, đ}
| |
x:2 |
\ /
x: 3
Dadurch erhalten wir eine MultiMap-CRDT mit Verlauf und ZusammenfĂŒhrung von gleichzeitigen Werten!
Auswirkungen der MerkleReg
Das MerkleReg ersetzt den alten Sequence-Datentyp. Wir haben festgestellt, dass der Versuch, lineare Sequenzen in einem teilweise geordneten Netzwerk zu modellieren, keine saubere Semantik haben wĂŒrde. Stattdessen verwenden wir Forks. Das Ergebnis ist, dass Anwendungen mit gleichzeitigen Werten umgehen mĂŒssen. Ein Browser, der auf dem sicheren Netzwerk basiert, muss beispielsweise mit der Möglichkeit umgehen, dass eine Website mehrere gleichzeitige index.html-Seiten hat. NRS muss mit mehreren EintrĂ€gen fĂŒr denselben Namen umgehen.
Dies ist kein so groĂes Problem, wie Sie vielleicht denken, die meisten GroĂsysteme arbeiten bereits mit diesem Modell. Zum Beispiel ermöglicht DNS mehrere IPs, die einer Domain zugeordnet sind, und die Dinge funktionieren (im Allgemeinen) noch.
NĂŒtzliche Links
FĂŒhlen Sie sich frei, unten mit Links zu Ăbersetzungen dieses Entwicklungsupdates zu antworten, und die Moderatoren werden sie hier hinzufĂŒgen.
Als Open Source-Projekt sind wir immer auf der Suche nach Feedback, Kommentaren und Community-BeitrĂ€gen. Seien Sie also nicht schĂŒchtern, machen Sie mit und lassen Sie uns gemeinsam das sichere Netzwerk erstellen!