Nutzen Sie diese Seite, um eine Maschine zu dimensionieren, bevor Sie eine betreiben. Ein Validator ist günstig. Das Beweisen ist es nicht: Der Speicherbedarf eines Beweises wächst steil mit seiner Stufe, und diese eine Zahl entscheidet, ob eine Maschine die Aufgabe leisten kann. Jede Angabe hier ist eine Messung aus dem testnet oder aus den Aufzeichnungen des Fullnode. Angaben, die nicht final sind, sind gekennzeichnet.
Was jede Rolle tut
| Rolle | Aufgabe | Ausführung | Beweist? |
|---|---|---|---|
| Validator | ordnet Transaktionen, verifiziert jeden Beweis in jedem Block, stimmt in HotStuff ab | rand-node run --validator | nein |
| Observer | synchronisiert, verifiziert jeden Beweis erneut, bedient JSON-RPC; keine Stimme | rand-node run | nein |
| Prover (ein Wallet) | beweist seine eigenen Bundles und Aufrufe lokal und reicht sie dann ein | rand send, rand call, rand program deploy | ja, jede Transaktion |
| delegierter Prover | erstellt den Bundle-Beweis für ein mit ihm gekoppeltes Wallet; auf Chain 20 erhält er den Viewing Key dieses Wallets, nie den Spend Key | rand-prover run oder rand-node run --prover | ja, nur Bundle-Beweise |
| Aggregator | beweist einen rekursiven Beweis über ein Fenster von Bundle-Beweisen, für einen Sealing-Block | rand-node aggregate --watch | ja, die größten Beweise |
| Build-Host | kompiliert rand-node und rand und übergibt die Binärdateien an kleine Nodes | cargo build --release | nein |
Validatoren und Observer beweisen nie. Ein abgeschirmter Transfer oder ein Aufruf wird von dem Wallet bewiesen, das ihn sendet, oder, nur für den Bundle-Beweis, von einem Prover, mit dem dieses Wallet gekoppelt ist (Running a node). Die Validatoren der Flotte beweisen heute nichts.
Die Block-Aggregation ist gebaut, aber nicht aktiv. Sie benötigt einen Abschnitt aggregation im Genesis. Chain 20 hat keinen: Die Aggregation ist aus, wie auf den Chains 9 bis 19, und der Build weigert sich, mit einem Genesis zu starten, der den Abschnitt enthält.
Dimensionierung auf einen Blick
| Rolle | RAM | CPU | Festplatte |
|---|---|---|---|
| Validator oder Observer | 2 GB (die ursprüngliche Flotte); ein Validator benötigt zudem eine synchronisierte Uhr (Uhr) | 1 vCPU (der größte Teil der ursprünglichen Flotte) | mit --prune-history 24h etwa ein Tag an Blöcken: auf Chain 14 gemessen Blocktabellen von 3,3–4,4 GB; halten Sie mehr als 4 GB frei (Festplatte) |
| Archiv (vollständige Historie) | wie ein Validator | wie ein Validator | wächst mit der Chain: gemessen etwa 3,6 GB pro Tag für die QCs mit 18 Signaturen der Chain 14 bei 1,4-s-Blöcken, mehr auf den Chains 18 bis 20, deren QCs bis zu 26 Signaturen tragen, was nicht erneut gemessen wurde; die beiden Archive des testnet liegen auf Volumes mit 250 GiB |
| Build-Host | 8 GB (Node E) | 4 vCPU (Node E) | der Quellbaum, target/ und mindestens 20 GB frei |
| Prover, abgeschirmter Transfer (Stufe 14) | 6,1 GB Spitze für einen Transfer auf Chain 18, 6,1 bis 6,6 GB für einen Aufruf mit seinem zahlenden Bundle (2026-09-30) | ein Kern; auf Chain 18 zwei Beweise, der Bundle-Beweis der Stufe 14 in 102 bis 134 s und der Autorisierungsbeweis der Stufe 10 in 7 bis 23 s (Apple-Silicon-Laptop, 2026-09-30); etwa 100 s allein für das 4-in-4-out-Bundle mit verstecktem Asset auf Chain 14; 92,2–96,0 s gemessen auf einem Laptop für das 2-in-2-out-Bundle der Chain 13 (Produktion, 2026-09-19) | klein |
| delegierter Prover | 5,74 GB für jeden Beweis, den er gleichzeitig ausführt, plus 1 GiB Reserve; er verweigert den Start, wenn weniger verfügbar ist | ein Kern pro Beweis | klein |
| Prover, Aufruf der Stufe 18 (der ERC-20; auf der Chain seit v0.5.6 abgelehnt, siehe Proving memory) | 85,0 GB (übersetztes transfer) / 85,5 GB (interpretiert), gemessen auf m-16vcpu-128gb | ein Kern | klein |
| Prover, Aufruf der Stufe 20 (SPL Token; auf der Chain seit v0.5.6 abgelehnt) | noch nicht bewiesen; auf etwa 330 GB extrapoliert, mehr als der größte Memory-Droplet von DigitalOcean (m-32vcpu-256gb, 256 GB) | ein Kern | klein |
| Aggregator, N = 1 | mindestens 64 GB war die Grenze vor den Läufen vom 2026-09-28/29; siehe Aggregatoren | heute CPU | wie ein Validator |
| Aggregator, N = 2 / N = 3 | 133 GB / 221 GB gemessen unter Constraint-Set 7 (2026-09-28/29) | ein GPU-Node für die Produktion ab N ≥ 2 | wie ein Validator |
Der Prover ist heute single-threaded. Ein Droplet mit 16 vCPUs lief mit 99 % eines Kerns. Mehr Kerne machen einen einzelnen Beweis nicht schneller; mehr RAM entscheidet, ob er fertig wird.
Validatoren und Observer
Speicher und CPU
Die ursprünglichen achtzehn Validatoren laufen auf Droplets mit 2 GB. Das Verifizieren eines Beweises ist günstig:
| Operation | Kosten |
|---|---|
| einen Bundle-Beweis verifizieren, warmer Verifier Key | etwa 16 ms |
| die erste Verifikation bei einer neuen Form | etwa 230 ms |
| den Verifier Key eines deployten Programms bauen (einmalig, im Hintergrund) | etwa 7 s auf einem Server mit 2 vCPUs |
| einen Aggregat-Beweis verifizieren (wenn die Aggregation aktiv ist) | etwa 0,8 s kalt, etwa 16 ms warm (Entwurfswerte) |
Der Speicher, den ein Validator zum Verifizieren eines Aufruf-Beweises der Stufe 18 oder 20 benötigt, ist nun teilweise gemessen, auf einem Apple-Silicon-Laptop mit 48 GB, unabhängig vom DigitalOcean-Droplet, das den jeweiligen Beweis erzeugt hat: Das Verifizieren des transfer-Beweises der Stufe 18 dauerte 50,2 s bei 3,66 GB Spitzen-RSS (übersetzt) bzw. 49,6 s (Interpreter, RSS nicht gesondert erfasst); das Verifizieren des approve-Beweises der Stufe 16 dauerte 12,2 s (RSS nicht gesondert erfasst). Stufe 20 ist nicht gemessen – es existiert noch kein Beweis der Stufe 20, den man verifizieren könnte. Seit v0.5.6 baut ein Validator nie einen so großen Key: Der Header eines Aufruf-Beweises wird geprüft, bevor ein Verifier Key gebaut wird, und ein Aufruf oberhalb der Stufe 14 (oder mit einer keccak-Tabelle über 2^12 oder einer sha256-Tabelle über 2^13) wird abgelehnt, bei der Zulassung und als Regel für die Blockgültigkeit. Der schlechteste zulässige Aufruf-Header benötigte gemessen 4,7 s und 312 MB zum Verifizieren.
Ein Droplet mit 1 vCPU und 2 GB kann die Binärdateien nicht bauen. Bauen Sie auf einer größeren Maschine und kopieren Sie sie hinüber (siehe Einrichtung).
Festplatte
| Angabe | Wert | Quelle |
|---|---|---|
| ein ruhender Block der Chain 14, vor v0.5.5 | etwa 60 KB in blocks plus etwa 49 KB in qcs: das QC mit 18 Dilithium2-Signaturen doppelt gespeichert, etwa 6,6 GB pro Tag bei 1,4-s-Blöcken | der Festplattenvorfall vom 2026-09-24, AGENTS.md |
| derselbe Block seit v0.5.5 | etwa 60 KB: das QC eines committeten Blocks wird einmal gespeichert, im justify seines Kindes; etwa 3,6 GB pro Tag bei 1,4-s-Blöcken | docs/deploy.md, Roll-Hinweis zu v0.5.5 |
| RocksDB-Write-Ahead-Log | seit dem Fix vom 2026-09-24 auf 256 MB begrenzt; davor 13 GB nicht bereinigtes Log pro Validator | AGENTS.md |
ein Validator der Chain 14 nach vollständigem --prune-history 24h (2026-09-25) | Blocktabellen 3,3–4,4 GB, zuvor 19 GB; Festplatten zu 18–37 % belegt | AGENTS.md, v0.5.7 |
| das Datenverzeichnis von Node A, Chain 12 bei Höhe 62.276 | etwa 10 GB | deploy/README.md, der Rollout von v0.3 |
| eine Chain mit vollen Blöcken | 4 MiB alle 2 s, etwa 170 GB pro Tag (das Blocklimit der Chains bis 12; das von Chain 20 beträgt 20 MiB) | docs/block-space.md |
| freier Platz, den die Flotte für Builds vorhält | mindestens 20 GB | docs/block-space.md |
| eine 30-GB-Festplatte mit den Datenverzeichnissen dreier Chains | voll; RocksDB No space left on device, Absturzschleife | mkc1 und mem1, deploy/README.md |
Auf Chain 20 laufen, wie auf Chain 19, 24 der 26 Validatoren mit --prune-history 24h und halten etwa einen Tag an Blöcken vor; das Ledger selbst (Notes, Nullifier, Anker, das Register) wird nie beschnitten. Die Archive, obs1 und rand-archive-2 (beide zugleich Validatoren), laufen ohne das Flag. Ein mainnet-Node übergibt es nie. Der Node verweigert den Start, wenn im Dateisystem seines Datenverzeichnisses weniger als --min-free-disk-mb (standardmäßig 1.024 MB) frei sind, und rand_getHealth antwortet mit disk_low unterhalb des Vierfachen davon; ein Roll, der auf ok wartet, bleibt an einem Node stehen, der sich füllt. Siehe History pruning, was ein beschnittener Node noch beantwortet.
Ein Datenverzeichnis einer stillgelegten Chain löschen Sie nach einer Umstellung. Datenverzeichnisse sind nach dem Genesis-Hash benannt (data-<name>-<hash8>: -6210cf07 für Chain 20, -a3defc93 für Chain 19; die sechs Guardian-Hosts verwenden /var/lib/randnode/data-20), alte Verzeichnisse bleiben also bestehen, bis Sie sie entfernen. Bei der Umstellung auf Chain 20 startete ein regionaler Validator (syd1) mit disk_low und 3,9 GB freiem Speicher und hielt den Start bei 25 von 26 an, weil die Verzeichnisse der Chains 14 bis 17 noch darauf lagen; ihr Löschen gab 22 GB frei. Behalten Sie das Verzeichnis der vorherigen Chain einen Tag lang als Rollback-Ziel und entfernen Sie es dann. Bei vollen Blöcken ist jeder rohe Bundle-Beweis seit Chain 14 etwa 1,42 MB groß (bis Chain 13 etwa 1,3 MB). Seit Chain 17 trägt jedes Bundle zusätzlich einen Autorisierungsbeweis, sodass eine Überweisung etwa 2,85 MB an Beweisen umfasst: etwa 1,49 MB für den Bundle-Beweis und 1,36 MB für den Autorisierungsbeweis (Produktionsprofil, gemessen am 2026-09-29). Sobald die Aggregation aktiv ist, beschneidet sie den Beweis eines versiegelten Bundles auf etwa 3 KB, es sei denn, der Node läuft mit --keep-raw-proofs. Den Autorisierungsbeweis erfasst sie nicht; er behält seine volle Größe.
Netzwerk
Öffnen Sie bei einem öffentlichen Node TCP 30303 eingehend. Nodes hinter NAT wählen sich mit --bootstrap nach außen ein. Bei vollen 4-MiB-Blöcken überträgt eine Validator-Verbindung etwa 2 MB/s.
Uhr
Ein Validator braucht NTP. Chain 14 ist die erste Chain, auf der die Echtzeituhr Teil des Konsenses ist (Bridge-Härtung B2):
| Regel | Grenze | Art |
|---|---|---|
| der Zeitstempel eines Blocks darf höchstens so weit hinter dem seines Vorgängers liegen | 60 s (MAX_TIMESTAMP_STEP_MS) | Gültigkeitsregel; der Block ist ungültig (BlockError::TimestampLeap) |
| ein Validator stimmt nicht für einen Block, dessen Zeitstempel mehr als so weit vor seiner eigenen Uhr liegt | 15 s (MAX_CLOCK_DRIFT_MS) | Abstimmungsregel |
Ein Validator, dessen Uhr 20 s nachgeht, hört stillschweigend auf abzustimmen: Er sieht jeden ehrlichen Block als seiner Uhr voraus und hält seine Stimme zurück, und nichts schlägt fehl. Auf Chain 20 müssen achtzehn von sechsundzwanzig abstimmen, damit überhaupt etwas committet wird. Prüfen Sie jeden Validator und installieren Sie chrony, wo die Uhr nicht synchronisiert ist:
timedatectl # want "System clock synchronized: yes" and "NTP service: active"
chronyc tracking 2>/dev/null || timedatectl show-timesync --all 2>/dev/null
apt-get install -y chrony && systemctl enable --now chrony
Dieselbe 15-s-Grenze gilt für einen Genesis. Setzen Sie timestamp_ms nahe an die Startzeit und nie davor: Ein Genesis, der mehr als 15 s in der Zukunft liegt, committet keinen Block 1, bis die Echtzeit ihn erreicht, und einer, der weit in der Vergangenheit liegt, lässt die Blockzeit hinter der Echtzeit zurück, die sie mit höchstens 60 s pro Block aufholt (docs/deploy.md). Ein Observer stimmt nicht ab, daher bindet ihn die Abstimmungsregel nicht.
DigitalOcean-Größen, auf denen das testnet läuft
| Größe | RAM, vCPU, Datenträger | Nodes | Hinweise |
|---|---|---|---|
s-1vcpu-2gb | 2 GB, 1 | die meisten regionalen Validatoren (darunter ams3, nyc1, nyc2, sfo2) | kann nicht bauen; Binärdateien werden hineinkopiert |
s-1vcpu-2gb-amd | 2 GB, 1 | atl1 | wie oben |
s-2vcpu-2gb-intel | 2 GB, 2 | D (ric1) | |
s5-1vcpu-2gb-30gb | 2 GB, 1, 30 GB | mkc1, mem1 (dort die einzige kleine Größe) | die Datenträger waren bei der Umstellung auf Chain 13 voll (29 GB); 7 GB frei, nachdem die Datenverzeichnisse der toten Chain 11 gelöscht wurden; Vergrößerung nötig |
| 4 vCPU, 8 GB | 8 GB, 4 | E (sgp1) | Validator, Build-Host und Explorer |
Diese Tabelle deckt die ursprünglichen achtzehn Validatoren ab. Seit 2026-09-27 läuft auch Validator A auf einem Droplet (sgp1), nicht mehr auf einem Laptop. Auf Chain 15 wurden acht weitere Validatoren gebondet (2026-09-27): die beiden Archivknoten, obs1 und rand-archive-2 (fra1), sowie die sechs Guardian-Hosts. Ihre Droplet-Größen sind hier nicht festgehalten, ebenso wenig, ob mkc1 und mem1 vergrößert wurden. Alle 26 sind auf Chain 20 Genesis-Validatoren, wie auf Chain 19, mit je 1.000 RAND, und Stand 2026-09-30 liegen alle 26 Schlüssel bei einem einzigen Betreiber.
Proving-Speicher
Die Wallet beweist jede Transaktion, die sie sendet, daher braucht der Aufrufer eines Programms den Speicher für die Stufe dieses Programms. Dies sind die gemessenen Grenzen. Die Läufe auf Stufe 18 sind auf DigitalOcean abgeschlossen, bewiesen und verifiziert; Stufe 20 nicht. Seit v0.5.6 lehnt die Chain einen Aufrufbeweis oberhalb von Stufe 14 ab (MAX_CALL_TIER), die Zeilen für Stufe 16, 18 und 20 unten sind also Messungen und keine Aufrufe, die Chain 20 zulässt; jeder auf Chain 14 committete Aufruf war Stufe 10.
| Workload | Stufe | Zyklen | Gemessen | Benötigt |
|---|---|---|---|---|
Shielded-Überweisung (der Guest bundle) | 14 | etwa 9.160 auf Chain 13 (der 2-in-2-out-Guest) | 92,2–96,0 s auf einem Apple-Silicon-Laptop (Produktion, Chain 13, 2026-09-19); Spitzenspeicher nicht erfasst. Der 4-in-4-out-Guest für verborgene Assets von Chain 14 ist auf dieselbe Stufe festgelegt: etwa 100 s und ein Beweis von etwa 1,42 MB. Auf Chain 20 besteht eine Überweisung aus zwei Beweisen (geteilte Autorisierung, seit Chain 17): dem Bundle-Beweis auf Stufe 14, 102 bis 134 s und etwa 1,49 MB, und einem Autorisierungsbeweis auf Stufe 10, 7 bis 23 s und etwa 1,36 MB. Spitzenspeicher 6,1 bis 6,6 GB für eine ganze Transaktion (Apple-Silicon-Laptop, Chain 18, 2026-09-30) | läuft auf dem Entwicklungslaptop |
ERC-20 approve (Produktion, auf Chain 13, 2026-09-19) | 16 | 48.119 | Aufrufbeweis 388,7 s, 3.412.405 Byte; der gesamte rand call 622,8 s bei 22,9 GB Spitzen-RSS auf einem M-Serie-Laptop mit 48 GB | ein Laptop mit 48 GB |
| ERC-20-Aufrufe | 18 | etwa 66k bis 162k | der transfer der ersten Stufe (79.203 Zyklen, vor dem Code-Guard) wurde auf einem Laptop mit 48 GB nach 1.016 s bei 24,7 GB mit SIGKILL beendet; ein Lauf auf einem Droplet mit 64 GB lag nach 25 Minuten über 47 GB | 85,0 GB (übersetzt) / 85,5 GB (interpretiert) Spitzen-RSS, 3.230,5 s / 3.143,3 s Proving-Zeit, Beweise von 811.600 / 805.108 Byte. Gemessen auf m-16vcpu-128gb, 2026-09-19 |
| SPL-Token-Vektoren | 20 | etwa 700k bis 770k | der übersetzte Transfer (692.854 Zyklen, vor dem ELF-Guard) wurde auf einem Laptop mit 48 GB nach 225 s bei 30,77 GB gestoppt, noch im Proving; ein Lauf auf Stufe 20 wurde auf einem Droplet mit 64 GB nach 10 min 41 s bei 65,1 GB vom OOM-Killer beendet | noch nicht bewiesen; extrapoliert auf etwa 330 GB und etwa 3,6 h (gemessene Skalierung der Stufen 16/18: Speicher etwa ×3,9, Zeit etwa ×4,1 je +2 Stufen) — mehr als das größte Speicher-Droplet von DigitalOcean (m-32vcpu-256gb, 256 GB) |
| rVM-Produktions-Exit auf Stufe 21 (ein Bundle-Beweis, verifiziert innerhalb der Rekursions-VM) | 21 | 1.968.619 Zeilen | abgeleiteter Bedarf von 48,6 GB vor dem Lauf; unter Constraint-Set 7 brauchte er mehr, als ein Droplet mit 256 GB hatte (2026-09-28/29) | mehr als 256 GB; unter Constraint-Set 8 nicht erneut gemessen |
Die ERC-20-Aufrufe landen auf den Stufen 16 und 18 und SPL Token auf Stufe 20 (Ethereum, Solana). Auf einer Maschine mit 48 GB wurde kein Beweis auf Stufe 18 oder 20 erzeugt.
Aggregatoren
Ein Aggregator beobachtet die Chain, nimmt die Bundle-Beweise eines Fensters finalisierter Blöcke, beweist darüber einen rekursiven Aggregatbeweis und reicht ihn ein. Der Block, der ihn aufnimmt, ist ein versiegelnder Block. Der Aggregator erhält den Proving-Anteil der abgedeckten Bundles plus eine Blocksubvention in neuen RAND, an seine registrierte Auszahlungsadresse. Die Aggregation ist permissionless: Jeder Betreiber mit einem Bond kann sich registrieren.
Sie existiert nur auf einer Chain, deren Genesis einen Abschnitt aggregation hat. Chain 20 hat keinen, und ihr Build weigert sich, mit einem Genesis zu starten, der einen hat.
Hardware
| Aggregat | Host-RAM | Backend |
|---|---|---|
| N = 1 Bundle | mindestens 64 GB | CPU; das Testprofil bewies eines in etwa 26 Minuten auf einem ausgelasteten Laptop (327.035 Byte) |
| N = 2 | 133 GB gemessen; die frühere Grenze lag bei mindestens 128 GB | das GPU-Backend für die Produktion |
| N = 3 | 221 GB gemessen; die frühere Grenze lag bei mindestens 160 GB | das GPU-Backend für die Produktion |
| der GPU-Node der Flotte | mindestens 160 GB Host, ein 80-GB-Gerät (H100 oder A100-80G) | Linux, Treiber R580+, CUDA 13, LLVM 21, sm_80+; bisher existiert keiner |
Die Werte für N = 2 und N = 3 wurden am 2026-09-28/29 auf einem DigitalOcean-Droplet mit 256 GB unter Constraint-Set 7 gemessen, und der Produktions-Exit-Beweis brauchte mehr als die 256 GB dieser Maschine. Keiner wurde unter Constraint-Set 8, das die Chains 18 bis 20 verwenden, erneut gemessen; betrachten Sie die Zeile für N = 1 daher als Untergrenze. Das CUDA-Backend lief am 2026-09-28 erstmals auf echter Hardware, auf einer NVIDIA H100: Seine Kernel werden zu PTX für sm_80 und sm_90 gebaut und stimmen mit der CPU-Referenz überein. Die Produktionsmessung auf einem GPU-Node der Flotte steht noch aus. Jeder Node zahlt außerdem einmalig beim Start den Key-Build für das Aggregatprogramm: 13,0 bis 13,4 s beim Testprofil (2¹⁹) und erwartet 30 bis 70 s in der Produktion (2²¹).
Befehle
# print a signed registration; the bond burns out of a wallet bundle as the register bundle's burn
rand-node aggregator register --key agg.key.json --bond <RAND> --payout rand1… --rpc http://127.0.0.1:8545
# the daemon: poll rand_getUnsealed, fetch the raw bundles, prove, seal the payment note, submit
rand-node aggregate --key agg.key.json --rpc http://127.0.0.1:8545 --watch
# leave, then withdraw the released bond into a note at the payout address
rand-node aggregator unbond --key agg.key.json --rpc http://127.0.0.1:8545
rand-node aggregator withdraw --key agg.key.json --rpc http://127.0.0.1:8545
aggregate-Flag | Standard | Bedeutung |
|---|---|---|
--key | erforderlich | der Aggregator-Schlüssel, den das Register kennt; signiert jedes Aggregat |
--rpc | http://127.0.0.1:8545 | der Node, der abgefragt wird und an den übermittelt wird |
--watch | aus | weiter abfragen, statt nur einmal zu übermitteln |
--interval-secs | 15 | Abfrageintervall mit --watch |
--no-wait | aus | zurückkehren, sobald der Node das Aggregat annimmt |
rand status zeigt auf einer solchen Chain einen Abschnitt aggregation: registrierte Aggregatoren, nicht versiegelte Blöcke und den Index des Subventionsplans. rand_getUnsealed ist die Arbeitsliste.
Einrichtung
Diese Schritte folgen den Skripten, die das testnet verwendet (deploy/vps-setup.sh, deploy/update-droplet.sh). Sie ergeben einen Linux-Validator oder -Observer.
1. Auf einem Build-Host bauen
Der Build benötigt build-essential clang cmake pkg-config libssl-dev, Rust 1.98.1 (festgelegt durch rust-toolchain.toml) und einen circuits-Checkout neben dem fullnode-Checkout. Der erste Build dauert 10 bis 20 Minuten.
git clone https://github.com/randprotocol/fullnode
git clone https://github.com/randprotocol/zkp-circuits circuits
cd fullnode
git checkout v0.6.8 # c9c9bd3c, the build chain 20 runs
git -C ../circuits checkout "$(sed -n 's/^circuits: //p' crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)" # aeacf31 for v0.6.8
git show origin/main:deploy/genesis-chain20.json > deploy/genesis-chain20.json # committed after the tag
cargo build --release -p randprotocol-node -p randprotocol-client
sha256sum target/release/rand-node # compare on every node you copy it to
Chain 20 benötigt vor init auf jedem Node v0.6.8. Ihr Genesis enthält Felder, die kein früherer Build liest (testnet, binding_domain, proof_window_blocks, program_state, die Gruppen rotation und fees der Bridge, die Gas-Obergrenzen, Staking-Zulassung per Abstimmung), und v0.6.8 enthält die Konsensänderungen CON-4 und CH-1 aus Audit v6. Beweise werden weiterhin unter Constraint-Set 8 erzeugt, wie auf den Chains 18 und 19, mit einem Autorisierungsbeweis neben jedem Bundle-Beweis (hc_auth). Ein v0.6.8-Build weist das Genesis der Chains 14 bis 17 bei run und verify zurück. Führen Sie genau den Build aus, den die Flotte ausführt. Die Genesis-Datei liegt im main des fullnode (Commit 74cfaca0), nicht im Tag v0.6.8, daher die dritte git-Zeile. Der circuits-Checkout muss auf dem Commit stehen, aus dem das Release vendored wurde; diesen liest die zweite git-Zeile oben aus dem fullnode-Baum aus. Fügen Sie -p randprotocol-prover hinzu, um auch rand-prover zu bauen.
2. Die Binärdateien auf dem Node installieren
scp target/release/rand-node target/release/rand deploy/genesis-chain20.json root@<node>:/root/
ssh root@<node> 'install -m 755 /root/rand-node /root/rand /usr/local/bin/'
3. Schlüssel, Genesis, Firewall
Auf dem Node:
install -d -m 700 /root/keys
test -e /root/keys/node.key.json || rand-node keygen --out /root/keys/node.key.json # prints the address; keep the seed secret
rand-node init --datadir /root/data-6210cf07 --genesis /root/genesis-chain20.json
timedatectl # "System clock synchronized: yes" (see Clock)
ufw allow 22/tcp && ufw allow 30303/tcp && ufw enable
Erzeugen Sie den Schlüssel wie oben auf dem Node und halten Sie ihn aus jedem Checkout heraus. Im fullnode-Repository ist kein Schlüssel mehr versioniert (Audit v3, OPS-1). Die für die Chains 8 bis 13 committeten Dateien deploy/node-*.key.json sind veröffentlichte Seeds; die Validator-Schlüssel von Chain 20 (die achtzehn für Chain 14 erzeugten und die acht, die auf Chain 15 gebondet wurden) wurden außerhalb des Repositorys erzeugt, und die Flotte legt den Schlüssel jedes Droplets in /root/keys/node-<name>.key.json ab, außerhalb des Quellbaums. Der Speicherort ist wichtig auf einem Node, der mit den Skripten der Flotte bereitgestellt wurde: deploy/rebuild-vps.sh und deploy/push-to-vps.sh übertragen /root/fullnode per rsync mit --delete, sodass ein Schlüssel innerhalb dieses Baums vom nächsten Rebuild gelöscht wird und die Unit danach nicht mehr startet. Seit v0.6.8 weigert sich keygen, eine vorhandene Datei zu überschreiben (v0.6.7 überschrieb sie ohne Rückfrage); das test -e macht die Zeile in beiden Fällen gefahrlos wiederholbar. Sichern Sie den Schlüssel außerhalb des Hosts, bevor Sie ihn bonden.
init gibt den Genesis-Hash aus. Er muss 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 lauten (Chain 20). Die Genesis-Datei ist genesis-chain20.json in deploy/ des fullnode-Repositorys auf main. Benennen Sie das Datenverzeichnis nach den ersten acht Zeichen des Hashs, wie es die Flotte tut (data-<name>-6210cf07), damit es nie mit dem von Chain 19 (-a3defc93) oder einer späteren Chain kollidiert. Das Genesis legt diese Grenzen fest. Das Beweislimit betrug auf den Chains 13 bis 16 8 MiB und beträgt seit Chain 17 4 MiB, ab der eine Transaktion bis zu drei Beweise tragen konnte:
| Grenze | Chain 20 |
|---|---|
max_program_words | 65,535 |
max_proof_bytes | 4,194,304 (4 MiB) |
max_block_bytes | 20,971,520 (20 MiB) |
max_call_envelope_bytes | 65,536 |
max_program_public_words | 32,768 |
envelope_bytes | 1,860 (jeder Note-Umschlag, mit seinem verschlüsselten Memo-Feld) |
proof_window_blocks | 1,024 (256 auf Chain 19) |
program_state | Zellgebühr 0.1 RAND (10,000,000 Einheiten); höchstens 8 Lesezugriffe, 8 Schreibzugriffe und 4 Auszahlungen pro Aufruf |
Abschnitt aggregation | keiner (Aggregation aus) |
Das Genesis von Chain 20 enthält außerdem consensus_domain: 1, binding_domain: 1, testnet: true, einen Abschnitt staking mit Zulassung per Abstimmung, einen Abschnitt gas mit Preisobergrenzen, die Gruppen rotation und fees der Bridge, hardening_v6 und die beiden Guest-Pins hc_bundle und hc_auth; Running a node listet auf, was sie festlegen.
4. Eine systemd-Unit
Dies ist die Unit, die deploy/vps-setup.sh mit den obigen Pfaden schreibt:
[Unit]
Description=RAND full node
After=network-online.target
[Service]
Environment=RUST_LOG=info,libp2p=warn,libp2p_mdns=off
ExecStart=/usr/local/bin/rand-node run --datadir /root/data-6210cf07 --key /root/keys/node.key.json --validator --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns --prune-history 24h --bootstrap <multiaddr> --bootstrap <multiaddr>
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Lassen Sie --validator für einen Observer weg. --prune-history 24h ist das, was die Validatoren des testnet ausführen, mit Ausnahme der Archive; lassen Sie es bei einem Node weg, der die vollständige Historie behält, und übergeben Sie es niemals auf mainnet-beta. Die Bootstrap-Multiaddrs für Chain 20 sind die Nodes C (fra1), D (ric1) und E (sgp1), unverändert gegenüber Chain 19. Chain 20 läuft auf den für Chain 14 erzeugten Validator-Schlüsseln, und eine p2p-Identität wird aus dem Validator-Schlüssel abgeleitet, daher sind dies die Peer-IDs, die Chain 14 verwendet hat. Ein neuer Node, der ab Genesis synchronisiert, braucht außerdem einen Peer mit vollständiger Historie; fügen Sie also eines der beiden Archive hinzu (obs1, dann rand-archive-2):
/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
/ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf
/ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh
Belassen Sie den RPC auf 127.0.0.1, sofern keine Firewall ihn schützt. Ein Node, der die Öffentlichkeit bedienen soll, öffnet daneben den öffentlichen Listener von v0.6.8 (--public-rpc <ADDR>) und setzt einen Proxy davor, niemals vor --rpc (JSON-RPC). Eine von v0.6.7 übernommene Unit darf nicht --prover-accept-spend-key übergeben, was v0.6.8 beim Start verweigert.
systemctl daemon-reload && systemctl enable --now rand-node
journalctl -u rand-node -f
rand status # height climbing, peer_count rising
5. Dem Validator-Set beitreten
Ein neuer Schlüssel gehört zu keinem Epochen-Set. Auf Chain 20 muss er zuerst hineingewählt werden: Ihr Genesis setzt staking.admission_by_vote, sodass Validatoren, die mehr als zwei Drittel des Stimmgewichts halten, ihn jeweils mit rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash <chain 20's hash> signieren, und einer übermittelt die Stimmen mit rand-node admit submit; rand_getAdmitted listet ihn dann auf. Binden Sie danach mindestens 1,000 RAND an ihn: Geben Sie eine Registrierung aus mit rand-node register --key /root/keys/node.key.json --payout rand1… --v2 (Chain 20 weist eine v1-Registrierung zurück), und bonden Sie dann aus einem Wallet mit rand bond <address> 1000 --registration <hex>. Der Bond wartet auf seine Aktivierungsepoche, frühestens drei 1,000-Block-Grenzen nach seinem Commit, und höchstens 2,500 bps des aktiven Gewichts werden pro Grenze zu neuem Gewicht (Chain 19 deckelte es auf feste 10,000 RAND). Staking führt Sie durch den Ablauf.
6. Aktualisieren
Dies gilt für einen Build, der dieselbe Chain ausführt. Der Wechsel von einer früheren Chain auf Chain 20 ist kein Update: Er erfordert die neue Binärdatei, das neue Genesis und ein frisches Datenverzeichnis, und das Datenverzeichnis der alten Chain kann danach gelöscht werden (deploy/retire-chain-dirs.sh; die Flotte behält es einen Tag für ein Rollback). Um einen neuen Build ohne Chain-Cut auszurollen, bauen Sie einmal, vergleichen Sie den sha256 von rand-node und rand, stoppen Sie den Dienst, installieren Sie und starten Sie neu, jeweils einen Node nach dem anderen. Einige Releases werden stattdessen komplett gestoppt und komplett gestartet (die Call-Tier-Regel von v0.5.6, die Status-Wire-Änderung von v0.5.7, die strengere Beweisverifikation von v0.6); die Hinweise jedes Releases nennen, welches Vorgehen gilt. v0.6.7 wurde auf Chain 18 Node für Node ausgerollt; v0.6.8 kam mit Chain 20, komplett gestoppt, komplett gestartet, weil seine Konsensänderungen CON-4 und CH-1 niemals Node für Node ausgerollt werden dürfen. Warten Sie, bis jeder Node wieder beigetreten ist, bevor der nächste folgt, damit das Quorum nie um mehr als einen fehlt. deploy/update-droplet.sh <ip> [build-host] tut genau das über SSH.
Die Releases bis v0.6.8 wurden von Hand auf einem Host gebaut und sind unsigniert. Das GitHub-Release v0.6.8 enthält rand-node, rand, rand-prover und SHA256SUMS, gebaut auf Node E; diese Prüfsumme erkennt einen beschädigten Download und bürgt nicht für den Build-Host. v0.6.8 liefert einen Release-Workflow mit, der die Binärdateien aus dem Tag baut, und deploy/update-droplet.sh verweigert eine Installation ohne signierte SHA256SUMS, sofern nicht ALLOW_UNSIGNED=1 gesetzt ist. deploy/release-signers listet noch keinen Schlüssel, daher wurde der signierte Pfad noch nicht genutzt.
Die Chains 15, 16, 17 und 18 gingen innerhalb von 2.7 Tagen live (2026-09-26 bis 2026-09-29), jede als Komplettstopp der Flotte. Chain 19 folgte am 2026-10-01 um 03:43 UTC, ein Re-Genesis von Chain 18 auf demselben Build, und Chain 20 am selben Tag um 06:17 UTC, geschnitten aus einem Snapshot von Chain 19 beim Hard Fork v0.6.8; jeder Node stoppte bei der Chain-19-Höhe 7,700. Eine schriftliche Cut-Richtlinie (2026-09-30) gilt ab Chain 20; der Cut-Eintrag von Chain 20 verzichtete auf den Rebuild durch einen zweiten Operator, weil ein Operator alle Schlüssel hält. Ein Cut braucht einen Grund, den ein Rolling Update nicht erfüllen kann, eine veröffentlichte Liste dessen, was er mitführt und was er streicht, eine zuvor abgeschlossene Checkliste für den Client-Rebuild, einen zweiten Operator, der das Genesis auf denselben Hash neu baut, einen Rollback-Plan und eine nie zuvor verwendete Chain-ID.