Dalla cargo build --release escono tre binari: rand-node (il nodo e i comandi dell’operatore), rand (il wallet schermato) e rand-prover (il prover delegato). Ogni comando accetta -h/--help. Questa pagina descrive la release v0.6.8 (c9c9bd3c), la build su cui gira la chain 20; dove v0.6.7 si comportava in modo diverso, lo indica. Un wallet rand precedente a v0.6.8 non può inviare sulla chain 20, il cui genesis lega ogni prova e ogni messaggio firmato al proprio hash. I primi due custodiscono tipi diversi di chiave: una chiave del nodo è una coppia di chiavi Dilithium2 che firma i blocchi; una chiave del wallet è una chiave di spesa schermata che non firma nulla on-chain.
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 e bridge-gov sono nuovi in v0.6.8. Non esistono né balance né transfer: un trasferimento richiede una chiave di spesa schermata, che solo il wallet possiede.
Un flag globale, --allow-test-fri-profile (o RAND_ALLOW_TEST_FRI_PROFILE=1), permette a init, run e verify di accettare un genesis il cui fri_profile è test. Quel profilo offre circa 17 bit di soundness e chiunque scriva un file genesis può indicarlo, per cui da v0.6.8 un nodo rifiuta un tale genesis senza il flag. Le suite di test lo impostano; nient’altro dovrebbe farlo.
keygen, address
| comando | argomento | predefinito |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | obbligatorio |
keygen scrive { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } con modalità 0600. Il file è l’unica copia del seed. Da v0.6.8 keygen rifiuta un --out già esistente (… already exists or cannot be created; refusing to overwrite a key file) e lo lascia intatto; non esiste --force, quindi per sostituire un vecchio file occorre prima spostarlo altrove. v0.6.7 e le versioni precedenti lo sovrascrivevano senza chiedere. address stampa address, public_key (1.312 byte in esadecimale) e peer_id.
genesis
| argomento | predefinito | significato |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | id della chain; le transazioni e i topic di gossip sono legati a esso |
--validator <KEY,STAKE,PAYOUT> | obbligatorio, ripetibile | una voce del registro: il percorso di un file di chiave o una chiave pubblica in esadecimale, lo stake in RAND (almeno 1.000), l’indirizzo di pagamento rand1… |
--epoch-blocks <N> | 1000 | blocchi per epoca |
--alloc <ALLOCS> | nessuno, ripetibile | una nota di deposito: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | percorso di output |
--faucet | disattivato | solo testnet: abilita Mint. Accanto a una sezione bridge richiede --testnet |
--testnet | disattivato | v0.6.8: scrive "testnet": true, il marcatore che permette a un faucet di coesistere con una sezione bridge. Fa parte dell’hash del genesis quando è indicato |
--no-confidential | disattivato | disabilita Deploy e Call |
--fri-profile <production|test> | production | test non è sicuro ed è destinato alla suite di test; init, run e verify rifiutano un tale file senza --allow-test-fri-profile |
--max-program-words <N> | nessuno (4096) | il programma più grande che un deploy può trasportare, 1..=65535. Scritto solo se indicato; fa parte dell’hash del genesis ogni volta che è presente, quindi --max-program-words 4096 è una chain diversa dall’ometterlo. Ogni nodo ha bisogno di un binario v0.4 prima di init su un file di questo tipo |
--max-proof-bytes <N> | nessuno (2.097.152) | la prova più grande che una transazione può trasportare, 1048576..=33554432. Ogni limite sulle prove ne segue il valore |
--max-block-bytes <N> | nessuno (4.194.304) | il blocco più grande, e quindi la transazione più grande, 4194304..=67108864, e almeno 2 × max_proof_bytes + 1 MiB, oppure 3 × max_proof_bytes + 1 MiB con --auth-guest, dove una chiamata trasporta tre prove (bundle, auth, call) |
--max-call-envelope-bytes <N> | nessuno (18.432) | il più grande envelope di input di una chiamata, 18432..=1048576 |
--max-program-public-words <N> | nessuno (0) | il più grande input pubblico che un deploy può fissare, 0..=65535; 0 non ne ammette alcuno |
--tokens <TOKENS.JSON> | nessuno | la sezione RPL tokens, come file JSON {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Se omesso, il file non ha tale sezione e il suo hash resta quello di prima. Una sezione bridge ne richiede una con un mint_cap_per_day diverso da zero (per backing, per giorno UTC, nelle unità a otto decimali del token); un token elencato richiede una sezione bridge |
--envelope-bytes <N> | nessuno (l’envelope legacy da 1.348 byte) | la dimensione esatta di ogni envelope di nota: un output di bundle, un mint del faucet, un withdraw, un deposito bridge, un’allocazione del genesis. È accettato solo 1860, la dimensione che permette a ogni envelope di trasportare un memo cifrato. Fa parte dell’hash del genesis quando è indicato, ed è impostato prima che le note --alloc di questo stesso comando vengano sigillate |
--vesting <VESTING.JSON> | nessuno | la sezione vesting: le allocazioni soggette a timelock, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Da v0.6.8 una voce revocabile elenca i revokers (da 1 a 5 chiavi), una threshold e il treasury a cui paga una revoca, e un file che ne omette uno viene rifiutato |
--staking <STAKING.JSON> | nessuno | v0.6.8: la sezione staking come file JSON (faucet_budget_per_epoch, bond_activation_epochs, max_weight_bps, max_stake_entry_per_epoch o max_stake_entry_bps_per_epoch, registration_v2, faucet_recipients, faucet_minters, admission_by_vote, slashing), validata dalla build |
--consensus-domain <0|1> | nessuno (0) | v0.6.8: 1 lega ogni voto, new-view e proposta a questo genesis |
--bundle-guest <v1|v2|v3> | v1 | il guest del bundle fissato come hc_bundle: v1 (il guest con asset nascosti che le chain 14 e 15 eseguivano), v2 (il guest senza branch della chain 16) o v3 (autorizzazione separata: il guest prende nk e un salt al posto della chiave di spesa). v3 richiede --auth-guest |
--auth-guest | disattivato | fissa l’auth guest di questa build come hc_auth: ogni bundle trasporta allora una prova di autorizzazione sulla chiave di spesa, legata alla sua transazione, il cui output è uguale all’auth_commit del bundle. Obbligatorio con --bundle-guest v3 e rifiutato con v1 o v2, prima che venga scritto qualsiasi file. Se assente, il file non ha il campo hc_auth |
--hardening-v6 | disattivato | trasforma le regole v0.6 in regole di validità (hardening_v6): la finestra del pc, i deploy non richiamabili, le forme canoniche delle prove e le parole di proof-of-work, il binding della chiamata e la soglia minima della tabella dei programmi. Se assente, un nodo continua a rifiutarle al proprio pool, come policy |
--gas-price <UNITS> | nessuno (nessuna sezione gas) | unità (10⁻⁹ RAND) per gas che la chain stessa addebita a una chiamata. Questo flag è ciò che scrive la sezione gas (metering: "circuit"); i tre flag seguenti sono rifiutati senza di esso. Fa parte dell’hash del genesis |
--byte-price <UNITS> | 800, solo con --gas-price | unità per KiB, o frazione di esso, di prova della chiamata più envelope di input, dal byte 0 |
--bundle-gas-limit <N> | 20479, solo con --gas-price | l’esatto GAS_LIMIT che ogni prova di bundle deve dichiarare; una prova di bundle che dichiari un altro valore viene rifiutata. Il genesis accetta solo 20479, gas_max(14, 0, 0) per il guest del bundle di tier 14 |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | nessuno (prezzi fissi) | attiva il controllore del prezzo per blocco, con soglia minima pari ai gas_price e byte_price iniziali della sezione stessa. Rifiutato insieme a --aggregation |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | nessuno (nessun tetto) | v0.6.8: i tetti oltre i quali il controllore non porta mai un prezzo, ciascuno almeno pari al prezzo iniziale. Rifiutati senza --gas-dynamic |
--gas-byte-load paying | nessuno (i byte di ogni transazione) | v0.6.8: solo la prova di una chiamata e il suo envelope di input muovono byte_price, quindi un blocco di trasferimenti non ne muove nessuno. Rifiutato senza --gas-dynamic; paying è l’unico valore |
--binding-domain <0|1> | nessuno (nessun campo) | v0.6.8: 1 lega l’hash del genesis a ogni binding di transazione e a ogni messaggio di azione firmato (un mint del faucet, unbond, withdraw, i messaggi dei token RPL, le azioni dell’aggregator, i messaggi di governance del bridge), così che una prova o una firma per questa chain non sia verificabile su nessun’altra. Se omesso, il comando avverte: un wallet v0.6.8 produce la forma legata al genesis su ogni chain id al di fuori da 14 a 19, quindi ogni chain dalla 20 in poi viene creata con 1 |
--proof-window-blocks <N> | nessuno (256) | v0.6.8: un’unica finestra, da 256 a 4.096 blocchi, per l’anzianità massima dell’ancora di un bundle e del suo time. Esposta come rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | nessuno (nessuna sezione program_state) | v0.6.8, RPL-2: attiva le celle di programma, i vault di programma e l’azione Invoke, con questa commissione per cella in unità RAND (al massimo 1.000 RAND) aggiunta alla soglia minima della commissione di un invoke per ogni cella che crea. Richiede --tokens, --gas-price, --hardening-v6 e --auth-guest, ciascuno rifiutato per nome prima che venga scritto qualsiasi file |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | nessuno | la sezione aggregation; la build v0.6.8 si rifiuta di avviarsi su un genesis che ne contenga una |
Stampa una riga alloc per ogni --alloc, poi l’hash del genesis, i conteggi di validatori e note, la lunghezza dell’epoca, i cinque limiti, hc_bundle e hc_auth (none senza --auth-guest), quindi la riga del gas: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, oppure gas: none senza --gas-price, e con --program-state-cell-fee una riga program_state: cell fee N RAND. init stampa la stessa riga del gas. I cinque flag dei limiti si comportano allo stesso modo: se omessi, il file non ha il campo corrispondente e la chain usa il valore predefinito; se indicati, il campo fa parte dell’hash del genesis anche al suo valore predefinito. La chain 20 è stata creata con questi flag (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
Le catene 18 e 19 sono state create con gli stessi flag fino a --envelope-bytes 1860 e senza nessuno di quelli della v0.6.8. Il limite di dimensione delle prove è 4 MiB, in calo rispetto agli 8 MiB delle catene da 13 a 16: una transazione con autorizzazione suddivisa porta fino a tre prove, e 3 × 4 MiB + 1 MiB entrano nel blocco da 20 MiB. tokens.json contiene una registration_fee di 1 RAND, una mint_cap_per_day di 10000000000000, max_tokens 4096, burn_registration_fee e bound_note_value, e zUSD elencato con i suoi sette backing. Non esiste un flag --bridge, e lo script di creazione inserisce ancora in seguito nel file le sezioni bridge, staking e consensus_domain (sulla catena 20: il bridge al guardian set 1 con otto chiavi PQ dei guardiani, la chiave di pausa, rules_v2, rotation e fees; la sezione staking con la allowlist del faucet, admission_by_vote e un budget di ingresso di 2.500 bps; consensus_domain: 1; e le note di genesi di zUSD, create con alloc-note --asset 1 --envelope-bytes 1860). L’hash di genesi che conta è quello che init stampa sul file finito.
Ogni --alloc costruisce una nota di deposito con una nuova casualità dell’impegno, quindi creare la genesi due volte produce due hash diversi. Il comando scrive sempre l’apertura della nota accanto a cm e amount, cosa che una catena con una sezione tokens richiede:
"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>" } }
]
Il proprietario e l’importo di una nota di genesi sono quindi pubblici per progetto una volta pubblicato il file; solo il momento in cui viene spesa in seguito, e verso che cosa, resta privato. Crea la genesi una sola volta e conserva il file.
alloc-note
--to <rand1…> (obbligatorio), --amount <N> (obbligatorio), --asset <INDEX> (predefinito 0), --envelope-bytes <N> (predefinito: il formato legacy). Stampa come JSON una nota di allocazione, sigillata verso --to come la sigilla genesis --alloc. Una genesi che imposta envelope_bytes rifiuta una nota sigillata senza il corrispondente --envelope-bytes. --amount è in unità intere dell’asset: nove decimali per RAND, otto per un token bridged (10 con asset 1 sono 10 zUSD). Una nota di un token elencato richiede che i backing di quel token portino importi locked la cui somma sia esattamente pari alle sue note.
init
| argomento | significato |
|---|---|
--datadir <DATADIR> | directory dei dati da creare |
--genesis <GENESIS> | file di genesi; copiato in <datadir>/genesis.json |
Stampa l’hash di genesi e la stessa riga gas: di genesis.
run
| argomento | predefinito | significato |
|---|---|---|
--datadir <DATADIR> | obbligatorio | directory dei dati inizializzata |
--key <KEY> | obbligatorio | file della chiave: identità del validatore, identità p2p, destinatario delle commissioni |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | multiaddr di ascolto libp2p, ripetibile |
--bootstrap <BOOTSTRAP> | nessuno, ripetibile | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, contattato all’avvio e ogni 30 s finché è disconnesso. Dalla v0.6.8 il suo peer id è riservato |
--reserved-peer <PEER_ID> | nessuno, ripetibile | v0.6.8: un peer ammesso oltre il limite di connessioni in ingresso e servito dalla quota di budget di sincronizzazione dei validatori. I bootstrap e ogni validatore di cui questo nodo ha visto il peer binding firmato sono riservati senza di esso; elenca qui i validatori della flotta su una catena appena creata, il cui store non contiene ancora binding |
--strict-gossip | off | v0.6.8: la validazione rigorosa di gossipsub, che accetta solo messaggi con una firma dell’autore, un numero di sequenza e una sorgente validi. I nodi rigorosi e permissivi interoperano, quindi si attiva nodo per nodo |
--rpc <RPC> | 127.0.0.1:8545 | il listener JSON-RPC dell’operatore: ogni metodo, e si fida del loopback. Tienilo sul loopback e non inoltrargli mai un endpoint pubblico |
--public-rpc <ADDR> | off | v0.6.8: un secondo listener, pubblico, con un insieme fisso di metodi (nessun metodo con viewing key, né rand_mint o rand_getPeers), senza batch, senza WebSocket e con un unico misuratore per tutti i chiamanti; è ciò a cui devono puntare un reverse proxy o un inoltro SSH (JSON-RPC) |
--rpc-viewing-token-file <PATH> | off | v0.6.8: richiede Authorization: Bearer <prima riga del file> (32 o più caratteri) sui metodi con viewing key di --rpc |
--validator | off | partecipa al consenso con questa chiave |
--no-mdns | off | disabilita la scoperta in LAN |
--block-interval-ms <MS> | 1000 | intervallo minimo tra le proposte |
--view-timeout-ms <MS> | 3000 | timeout di base della view; raddoppia a ogni timeout consecutivo fino a 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | off | modalità archivio su una catena con aggregazione |
--prune-history <WINDOW> | nessuno (conserva tutto) | conserva solo questa quantità di storia dei blocchi, <n>m, <n>h o <n>d, almeno 1h: i blocchi più vecchi perdono il blocco, il QC, le transazioni e le ricevute; il ledger resta. Sulla catena 20, 24 dei 26 validatori usano 24h e due nodi sono archivi; un archivio e un nodo mainnet non lo impostano mai. Le ricerche per altezza sotto la soglia rispondono -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | rifiuta di avviarsi con meno spazio libero sul filesystem della directory dei dati; rand_getHealth riporta disk_low sotto quattro volte tale valore. 0 disabilita la protezione |
--rpc-viewing-open | off | consente ai chiamanti non loopback di usare i metodi con viewing key; solo dietro qualcosa che autentichi |
--gas-price <UNITS> | 100 | unità (10⁻⁹ RAND) per gas che il pool di questo nodo richiede a una chiamata, oltre gas_max della sua intestazione della prova. Politica di ammissione, non una regola della catena: un blocco che porta una chiamata più economica è comunque valido. 0 con --byte-price 0 non applica alcuna politica. Su una catena la cui genesi ha una sezione gas, come quella della catena 20, i prezzi della catena stessa sono la regola di validità |
--byte-price <UNITS> | 800 | unità per KiB, o frazione di esso, della prova e dell’envelope di input di una chiamata, dal byte 0, con la stessa politica |
--prover <ADDR> | off | ospita il prover delegato (il JSON-RPC prover_*) a questo indirizzo: un listener a sé, che deve essere diverso da --rpc. Il nodo rifiuta di avviarsi senza <prover-home>/prover.key.json, creato da rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | il prover.key.json e il pairings.json del prover |
--prover-accept-spend-key | ritirato | rifiutato all’avvio dalla v0.6.8: run con questo flag termina prima che la chiave del nodo venga letta, nominando il flag. Nessun prover accetta più un witness con spend key; toglilo dal file di unit. Sulla v0.6.7 accettava witness con spend key per catene con bundle guest v1 o v2 |
--prover-max-parallel <N> | 1 | prove che il prover ospitato esegue contemporaneamente; l’avvio è rifiutato a meno che non siano disponibili 5,74 GB × N + 1 GiB di memoria |
--prover-max-queue <N> | 8 | job in coda oltre quelli in esecuzione |
--prover-cuda | off | prova sul backend CUDA (una build con --features cuda); nessun ripiego sulla CPU |
--prover-skip-memory-check | off | salta il controllo della memoria libera |
--prover-fee <RAND>, --prover-fee-address <rand1…> | nessuno | la commissione che ogni job inviato al prover ospitato deve pagare, in RAND con fino a nove decimali: un output RAND verso l’indirizzo, dentro il bundle provato. Ciascun flag richiede l’altro |
--prover-allow-origin <ORIGIN> | estensioni del browser e pagine loopback | un’origine del browser le cui pagine possono leggere le risposte del prover, ripetibile; se indicato una o più volte, i valori sono l’intero elenco. * consente ogni sito web e stampa un avviso |
Ambiente: RUST_LOG (predefinito info,libp2p=warn,libp2p_mdns=off). Ctrl-C o SIGTERM arrestano il nodo in modo pulito.
L’endpoint pubblico https://rpc.randprotocol.org è un proxy con allowlist davanti a un nodo archivio; dal 2026-10-01 la sua allowlist è l’insieme di metodi del listener pubblico.
safety
Lo stato di sicurezza del consenso di un validatore arrestato (v0.6.8). Ogni comando apre da sé la directory dei dati, quindi nessuno gira accanto a un nodo attivo.
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 stampa la testa committed, la view e l’ultima view votata, il QC più alto, se il validatore è bloccato sopra la sua testa e qualsiasi arresto di sicurezza registrato. Un nodo che vede una three-chain certificata tentare di eseguire il commit di un blocco che non discende dalla propria testa committed si ferma e lo registra (audit v6, CON-5); run termina poi con quella registrazione fino a clear-halt. Confronta la testa di questo nodo con quella di altri due validatori e, se differisce, risincronizza da un archivio prima di cancellare. Dalla v0.6.8 (CON-4) nessun quorum di risposte “not held” sblocca più un lock: un validatore bloccato su un blocco che non riesce a ottenere resta in silenzio finché non arriva una proposta il cui justify supera il lock o il blocco viene recuperato. release-lock abbassa il lock persistito al certificato della testa committed; usalo su un validatore alla volta, e solo quando il blocco è perso per sempre. Senza il suo flag di conferma ogni comando di scrittura stampa ciò che farebbe e non modifica nulla.
verify
| argomento | predefinito | significato |
|---|---|---|
--datadir <DATADIR> | obbligatorio | il nodo non deve essere in esecuzione |
--mode <MODE> | full | quick o full |
--repair | off | tronca la coda danneggiata; lo stato di sicurezza viene conservato |
Codice di uscita 0 se coerente, 2 se è stato trovato un problema senza --repair.
db
db drop-receipts-index --datadir <DATADIR>, con il nodo arrestato: elimina l’indice receipts_by_program prima di tornare a una build precedente alla v0.3, che non può aprire un database che lo contiene. Un avvio successivo ricostruisce l’indice dalle ricevute.
status
--rpc <URL> (predefinito http://127.0.0.1:8545). Stampa rand_status alla lettera.
register, unbond, withdraw
| comando | argomenti | significato |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | stampa una Registration esadecimale firmata dalla chiave di questo nodo; l’RPC viene letto per l’id della chain e, con --v2, anche per l’hash del genesis. --v2 è obbligatorio su una chain il cui genesis imposta staking.registration_v2, come quello della chain 20; lì una registrazione v1 viene rifiutata, mentre ovunque altrove viene accettata una v2 |
unbond <amount RAND> | --key, --rpc, --no-wait | sposta lo stake in unbonding; gratuito; prelevabile due epoche dopo |
withdraw <amount RAND> | --key, --rpc, --no-wait | versa lo stake rilasciato e le ricompense in una nota all’indirizzo di payout, meno la base di 0.001 RAND |
admit sign|submit
Ammissione per voto (v0.6.8). Su una chain il cui genesis imposta staking.admission_by_vote, come quello della chain 20, una nuova chiave di validatore si registra solo dopo che i validatori che detengono strettamente più di due terzi del peso di voto l’hanno approvata con la propria firma.
| comando | argomenti | significato |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | stampa il voto di questo validatore su una sola riga, <voter key hex>:<signature hex>, calcolato sull’hash del genesis e sull’indirizzo del candidato, quindi valido su una sola chain. Offline: non legge alcun nodo |
admit submit | --candidate …, --signature <line> (ripetibile), --rpc, --no-wait | verifica ogni voto rispetto all’hash del genesis del nodo (un voto per un altro genesis o un altro candidato, o un votante presente due volte, viene segnalato per nome), li ordina e invia l’AdmitValidator senza commissioni |
Il candidato è la chiave che la registrazione porterà con sé; rand-node address --key la stampa, e l’esadecimale stampato da register la contiene. Dopo che l’ammissione è stata confermata, il bond procede come prima (rand bond … --registration) e la consuma. rand_getAdmitted elenca ciò che è ammesso e in attesa.
bridge-gov
Le rotazioni post-quantistiche del bridge (v0.6.8), per i guardiani e per il detentore della pause key. Ogni passaggio legge da --rpc (predefinito http://127.0.0.1:8545) l’id della chain, il suo dominio di binding e rand_getBridgeState.rotation_nonce.
| comando | cosa fa |
|---|---|
rotate-pq message --new-key K… | stampa il messaggio di rotazione in esadecimale per il nonce corrente, da confrontare presso ogni firmatario |
rotate-pq sign --new-key K… --key F --index I [--possession] | stampa I:signature: la riga di quorum di un guardiano PQ attuale (I è il suo indice nell’insieme corrente) o, con --possession, la riga di un detentore della nuova chiave (I è il suo indice nel nuovo insieme); rifiuta un file di chiave che non sia la chiave in posizione I |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | assembla RotatePqGuardians, o l’azione V2 con le righe di possesso, e la invia; rifiuta il possesso su una chain che non lo prevede e la sua assenza su una che lo richiede, come fa la chain 20 |
rotate-pause message|sign|submit --new-key K | lo stesso per la pause key (indice di possesso 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | stampa 0:signature sul messaggio di annullamento, verificata rispetto alla pause key corrente della chain |
cancel-rotation submit --kind pq|pause --signature @F | invia CancelRotation, scartando una rotazione in sospeso prima che il suo ritardo termini |
--new-key è una chiave pubblica Dilithium2 in esadecimale, @file che ne contiene una, oppure @key-file (la sua chiave pubblica). Le righe di firma hanno la forma index:hex, separate da spazi o a capo; sono ammessi commenti con #.
vesting status|claim|revoke|bond|unbond
Il lato del detentore e quello del revocatore di un’allocazione di genesis soggetta a timelock, su una chain il cui genesis contiene una sezione vesting. Quello della chain 20 non ne ha. La chiave è un file di rand-node keygen.
| comando | argomenti | significato |
|---|---|---|
vesting status <ENTRY> | --rpc | la voce così come la serve rand_getVesting: le sue condizioni, quanto è maturato, quanto è riscattabile ora |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> oppure --all, --key, --rpc, --no-wait | versa quanto si è sbloccato in una nota presso --to, meno la base di 0.001 RAND; firmato dalla chiave del beneficiario |
vesting revoke prepare | --entry, --margin-secs (predefinito 600), --out (predefinito revoke.json), --rpc | v0.6.8, senza chiave: scrive la revoca che ogni revocatore firma, una nota della parte ancora non maturata a --margin-secs oltre la testa, versata al treasury del genesis della voce (non esiste --to) |
vesting revoke sign | --proposal <file>, --key, --index? | una chiave di revocatore, offline: stampa <index>:<signature hex> |
vesting revoke submit | --proposal <file>, --signature <index:hex> (ripetibile), --rpc, --no-wait | invia la revoca con almeno il threshold di firme della voce, entro 256 blocchi da prepare. Il vesting revoke --to a chiave singola della v0.6.7 non esiste più |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | voci irrevocabili: vincola RAND bloccati come stake di quel validatore; un validatore non ancora nel registro ha bisogno di ciò che ha stampato register |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | riporta i RAND vincolati nel lock; di nuovo riscattabili dopo le epoche di unbonding |
aggregator register|unbond|withdraw, aggregate
I comandi del ruolo di aggregatore per una chain con una sezione aggregation: aggregator register --key --bond <RAND> --payout <rand1…> --rpc stampa una AggregatorRegistration firmata; aggregator unbond e aggregator withdraw rispecchiano la coppia del validatore. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] è il demone che interroga rand_getUnsealed, dimostra un aggregato e lo invia. Inerte sulla chain 20, il cui genesis non ha alcuna sezione aggregation.
rand (wallet)
Opzioni globali, prima o dopo il sottocomando:
| opzione | env | predefinito |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http o https (l’endpoint pubblico è https://rpc.randprotocol.org). Una risposta superiore a 64 MiB viene rifiutata |
--key <KEY> | RAND_KEY | wallet.key.json; l’archivio delle note si trova accanto, in <key>.notes.json. L’archivio è legato alla chain rispetto alla quale è stato scansionato (il rand_getGenesisHash del nodo): se lo si punta a un’altra chain, come un wallet conservato attraverso il passaggio dalla chain 19 alla 20, viene svuotato e riscansionato dalla foglia 0 con un avviso. Dalla v0.6.8 ogni comando rifiuta un file di chiave leggibile dal gruppo o da altri, indicando il rimedio (chmod 600 <key>) |
--prover | disattivato. Dimostra il bundle sul prover abbinato a questo wallet (rand prover pair) anziché su questa macchina; la prova viene verificata qui (digest, dimensione e una verifica locale) prima di entrare in una transazione. Vale per ogni comando che dimostra un bundle; per call e program invoke, al prover va solo il bundle di pagamento e la prova della chiamata resta locale. Rifiutato senza un abbinamento, e insieme a --cuda tranne che su call. Su una chain ad autorizzazione divisa come la chain 20 al prover vengono inviati la viewing key nk e un salt, mai la chiave di spesa: può leggere l’intera cronologia di questo wallet e non può spendere. La prova di autorizzazione viene sempre prodotta su questa macchina. Su una chain il cui guest del bundle è v1 o v2, la v0.6.8 rifiuta --prover prima di chiedere qualsiasi cosa al prover | |
--max-prover-fee <RAND> | 1. Il massimo che un prover abbinato può addebitare per bundle. Un preventivo superiore viene rifiutato prima che venga costruito qualsiasi bundle; 0 rifiuta qualsiasi commissione. La commissione è un ulteriore output in RAND nello stesso bundle, mostrato come prover fee: <amount> RAND to <fingerprint> |
Gli importi sono RAND decimali con fino a nove decimali (1, 1.5, .25, 0.000000001). Un importo in token su send, token mint e token burn, e in un link randpay:, è espresso nelle unità di visualizzazione del token, secondo i decimals propri della riga del suo registro (10 di zUSD sono 10 zUSD). bridge-burn, token create --fixed-supply e --initial accettano interi semplici nell’unità più piccola del token, e asset-balance li stampa. Ovunque un comando accetti un token, accetta l’indice di registro, l’id rpl1… o l’id di 64 caratteri esadecimali; un id viene risolto nel suo indice a partire dall’elenco completo del registro del nodo (rand_getTokens, ogni pagina), mai con una ricerca per singolo token, che direbbe al nodo quale token sta per essere spostato. Un indice numerico non raggiunge mai il nodo.
| comando | argomenti | comportamento |
|---|---|---|
keygen | scrive un nuovo file della chiave di spesa in --key, modalità 0600; rifiuta di sovrascrivere | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | stampa su stdout l’indirizzo rand1… di questo wallet, esattamente l’indirizzo e un a capo, così che $(rand address) funzioni in uno script, e su stderr il suo fingerprint XXXX-XXXX-XXXX-XXXX: 16 caratteri base32 Crockford, un controllo umano dell’indirizzo che non viene mai inviato sulla rete. --uri stampa anche un link randpay: (l’indirizzo più un importo, un asset e un memo facoltativi). --qr rappresenta quel link come codice QR nel terminale; --qr-png lo scrive come PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | indirizzi con nome a cui questo wallet può inviare per nome. TO è un indirizzo rand1… o un link randpay:, del quale si conserva solo l’indirizzo. add stampa il fingerprint e chiede add? [y/N] salvo --yes; senza di esso, uno stdin che non è un terminale viene rifiutato. Salvato in <key>.contacts.json, modalità 0600. Un nome ha da 1 a 64 caratteri, non inizia mai con rand1 o randpay: ed è univoco |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | associa questo wallet a un prover delegato. pair accetta il link randprover: stampato da rand-prover pair, rifiuta un URL che non sia https:// (il semplice http:// solo verso localhost, 127.0.0.1 o [::1]), poi indica che cosa riceverà il prover (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) e chiede pair? [y/N]; --yes salta la domanda, e senza di esso uno stdin che non è un terminale viene rifiutato. Poi interroga prover_info del prover, rifiuta se il fingerprint della sua chiave non è quello indicato dal link, e scrive <key>.prover.json, modalità 0600, sostituendo ogni associazione precedente. --trusted (v0.6.8) non accetta alcun link: associa al pool di prover dei validatori, https://prover.randprotocol.org, a partire dal link incluso nella build; i suoi operatori possono leggere la cronologia di questo wallet e non possono spendere. show stampa nome, URL, fingerprint, own e la chiave del prover, mai il token; forget elimina il file. v0.6.7 non chiedeva conferma prima di associare |
viewing-key | stampa la viewing key nk di questo wallet, 64 caratteri esadecimali: il parametro che rand_importViewingKey accetta. Legge ogni nota che il wallet ha inviato o ricevuto e non ne spende nessuna | |
balance | analizza l’albero, salva lo store, stampa il valore spendibile e il numero di note non spese | |
sync | --rescan | analizza senza stampare un saldo. Una prima sincronizzazione legge ogni header di blocco (1.024 per chiamata) prima delle foglie. --rescan dimentica ogni nota, ogni marcatura di spesa e il cursore (mantenendo il legame con la chain) e ripete l’analisi dalla foglia 0: la via di ritorno quando un nodo ha segnalato per errore come spese le note di questo wallet. Meglio eseguirlo su un nodo di cui ci si fida |
notes | --memo | ogni nota che questo wallet ha aperto: indice, asset, importo, altezza, spent, pending, e il memo troncato a 24 caratteri, o intero con --memo |
asset-balance [INDEX] | analizza, poi stampa ciò che questo wallet detiene in un asset, o una riga per ogni asset detenuto; gli importi sono nell’unità minima propria dell’asset | |
history | --memo | ogni nota che questo wallet ha creato per qualcun altro, con la stessa colonna memo di notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (predefinito 0, RAND), --memo <M>, --fee <RAND> (predefinito 0.001), --no-wait, --yes, --cuda | TO è un indirizzo rand1…, un link randpay: o il nome di un contatto salvato, provati in quest’ordine. Importo, asset e memo propri del link completano ciò che la riga di comando omette; AMOUNT è facoltativo solo quando il link ne porta uno, e un valore indicato in entrambi i modi che non coincide viene rifiutato. Il comando stampa la conferma, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> e, quando c’è un memo, una riga a sé memo: "<text>", poi chiede conferma prima di generare la prova salvo --yes. Uno script deve passare --yes: uno stdin che non è un terminale viene rifiutato con stdin is not a terminal: pass --yes to send without confirmation. Poi seleziona al massimo due note dell’asset e al massimo due note RAND per la commissione, sigilla il memo solo nell’output del pagamento, genera la prova di un bundle a quattro slot con asset nascosto e, su una chain con autorizzazione separata, in locale anche l’autorizzazione di spesa, invia e attende il commit. Un memo non vuoto viene rifiutato prima della prova su una chain il cui genesis non ha envelope_bytes. AMOUNT è nelle unità di visualizzazione dell’asset: RAND decimale per RAND, e un token con i decimals propri della sua riga di registro; solo 0 o rand indicano RAND, qualunque indice abbia risposto il nodo. L’id di un token viene decodificato prima di interrogare il nodo, e una riga dell’elenco che risponde con indice 0 o con campi id discordanti viene rifiutata. La conferma mostra l’importo di un token in unità di visualizzazione e in unità di base, 10.00000000 zUSD (1000000000 units), così che un nodo che mente sui decimals di un token sia visibile prima che venga inviato qualcosa. L’indice dell’asset e la commissione vengono stampati prima della prova. On-chain un trasferimento di token è un bundle semplice, indistinguibile da un pagamento in RAND; la sua commissione è in RAND, e un wallet senza RAND spendibili viene rifiutato prima della prova |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | effettua lo staking su un validatore: il bundle brucia l’importo |
faucet [ADDRESS] | --amount <RAND> (predefinito e massimo 100) | solo testnet: chiede a un nodo validatore di coniare. Sulla chain 20 il faucet paga solo i 16 wallet della sua allowlist di genesis |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (ripetibile), --out <file> (predefinito program.json) | assembla un guest integrato; stampa l’id del programma. rpl2_counter (v0.6.8) è il programma dimostrativo di RPL-2 |
program deploy <FILE> | .json, un .bin grezzo, o il contenitore di immagine che rand-guest build scrive; --public <FILE>, --input <u32> (ripetibile) o --check-call, --cuda | stampa l’id del programma, hc e il numero di parole; rifiuta un programma oltre il limite della chain (tramite rand_estimateFee) prima della prova; paga il minimo di deploy tramite un bundle, attende. --public memorizza un input pubblico con il programma (parole u32 separate da spazi, o un ELF .so), entro max_program_public_words della chain; l’id del programma lo vincola poi. Con --input o --check-call il wallet esegue prima una chiamata di prova su quegli input privati nell’emulatore e rifiuta se non rientra nel limite del tier di chiamata (14); per il controllo non viene generata alcuna prova |
program show <ID> | metadati del programma distribuito | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (obbligatorio), --input N (ripetibile, privato), --inputs-file <FILE.json> (un array JSON di u32, aggiunto), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: dichiara una transizione di stato del programma e la fa applicare dalla chain. Prima di generare qualsiasi prova, verifica che la chain abbia una sezione program_state, che il programma esista, che il contesto della transizione rispetti la regola dei segmenti, che ogni voce di reads corrisponda alla cella attiva (rand_getProgramCell; una discordanza nomina la cella obsoleta e termina con codice 3), che il vault possa pagare ogni voce di pays più ciò che questa transizione deposita, e che questo wallet detenga il token e il RAND che il deposito e la commissione richiedono. Conta le celle che le scritture creano, esegue il programma di prova sulle parole di contesto reali, genera la prova della chiamata legata alla transazione, poi il bundle (la commissione, più deposit.rand bruciato tramite burn_r e deposit.amount di deposit.asset tramite burn_a) e la prova di autorizzazione. La commissione predefinita è il minimo della chiamata per il gas dichiarato più la commissione di cella per ogni cella creata, con gli stessi due scatti di prezzo di margine di call. Stampa ogni pagamento e, salvo --no-wait, gli otto outputs della ricevuta. Anche una lettura obsoleta al momento dell’inclusione termina con codice 3, così che uno strumento chiamante rilegga e riprovi. Non pubblica alcuna trascrizione degli input. Il file di transizione, con ogni campo facoltativo: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}; chiavi e valori sono Word8 di 64 caratteri esadecimali, gli importi stringhe decimali nelle unità proprie dell’asset, to è per impostazione predefinita questo wallet |
program state <ID> | --cell <64 hex> | v0.6.8: ogni cella del programma in ordine di chiave (rand_getProgramCells, paginato fino alla fine), o una sola cella con --cell, 64 zeri se assente. Rifiutato su una chain senza sezione program_state |
program vault <ID> | v0.6.8: il vault del programma (rand_getProgramVault), una riga per ogni asset che detiene, importi in unità. Rifiutato su una chain senza la sezione | |
call <PROGRAM-ID> | --input N (ripetibile), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | esegue prima la chiamata nell’emulatore e stampa gas: <exact> (declaring <limit>, tier <t>): il gas esatto è witness e non lascia mai il wallet, il limite dichiarato è il GAS_LIMIT pubblico della prova. Su una chain con una sezione gas il limite predefinito è il gas esatto arrotondato per eccesso a un multiplo di 2^(t−2); max dichiara il tetto dell’header gas_max, che non rivela nulla che il tier non riveli già; N viene rifiutato se inferiore al gas esatto o superiore al tetto. Senza sezione, o con --cuda, il predefinito è max. Poi genera la prova della chiamata in locale sull’input pubblico del programma, sigilla la sua trascrizione degli input, paga tramite un bundle, stampa la ricevuta. La commissione predefinita è il minimo per il limite dichiarato, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB ai prezzi che rand_getLimits serve, più due scatti di prezzo di margine dove i prezzi si muovono, stampata come fee … RAND (incl. two price steps of headroom). Su una chain hardening_v6 la commissione è fissata prima che la prova esista, quindi il predefinito prezza al posto della prova il limite di prova della chain, il che può solo far pagare di più; --fee paga un importo esatto. --expect-public rifiuta prima della prova a meno che l’input pubblico del programma non sia costituito dalle parole di quel file |
open-call <TXHASH> | --call-key <hex>, --as-auditor | apre la trascrizione di una chiamata, la verifica rispetto a H_IN, riesegue il programma; termina con codice diverso da zero in caso di discordanza |
receipt <TX> | la ricevuta di una chiamata confermata | |
bridge-mint <ATTESTATION> | hex o @path, --pq <JSON or @path> (obbligatorio), --to <rand1…> (predefinito: questo wallet), --fee (predefinito: il minimo dell’azione), --no-wait, --cuda | deposita come nota un’attestazione firmata dai guardiani. --pq è il quorum di cofirme Dilithium2 dei guardiani, [{"index":0,"signature":"<4840 hex>"},…]. Prima di qualsiasi prova: decodifica l’attestazione, verifica il quorum rispetto a pq_guardians del nodo e all’id della chain, verifica il destinatario e l’id dell’asset, legge l’indice elencato (rand_getAssets). Il blinding della nota di deposito deriva dal digest dell’attestazione, r = blake3("rand-deposit-r-1" || mu), l’unico r che la chain ammette. Il bundle della commissione è provato rispetto all’intera transazione, quorum incluso. Stampa owner, time e r della nota |
bridge-rotate <ROTATION> | hex o @path, --pq <JSON or @path> (obbligatorio), --fee (predefinito: il minimo dell’azione), --no-wait, --cuda | invia una rotazione dell’insieme dei guardiani con il quorum di cofirme dell’insieme PQ corrente, come BridgeAttest che non deposita nulla. Prima della prova rifiuta tutto ciò che non sia una rotazione che fa avanzare di uno l’insieme di Rand. Stampa poi il guardian_set_index |
bridge-pause | --sig <HEX or @path> (obbligatorio), --no-wait | mette in pausa il mint del bridge: un PauseMints senza bundle e senza commissione, quindi non servono né file di chiave né RAND. Il file è l’output di rand-bridge-gov pause, la firma di 2.420 byte della chiave di pausa in esadecimale, prodotta per il pause_nonce corrente del bridge; verificata rispetto a pause_key del nodo e all’id della chain prima dell’invio. Burn e rotazioni restano aperti durante la pausa |
bridge-unpause | --pq <JSON or @path> (obbligatorio), --no-wait | revoca una pausa con un quorum di guardiani PQ (il file di rand-bridge-gov pq-unpause) prodotto per il pause_nonce corrente. Senza bundle e senza commissione; la sola chiave di pausa non può mai revocare la pausa |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (predefinito 0.01), --no-wait, --cuda, --yes | brucia in uscita un asset trasferito tramite bridge: verifica che la moneta TOKEN su TO_CHAIN sostenga ASSET e abbia almeno AMOUNT bloccato, e che AMOUNT e la commissione del relayer siano unità di rilascio intere; poi genera la prova di un bundle che spende l’asset negli slot 0–1, ne brucia esattamente AMOUNT (burn_a, burn_asset) e paga la commissione in RAND dagli slot 2–3. --relayer-fee è una porzione di AMOUNT, non un costo aggiuntivo. Su una chain con una commissione di bridge (rand_getBridgeState.fees), come lo è la chain 20, v0.6.8 stampa prima la commissione che la chain trattiene (nell’asset) e l’importo che verrà rilasciato, e chiede conferma; --yes salta la domanda, e senza di esso uno stdin che non è un terminale viene rifiutato. Le verifiche su importo bloccato e commissione del relayer valgono poi sull’importo rilasciato |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (casuale se omesso), poi --fixed-supply <N> --to <rand1…>, --authority-key-out <FILE> [--initial <N> --to <rand1…>] oppure (v0.6.8) --program <PROGRAM-ID>, un token la cui autorità di mint è quel programma, che solo le sue invocazioni coniano o bruciano, con offerta iniziale pari a zero e che richiede la sezione program_state della chain, --fee (predefinito: la base del bundle più la registration_fee del registro; rifiutata quando il nodo indica una commissione di registrazione superiore a 10 RAND, quindi passare --fee per pagarne deliberatamente una maggiore), --no-wait, --cuda | registra un token al successivo indice del registro: offerta fissa (conia una volta, autorità none) o autorizzato da Key (un nuovo file di chiave Dilithium2, scritto 0600, che rifiuta di sovrascrivere). La chiave di autorità resta in <FILE>.pending finché la chain non accetta la registrazione. Se un’altra registrazione prende prima l’indice, stampa another token took index N first — re-run to register at N+1; in caso di successo stampa l’indice e l’id, esadecimale e rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (nelle unità di visualizzazione del token), --authority-key <FILE>, --fee (predefinito 0.001), --no-wait, --cuda | conia altro di un token autorizzato da Key; rifiutato prima di qualsiasi prova se il token non è autorizzato da Key o se la chiave non è la sua autorità |
token set-authority | --asset, --authority-key <FILE>, poi --new-key <FILE> oppure --renounce, --fee (predefinito 0.001), --no-wait, --cuda | cede un token autorizzato da Key a un’altra chiave, o rinuncia definitivamente al mint |
token burn <ASSET> <AMOUNT> | --fee (predefinito 0.001), --no-wait, --cuda | distrugge AMOUNT, nelle unità di visualizzazione del token, di un token RPL che questo wallet detiene; la sua offerta pubblica diminuisce esattamente di tale importo. Un token trasferito tramite bridge viene rifiutato prima della prova: esce tramite bridge-burn |
token info <INDEX|rpl1…|hex> | la riga completa di rand_getTokens di un token: nome, simbolo, decimals, autorità, mint_nonce, offerta totale, registered_at, id (hex e id_text) e, se trasferito tramite bridge, ogni backing (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (predefinito 0), --limit <N> (predefinito 1000) | una pagina di rand_getTokens: enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (i decimals di origine del primo backing), --pq <JSON or @path> (obbligatorio), --fee (predefinito: la base del bundle più la registration_fee del nodo, con lo stesso rifiuto oltre 10 RAND di token create), --no-wait, --cuda | registra dopo il genesis un token trasferito tramite bridge con il suo primo backing, autorizzato da un quorum di guardiani PQ (il file di rand-bridge-gov pq-register) prodotto per il list_nonce del nodo. Prima l’elenco su Rand, poi setToken sull’endpoint |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (obbligatorio), --fee (predefinito: la base del bundle), --no-wait, --cuda | aggiunge un backing a un token trasferito tramite bridge, autorizzato da un quorum di guardiani PQ (il file di rand-bridge-gov pq-list) al list_nonce del nodo |
bridge | lo stato pubblico del bridge: guardiani, emittenti, il registro degli asset, la sequenza dei burn | |
bridge-message <SEQUENCE> | un messaggio di burn in uscita, testuale | |
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) | la commissione minima secondo la tabella del nodo. Su una chain con una sezione gas, fee call <tier> --gas N prezza il limite dichiarato che rand call stampa, ai prezzi del tip e senza margine: il minimo stesso. Senza --gas prezza il tetto gas_max(tier, K, S), il massimo che una tale chiamata può costare. --bytes sono i byte della prova della chiamata più quelli dell’envelope di input |
tx <HASH> | transazione confermata con la sua altezza e il suo indice | |
tx-key <HASH> | una riga per ogni output di quella transazione che questo wallet ha inviato, ricevuto o tenuto come resto: output (bundle:0 … bundle:3, i quattro slot dell’unico bundle, o mint:0), ruolo, importo (in RAND, o N (asset I) per un token), il memo che portava (- se assente) e la chiave per transazione con cui è stato sigillato. Consegnare la chiave di una riga sent a un beneficiario o a un auditor e rand_checkTransaction <HASH> <KEY> rivela quel singolo output, memo incluso. Uno slot fittizio non si apre a nessuno e non ha riga | |
block <ID> | blocco per altezza o hash | |
head | { height, hash, view } | |
status | rand_status | |
peers | peer connessi | |
validators | il registro dei validatori |
--cuda richiede una build con --features cuda e non prevede alcun ripiego; non è ancora stato compilato alcun PTX. Non può sigillare un envelope di input della chiamata: rand call --cuda richiede --no-envelope. Dichiara solo il tetto di gas e rifiuta --gas-limit N.
Ogni memo e ogni nome di contatto che la CLI stampa (la conferma di send, notes, history, tx-key) passa prima per un’unica regola di visualizzazione: i caratteri di controllo, i caratteri di formato Unicode (controlli bidirezionali, caratteri a larghezza zero, il trattino morbido) e U+2028/U+2029 sono mostrati come U+FFFD, e una sequenza di separatori di spazio come un solo spazio.
Un primo trasferimento shielded
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
Condividere un indirizzo, e un 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
Il memo si trova nello stesso corpo sigillato della nota, quindi chi può aprire l’uno può aprire l’altra: il destinatario tramite notes, e chiunque possieda la chiave per transazione di quell’output tramite rand_checkTransaction <hash> <key>. La chain 18 è la prima chain il cui genesis imposta envelope_bytes; sulle chain da 14 a 17 --memo veniva rifiutato prima ancora di generare qualsiasi prova.
Una chiamata riservata che puoi riaprire in seguito
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)
Un programma con stato: il contatore RPL-2
Su una chain con una sezione program_state, come la chain 20. Il contatore accetta esattamente le transizioni che leggono una cella e la riscrivono con la sua prima parola aumentata di uno; tutto il resto della transizione (ciò che il bundle deposita, ciò che il vault paga, ciò che il programma conia) passa senza alcun controllo, il che ne fa una dimostrazione e non un programma su cui appoggiare valore.
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)
I … nel file stanno per i 64 caratteri esadecimali completi, che il wallet richiede.
Che cosa stampano un deploy e una chiamata
Su una chain con autorizzazione separata ogni bundle comporta due prove generate su questa macchina: l’autorizzazione di spesa di tier 10 e il bundle di tier 14. Un program deploy con rand v0.6.7 sulla 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)
Una call stampa il suo gas e la sua commissione prima della prova della chiamata, poi dimostra allo stesso modo il bundle di pagamento:
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 [...]
Qui 6,144 è 5,636 arrotondato per eccesso a un multiplo di 2^10, e rand fee call 12 --gas 6144 --bytes <B> quota quel limite ai prezzi della punta della chain, senza margine.
rand-prover
Il prover delegato come binario a sé stante: genera la prova del bundle di tier 14 di un wallet su un’altra macchina. rand-node run --prover ospita lo stesso servizio all’interno di un nodo. Ogni sottocomando accetta --home <DIR> (env RAND_PROVER_HOME, predefinito ~/.rand-prover), la directory che contiene prover.key.json e pairings.json.
| command | arguments | behaviour |
|---|---|---|
keygen | scrive prover.key.json, con modalità 0600, e stampa l’impronta della chiave; rifiuta di sovrascrivere | |
pair | --name <LABEL> (obbligatorio), --url <URL> (predefinito http://127.0.0.1:8600), --own, --qr | genera un token, ne memorizza solo l’hash sotto l’etichetta e stampa il link di abbinamento randprover: che rand prover pair accetta. Il token è mostrato una sola volta, dentro il link. --url è l’indirizzo con cui il wallet raggiunge questo prover; --own aggiunge own=1; --qr stampa il link anche come codice QR nel terminale |
unpair | --name <LABEL> | rimuove un abbinamento; un prover in esecuzione legge il file all’avvio, quindi l’effetto si ha al riavvio |
pairings | una riga per abbinamento: etichetta, own oppure -, data di creazione | |
run | --listen <ADDR> (predefinito 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (ripetibile), --fee <RAND> con --fee-address <rand1…>, --accept-spend-key | serve il JSON-RPC prover_* fino a Ctrl-C o SIGTERM. L’avvio è rifiutato a meno che non siano disponibili 5.74 GB × --max-parallel + 1 GiB di memoria. --per-token è il numero di job che un abbinamento può avere in coda o in elaborazione contemporaneamente. --accept-spend-key è ritirato nella v0.6.8: run rifiuta di avviarsi con esso, e un prover accetta solo witness con viewing key. Nella v0.6.7 ammetteva witness con spend key, che invia solo una chain con bundle guest v1 o v2 |
Un prover sulla chain 20 riceve la viewing key nk del wallet e un salt nuovo. Non può spendere, e può leggere tutto ciò che quel wallet ha mai ricevuto o inviato: abbinati a un prover a cui mostreresti la tua cronologia. Il wallet verifica ogni prova che riceve.
Formati dei file di chiave
Chiave del nodo:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Chiave del wallet, versione 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen la scrive con modalità 0600, e dalla v0.6.8 ogni comando rand rifiuta un file di chiave del wallet leggibile da gruppo o altri: una chiave copiata o ripristinata a mano deve essere riportata a 0600 (chmod 600 <key>). Perdere una chiave del wallet significa perdere ogni nota che avrebbe potuto aprire; in questa versione non esiste alcuna frase di recupero.