Argon2id-Proof-of-Work erklärt

· 6 Min. Lesezeit

Dieser Artikel erklärt, was Argon2id ist, wie Blocknet daraus einen Proof of Work macht, warum er viel schnellen Speicher belohnt und wie der Miner seine aus jeder CPU die meisten Hashes herausholt.

Was ist Argon2id?

Kurze Antwort

Argon2id ist eine speicherintensive (memory-hard) Hashfunktion, die in RFC 9106 für Passwort-Hashing und Proof of Work spezifiziert ist. Sie füllt einen großen Speicherbereich mit 1-KiB-Blöcken und baut jeden Block aus dem vorherigen und einem früheren Block an anderer Stelle im Speicher auf. Einen Hash zu berechnen kostet daher echten Speicher und nicht nur Prozessorzeit.

RFC 9106, 2021 von der Crypto Forum Research Group der IRTF veröffentlicht, beschreibt „die speicherintensive Funktion Argon2 für Passwort-Hashing und Proof-of-Work-Anwendungen“. Argon2 gibt es in drei Varianten:

Unter der Haube behandelt Argon2 den Speicher als lange Folge von 1.024-Byte-Blöcken. Jeder neue Block ist die Ausgabe einer Kompressionsfunktion G, die auf zwei Eingaben angewendet wird: den Block direkt davor und einen Referenzblock von weiter vorne im Speicher. G basiert auf den Mischrunden der Hashfunktion BLAKE2b, die mit Additionen, XORs und Rotationen auf 64-Bit-Wörtern arbeiten.

Wie nutzt Blocknet Argon2id als Proof of Work?

Blocknet legt jede Argon2id-Einstellung im Konsenscode fest, sodass jeder Miner und jeder Node exakt dieselbe Funktion berechnet:

Parameter Wert bei Blocknet Bedeutung
Variante Argon2id, Version 1.3 Die primäre Variante aus RFC 9106
Speicher 2 GiB (2.097.152 KiB) 2.097.152 Blöcke à 1 KiB pro Hash gefüllt
Iterationen 1 Ein Durchlauf über den Speicher
Parallelität 1 Eine Lane, ein Hash läuft also auf einem Thread
Ausgabe 32 Byte Der Wert, der mit dem Zielwert verglichen wird
Passwort 8-Byte-Nonce, Little-Endian Die Zahl, die ein Miner bei jedem Versuch ändert
Salt Block-Header ohne die Nonce Bindet den Hash an ein Block-Template

Mining ist eine Suche. Ein Miner nimmt den Block-Header, den er veröffentlichen will, wählt eine Nonce und berechnet den Argon2id-Hash. Liegt das 32-Byte-Ergebnis, als Zahl gelesen, auf oder unter dem Zielwert des Netzwerks, ist der Block gültig. Wenn nicht, probiert der Miner die nächste Nonce.

Der Zielwert ergibt sich direkt aus der Difficulty: Er ist (2^256 − 1) geteilt durch die Difficulty. Die Difficulty entspricht damit ungefähr der Anzahl an Hashes, die das ganze Netzwerk voraussichtlich berechnen muss, um einen Block zu finden. Blocknet strebt einen Block alle fünf Minuten an, die Netzwerk-Hashrate ist also etwa die Difficulty geteilt durch 300 Sekunden. Die Difficulty selbst folgt den jüngsten Blockzeiten über einen gewichteten gleitenden Durchschnitt über 60 Blöcke.

Pools funktionieren genauso, nur mit einem leichteren Zielwert. Auf bntpool.com müssen die Shares, die seine einreicht, nur eine niedrigere Difficulty pro Verbindung erfüllen, und jeder Share, der zusätzlich den Zielwert des Netzwerks erfüllt, ist ein gefundener Block.

Warum passt speicherintensiver Proof of Work zu normalen Computern?

Die obigen Einstellungen stellen den Speicher in den Mittelpunkt jedes Hashes. Mit einem Durchlauf und einer Lane ist die zweite Hälfte des Durchlaufs datenabhängig: Die Position der Referenz jedes Blocks ergibt sich aus dem ersten 64-Bit-Wort des unmittelbar zuvor berechneten Blocks. Ein Miner kann nicht wissen, welchen früheren Block er braucht, bis er ihn braucht, also hält er den ganzen 2-GiB-Speicherbereich im RAM.

