Mining
Proof of Work mit RandomX, auf dem Prozessor, der ohnehin in Ihrem Rechner steckt. Keine ASIC-Farm als Konkurrenz und kein Premine — Coins kommen aus dem Mining und sonst nirgendwoher.
Das Ganze#
# A payout address. The node never sees the key behind it.
zcd wallet new --out miner.json
# Mine to it.
zycordd --testnet --dir ./testnet \
--mine --payout $(zcd wallet address --key miner.json)
Im öffentlichen Testnet und im Mainnet sind das die -randomx-Binärdateien —
zcd-randomx und zycordd-randomx. Eine ohne das Tag gebaute Binärdatei verweigert
den Start, statt auf die Entwicklungs-Engine zurückzufallen. Siehe
Installation.
Starten Sie ihn, wann Sie wollen#
Ein Node, der gestartet wird, bevor der erste Block seines Netzwerks fällig ist, mint nicht zu früh und muss nicht zur Stunde erneut gestartet werden. Er verweigert es, einen Block zu bauen, dessen Zeitstempel seine eigene Uhr noch nicht erreicht hat, wartet und beginnt von selbst. Er sagt das, während er wartet, mit dem Zeitpunkt, auf den er wartet, und der verbleibenden Dauer:
waiting to mine: the next block cannot be dated before 2026-10-01T00:00:01Z
(unix 1790812801), and this node's clock reads 2026-09-30T20:12:31Z - 3h47m30s
to wait. Leave this running: mining starts on its own and there is nothing to
restart or reconfigure.
Das ist eine Weigerung zu minen, keine Weigerung zu laufen: der Node peert, synchronisiert und bedient seine RPC die ganze Zeit. Die Meldung wiederholt sich alle zehn Minuten, damit eine lange Wartezeit nicht wie ein Hänger aussieht.
Die Wartezeit wird gegen die Uhr dieses Rechners berechnet, eine um Tage nachgehende Uhr wartet also Tage. Prüfen Sie sie, bevor Sie irgendetwas anderes prüfen.
Diese Weigerung ist auch der Grund, warum es überhaupt vertretbar ist, einen Startzeitpunkt zu veröffentlichen. Ohne sie datierte der Miner
seinen Header stattdessen auf den Median-Boden vor, der vor der Genesis genesis_time
selbst ist — ein früher Start erzeugte also eine private Chain, die sonst niemand beurteilen konnte, und weil die
Schwierigkeitsregel die deklarierten Lösungszeiten misst, eine, deren Ziel sich in jedem Block gegen
Intervalle verhärtete, die nichts mit tatsächlich verstrichener Zeit zu tun hatten. Dafür musste niemand unehrlich sein;
das war es, was ein Durchlaufenlassen über Nacht früher bewirkte.
Die Auszahlungsadresse muss persistent sein#
Sie muss eine persistente (0x02) Adresse sein — zcd wallet
address gibt standardmäßig eine aus —, und zycordd weist alles
andere ab, statt zu warnen. Der Node sieht den Schlüssel, der sie kontrolliert, nie und könnte die Belohnung
nicht ausgeben, wenn er wollte.
Eine One-Shot-Auszahlung (0x01) mint korrekt — bis genau zu dem Moment, in dem Sie einmal von ihr ausgeben.
Diese Belastung markiert die Adresse für immer als ausgegeben, und der Fold verbrennt ab genau demselben Block jede reifende Belohnung, die an sie
adressiert ist — der Maturity-Ring rollt weiter, nachdem die Zertifikate des Blocks gelandet sind, sodass
der Block mit der Ausgabe bereits der erste Block ist, der Geld verliert, und alles, was von Ihren
letzten coinbase_maturity Blöcken noch im Ring liegt, geht mit.
Nichts wirft einen Fehler. Die einzige Spur steht in der Blockzeile dieses Nodes selbst:
matured=0, was auch ein gewöhnlicher leerer Ringplatz ausgibt, und ein
burned=, das den gesamten Producer-Anteil klammheimlich neben den Grund- und
Skip-Gebühren aufgenommen hat, die es normalerweise meldet. Kein Feld sagt „coinbase“. Eine persistente Adresse kann überhaupt nie in
die Spent-Registry gelangen, der Fehlerfall ist also beseitigt statt verengt — siehe
Wallet-Regel 3.
Coinbase-Maturity#
Belohnungen reifen nach coinbase_maturity Blöcken — 100 sowohl im
Mainnet als auch im öffentlichen Testnet. Bis dahin sind sie im Zustand sichtbar und nicht ausgebbar, und das
finanziert die ersten Einlagen auf einer Chain ohne Premine: in den ersten rund hundert
Blöcken können nur Miner Transaktionen durchführen.
Das Mainnet hat keinen Faucet und wird auch keinen bekommen, im Mainnet ist diese Anlaufphase also die gesamte Verteilung: minen, um mitzuspielen. Das öffentliche Testnet hat einen Faucet, wie alles andere darauf durch Mining finanziert, denn ein Netzwerk, dessen Coins nichts wert sind, verliert nichts dadurch, dass jemand eine Wallet probt, bevor er einen Miner probt.
Was der Betrieb kostet#
Die Arbeitsfunktion ist ein Konsensparameter, keine Einstellung. zcd
params gibt sie aus:
proof of work randomx-v1 (re-keyed every 2048 blocks, 64-block lag)
Speicher#
Die Verifikation braucht etwa 256 MiB je gehaltener Schlüsselepoche, und die Tabelle hält zwei, damit eine Reorg über eine Schlüsselgrenze hinweg nicht eine pro Block neu aufbaut. Kalkulieren Sie mehr als diese Tabelle ein, denn die Tabelle ist nicht die Schranke. Ein Cache ist ab dem Moment der Zuteilung im Speicher, und die Argon2-Befüllung, die ihn teuer macht, kommt danach — es können also bis zu zwei weitere aktiv sein, während sie gebaut werden —, und ein Eintrag, der verdrängt wird, während ihn noch etwas benutzt, behält alles, was er hat, bis dieser Nutzer loslässt, und genau das tut ein Miner über eine Dataset-Befüllung hinweg.
| Rolle | Budget | Warum |
|---|---|---|
| Verifizierender Node | ~1 GiB für die Engine | Der Cache-Spitzenwert gegen die zweieinträgige Tabelle wurde mit beiden Effekten gleichzeitig bei 1280 MiB gemessen — nicht bei den 512 MiB, die die Tabelle nahelegt. |
| Minender Node | ~3,3 GiB | Reserviert zusätzlich das ~2 GiB große Dataset und ist der Fall, der einen Nutzer über die Befüllung hinweg festhält. |
Ein Rechner, der bequem verifizieren kann, kann nicht zwangsläufig minen.
Threads#
--mine-threads steht standardmäßig auf einem je Kern. Es ändert nichts an der Gültigkeit; es bestimmt,
wie schnell dieser Node nach einer Lösung sucht.
Was bei einem Schlüsselwechsel passiert#
Die Arbeitsfunktion erhält alle randomx_key_interval Blöcke einen neuen Schlüssel. Ein minender Node
baut dann das ~2 GiB große Dataset neu auf und hört währenddessen auf zu minen — in der Größenordnung
von zehn Sekunden, maschinenabhängig; messen Sie Ihre eigene ab der ersten Grenze im Log.
Er verifiziert die ganze Zeit weiter, und ein Neuaufbau kann ihn nicht ausbremsen: ein Header aus einer
anderen Schlüsselepoche als der gerade geminten wird auf dem eigenen 256-MiB-Cache dieser Epoche verifiziert, den das
Dataset nicht berührt. Beide berechnen identische Digests, der einzige Unterschied, den ein Neuaufbau für die Verifikation
macht, ist also Geschwindigkeit. Der Cache der nächsten Epoche wird über die letzten
randomx_key_lag Blöcke der Epoche vorgewärmt.
| Netzwerk | randomx_key_interval | Mining-Pause, ungefähr |
|---|---|---|
| Mainnet | 2048 Blöcke | eine alle ~17 Stunden |
| öffentliches Testnet | 512 Blöcke | eine alle ~4 Stunden |
Das kürzere Intervall des Testnets ist Absicht: diese Grenze öfter zu proben, gehört zu dem, was das Netzwerk messen soll. Das Dataset der nächsten Epoche im Voraus zu bauen, ist möglich — der Schlüssel ergibt sich aus der Höhe, ist also lange vor der Grenze bekannt — und wird bewusst unterlassen: es hieße, zwei davon zu halten, 4 GiB, um eine Pause zu sparen, die einen Miner ein paar Sekunden am Tag kostet.
Einen minenden Node anhalten#
SIGTERM (oder Strg-C) hält ihn an, und er hält zügig an: ein Signal
erreicht jede Schleife, nicht diejenige, die gerade zufällig am Kanal wartet.
Ein Stopp, der während eines Schlüsselwechsels eintrifft, wartet, bis die Dataset-Befüllung fertig ist
— die Engine gibt keinen ~2 GiB großen Puffer frei, solange Hash-Aufrufe noch darin lesen, was
ein Use-after-free in C wäre, das kein Go-Werkzeug melden würde. Es ist ein Stopp, der auf ein festes Ereignis wartet,
nicht einer, der mit ihm um die Wette läuft: über zehn Durchläufe gemessen bewegte sich der Zeitpunkt des Endes nicht, wie früh das
Signal auch eintraf, während die Wartezeit von 4,5 s auf 0,7 s schrumpfte, ohne SIGSEGV.
Kalkulieren Sie also ein Stopp-Timeout oberhalb der Befüllzeit Ihres Rechners ein. Ein zweites SIGTERM
wartet nicht — das erste gibt das Signal an das Betriebssystem zurück, ein erneutes
Drücken von Strg-C während dieser Pause beendet den Prozess also sofort.
Pools, und warum es keine gibt#
Zum Start gibt es keine, und keiner wäre offiziell. Der Node mint ab Werk allein, und bei Genesis-Schwierigkeit ist das der vernünftige Einstieg. Falls Pools auftauchen, sind sie Dritte; wenden Sie dieselbe Skepsis an wie überall sonst.
Botnetze, benannt statt geleugnet#
CPU-Mining lädt sie ein. Jeder CPU-minebare Coin hat gegen sie gekämpft, und dieses Projekt erwartet nicht, die Ausnahme zu sein. Der Handel wird sehenden Auges eingegangen: eine durch Botnetze verzerrte Verteilung ist immer noch breiter als eine, die in einem Verkauf entschieden wird, und den Laptop, den Sie ohnehin besitzen, konkurrenzfähig zu halten, ist der ganze Grund, warum es RandomX gibt.
Beim Arbeiten zusehen#
Der Testnet-Explorer stellt jeden Block und jedes Zertifikat dar,
einschließlich der Seite, die kein Explorer einer anderen Chain darstellen kann: ob jedes Zertifikat angewendet oder
übersprungen und abgerechnet wurde und welcher deklarierte Read nicht mehr galt. Ihr eigener Node beantwortet dieselben
Fragen auf /status, /head und /metrics — siehe
die schreibgeschützte Oberfläche.