Safe Network Entwickler Update ­čçę­čç¬ 13. Oktober 2022

Dies ist eine maschinelle ├ťbersetzung. Das Original in Englisch ist hier: Update 13 October, 2022

Wir haben jetzt schon eine Weile ├╝ber den ├╝berarbeiteten Prozess zur Wahl neuer Sektions├Ąltester und zur Verwaltung von Splits gesprochen. Diese Woche befasst sich @anselme mit der Denkweise hinter dem G├╝rtel-und-Klammern-Ansatz.

Allgemeiner Fortschritt

@Chriso ├╝berarbeitet die Prozesse zum Signieren von Chunks und Registern und testet Speicher- und DBC-Doppelausgaben.

@roland arbeitet an Tests f├╝r die sn_sdkg-AE- und Mitgliedschaftsfunktionalit├Ąt, die unten beschrieben werden.

Mostafa hat dezentrale Konsensmechanismen erforscht und ├╝berpr├╝ft unser aktuelles Setup.
@davidrusu ├╝berarbeitet den Beitrittsprozess, um vor dem Beitritt eine Aktualisierung des Netzwerkwissens einzuschlie├čen.

Und @anselme und @dirvine ├╝berarbeiten den Autorit├Ątsprozess wie letzte Woche beschrieben.

@bzee, @bochaco und @joshuef arbeiten am Debuggen der Stabilit├Ąt auf niedriger Ebene. Wir haben festgestellt, dass eine Kombination aus langsamer Nachrichtenverarbeitung und Fehlern in der Verbindungsverwaltung gelegentlich Probleme verursacht. Also tauchen wir hier tief ein. Wir haben einige Fortschritte gemacht, indem wir die Handhabung von Nachrichten vereinfacht haben, und machen weiter an dieser Front, da es so aussieht, als w├╝rde es ein ziemlich vielversprechender Refactor sein, sowohl in Bezug auf die Einfachheit des Codes als auch auf die Stabilit├Ąt.

Alles ├╝ber sn_sdkg


DKG mit sn_sdkg

  • Basierend auf der Schl├╝sselgenerierung von poanetwork in hbbft
  • Entfernt Timer
  • Stellt Klatsch vor
  • Umarmt die gleichzeitige DKG
  • Ein Rennen zwischen DKGs bis zur ├ťbergabe

Wir haben gerade sn_sdkg (Safe Network Synchronous Distributed Key Generation) integriert und die vorherige Version ersetzt, in der wir bei langsamen Netzwerken Fehler und Zeit├╝berschreitungen sahen. Die Hauptursache ist wahrscheinlich, dass wir Timer verwenden. Dieser neue DKG-Prozess verwendet keine Timer, tats├Ąchlich wollen wir ├╝berhaupt keine Timer auf Safe, nirgendwo.

DKG ist nicht aktiv, es ist nur etwas, was Knoten im Hintergrund tun, wenn sie Systemmeldungen erhalten, und sie k├Ânnen mehrere Sitzungen gleichzeitig ausf├╝hren.

Neben der Verwendung von Anti-Entropie (AE) f├╝hrt sn_sdkg auch Klatsch ein, um sicherzustellen, dass Knoten alle Nachrichten erhalten, die ihnen m├Âglicherweise fehlen, damit alle letztendlich konsistent sind.

Gehen wir es durch.


Älteste senden DkgStart

  • Abschnitt aufgeteilt
  • Abschnitts├╝bergabe

Der erste Schritt in diesem Prozess besteht darin, dass die ├ältesten eine ÔÇ×DkgStartÔÇť-Nachricht senden. Dies geschieht, wenn eine von zwei Situationen eintritt. Der erste ist, wenn ein Knoten in einem Abschnitt ankommt, der ├Ąlter ist als einer oder mehrere der aktuellen ├ältesten. In diesem Fall m├╝ssen wir ├╝bergeben - der neue Knoten wird gef├Ârdert und Abschnittswissen weitergegeben. Das zweite Szenario ist, wenn der Abschnitt zu gro├č wird und sich aufspaltet.


Rost
pub struct DkgSessionId {
    /// Pr├Ąfix der Sitzung, f├╝r die wir die ├Ąlteren Kandidaten sind
    Pub-Pr├Ąfix: Pr├Ąfix,
    /// Andere Älteste in dieser dkg-Sitzung
    Pub-Älteste: BTreeMap<XorName, SocketAddr>,
    /// Die L├Ąnge des Hauptasts der Abschnittskette.
    pub section_chain_len: u64,
    /// Die Bootstrap-Member f├╝r die n├Ąchste Membership-Instanz.
    pub bootstrap_members: BTreeSet<NodeState>,
    /// Die Mitgliedschaftsgeneration, bei der dieser SAP instanziiert wurde
    Pub-Mitgliedschaft_gen: Generation,
}