Ein Miner könnte versuchen, weniger Blöcke zu speichern und fehlende bei Bedarf neu zu berechnen. RFC 9106 nennt das Time-Memory-Trade-offs: Sie sparen Speicher „auf Kosten von mehr Aufrufen der internen Kompressionsfunktion“. Jeder Block, der aus dem Speicherbereich wegfällt, muss mit zusätzlicher Rechenarbeit erneut bezahlt werden.

Genau das macht das Design freundlich für normale Hardware. Desktop-PCs, Laptops und Server haben bereits Gigabytes an RAM und Speichercontroller, die darauf ausgelegt sind, ihn zu versorgen. Ein Chip, der nur zum Hashen gebaut ist, bräuchte neben seinen Hash-Kernen trotzdem Gigabytes an schnellem Speicher. Die erste empfohlene Einstellung in RFC 9106 ist Argon2id mit einem Durchlauf über 2 GiB Speicher, dieselbe Anzahl an Durchläufen und dieselbe Speichergröße, die Blocknet verwendet, und laut RFC „maximiert“ diese Einstellung „die Kosten für Angreifer auf spezialisierter Brute-Force-Hardware“. Blocknets Daemon-Code beschreibt die Wahl als speicherintensiven Proof of Work, „um ASICs zu widerstehen und faires Mining sicherzustellen“. Argon2id ist darauf ausgelegt, ASICs zu widerstehen, und die 2-GiB-Einstellung setzt dieses Design um, sodass Mining für die Computer offen bleibt, die man ohnehin schon besitzt. Der Artikel Proof of Work vs. Proof of Stake erklärt, wie sich das von Staking unterscheidet.

Warum bestimmen RAM und Speicherbandbreite die Hashrate?

Kurze Antwort

Jeder Mining-Thread hält seinen eigenen 2-GiB-Speicherbereich, also bestimmt dein RAM, wie viele Threads du ausführen kannst. Jeder Hash schreibt außerdem 2 GiB und liest ungefähr genauso viel von verstreuten Stellen zurück, also bestimmen Geschwindigkeit und Latenz deines Speichers, wie schnell diese Threads fertig werden. Der Speicher zählt so viel wie die Anzahl der Kerne.

Der RAM bestimmt die Thread-Anzahl. Parallelität 1 bedeutet, dass ein Hash auf einem Thread läuft, und jeder Thread braucht einen eigenen vollen 2-GiB-Speicherbereich. Ein Rechner mit 16 GB kann etwa sechs bis sieben Threads ausführen und lässt dabei Platz für das System. seine misst deinen Arbeitsspeicher, hält 5 % in Reserve und wählt die Thread-Anzahl für dich.

Bandbreite und Latenz bestimmen das Tempo jedes Threads. Ein Hash erzeugt 2.097.152 neue Blöcke, und jeder davon liest einen 1-KiB-Referenzblock von irgendwo im Speicherbereich. Das ergibt pro Hash etwa 2 GiB geschrieben und etwa 2 GiB gelesen. Bei 10 H/s bewegt ein Rechner jede Sekunde ungefähr 40 GiB an Daten durch den Speicher. In der datenabhängigen Hälfte ist jede Leseadresse erst bekannt, wenn der vorherige Block fertig ist, daher zählt die Antwortzeit des Speichers genauso viel wie der reine Durchsatz.

Deshalb heißt es auf der Leistungsseite von seine, die Hashrate hänge „genauso stark von Speicherbandbreite und Latenz ab wie von der Anzahl der Kerne“. Der Hardware-Leitfaden für Blocknet-Mining zeigt das beste Ergebnis jeder Hardware-Generation.

