Drei Binärdateien entstehen mit cargo build --release: rand-node (der Node und die Operator-Befehle), rand (die abgeschirmte Wallet) und rand-prover (der delegierte Prover). Jeder Befehl akzeptiert -h/--help. Diese Seite beschreibt das Release v0.6.8 (c9c9bd3c), den Build, den chain 20 betreibt; wo sich v0.6.7 anders verhielt, wird das vermerkt. Eine rand-Wallet, die älter ist als v0.6.8, kann auf chain 20 nicht senden, deren Genesis jeden Beweis und jede signierte Nachricht an ihren Hash bindet. Die ersten beiden halten unterschiedliche Arten von Schlüsseln: Ein Node-Schlüssel ist ein Dilithium2-Schlüsselpaar, das Blöcke signiert; ein Wallet-Schlüssel ist ein abgeschirmter Spend-Schlüssel, der on-chain nichts signiert.
rand-node
rand-node <COMMAND>
keygen Generate a new Dilithium2 key file (refuses to overwrite an existing one)
address Print the address, public key, and libp2p peer id of a key file
genesis Write a genesis.json: every validator key is staked, each --alloc becomes a deposit note
alloc-note Print one genesis alloc note as JSON, RAND or a listed token, for splicing into a genesis
init Initialise a data directory from a genesis file
run Run the node
verify Verify the chain in a data directory without running the node
db Database maintenance on a stopped node's data directory
safety status | clear-halt | release-lock: a stopped validator's consensus safety state
status Show node status
register Print this node's Registration, for the wallet that bonds it in
admit sign | submit: the validator set's vote to admit a new key (admission by vote)
unbond Move bonded stake into unbonding
withdraw Pay released stake and rewards into a note at the payout address
bridge-gov rotate-pq | rotate-pause | cancel-rotation: the bridge's post-quantum rotations
vesting status | claim | revoke | bond | unbond: genesis vesting (chains with a vesting section)
aggregator register | unbond | withdraw — the aggregator role (aggregation chains only)
aggregate The aggregate daemon (aggregation chains only)
safety, admit und bridge-gov sind neu in v0.6.8. Es gibt weder balance noch transfer: Ein Transfer braucht einen abgeschirmten Spend-Schlüssel, und den hält nur die Wallet.
Ein globales Flag, --allow-test-fri-profile (oder RAND_ALLOW_TEST_FRI_PROFILE=1), lässt init, run und verify ein Genesis akzeptieren, dessen fri_profile test ist. Dieses Profil bietet etwa 17 Bit Soundness, und wer eine Genesis-Datei schreibt, kann es benennen; deshalb lehnt ein Node ein solches Genesis seit v0.6.8 ohne das Flag ab. Die Test-Suites setzen es; sonst sollte es nichts setzen.
keygen, address
| Befehl | Argument | Standardwert |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | erforderlich |
keygen schreibt { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } mit Modus 0600. Die Datei ist die einzige Kopie des Seeds. Seit v0.6.8 verweigert keygen ein --out, das bereits existiert (… already exists or cannot be created; refusing to overwrite a key file), und lässt es unverändert; es gibt kein --force, eine alte Datei muss also beiseitegelegt werden, um sie zu ersetzen. v0.6.7 und früher überschrieben sie ohne Nachfrage. address gibt address, public_key (1.312 Bytes hex) und peer_id aus.
genesis
| Argument | Standardwert | Bedeutung |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | Chain-ID; Transaktionen und Gossip-Topics sind an sie gebunden |
--validator <KEY,STAKE,PAYOUT> | erforderlich, wiederholbar | ein Register-Eintrag: ein Schlüsseldateipfad oder öffentlicher Schlüssel in hex, der Stake in RAND (mindestens 1.000), die rand1…-Auszahlungsadresse |
--epoch-blocks <N> | 1000 | Blöcke pro Epoche |
--alloc <ALLOCS> | keiner, wiederholbar | eine Einzahlungs-Note: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | Ausgabepfad |
--faucet | aus | nur testnet: aktiviert Mint. Neben einem bridge-Abschnitt braucht es --testnet |
--testnet | aus | v0.6.8: schreibt "testnet": true, die Markierung, die einen Faucet neben einem bridge-Abschnitt zulässt. Teil des Genesis-Hashes, wenn angegeben |
--no-confidential | aus | deaktiviert Deploy und Call |
--fri-profile <production|test> | production | test ist unsicher und für die Test-Suite gedacht; init, run und verify lehnen eine solche Datei ohne --allow-test-fri-profile ab |
--max-program-words <N> | keiner (4096) | das größte Programm, das ein Deploy enthalten darf, 1..=65535. Wird nur geschrieben, wenn angegeben; ist immer dann Teil des Genesis-Hashes, wenn vorhanden, sodass --max-program-words 4096 eine andere Chain ist als das Weglassen. Jeder Node braucht eine v0.4-Binärdatei vor init auf einer solchen Datei |
--max-proof-bytes <N> | keiner (2.097.152) | der größte Beweis, den eine Transaktion enthalten darf, 1048576..=33554432. Jede Beweisgrenze folgt ihm |
--max-block-bytes <N> | keiner (4.194.304) | der größte Block und damit die größte Transaktion, 4194304..=67108864, und mindestens 2 × max_proof_bytes + 1 MiB, bzw. 3 × max_proof_bytes + 1 MiB mit --auth-guest, wo ein Call drei Beweise trägt (Bundle, Auth, Call) |
--max-call-envelope-bytes <N> | keiner (18.432) | der größte Call-Input-Envelope, 18432..=1048576 |
--max-program-public-words <N> | keiner (0) | der größte öffentliche Input, den ein Deploy festlegen darf, 0..=65535; 0 lässt keinen zu |
--tokens <TOKENS.JSON> | keiner | der RPL-Abschnitt tokens als JSON-Datei {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Ohne ihn hat die Datei keinen solchen Abschnitt und wird wie bisher gehasht. Ein bridge-Abschnitt braucht eine solche Datei mit einem mint_cap_per_day ungleich null (pro Backing, pro UTC-Tag, in den Einheiten des Tokens mit acht Dezimalstellen); ein gelisteter Token braucht einen bridge-Abschnitt |
--envelope-bytes <N> | keiner (der alte 1.348-Byte-Envelope) | die exakte Größe jedes Note-Envelopes: eine Bundle-Ausgabe, ein Faucet-Mint, ein Withdraw, eine Bridge-Einzahlung, eine Genesis-Alloc. Akzeptiert wird nur 1860, die Größe, mit der jeder Envelope ein verschlüsseltes Memo tragen kann. Teil des Genesis-Hashes, wenn angegeben, und gesetzt, bevor die --alloc-Notes dieses Befehls versiegelt werden |
--vesting <VESTING.JSON> | keiner | der Abschnitt vesting: die zeitgesperrten Zuteilungen, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Seit v0.6.8 führt ein widerrufbarer Eintrag revokers (1 bis 5 Schlüssel), einen threshold und das treasury, an das ein Widerruf auszahlt; eine Datei, die eines davon auslässt, wird abgelehnt |
--staking <STAKING.JSON> | keiner | v0.6.8: der Abschnitt staking als JSON-Datei (faucet_budget_per_epoch, bond_activation_epochs, max_weight_bps, max_stake_entry_per_epoch oder max_stake_entry_bps_per_epoch, registration_v2, faucet_recipients, faucet_minters, admission_by_vote, slashing), vom Build validiert |
--consensus-domain <0|1> | keiner (0) | v0.6.8: 1 bindet jede Stimme, jede New-View und jeden Vorschlag an dieses Genesis |
--bundle-guest <v1|v2|v3> | v1 | der als hc_bundle fixierte Bundle-Guest: v1 (der Hidden-Asset-Guest, den chain 14 und 15 betrieben), v2 (der verzweigungsfreie Guest von chain 16) oder v3 (geteilte Autorisierung: Der Guest nimmt nk und ein Salt statt des Spend-Schlüssels). v3 braucht --auth-guest |
--auth-guest | aus | fixiert den Auth-Guest dieses Builds als hc_auth: Jedes Bundle trägt dann einen Auth-Beweis über den Spend-Schlüssel, an seine Transaktion gebunden, dessen Ausgabe dem auth_commit des Bundles entspricht. Erforderlich mit --bundle-guest v3 und abgelehnt mit v1 oder v2, bevor eine Datei geschrieben wird. Fehlt es, hat die Datei kein Feld hc_auth |
--hardening-v6 | aus | macht die v0.6-Regeln zu Gültigkeitsregeln (hardening_v6): das pc-Fenster, nicht aufrufbare Deploys, kanonische Beweisformen und Proof-of-Work-Wörter, die Call-Bindung und die Untergrenze der Programmtabelle. Fehlt es, lehnt ein Node diese an seinem Pool weiterhin ab, als Policy |
--gas-price <UNITS> | keiner (kein Abschnitt gas) | Einheiten (10⁻⁹ RAND) pro Gas, die die Chain selbst einem Call berechnet. Dieses Flag schreibt den Abschnitt gas (metering: "circuit"); die drei folgenden Flags werden ohne es abgelehnt. Teil des Genesis-Hashes |
--byte-price <UNITS> | 800, nur mit --gas-price | Einheiten pro KiB oder angebrochenem KiB von Call-Beweis plus Input-Envelope, ab Byte 0 |
--bundle-gas-limit <N> | 20479, nur mit --gas-price | das exakte GAS_LIMIT, das jeder Bundle-Beweis deklarieren muss; ein Bundle-Beweis, der einen anderen Wert deklariert, wird abgelehnt. Das Genesis akzeptiert nur 20479, gas_max(14, 0, 0) für den Tier-14-Bundle-Guest |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | keiner (feste Preise) | schaltet den Preisregler pro Block ein, nach unten begrenzt durch den eigenen Startwert von gas_price und byte_price des Abschnitts. Neben --aggregation abgelehnt |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | keine (keine Obergrenze) | v0.6.8: die Obergrenzen, über die der Regler einen Preis nie hebt, jeweils mindestens der Startpreis. Ohne --gas-dynamic abgelehnt |
--gas-byte-load paying | keiner (die Bytes jeder Transaktion) | v0.6.8: Nur Beweis und Input-Envelope eines Calls bewegen byte_price, sodass ein Block aus Transfers keinen bewegt. Ohne --gas-dynamic abgelehnt; paying ist der einzige Wert |
--binding-domain <0|1> | keiner (kein Feld) | v0.6.8: 1 bindet den Genesis-Hash in jede Transaktionsbindung und jede signierte Aktionsnachricht (ein Faucet-Mint, Unbond, Withdraw, die RPL-Token-Nachrichten, die Aggregator-Aktionen, die Bridge-Governance-Nachrichten), sodass ein Beweis oder eine Signatur für diese Chain auf keiner anderen verifiziert. Ohne das Flag warnt der Befehl: Eine v0.6.8-Wallet beweist die Genesis-gebundene Form auf jeder Chain-ID außerhalb von 14 bis 19, daher wird jede Chain ab 20 mit 1 erzeugt |
--proof-window-blocks <N> | keiner (256) | v0.6.8: ein Fenster, 256 bis 4.096 Blöcke, dafür, wie alt der Anker eines Bundles und sein time sein dürfen. Ausgeliefert als rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | keiner (kein Abschnitt program_state) | v0.6.8, RPL-2: schaltet Programm-Zellen, Programm-Vaults und die Aktion Invoke ein, mit dieser Zellgebühr in RAND-Einheiten (höchstens 1.000 RAND), die der Gebührenuntergrenze eines Invoke pro erzeugter Zelle hinzugefügt wird. Braucht --tokens, --gas-price, --hardening-v6 und --auth-guest, jedes mit Namen abgelehnt, bevor eine Datei geschrieben wird |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | keiner | der Abschnitt aggregation; der v0.6.8-Build weigert sich, auf einem Genesis zu starten, das einen hat |
Gibt eine alloc-Zeile pro --alloc aus, dann den Genesis-Hash, die Anzahl der Validatoren und Notes, die Epochenlänge, die fünf Limits, hc_bundle und hc_auth (none ohne --auth-guest), dann die Gas-Zeile: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, oder gas: none ohne --gas-price, und mit --program-state-cell-fee eine Zeile program_state: cell fee N RAND. init gibt dieselbe Gas-Zeile aus. Die fünf Limit-Flags verhalten sich gleich: Fehlen sie, hat die Datei kein solches Feld und die Chain läuft mit dem Standardwert; sind sie angegeben, ist das Feld Teil des Genesis-Hashes, auch bei seinem Standardwert. Chain 20 wurde mit diesen Flags erzeugt (deploy/cut-chain20-genesis.sh):
--max-program-words 65535 --max-proof-bytes 4194304 --max-block-bytes 20971520 \
--max-call-envelope-bytes 65536 --max-program-public-words 32768 \
--tokens tokens.json \
--bundle-guest v3 --auth-guest --hardening-v6 \
--gas-price 100 --byte-price 800 --bundle-gas-limit 20479 --gas-dynamic 10485760,262144,1250 \
--max-gas-price 10000 --max-byte-price 80000 --gas-byte-load paying \
--envelope-bytes 1860 \
--testnet --binding-domain 1 --proof-window-blocks 1024 --program-state-cell-fee 10000000 \
--epoch-blocks 1000 --faucet --fri-profile production
Die Ketten 18 und 19 wurden mit denselben Flags geschnitten, bis auf --envelope-bytes 1860 und keines der Flags aus v0.6.8. Die Proof-Obergrenze beträgt 4 MiB, gegenüber 8 MiB bei den Ketten 13 bis 16: Eine Transaktion mit geteilter Autorisierung trägt bis zu drei Proofs, und 3 × 4 MiB + 1 MiB passen in den Block von 20 MiB. tokens.json enthält eine registration_fee von 1 RAND, ein mint_cap_per_day von 10000000000000, max_tokens 4096, burn_registration_fee und bound_note_value sowie zUSD, aufgeführt mit seinen sieben Deckungen. Es gibt kein Flag --bridge, und das Cut-Skript fügt die Abschnitte bridge, staking und consensus_domain anschließend weiterhin in die Datei ein (auf Chain 20: die Bridge mit Guardian-Set 1 und acht PQ-Guardian-Schlüsseln, der Pause-Schlüssel, rules_v2, rotation und fees; der Abschnitt staking mit der Faucet-Allowlist, admission_by_vote und einem Eintrittsbudget von 2.500 bps; consensus_domain: 1; sowie die Genesis-Notes von zUSD, erstellt mit alloc-note --asset 1 --envelope-bytes 1860). Maßgeblich ist der Genesis-Hash, den init für die fertige Datei ausgibt.
Jedes --alloc erzeugt eine Einzahlungs-Note mit frischer Commitment-Zufälligkeit, sodass zweimaliges Schneiden zwei verschiedene Hashes ergibt. Der Befehl schreibt die Öffnung der Note stets neben cm und amount, was eine Chain mit einem Abschnitt tokens voraussetzt:
"alloc": [
{ "cm": "<64 hex>",
"envelope": { "kem_ct": "<hex>", "to_receiver": "<hex>", "to_sender": "<hex>", "body": "<hex>" },
"amount": 1000000000000,
"opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>" } }
]
Eigentümer und Betrag einer Genesis-Note sind daher mit der Veröffentlichung der Datei bewusst öffentlich; privat bleibt nur, wann und wofür sie später ausgegeben wird. Schneiden Sie ein Genesis einmal und bewahren Sie die Datei auf.
alloc-note
--to <rand1…> (erforderlich), --amount <N> (erforderlich), --asset <INDEX> (Standard 0), --envelope-bytes <N> (Standard: das Legacy-Format). Gibt eine Alloc-Note als JSON aus, versiegelt an --to, wie genesis --alloc sie versiegelt. Ein Genesis, das envelope_bytes setzt, weist eine Note ab, die ohne das passende --envelope-bytes versiegelt wurde. --amount gilt in ganzen Einheiten des Assets: neun Dezimalstellen für RAND, acht für ein gebridgtes Token (10 bei Asset 1 sind 10 zUSD). Eine Note eines gelisteten Tokens setzt voraus, dass die Deckungen dieses Tokens locked-Beträge tragen, die sich genau zu seinen Notes summieren.
init
| Argument | Bedeutung |
|---|---|
--datadir <DATADIR> | zu erstellendes Datenverzeichnis |
--genesis <GENESIS> | Genesis-Datei; wird nach <datadir>/genesis.json kopiert |
Gibt den Genesis-Hash und dieselbe gas:-Zeile wie genesis aus.
run
| Argument | Standard | Bedeutung |
|---|---|---|
--datadir <DATADIR> | erforderlich | initialisiertes Datenverzeichnis |
--key <KEY> | erforderlich | Schlüsseldatei: Validator-Identität, p2p-Identität, Gebührenempfänger |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | libp2p-Listen-Multiaddr, wiederholbar |
--bootstrap <BOOTSTRAP> | keiner, wiederholbar | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, beim Start und danach alle 30 s gewählt, solange die Verbindung getrennt ist. Seit v0.6.8 ist seine Peer-ID reserviert |
--reserved-peer <PEER_ID> | keiner, wiederholbar | v0.6.8: ein Peer, der über das Limit für eingehende Verbindungen hinaus zugelassen wird und aus dem Anteil der Validatoren am Sync-Budget bedient wird. Bootstraps und jeder Validator, dessen signierte Peer-Bindung dieser Node gesehen hat, sind auch ohne dieses Flag reserviert; führen Sie hier die Validatoren der Flotte auf einer frisch geschnittenen Chain auf, deren Store noch keine Bindungen enthält |
--strict-gossip | aus | v0.6.8: die strikte Validierung von gossipsub, die nur Nachrichten mit gültiger Autorsignatur, Sequenznummer und Quelle akzeptiert. Strikte und permissive Nodes arbeiten zusammen, sodass sich die Umstellung Node für Node ausrollen lässt |
--rpc <RPC> | 127.0.0.1:8545 | der JSON-RPC-Listener des Betreibers: jede Methode, und er vertraut Loopback. Belassen Sie ihn auf Loopback und leiten Sie nie einen öffentlichen Endpunkt auf ihn weiter |
--public-rpc <ADDR> | aus | v0.6.8: ein zweiter, öffentlicher Listener mit festem Methodensatz (keine Viewing-Key-Methoden, kein rand_mint oder rand_getPeers), ohne Batches, ohne WebSocket und mit einem gemeinsamen Zähler für alle Aufrufer; worauf ein Reverse-Proxy oder eine SSH-Weiterleitung zeigen sollte (JSON-RPC) |
--rpc-viewing-token-file <PATH> | aus | v0.6.8: verlangt Authorization: Bearer <first line of the file> (32 oder mehr Zeichen) bei den Viewing-Key-Methoden von --rpc |
--validator | aus | mit diesem Schlüssel am Konsens teilnehmen |
--no-mdns | aus | LAN-Discovery deaktivieren |
--block-interval-ms <MS> | 1000 | Mindestabstand zwischen Vorschlägen |
--view-timeout-ms <MS> | 3000 | Basis-View-Timeout; verdoppelt sich bei jedem aufeinanderfolgenden Timeout bis auf das 8-Fache |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | aus | Archivmodus auf einer Aggregationschain |
--prune-history <WINDOW> | keiner (alles behalten) | nur so viel Blockhistorie behalten, <n>m, <n>h oder <n>d, mindestens 1h: ältere Blöcke verlieren ihren Block, QC, Transaktionen und Receipts; das Ledger bleibt. Auf Chain 20 betreiben 24 der 26 Validatoren 24h, und zwei Nodes sind Archive; ein Archiv und ein Mainnet-Node setzen es nie. Höhenabfragen unterhalb der Untergrenze beantworten -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | den Start verweigern, wenn im Dateisystem des Datenverzeichnisses weniger frei ist; rand_getHealth meldet disk_low unterhalb des Vierfachen. 0 deaktiviert die Schutzprüfung |
--rpc-viewing-open | aus | Aufrufern außerhalb von Loopback die Viewing-Key-Methoden erlauben; nur hinter etwas, das authentifiziert |
--gas-price <UNITS> | 100 | Einheiten (10⁻⁹ RAND) pro Gas, die der Pool dieses Nodes von einem Aufruf verlangt, über gas_max seines Proof-Headers. Zulassungsrichtlinie, keine Chain-Regel: Ein Block mit einem günstigeren Aufruf bleibt gültig. 0 mit --byte-price 0 wendet keine Richtlinie an. Auf einer Chain, deren Genesis einen Abschnitt gas hat, wie bei Chain 20, sind die eigenen Preise der Chain die Gültigkeitsregel |
--byte-price <UNITS> | 800 | Einheiten pro KiB oder angefangenem KiB des Proofs und der Eingabe-Envelope eines Aufrufs, ab Byte 0, nach derselben Richtlinie |
--prover <ADDR> | aus | den delegierten Prover (das prover_*-JSON-RPC) auf dieser Adresse hosten: ein eigener Listener, der sich von --rpc unterscheiden muss. Der Node verweigert den Start ohne <prover-home>/prover.key.json, erzeugt mit rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | prover.key.json und pairings.json des Provers |
--prover-accept-spend-key | eingestellt | seit v0.6.8 beim Start abgelehnt: run mit diesem Flag endet, bevor der Node-Schlüssel gelesen wird, und nennt das Flag. Kein Prover akzeptiert mehr ein Spend-Key-Witness; entfernen Sie es aus der Unit-Datei. Unter v0.6.7 akzeptierte er Spend-Key-Witnesses für Ketten mit Bundle-Guest v1 oder v2 |
--prover-max-parallel <N> | 1 | Proofs, die der gehostete Prover gleichzeitig ausführt; der Start wird verweigert, sofern nicht 5.74 GB × N + 1 GiB Speicher verfügbar sind |
--prover-max-queue <N> | 8 | Jobs in der Warteschlange zusätzlich zu den laufenden |
--prover-cuda | aus | auf dem CUDA-Backend beweisen (ein Build mit --features cuda); kein CPU-Fallback |
--prover-skip-memory-check | aus | die Prüfung auf freien Speicher überspringen |
--prover-fee <RAND>, --prover-fee-address <rand1…> | keine | die Gebühr, die jeder an den gehosteten Prover gesendete Job zahlen muss, in RAND mit bis zu neun Dezimalstellen: ein RAND-Output an die Adresse, innerhalb des bewiesenen Bundles. Jedes Flag setzt das andere voraus |
--prover-allow-origin <ORIGIN> | Browser-Erweiterungen und Loopback-Seiten | ein Browser-Origin, dessen Seiten die Antworten des Provers lesen dürfen, wiederholbar; ein- oder mehrmals angegeben, bilden die Werte die gesamte Liste. * erlaubt jede Website und gibt eine Warnung aus |
Umgebung: RUST_LOG (Standard info,libp2p=warn,libp2p_mdns=off). Strg+C oder SIGTERM fährt den Node sauber herunter.
Der öffentliche Endpunkt https://rpc.randprotocol.org ist ein Allowlist-Proxy vor einem Archiv-Node; seit 2026-10-01 ist seine Allowlist der Methodensatz des öffentlichen Listeners.
safety
Der Konsens-Sicherheitszustand eines gestoppten Validators (v0.6.8). Jeder Befehl öffnet das Datenverzeichnis selbst, daher läuft keiner neben einem aktiven Node.
rand-node safety status --datadir <dir>
rand-node safety clear-halt --datadir <dir> --i-have-compared-this-node-with-the-fleet
rand-node safety release-lock --datadir <dir> --i-give-up-this-validators-lock
status gibt den committeten Head, den View und den zuletzt gewählten View, den High QC, ob der Validator oberhalb seines Heads gesperrt ist, und einen etwaigen aufgezeichneten Safety-Halt aus. Ein Node, der sieht, dass eine zertifizierte Three-Chain versucht, einen Block zu committen, der nicht von seinem eigenen committeten Head abstammt, hält an und zeichnet das auf (Audit v6, CON-5); run endet dann mit diesem Eintrag, bis clear-halt ausgeführt wird. Vergleichen Sie den Head dieses Nodes mit dem zweier anderer Validatoren und synchronisieren Sie von einem Archiv neu, falls er abweicht, bevor Sie den Halt löschen. Seit v0.6.8 (CON-4) löst kein Quorum von „nicht gehalten“-Antworten eine Sperre mehr: Ein Validator, der auf einen Block gesperrt ist, den er nicht beschaffen kann, bleibt stumm, bis ein Vorschlag eintrifft, dessen Justify die Sperre übertrifft, oder der Block abgerufen wird. release-lock senkt die gespeicherte Sperre auf das Zertifikat des committeten Heads; verwenden Sie es jeweils bei einem Validator und nur, wenn der Block endgültig verloren ist. Ohne sein Bestätigungs-Flag gibt jeder schreibende Befehl aus, was er tun würde, und ändert nichts.
verify
| Argument | Standard | Bedeutung |
|---|---|---|
--datadir <DATADIR> | erforderlich | der Node darf nicht laufen |
--mode <MODE> | full | quick oder full |
--repair | aus | den beschädigten Abschnitt am Ende abschneiden; der Sicherheitszustand bleibt erhalten |
Exitcode 0, wenn konsistent, 2, wenn ohne --repair ein Problem gefunden wurde.
db
db drop-receipts-index --datadir <DATADIR>, bei gestopptem Node: den Index receipts_by_program löschen, bevor auf einen Build vor v0.3 zurückgegangen wird, der eine Datenbank mit diesem Index nicht öffnen kann. Ein späterer Start baut den Index aus den Receipts neu auf.
status
--rpc <URL> (Standard http://127.0.0.1:8545). Gibt rand_status unverändert aus.
register, unbond, withdraw
| Befehl | Argumente | Bedeutung |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | gibt eine hexadezimale Registration aus, die mit dem Schlüssel dieses Knotens signiert ist; der RPC wird für die Chain-ID gelesen, mit --v2 auch für den Genesis-Hash. --v2 ist auf einer Chain erforderlich, deren Genesis staking.registration_v2 setzt, wie bei Chain 20; eine v1-Registrierung wird dort abgelehnt, eine v2-Registrierung überall sonst |
unbond <amount RAND> | --key, --rpc, --no-wait | überführt Stake in das Unbonding; gebührenfrei; zwei Epochen später abhebbar |
withdraw <amount RAND> | --key, --rpc, --no-wait | zahlt freigegebenen Stake und Belohnungen abzüglich der Basisgebühr von 0.001 RAND in eine Note an der Auszahlungsadresse aus |
admit sign|submit
Zulassung per Abstimmung (v0.6.8). Auf einer Chain, deren Genesis staking.admission_by_vote setzt, wie bei Chain 20, wird ein neuer Validator-Schlüssel erst registriert, nachdem Validatoren, die strikt mehr als zwei Drittel des Stimmgewichts halten, ihn per Signatur zugelassen haben.
| Befehl | Argumente | Bedeutung |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | gibt die Stimme dieses Validators als eine Zeile aus, <voter key hex>:<signature hex>, über den Genesis-Hash und die Adresse des Kandidaten, sodass sie auf genau einer Chain gilt. Offline: liest keinen Knoten |
admit submit | --candidate …, --signature <line> (wiederholbar), --rpc, --no-wait | prüft jede Stimme gegen den Genesis-Hash des Knotens (eine Stimme für einen anderen Genesis oder Kandidaten oder ein doppelt abstimmender Wähler wird benannt), ordnet sie und reicht das gebührenfreie AdmitValidator ein |
Der Kandidat ist der Schlüssel, den die Registrierung tragen wird; rand-node address --key gibt ihn aus, und das von register ausgegebene Hex enthält ihn. Nachdem die Zulassung bestätigt ist, verläuft das Bonding wie bisher (rand bond … --registration) und verbraucht sie. rand_getAdmitted listet auf, was zugelassen ist und wartet.
bridge-gov
Die postquantensicheren Rotationen der Bridge (v0.6.8), für Guardians und den Inhaber des Pause-Schlüssels. Jeder Schritt liest die Chain-ID, ihre Bindungsdomäne und rand_getBridgeState.rotation_nonce von --rpc (Standard http://127.0.0.1:8545).
| Befehl | Wirkung |
|---|---|
rotate-pq message --new-key K… | gibt die hexadezimale Rotationsnachricht für die aktuelle Nonce aus, zum Abgleich bei jedem Unterzeichner |
rotate-pq sign --new-key K… --key F --index I [--possession] | gibt I:signature aus: die Quorum-Zeile eines aktuellen PQ-Guardians (I ist dessen Index in der aktuellen Menge) oder, mit --possession, die Zeile eines Inhabers des neuen Schlüssels (I ist dessen Index in der neuen Menge); weist eine Schlüsseldatei zurück, die nicht der Schlüssel an I ist |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | stellt RotatePqGuardians oder die V2-Aktion mit Besitznachweis-Zeilen zusammen und sendet sie; weist den Besitznachweis auf einer Chain zurück, die ihn nicht annimmt, und sein Fehlen auf einer Chain, die ihn verlangt, wie Chain 20 |
rotate-pause message|sign|submit --new-key K | dasselbe für den Pause-Schlüssel (Besitznachweis-Index 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | gibt 0:signature über die Abbruchnachricht aus, geprüft gegen den aktuellen Pause-Schlüssel der Chain |
cancel-rotation submit --kind pq|pause --signature @F | sendet CancelRotation und verwirft damit eine ausstehende Rotation, bevor ihre Verzögerung abläuft |
--new-key ist ein hexadezimaler öffentlicher Dilithium2-Schlüssel, @file mit einem solchen Schlüssel oder @key-file (dessen öffentlicher Schlüssel). Signaturzeilen haben die Form index:hex, getrennt durch Leerraum oder Zeilenumbrüche; #-Kommentare sind erlaubt.
vesting status|claim|revoke|bond|unbond
Die Seite des Inhabers und des Widerrufenden bei einer zeitgesperrten Genesis-Zuteilung, auf einer Chain, deren Genesis einen vesting-Abschnitt enthält. Der von Chain 20 hat keinen. Der Schlüssel ist eine rand-node keygen-Datei.
| Befehl | Argumente | Bedeutung |
|---|---|---|
vesting status <ENTRY> | --rpc | der Eintrag, wie rand_getVesting ihn liefert: seine Bedingungen, was freigegeben (vested) ist, was jetzt beanspruchbar ist |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> oder --all, --key, --rpc, --no-wait | zahlt, was freigeschaltet wurde, abzüglich der Basisgebühr von 0.001 RAND in eine Note an --to aus; signiert vom Schlüssel des Begünstigten |
vesting revoke prepare | --entry, --margin-secs (Standard 600), --out (Standard revoke.json), --rpc | v0.6.8, kein Schlüssel: schreibt den Widerruf, den jeder Widerrufende signiert, eine Note über den noch nicht freigegebenen Teil, --margin-secs nach dem Head, ausgezahlt an die Genesis-treasury des Eintrags (es gibt kein --to) |
vesting revoke sign | --proposal <file>, --key, --index? | ein Schlüssel eines Widerrufenden, offline: gibt <index>:<signature hex> aus |
vesting revoke submit | --proposal <file>, --signature <index:hex> (wiederholbar), --rpc, --no-wait | sendet den Widerruf mit mindestens dem threshold des Eintrags an Signaturen, innerhalb von 256 Blöcken nach prepare. Das vesting revoke --to von v0.6.7 mit einem einzelnen Schlüssel entfällt |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | unwiderrufliche Einträge: bindet gesperrte RAND als Stake dieses Validators; ein Validator, der noch nicht im Register steht, benötigt das, was register ausgegeben hat |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | holt gebundene RAND in die Sperre zurück; nach den Unbonding-Epochen wieder beanspruchbar |
aggregator register|unbond|withdraw, aggregate
Die Befehle der Aggregator-Rolle für eine Chain mit einem aggregation-Abschnitt: aggregator register --key --bond <RAND> --payout <rand1…> --rpc gibt eine signierte AggregatorRegistration aus; aggregator unbond und aggregator withdraw entsprechen dem Validator-Paar. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] ist der Daemon, der rand_getUnsealed abfragt, ein Aggregat beweist und einreicht. Wirkungslos auf Chain 20, deren Genesis keinen aggregation-Abschnitt hat.
rand (Wallet)
Globale Optionen, vor oder nach dem Unterbefehl:
| Option | Umgebungsvariable | Standard |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http oder https (der öffentliche Endpunkt ist https://rpc.randprotocol.org). Eine Antwort über 64 MiB wird abgelehnt |
--key <KEY> | RAND_KEY | wallet.key.json; der Note-Speicher liegt daneben unter <key>.notes.json. Der Speicher ist an die Chain gebunden, gegen die er gescannt wurde (das rand_getGenesisHash des Knotens): zeigt er auf eine andere Chain, etwa bei einer Wallet, die über den Übergang von Chain 19 zu 20 hinweg weiterverwendet wird, wird er geleert und mit einer Warnung ab Leaf 0 neu gescannt. Seit v0.6.8 weist jeder Befehl eine Schlüsseldatei zurück, die für Gruppe oder andere lesbar ist, und nennt die Abhilfe (chmod 600 <key>) |
--prover | aus. Beweist das Bundle auf dem mit dieser Wallet gekoppelten Prover (rand prover pair) statt auf diesem Rechner; der Beweis wird hier geprüft (sein Digest, seine Größe und eine lokale Verifikation), bevor er in eine Transaktion eingeht. Gilt für jeden Befehl, der ein Bundle beweist; bei call und program invoke geht nur das Zahlungs-Bundle an den Prover, der Aufrufbeweis bleibt lokal. Wird ohne Kopplung abgelehnt, ebenso zusammen mit --cuda, außer bei call. Auf einer Chain mit geteilter Autorisierung wie Chain 20 erhält der Prover den Viewing-Key nk und ein Salt, nie den Spend-Schlüssel: Er kann die gesamte Historie dieser Wallet lesen, aber nichts ausgeben. Der Auth-Beweis wird stets auf diesem Rechner erstellt. Auf einer Chain, deren Bundle-Guest v1 oder v2 ist, weist v0.6.8 --prover zurück, bevor der Prover etwas gefragt wird | |
--max-prover-fee <RAND> | 1. Das Meiste, was ein gekoppelter Prover pro Bundle verlangen darf. Ein höheres Angebot wird abgelehnt, bevor ein Bundle gebaut wird; 0 lehnt jede Gebühr ab. Die Gebühr ist ein weiterer RAND-Output im selben Bundle, angezeigt als prover fee: <amount> RAND to <fingerprint> |
Beträge sind dezimale RAND mit bis zu neun Nachkommastellen (1, 1.5, .25, 0.000000001). Ein Token-Betrag bei send, token mint und token burn sowie in einem randpay:-Link steht in den Anzeigeeinheiten des Tokens, mit den eigenen decimals seiner Registerzeile (10 zUSD sind 10 zUSD). bridge-burn, token create --fixed-supply und --initial nehmen einfache Ganzzahlen in der kleinsten Einheit des Tokens, und asset-balance gibt sie so aus. Wo immer ein Befehl einen Token entgegennimmt, akzeptiert er den Registerindex, die rpl1…-ID oder die 64-stellige Hex-ID; eine ID wird anhand der gesamten Registerliste des Knotens (rand_getTokens, jede Seite) in ihren Index aufgelöst, nie durch eine Abfrage pro Token, die dem Knoten verraten würde, welcher Token gleich bewegt wird. Ein numerischer Index erreicht den Knoten überhaupt nicht.
| Befehl | Argumente | Verhalten |
|---|---|---|
keygen | schreibt eine neue Spend-Key-Datei nach --key, Modus 0600; überschreibt nie | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | gibt die rand1…-Adresse dieser Wallet auf stdout aus, genau die Adresse und einen Zeilenumbruch, sodass $(rand address) in einem Skript funktioniert, und ihren fingerprint XXXX-XXXX-XXXX-XXXX auf stderr: 16 Crockford-Base32-Zeichen, eine Sichtprüfung der Adresse durch den Menschen, die nie über das Netzwerk gesendet wird. --uri gibt zusätzlich einen randpay:-Link aus (die Adresse plus optional Betrag, Asset und Memo). --qr stellt diesen Link als QR-Code im Terminal dar; --qr-png schreibt ihn als PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | benannte Adressen, an die diese Wallet per Name senden kann. TO ist eine rand1…-Adresse oder ein randpay:-Link, von dem nur die Adresse gespeichert wird. add gibt den Fingerprint aus und fragt add? [y/N], außer bei --yes; ein stdin, das kein Terminal ist, wird ohne --yes abgelehnt. Gespeichert unter <key>.contacts.json, Modus 0600. Ein Name hat 1 bis 64 Zeichen, beginnt nie mit rand1 oder randpay: und ist eindeutig |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | koppelt diese Wallet mit einem delegierten Prover. pair nimmt den randprover:-Link, den rand-prover pair ausgegeben hat, lehnt eine URL ab, die nicht https:// ist (einfaches http:// nur für localhost, 127.0.0.1 oder [::1]), nennt dann, was der Prover erhält (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) und fragt pair? [y/N]; --yes überspringt die Frage, und ein stdin, das kein Terminal ist, wird ohne --yes abgelehnt. Danach fragt es prover_info des Provers ab, lehnt ab, sofern dessen Key-Fingerprint nicht der im Link genannte ist, und schreibt <key>.prover.json, Modus 0600, wobei eine frühere Kopplung ersetzt wird. --trusted (v0.6.8) nimmt keinen Link: Es koppelt mit dem Prover-Pool der Validatoren, https://prover.randprotocol.org, anhand des Links, den der Build mitführt; dessen Betreiber können den Verlauf dieser Wallet lesen, aber nichts ausgeben. show gibt Name, URL, Fingerprint, own und den Schlüssel des Provers aus, nie das Token; forget löscht die Datei. v0.6.7 fragte vor dem Koppeln nicht nach |
viewing-key | gibt den Viewing Key nk dieser Wallet aus, 64 Hex-Zeichen: der Parameter, den rand_importViewingKey entgegennimmt. Er liest jede Note, die die Wallet gesendet oder empfangen hat, und gibt keine aus | |
balance | durchsucht den Baum, speichert den Store, gibt den ausgebbaren Wert und die Anzahl unausgegebener Notes aus | |
sync | --rescan | durchsucht den Baum, ohne ein Guthaben auszugeben. Ein erster Sync liest vor den Blättern jeden Block-Header (1.024 pro Aufruf). --rescan vergisst jede Note, jede Ausgegeben-Markierung und den Cursor (die Bindung an die Chain bleibt erhalten) und durchsucht erneut ab Blatt 0: der Weg zurück, wenn ein Node Notes dieser Wallet fälschlich als ausgegeben gemeldet hat. Am besten gegen einen Node ausführen, dem Sie vertrauen |
notes | --memo | jede Note, die diese Wallet geöffnet hat: Index, Asset, Betrag, Höhe, spent, pending und das Memo, auf 24 Zeichen gekürzt, oder mit --memo vollständig |
asset-balance [INDEX] | durchsucht den Baum und gibt dann aus, was diese Wallet in einem Asset hält, oder eine Zeile je gehaltenem Asset; Beträge in der kleinsten Einheit des jeweiligen Assets | |
history | --memo | jede Note, die diese Wallet für jemand anderen erstellt hat, mit derselben Memo-Spalte wie bei notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (Standard 0, RAND), --memo <M>, --fee <RAND> (Standard 0.001), --no-wait, --yes, --cuda | TO ist eine rand1…-Adresse, ein randpay:-Link oder der Name eines gespeicherten Kontakts, in dieser Reihenfolge geprüft. Betrag, Asset und Memo eines Links füllen auf, was die Befehlszeile offenlässt; AMOUNT ist nur dann optional, wenn der Link einen Betrag enthält, und ein auf beiden Wegen angegebener Wert, der nicht übereinstimmt, wird abgelehnt. Der Befehl gibt die Bestätigung aus, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> und, wenn es ein Memo gibt, eine eigene Zeile memo: "<text>", und fragt dann vor dem Beweisen nach, außer bei --yes. Ein Skript muss --yes übergeben: Ein stdin, das kein Terminal ist, wird mit stdin is not a terminal: pass --yes to send without confirmation abgelehnt. Danach wählt er höchstens zwei Notes des Assets und höchstens zwei RAND-Notes für die Gebühr aus, versiegelt das Memo nur in der Zahlungsausgabe, beweist lokal ein Bundle mit vier Slots und verborgenem Asset und, auf einer Chain mit geteilter Autorisierung, die Spend-Autorisierung, sendet es und wartet auf den Commit. Ein nicht leeres Memo wird vor dem Beweisen abgelehnt, wenn das Genesis der Chain kein envelope_bytes hat. AMOUNT steht in den Anzeigeeinheiten des Assets: dezimal RAND für RAND und bei einem Token mit den eigenen decimals seiner Registry-Zeile; nur 0 oder rand liest RAND, welchen Index der Node auch geantwortet hat. Eine Token-ID wird dekodiert, bevor der Node gefragt wird, und eine Listenzeile, die sie mit Index 0 oder mit widersprüchlichen ID-Feldern beantwortet, wird abgelehnt. Die Bestätigung zeigt einen Token-Betrag in Anzeigeeinheiten und in Basiseinheiten, 10.00000000 zUSD (1000000000 units), sodass ein Node, der über die decimals eines Tokens lügt, sichtbar wird, bevor etwas gesendet wird. Asset-Index und Gebühr werden vor dem Beweisen ausgegeben. On-Chain ist ein Token-Transfer ein gewöhnliches Bundle, von einer RAND-Zahlung nicht zu unterscheiden; seine Gebühr ist RAND, und eine Wallet ohne ausgebbares RAND wird vor dem Beweisen abgelehnt |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | Stake auf einen Validator: Das Bundle verbrennt den Betrag |
faucet [ADDRESS] | --amount <RAND> (Standard und Maximum 100) | nur testnet: einen Validator-Node bitten zu minten. Auf Chain 20 zahlt der Faucet nur an die 16 Wallets auf seiner Genesis-Allowlist |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (wiederholbar), --out <file> (Standard program.json) | assembliert einen eingebauten Guest; gibt die Programm-ID aus. rpl2_counter (v0.6.8) ist das RPL-2-Demonstrationsprogramm |
program deploy <FILE> | .json, eine rohe .bin oder der Image-Container, den rand-guest build schreibt; --public <FILE>, --input <u32> (wiederholbar) oder --check-call, --cuda | gibt Programm-ID, hc und Wortanzahl aus; lehnt ein Programm über dem Limit der Chain ab (über rand_estimateFee), bevor bewiesen wird; zahlt die Deploy-Untergrenze über ein Bundle und wartet. --public speichert einen öffentlichen Input mit dem Programm (durch Leerraum getrennte u32-Wörter oder eine ELF-.so), innerhalb von max_program_public_words der Chain; die Programm-ID bindet ihn dann. Mit --input oder --check-call führt die Wallet zuvor einen Trockenlauf eines Aufrufs über diese privaten Inputs im Emulator aus und lehnt ab, sofern er nicht in das Call-Tier-Limit (14) passt; für die Prüfung wird nichts bewiesen |
program show <ID> | Metadaten des deployten Programms | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (erforderlich), --input N (wiederholbar, privat), --inputs-file <FILE.json> (ein JSON-Array von u32, angehängt), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: deklariert einen Zustandsübergang des Programms und lässt die Chain ihn anwenden. Bevor etwas bewiesen wird, prüft er, dass die Chain einen Abschnitt program_state hat, dass das Programm existiert, dass der Kontext des Übergangs zur Segmentregel passt, dass jeder reads-Eintrag mit der Live-Zelle übereinstimmt (rand_getProgramCell; eine Abweichung nennt die veraltete Zelle und beendet mit Exit-Code 3), dass der Vault jeden pays-Eintrag plus das, was dieser Übergang einzahlt, bezahlen kann, und dass diese Wallet das Token und das RAND hält, die die Einzahlung und die Gebühr benötigen. Er zählt die Zellen, die die Schreibvorgänge erzeugen, führt das Programm über die realen Kontextwörter im Trockenlauf aus, beweist den an die Transaktion gebundenen Call, dann das Bundle (die Gebühr, plus deposit.rand, verbrannt über burn_r, und deposit.amount von deposit.asset über burn_a) und den Auth-Beweis. Die Standardgebühr ist die Untergrenze des Calls für das deklarierte Gas plus die Zellgebühr je erzeugter Zelle, mit denselben zwei Preisstufen Spielraum wie bei call. Gibt jede Auszahlung aus und, außer bei --no-wait, die acht outputs des Receipts. Auch ein veralteter Read bei der Aufnahme beendet mit Exit-Code 3, sodass ein aufrufendes Tool neu liest und es erneut versucht. Veröffentlicht kein Input-Transkript. Die Transition-Datei, jedes Feld optional: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}; Schlüssel und Werte sind 64-Hex-Word8s, Beträge Dezimalstrings in den eigenen Einheiten des Assets, to ist standardmäßig diese Wallet |
program state <ID> | --cell <64 hex> | v0.6.8: jede Zelle des Programms in Schlüsselreihenfolge (rand_getProgramCells, bis zum Ende seitenweise abgerufen) oder mit --cell eine einzelne Zelle, 64 Nullen, wenn sie fehlt. Wird auf einer Chain ohne Abschnitt program_state abgelehnt |
program vault <ID> | v0.6.8: der Vault des Programms (rand_getProgramVault), eine Zeile je gehaltenem Asset, Beträge in Einheiten. Wird auf einer Chain ohne den Abschnitt abgelehnt | |
call <PROGRAM-ID> | --input N (wiederholbar), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | führt den Call zuerst im Emulator aus und gibt gas: <exact> (declaring <limit>, tier <t>) aus: Das exakte Gas ist Witness und verlässt die Wallet nie, das deklarierte Limit ist das öffentliche GAS_LIMIT des Beweises. Auf einer Chain mit einem Gas-Abschnitt ist das Standardlimit das exakte Gas, aufgerundet auf ein Vielfaches von 2^(t−2); max deklariert die Obergrenze gas_max des Headers, was nichts preisgibt, was das Tier nicht ohnehin preisgibt; N wird abgelehnt, wenn es unter dem exakten Gas oder über der Obergrenze liegt. Ohne Abschnitt oder mit --cuda ist der Standard max. Dann wird der Call lokal über den öffentlichen Input des Programms bewiesen, sein Input-Transkript versiegelt, über ein Bundle bezahlt und das Receipt ausgegeben. Die Standardgebühr ist die Untergrenze für das deklarierte Limit, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB zu den Preisen, die rand_getLimits liefert, plus zwei Preisstufen Spielraum, wo sich Preise bewegen, ausgegeben als fee … RAND (incl. two price steps of headroom). Auf einer hardening_v6-Chain wird die Gebühr festgelegt, bevor der Beweis existiert; deshalb bepreist der Standard das Beweis-Limit der Chain anstelle des Beweises, was nur überzahlen kann; --fee zahlt einen exakten Betrag. --expect-public lehnt vor dem Beweisen ab, sofern der öffentliche Input des Programms nicht die Wörter dieser Datei sind |
open-call <TXHASH> | --call-key <hex>, --as-auditor | öffnet das Transkript eines Calls, prüft es gegen H_IN, führt das Programm erneut aus; beendet mit Fehlercode ungleich null bei einer Abweichung |
receipt <TX> | das Receipt eines committeten Calls | |
bridge-mint <ATTESTATION> | hex oder @path, --pq <JSON or @path> (erforderlich), --to <rand1…> (Standard: diese Wallet), --fee (Standard: die Untergrenze der Aktion), --no-wait, --cuda | hinterlegt eine von Guardians signierte Attestation als Note. --pq ist das Dilithium2-Mitsignatur-Quorum der Guardians, [{"index":0,"signature":"<4840 hex>"},…]. Vor jedem Beweisen: die Attestation dekodieren, das Quorum gegen pq_guardians des Nodes und die Chain-ID prüfen, den Empfänger und die Asset-ID prüfen, den aufgeführten Index lesen (rand_getAssets). Der Blinding-Faktor der Deposit-Note wird aus dem Digest der Attestation abgeleitet, r = blake3("rand-deposit-r-1" || mu), das einzige r, das die Chain zulässt. Das Gebühren-Bundle wird gegen die gesamte Transaktion bewiesen, das Quorum eingeschlossen. Gibt owner, time und r der Note aus |
bridge-rotate <ROTATION> | hex oder @path, --pq <JSON or @path> (erforderlich), --fee (Standard: die Untergrenze der Aktion), --no-wait, --cuda | reicht eine Rotation des Guardian-Sets mit dem Mitsignatur-Quorum des aktuellen PQ-Sets ein, als BridgeAttest, das nichts hinterlegt. Lehnt vor dem Beweisen alles ab, was keine Rotation ist, die das Set von Rand um genau einen Schritt weiterführt. Gibt anschließend den guardian_set_index aus |
bridge-pause | --sig <HEX or @path> (erforderlich), --no-wait | pausiert das Minten der Bridge: ein bundle- und gebührenfreies PauseMints, sodass weder eine Key-Datei noch RAND nötig sind. Die Datei ist die Ausgabe von rand-bridge-gov pause, die 2.420-Byte-Signatur des Pause-Keys als Hex, erstellt für den aktuellen pause_nonce der Bridge; vor dem Senden gegen pause_key des Nodes und die Chain-ID geprüft. Burns und Rotationen bleiben während der Pause offen |
bridge-unpause | --pq <JSON or @path> (erforderlich), --no-wait | hebt eine Pause mit einem PQ-Guardian-Quorum auf (die Datei von rand-bridge-gov pq-unpause), erstellt für den aktuellen pause_nonce. Bundle- und gebührenfrei; der Pause-Key allein kann nie aufheben |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (Standard 0.01), --no-wait, --cuda, --yes | verbrennt ein Bridge-Asset ausgehend: prüft, dass der Coin TOKEN auf TO_CHAIN das ASSET deckt und mindestens AMOUNT gesperrt hat und dass AMOUNT und die Relayer-Gebühr ganze Release-Einheiten sind; beweist dann ein Bundle, das das Asset in den Slots 0–1 ausgibt, genau AMOUNT davon verbrennt (burn_a, burn_asset) und die RAND-Gebühr aus den Slots 2–3 zahlt. --relayer-fee ist ein Teil von AMOUNT, keine zusätzliche Belastung. Auf einer Chain mit Bridge-Gebühr (rand_getBridgeState.fees), wie Chain 20 sie hat, gibt v0.6.8 zuerst die Gebühr aus, die die Chain einbehält (im Asset), und den Betrag, der freigegeben wird, und bittet um Bestätigung; --yes überspringt die Frage, und ein stdin, das kein Terminal ist, wird ohne --yes abgelehnt. Die Prüfungen des gesperrten Betrags und der Relayer-Gebühr beziehen sich dann auf den freigegebenen Betrag |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (zufällig, wenn nicht angegeben), dann entweder --fixed-supply <N> --to <rand1…>, --authority-key-out <FILE> [--initial <N> --to <rand1…>] oder (v0.6.8) --program <PROGRAM-ID>, ein Token, dessen Mint-Autorität dieses Programm ist, das nur dessen Invokes minten oder verbrennen, das bei Supply null beginnt und den Abschnitt program_state der Chain benötigt, --fee (Standard: die Bundle-Basis plus die registration_fee der Registry; wird abgelehnt, wenn der Node eine Registrierungsgebühr über 10 RAND meldet, übergeben Sie also --fee, um eine höhere bewusst zu zahlen), --no-wait, --cuda | registriert ein Token am nächsten Index der Registry: mit fester Supply (mintet einmal, Autorität none) oder Key-autorisiert (eine frische Dilithium2-Key-Datei, mit 0600 geschrieben, überschreibt nie). Der Authority-Key liegt unter <FILE>.pending, bis die Chain die Registrierung akzeptiert. Nimmt eine andere Registrierung den Index zuerst, gibt er another token took index N first — re-run to register at N+1 aus; bei Erfolg gibt er Index und ID aus, hex und rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (in den Anzeigeeinheiten des Tokens), --authority-key <FILE>, --fee (Standard 0.001), --no-wait, --cuda | mintet mehr von einem Key-autorisierten Token; wird vor jedem Beweis abgelehnt, wenn das Token nicht Key-autorisiert ist oder der Key nicht dessen Autorität ist |
token set-authority | --asset, --authority-key <FILE>, dann entweder --new-key <FILE> oder --renounce, --fee (Standard 0.001), --no-wait, --cuda | übergibt ein Key-autorisiertes Token an einen anderen Key oder verzichtet endgültig aufs Minten |
token burn <ASSET> <AMOUNT> | --fee (Standard 0.001), --no-wait, --cuda | vernichtet AMOUNT, in den Anzeigeeinheiten des Tokens, eines RPL-Tokens, das diese Wallet hält; seine öffentliche Supply sinkt um genau diesen Betrag. Ein Bridge-Token wird vor dem Beweisen abgelehnt: Es verlässt die Chain über bridge-burn |
token info <INDEX|rpl1…|hex> | die vollständige rand_getTokens-Zeile eines Tokens: Name, Symbol, Decimals, Autorität, mint_nonce, Gesamt-Supply, registered_at, ID (hex und id_text) und, falls gebridged, jede Deckung (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (Standard 0), --limit <N> (Standard 1000) | eine Seite von rand_getTokens: enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (die Quell-Decimals der ersten Deckung), --pq <JSON or @path> (erforderlich), --fee (Standard: die Bundle-Basis plus die registration_fee des Nodes, mit derselben 10-RAND-Ablehnung wie bei token create), --no-wait, --cuda | registriert nach dem Genesis ein gebridgtes Token mit seiner ersten Deckung, autorisiert durch ein PQ-Guardian-Quorum (die Datei von rand-bridge-gov pq-register), erstellt für den list_nonce des Nodes. Zuerst auf Rand listen, danach setToken auf dem Endpoint |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (erforderlich), --fee (Standard: die Bundle-Basis), --no-wait, --cuda | fügt einem gebridgten Token eine Deckung hinzu, autorisiert durch ein PQ-Guardian-Quorum (die Datei von rand-bridge-gov pq-list) beim list_nonce des Nodes |
bridge | der öffentliche Zustand der Bridge: Guardians, Emitter, die Asset-Registry, die Burn-Sequenz | |
bridge-message <SEQUENCE> | eine ausgehende Burn-Nachricht, wörtlich | |
fee bundle / fee deploy <words> / fee call <tier> | --public-words M (deploy); --gas N, --bytes B, --keccak-log-height K, --sha256-log-height S (call) | die Mindestgebühr laut Gebührenplan des Nodes. Auf einer Chain mit Gas-Abschnitt bepreist fee call <tier> --gas N das deklarierte Limit, das rand call ausgibt, zu den Preisen der Spitze und ohne Spielraum: die Untergrenze selbst. Ohne --gas bepreist es die Obergrenze gas_max(tier, K, S), das Meiste, was ein solcher Call kosten kann. --bytes sind die Bytes aus Beweis plus Input-Envelope des Calls |
tx <HASH> | committete Transaktion mit Höhe und Index | |
tx-key <HASH> | eine Zeile je Ausgabe dieser Transaktion, die diese Wallet gesendet, empfangen oder als Wechselgeld behalten hat: output (bundle:0 … bundle:3, die vier Slots des einen Bundles, oder mint:0), Rolle, Betrag (in RAND oder N (asset I) bei einem Token), das mitgeführte Memo (-, wenn keines) und der Schlüssel pro Transaktion, unter dem sie versiegelt wurde. Geben Sie den Key einer sent-Zeile an einen Zahlungsempfänger oder Auditor weiter, und rand_checkTransaction <HASH> <KEY> legt genau diese eine Ausgabe offen, das Memo eingeschlossen. Ein Dummy-Slot öffnet sich für niemanden und hat keine Zeile | |
block <ID> | Block nach Höhe oder Hash | |
head | { height, hash, view } | |
status | rand_status | |
peers | verbundene Peers | |
validators | das Validator-Register |
--cuda setzt einen Build mit --features cuda voraus und hat keinen Fallback; bisher wurde kein PTX gebaut. Es kann keinen Call-Input-Envelope versiegeln: rand call --cuda braucht --no-envelope. Es deklariert nur die Gas-Obergrenze und lehnt --gas-limit N ab.
Jedes Memo und jeder Kontaktname, den die CLI ausgibt (die Bestätigung von send, notes, history, tx-key), durchläuft zuerst eine Anzeigeregel: Steuerzeichen, Unicode-Formatzeichen (Bidi-Steuerzeichen, Zeichen der Breite null, das weiche Trennzeichen) und U+2028/U+2029 werden als U+FFFD angezeigt, und eine Folge von Leerzeichen-Trennzeichen als ein einzelnes Leerzeichen.
Ein erster abgeschirmter Transfer
rand keygen # wallet.key.json
rand address # rand1… on stdout, its fingerprint XXXX-XXXX-XXXX-XXXX on stderr
rand faucet # testnet, allowlisted wallets only: 100 RAND into a note only you can open
rand balance # balance: 100 RAND
rand send rand1q9f… 1.5 # asks to confirm, then a minute and a half to two minutes of local proving, then the commit
rand notes # the spent note, and the change note
Eine Adresse teilen, und ein Memo
rand address --uri --amount 1.5 --memo "invoice #42" --qr # a randpay: link, as a terminal QR
rand contacts add alice rand1q9f… # shows the fingerprint, asks add? [y/N]
rand send alice 1.5 --memo "coffee" # the memo is sealed into the payment output
rand history --memo # alice's row shows the whole memo
rand tx-key <hash> # hand the sent row's key to alice or an auditor
Das Memo liegt im selben versiegelten Body wie die Note; wer das eine öffnen kann, kann auch das andere öffnen: der Zahlungsempfänger über notes, und jeder, der den Per-Transaction-Schlüssel dieses Outputs besitzt, über rand_checkTransaction <hash> <key>. Chain 18 ist die erste Chain, deren Genesis envelope_bytes setzt; auf den Chains 14 bis 17 wurde --memo abgelehnt, bevor irgendetwas bewiesen wurde.
Ein vertraulicher Call, den Sie später wieder öffnen können
rand program build --guest balance_check --arg 1000 --out bc.json
rand program deploy bc.json # prints the program id
rand call <id> --input 100 --input 200 --input 300 --input 400
rand open-call <txhash> # inputs: [100, 200, 300, 400] — verdict: faithful (exit 0)
Ein zustandsbehaftetes Programm: der RPL-2-Zähler
Auf einer Chain mit einem Abschnitt program_state, wie es Chain 20 ist. Der Zähler akzeptiert genau die Übergänge, die eine Zelle lesen und sie mit ihrem ersten Wort plus eins zurückschreiben; alles Übrige am Übergang (was das Bundle einzahlt, was der Vault auszahlt, was das Programm mintet) läuft ungeprüft mit. Damit ist er eine Demonstration und kein Programm, hinter das man Werte legen sollte.
rand program build --guest rpl2_counter --out counter.json
rand program deploy counter.json # prints the program id
rand token create --name "Counter Share" --symbol CTR --decimals 0 --program <id> # say index 2
rand program state <id> --cell 0100000000000000000000000000000000000000000000000000000000000000 # 64 zeros: absent
cat > step.json <<'JSON'
{ "reads": [{ "key": "0100…00", "value": "0000…00" }],
"writes": [{ "key": "0100…00", "value": "0100…00" }],
"deposit": { "rand": "500000000", "kind": "none" },
"pays": [{ "asset": 0, "amount": "200000000", "to": "rand1…" }],
"mints": [{ "asset": 2, "amount": "1" }] }
JSON
rand program invoke <id> --transition step.json # exit 3 if the cell moved since; re-read and retry
rand program vault <id> # asset 0: 300000000 units (0.5 RAND in, 0.2 out)
Die … in der Datei stehen für die vollständigen 64 Hex-Zeichen, die das Wallet verlangt.
Was ein Deploy und ein Call ausgeben
Auf einer Chain mit getrennter Autorisierung besteht jedes Bundle aus zwei Proofs, die auf diesem Rechner erzeugt werden: die Tier-10-Spend-Autorisierung und das Tier-14-Bundle. Ein program deploy mit rand v0.6.7 auf Chain 18, 2026-09-30:
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1368908 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 116.7s: tier 14, 1500710 bytes
submitted deploy <hash>
0 RAND out, 59.8545 RAND change, fee 0.1007 RAND, anchored at height 97831, proved in 116.7s (bundle) + 6.8s (auth)
Ein call gibt sein Gas und seine Gebühr vor dem Call-Proof aus und beweist dann das zahlende Bundle auf dieselbe Weise:
proving the call locally (90 inputs stay private, over the program's 11-word public input)…
gas: 5636 (declaring 6144, tier 12)
fee 0.006191437 RAND (incl. two price steps of headroom)
proved in 29.2s: tier 12, 3346865 bytes, outputs [...]
Hier ist 6,144 gleich 5,636, aufgerundet auf ein Vielfaches von 2^10, und rand fee call 12 --gas 6144 --bytes <B> bewertet dieses Limit zu den Preisen der Chain-Spitze ohne Spielraum.
rand-prover
Der delegierte Prover als eigenes Binary: Er erzeugt den Tier-14-Bundle-Proof eines Wallets auf einem anderen Rechner. rand-node run --prover betreibt denselben Dienst innerhalb eines Nodes. Jeder Unterbefehl akzeptiert --home <DIR> (env RAND_PROVER_HOME, Standard ~/.rand-prover), das Verzeichnis, das prover.key.json und pairings.json enthält.
| command | arguments | behaviour |
|---|---|---|
keygen | write prover.key.json, mode 0600, and print the key’s fingerprint; refuses to overwrite | |
pair | --name <LABEL> (required), --url <URL> (default http://127.0.0.1:8600), --own, --qr | mint a token, store only its hash under the label and print the randprover: pairing link that rand prover pair takes. The token is shown once, inside the link. --url is where the wallet reaches this prover; --own adds own=1; --qr also prints the link as a terminal QR code |
unpair | --name <LABEL> | remove a pairing; a running prover reads the file at start, so it takes effect on restart |
pairings | one line per pairing: label, own or -, creation date | |
run | --listen <ADDR> (default 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (repeatable), --fee <RAND> with --fee-address <rand1…>, --accept-spend-key | serve the prover_* JSON-RPC until Ctrl-C or SIGTERM. The start is refused unless 5.74 GB × --max-parallel + 1 GiB of memory is available. --per-token is the number of jobs one pairing may have queued or proving at once. --accept-spend-key is retired in v0.6.8: run refuses to start with it, and a prover accepts only viewing-key witnesses. On v0.6.7 it admitted spend-key witnesses, which only a chain on bundle guest v1 or v2 sends |
Ein Prover auf Chain 20 erhält den Viewing Key nk des Wallets und ein frisches Salt. Er kann nichts ausgeben, aber er kann alles lesen, was dieses Wallet je empfangen oder gesendet hat: Koppeln Sie nur mit einem Prover, dem Sie Ihren Verlauf zeigen würden. Das Wallet prüft jeden Proof, den es zurückerhält.
Formate der Schlüsseldateien
Node-Schlüssel:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Wallet-Schlüssel, Version 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen schreibt ihn mit Modus 0600, und seit v0.6.8 verweigert jeder rand-Befehl eine Wallet-Schlüsseldatei, die Gruppe oder andere lesen können: Ein von Hand kopierter oder wiederhergestellter Schlüssel muss auf 0600 zurückgesetzt werden (chmod 600 <key>). Geht ein Wallet-Schlüssel verloren, gehen alle Notes verloren, die er öffnen konnte; in diesem Release gibt es keine Wiederherstellungsphrase.