Wenn es ein DkgStart-Ereignis gibt, generieren die ├ältesten Informationen in einer Struktur namens DkgSessionId (das Format wird in Rust als ÔÇÜstructÔÇś bezeichnet). Sie signieren diese Struktur mit ihrem BLS-Schl├╝sselanteil und tauschen sie mit den anderen ├ältesten aus. Jede ÔÇ×DkgSessionIdÔÇť stellt Basisinformationen ├╝ber den aktuellen Stand der Dinge bereit und ist f├╝r eine DKG-Runde eindeutig.

Das Pr├Ąfix ist das aktuelle Abschnittspr├Ąfix. Bei einer ├ťbergabe ├Ąndert sich daran nichts. Im Falle einer Teilung ist dies der Fall, und wir f├╝gen unserem aktuellen Pr├Ąfix eine Eins oder eine Null hinzu, je nachdem, ob wir uns auf der 0- oder 1-Seite der Teilung befinden.

Das Feld ÔÇ×├ältesteÔÇť enth├Ąlt alle neuen Kandidaten f├╝r ├älteste f├╝r diese DKG-Sitzung, Knoten mit einem Knotenalter, das gleich oder gr├Â├čer als das eines aktuellen ├ältesten ist.

section_chain_length (umzubenennen) ist die Entfernung vom aktuellen Abschnittsschl├╝ssel zur├╝ck zu Genesis. Wir k├Ânnen es uns als ÔÇ×AbschnittsgenerationÔÇť vorstellen.

membership_gen zeigt auch die Mitgliedschaftsgeneration. Es unterscheidet sich von der Abschnittsgenerierung. Jeder Abschnitt hat viele Zugeh├Ârigkeitsgenerationen und die Kettenl├Ąnge ├Ąndert sich nicht.

bootstrap_members sind die aktuellen Ältesten in der Sektion.

Sobald Knoten DkgSessionIds von allen aktuellen ├ältesten erhalten, k├Ânnen sie eine DKG-Sitzung starten.

Lass uns gehen!


Dkg-Schritte

ÔÇ×Meerjungfrau
Flussdiagramm LR;
A[DkgStart] --> B[Kurzlebiger Schl├╝ssel]

Alle derzeitigen Ältesten und Ältestenkandidaten erhalten eine DkgStart-Nachricht, die an sie adressiert ist und in der sie als Älteste in der DkgSessionId-Struktur enthalten sind.

Jeder dieser Knoten generiert dann einen fl├╝chtigen einmaligen BLS-Schl├╝ssel, der nur f├╝r diese DKG-Runde verwendet wird. Dieser verg├Ąngliche Schl├╝ssel ist mit seinem ed25519-Schl├╝ssel signiert, der als Identit├Ąt dient, sodass die anderen Knoten pr├╝fen k├Ânnen, ob er g├╝ltig ist.


Dkg-Schritte

ÔÇ×Meerjungfrau
Flussdiagramm LR;
A[DkgStart] --> B[Kurzlebiger Schl├╝ssel] --> C[Voting]

Als n├Ąchstes kommt die Abstimmungsphase, in der jeder Knoten seine eigenen Schl├╝ssel f├╝r die Abstimmung generieren kann. Wir verwenden einen von Poanetwork Schl├╝sselgenerierung in hbbft, die sicherstellt, dass jeder Knoten nur seinen eigenen Schl├╝ssel generieren kann und keine Informationen von anderen Knoten verwendet, um einen separaten Schl├╝ssel f├╝r die DKG-Runde zu generieren.

Die Knoten stimmen darüber ab, welche der Kandidaten und Ältesten nun die Ältesten der Sektion sein sollen.


Dkg-Schritte

ÔÇ×Meerjungfrau
Flussdiagramm LR;
A[DkgStart] --> B[Ephemeral Key] --> C[Voting] --> D{Schl├╝sselgenerierung}

Sobald die Abstimmung beendet ist, generiert der Kandidat einen neuen Schl├╝ssel, den er an die aktuellen ├ältesten sendet, um zu beweisen, dass er berechtigt ist, ein ├ältester zu werden (weil eine Supermehrheit von Knoten ihn mit dem neu gepr├Ągten Schl├╝ssel signiert hat). DKG ist also eine Art Test f├╝r einen guten Kandidaten. Wenn sie DKG nicht beenden, sind sie nicht gut genug.


Parallelit├Ąt

ÔÇ×Meerjungfrau
Flussdiagramm LR;
A[DkgStart1] --> B[Ephemeral Key] --> C[Voting] --> D{Key1 Generation}
ÔÇ×Meerjungfrau
Flussdiagramm LR;
A[DkgStart2] --> B[Ephemeral Key] --> C[Voting] --> D{Key2 Generation}

Es k├Ânnen mehrere DKG-Sitzungen gleichzeitig stattfinden. Jedes Mal, wenn es ein neues Mitglied in der Sektion gibt, k├Ânnten wir (wenn der neue Knoten ├Ąlter als jeder der aktuellen ├ältesten ist) eine neue DKG-Sitzung haben, wenn also w├Ąhrend einer laufenden Sitzung ein neuer Knoten beitritt, kann eine andere DKG-Sitzung beginnen. Einige werden beendet, andere werden nur eine Zeit├╝berschreitung haben und fehlschlagen. Es ist ein Rennen, und wir w├Ąhlen das erste aus, das ins Ziel kommt. Wenn sich sp├Ąter herausstellt, dass es einen ├Ąlteren Knoten gibt, der kein ├ältester ist, beginnt der Prozess erneut.


