Semi-Stateless Initial Sync Experiment – Igor Mandrigin


Um den Semi-Stateless-Ansatz zu testen, müssen wir zwei Dinge messen:

  • Wie viel zusätzlicher Speicherplatz / Bandbreite ist für diesen Ansatz erforderlich? ist es besser als der vollständig zustandsbezogene Ansatz?
  • Wie viel schneller wird die anfängliche Synchronisierung durchgeführt?

In diesem Artikel werden wir uns konzentrieren auf dem Speicherplatz.

Aufbau des Experiments

  • Maximale Größe der Trie (Merkle Trie): 1.000.000 Knoten. Wenn die Anzahl der Knoten diesen Wert überschreitet, werden die LRU-Knoten entfernt, um den Speicher freizugeben. Auf diese Weise können wir den verwendeten Arbeitsspeicher unter Kontrolle halten.
  • Die Teilzeugen werden in einer Datenbank (unserer Gabel von boltdb) gespeichert. Jeder Eintrag hat folgende Struktur:
Schlüssel: [12]Byte // Blocknummer + maximale Anzahl der Knoten im Trie
Wert: []Byte // Zeugen, serialisiert wie in diesem Dokument beschrieben
  • Wir speichern den Vertragscode nicht in den Zeugen (dies ist eine Einschränkung der aktuellen Architektur).

Wie die Daten gesammelt wurden (Synchronisation erforderlich).

(im Turbo-Geth-Repository)Staat machen./build/bin/state zustandslos 
- chaindata ~ / nvme1 / mainnet / mainnet / geth / chaindata
- statefile semi_stateless.statefile
- snapshotInterval 1000000
- Schnappschuss von 10000000
- Statistikdatei new_witness.stats.compressed.2.csv
- witnessDbFile semi_stateless_witnesses.db
- zustandsloserResolver
- Größe 1000000 versuchen

Gesamtspeicher

Zeugen DB (Schraube db), um 6.169.246 Blöcke von Grund auf neu zu synchronisieren, braucht 99 GB

Quantilanalyse

python quantile-analysis.py cache_1_000_000 / semi_stateless_witnesses.db.stats.1.csv
Mittelwert 0,038 MB
Median 0,028 MB
p90 0,085 MB
S95 0,102 MB
p99 0,146 MB
max 2.350 MB

Vollständige Daten

python absolute_values_plot.py cache_1_000_000 / semi_stateless_witnesses.db.stats.1.csv

Zeugengrößen für Blöcke von 1 bis 6100.000, begrenzt auf 1,0 MB. Schiebedurchschnitt 1024.

Normalisierte Daten (nach DDoSes)

absolute_values_plot.py cache_1_000_000 / semi_stateless_witnesses.db.stats.1.csv 3000000

Zeugengrößen nach DDoS-Werten, gleitender Durchschnitt von 1024.

DDos Vergrößern

python ddos_zoom.py cache_1_000_000 / semi_stateless_witnesses.db.stats.1.csv

Vergrößerter Ausschnitt auf DDoSes-Einfluss auf Zeugengrößen (Rohdaten).

Wir können sehen, dass aufgrund der DDoSes um die Blöcke 2,3M-2,5M und 2,65M-2,75M die Größe der Zeugen erheblich größer ist.

Full vs Semi

python full_vs_semi.py cache_1_000_000 / semi_stateless_witnesses.db.stats.1.csv

Vollständige Zeugengrößen werden für fehlende Codekomponenten angepasst.

Wie wir aus diesem Diagramm ersehen können, werden durch die Verwendung des Ansatzes "Semi-Stateless" ziemlich viele Daten gespeichert, wenn wir ihn mit dem Ansatz "Full Stateless" vergleichen.

Ein zustandsloser Resolver fügt ca. 0,4 MB zusätzliche Informationen pro Block hinzu, die übertragen / gespeichert werden müssen. Das sind deutlich weniger Daten als ein Zeuge pro Block, selbst wenn wir den Code anpassen (Sie können einige Diagramme in meinem vorherigen Beitrag sehen).

Wenn die Leistung gut ist, kann dies ein guter Modus für die anfängliche Synchronisierung sein, um sie zu beschleunigen, der jedoch weniger Daten erfordert als ein vollständig zustandsorientierter Ansatz.

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

Werbung: Immobilienmakler HeidelbergMakler Heidelberg

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close