Huge Pages helfen aus demselben Grund. Ein 2-GiB-Speicherbereich umfasst 524.288 gewöhnliche 4-KiB-Seiten oder 1.024 Seiten à 2 MiB. Weniger, größere Seiten bedeuten bei diesen verstreuten Lesezugriffen weniger Fehltreffer bei der Adressübersetzung, was auf dem Validierungsrechner von seine etwa 4–6 % brachte. Die Huge-Pages-Anleitung zeigt die Einrichtung.

Wie holen die CPU-Kernel von seine das Beste aus Argon2id heraus?

Ein Kernel ist die innere Schleife, die die Blöcke berechnet. Die x86-Builds von seine enthalten Skalar-, AVX2- und AVX-512-Kernel sowie eine Streaming-Variante, die Arm-Builds NEON mit einem schnellen SHA3-Pfad. Jeder geht die speichergebundene Arbeit auf andere Weise an:

Auf der von uns getesteten Hardware hat der richtige Kernel viel ausgemacht. Das sind gepaarte Läufe auf demselben Rechner mit derselben Thread-Anzahl, von der Leistungsseite von seine:

Rechner Kernel-Wechsel Gewinn
AWS Graviton4 (Neoverse V2), 16 Threads NEON zu SHA3 mit Prefetch +56 % (13,80 auf 21,50 H/s)
AWS Graviton3 (Neoverse V1), 16 Threads NEON zu SHA3 mit Prefetch +45 % (12,52 auf 18,17 H/s)
AMD EPYC 9R45 (Zen 5), 24 Threads AVX2 zu Streaming +30 % (34,47 auf 44,74 H/s)
Intel Xeon 8375C (Ice Lake), 1–4 Threads AVX2 zu AVX-512 +21–29 %

Nichts davon wählst du selbst. seine vergleicht die Kernel, die deine CPU unterstützt, an echter Mining-Arbeit, wechselt erst nach zwei bestätigten Gewinnen und speichert den Sieger für den nächsten Start. Welcher Kernel am besten ist, hängt von Thread-Anzahl, Seitengröße und CPU-Zuweisung ab. Deshalb misst seine das auf deinem Rechner, statt eine Wahl fest einzuprogrammieren.

Um deinen eigenen Speicher arbeiten zu lassen, lade seine herunter, starte es und füge deine Adresse ein. Die Mining-Anleitung zeigt dir den Rest.

Häufig gestellte Fragen

Welche Argon2id-Parameter nutzt Blocknet für den Proof of Work?

Blocknet verwendet Argon2id Version 1.3 mit 2 GiB Speicher, einer Iteration, Parallelität 1 und einer 32-Byte-Ausgabe. Die 8-Byte-Nonce ist das Passwort, der Block-Header ohne Nonce das Salt. Ein Hash gewinnt einen Block, wenn er auf oder unter dem Zielwert liegt, den die Netzwerk-Difficulty festlegt.

Warum braucht jeder Blocknet-Mining-Thread 2 GB RAM?

Jeder Argon2id-Hash füllt einen 2-GiB-Speicherbereich aus 1-KiB-Blöcken, und in der zweiten Hälfte dieses Durchlaufs liest jeder neue Block einen früheren, der anhand von Daten ausgewählt wird, die der Miner nicht vorhersagen kann. Ein Thread muss seinen gesamten Speicherbereich im RAM halten, daher braucht jeder Thread etwa 2 GB RAM.

Warum ist Argon2id darauf ausgelegt, ASICs zu widerstehen?

Argon2id macht den Speicher zum teuren Teil jedes Hashes. Jeder Blocknet-Hash braucht 2 GiB schnellen Speicher und bewegt Gigabytes durch ihn, sodass auch ein reiner Hash-Chip große Mengen RAM pro Kern bräuchte. Der Code des Daemons beschreibt die Wahl als speicherintensiven Proof of Work, um ASICs zu widerstehen und faires Mining sicherzustellen.

Kann eine Grafikkarte Blocknets Argon2id minen?

Ja. seine mint unter Windows und Linux auf jeder NVIDIA-Grafikkarte im Rechner gleichzeitig mit der CPU, und die Hashraten addieren sich. Die Kernel werden beim Start kompiliert, und der erste Start optimiert jede Karte und speichert das Ergebnis, es gibt also vor dem Start nichts zu konfigurieren.