Durch ├ťbergabe behoben

ÔÇ×Meerjungfrau
stateDiagram-v2
Dkg1 --> ├ťbergabe
├ťbergabe --> Gewinner:Dkg1
Dkg2 --> ├ťbergabe
Dkg3 --> ├ťbergabe

Bei Gleichstand wollen wir nur einen Sieger, also einen neuen ├ältesten. Die ├ťbergabe ist ein Prozess, bei dem im Konsens entschieden wird, wer gewinnen soll.


Aktive AE

ÔÇ×Meerjungfrau
stateDiagram-v2
DkgStart --> EphemeralKey
EphemeralKey --> EphemeralKey: Beinhaltet DkgStart AE
EphemeralKey --> Abstimmung
Abstimmung --> Abstimmung: Enth├Ąlt EphemeralKeys AE
Abstimmung --> K├╝ndigung

In diesen oben erw├Ąhnten Phasen, dem Empfangen einer ÔÇ×DkgStartÔÇť-Nachricht, dem Erstellen eines verg├Ąnglichen Schl├╝ssels und der Abstimmung, m├╝ssen wir Netzwerkprobleme und langsame Knoten ausgleichen. Zum Beispiel brauchen wir alle Schl├╝ssel, um mit der Abstimmung zu beginnen, wenn nicht, bleiben wir h├Ąngen. Daher f├╝gen wir AE in jede schl├╝sselbezogene Nachricht ein, um Informationen dar├╝ber bereitzustellen, dass ein Knoten m├Âglicherweise fehlt. AE ist leichtgewichtig und eine effiziente Methode, um sicherzustellen, dass alle Knoten auf dem neuesten Stand sind.


Rost
enum SystemMsg {

    DkgStart(DkgSessionId),

    DkgEphemeralPubKey {
        /// Die Kennung der DKG-Sitzung, f├╝r die diese Nachricht bestimmt ist.
        session_id: DkgSessionId,
        /// Section Authority f├╝r die DKG-Startmeldung
        section_auth: AuthorityProof<SectionAuthProof>,
        /// Der fl├╝chtige bls-Schl├╝ssel, der vom Kandidaten ausgew├Ąhlt wurde
        pub_key: BlsPublicKey,
        /// Die ed25519-Signatur des Kandidaten
        sig: Unterschrift,
    },

    DkgVotes {
        /// Die Kennung der DKG-Sitzung, f├╝r die diese Nachricht bestimmt ist.
        session_id: DkgSessionId,
        /// Die kurzlebigen ├Âffentlichen bls-Schl├╝ssel, die f├╝r diese Dkg-Runde verwendet werden
        pub_keys: BTreeMap<XorName, (BlsPublicKey, Signatur)>,
        /// Die DKG-Nachricht.
        Stimmen: Vec<DkgSignedVote>,
    },

    DkgAE(DkgSessionId),

    ...
}


Im Code sieht eine Systemnachricht, der Nachrichtentyp, der f├╝r Prozesse verwendet wird, die die Netzwerkstruktur ├Ąndern k├Ânnten, wie oben aus. Dies umfasst alle Prozesse, ├╝ber die wir gesprochen haben.


Widerstandsf├Ąhigkeit

  • Aktive AE
  • Abstimmung AE
  • Tratsch
    • beim Warten auf Stimmen
    • wenn veraltete Stimmen empfangen werden

Abschlie├čend haben wir mehrere Mechanismen f├╝r Resilienz bei der Handhabung von ├ťbergaben und Splits.

Aktive AE bedeutet, dass Knoten Informationen aus dem vorherigen Schritt gesendet werden, falls sie diese verpasst haben.

Wir haben auch Klatsch als Backup. Wenn Sie sich in einer DKG-Sitzung befinden, k├Ânnen Sie fl├╝chtige Schl├╝ssel oder Stimmen von jemandem empfangen. Wenn sie nicht auftauchen, schickst du dein aktuelles Wissen an die anderen in der Hoffnung, dass sie dich auf den neuesten Stand bringen. Auch wenn Sie veraltete AE von jemandem erhalten, k├Ânnen Sie diese aktualisieren.

Klatsch hat also zwei Zwecke. Um sicherzustellen, dass wir auf dem neuesten Stand sind, damit wir vorankommen k├Ânnen, und um andere auf den neuesten Stand zu bringen, damit wir zur K├╝ndigung gelangen k├Ânnen.

Zusammen mit AE und dem Erm├Âglichen des Wettbewerbs zwischen DKG-Prozessen bietet dies einen viel robusteren Prozess f├╝r die F├Ârderung neuer ├ältester und den Umgang mit Splits. W├Ąhrend Splits haben wir zwei DKGs statt einem.


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!