Rand Protocol
Documentazione
Introduzione

Introduzione

Che cos'è Rand Protocol, cosa gira oggi sulla testnet pubblica e come ottenere RAND per sviluppare su di essa.

Leggi questa pagina per decidere su cosa costruire e da dove cominciare: il modello della chain in pochi paragrafi, i parametri della testnet attiva, come ottenere RAND di prova e una mappa del resto della documentazione.

Che cos’è Rand Protocol

Rand è una chain schermata post-quantistica. La sua moneta nativa è RAND, e RAND vive in un pool interamente schermato: on-chain non esistono account né saldi, solo commitment delle note e nullifier, e un trasferimento è una prova a conoscenza zero che quattro note sono diventate altre quattro note (note fittizie riempiono gli slot inutilizzati), senza rivelare quale asset si sia mosso. RAND e ogni token dello standard proprio della chain, RPL, condividono quell’unico pool. La stessa moneta paga i programmi confidenziali: programmi RISC-V che girano off-chain dentro una macchina virtuale a conoscenza zero e vengono regolati on-chain con una prova al posto dei loro input.

Ogni primitiva è scelta per resistere a un avversario quantistico:

livellocosa viene eseguito
FirmeDilithium2 (basato su reticoli). I validatori firmano con esso blocchi e voti; con esso sono firmati anche il faucet, le azioni di staking e le registrazioni del bridge. Un wallet non firma mai una transazione: un bundle si autorizza con la propria prova.
Cifratura delle noteIncapsulamento di chiave ML-KEM-768 più ChaCha20-Poly1305. Ogni nota on-chain è accompagnata da una busta che solo il suo proprietario (e il suo mittente) può aprire.
HashingBLAKE3 con separazione di dominio per indirizzi, id di transazione, radice di stato e tutto il resto al di fuori del sistema di prova; Poseidon2 sul campo Goldilocks per note, nullifier, albero dei commitment e tutto ciò che sta dentro una prova.
ProveUna STARK batch Plonky3 con FRI hiding (80 query, blowup 8, 20 bit di proof-of-work). Trasparente: nessun trusted setup, nessuna curva con pairing, e l’assunzione è una funzione hash resistente alle collisioni.
Calcolo confidenzialeLa zkVM di Rand, una macchina RV32IM provata con quella STARK. Un programma è identificato da un digest in-circuit, e il verificatore non vede mai una sola parola di istruzione.
ConsensoHotStuff BFT concatenato: quorum pesati per stake superiori ai due terzi, leader a rotazione round-robin, una regola di commit a tre view consecutive.
Storage e reteUn RocksDB per nodo con commit sincronizzati su disco (fsync) e un controllo di integrità all’avvio; libp2p (TCP, Noise, Yamux, gossipsub, Kademlia, mDNS sulle LAN).

L’implementazione di riferimento è randprotocol/fullnode, in Rust: il binario rand-node è il nodo, il binario rand è il wallet, e i metodi JSON-RPC hanno il prefisso rand_. L’explorer è randscan.org.

La testnet: chain 20

La flotta pubblica esegue la chain 20, attiva dal 2026-10-01 06:17 UTC su fullnode v0.6.8. Le chain da 15 a 19 sono ritirate. Quattro chain sono state create in quattro giorni, ciascuna per una modifica che cambia ogni prova o il formato delle transazioni:

  • La chain 16 (2026-09-28, fullnode v0.6.1) ha portato la zkVM al constraint set 7, che oscura ciò che una prova rivelava sui piccoli input privati, e ha attivato le regole hardening_v6.
  • La chain 17 (2026-09-29, v0.6.3) ha separato l’autorizzazione di un trasferimento dalla sua prova: ogni bundle porta una seconda, piccola prova prodotta con la spend key, così che quella grande possa essere prodotta da una macchina che possiede solo una viewing key.
  • La chain 18 (2026-09-29, v0.6.7) misura le chiamate confidenziali in gas (constraint set 8) e attiva il memo cifrato in ogni busta di nota.
  • La chain 20 (2026-10-01, v0.6.8) lega ogni prova e ogni messaggio firmato all’hash di genesi, aggiunge lo stato dei programmi (RPL-2), applica una commissione sui mint e sui burn del bridge zUSD e attiva le regole audit-v6 elencate nella tabella qui sotto.

La chain 19 (2026-10-01 03:43 UTC, v0.6.7) è stata una nuova genesi della chain 18 sulla stessa build e non ha cambiato alcuna regola. La chain 18 è stata fermata all’altezza 143.776, e la chain 19 è stata creata da uno snapshot all’altezza 141.935. La sua genesi differiva da quella della chain 18 solo per l’id della chain, il timestamp, le note riportate e la sezione del bridge: nuovi emitter per gli endpoint Ethereum, Binance Smart Chain e Tron, con i contatori di sequenza riportati.

La chain 20 è un hard fork della chain 19: la sua genesi è stata creata da uno snapshot della chain 19 all’altezza 7.258, la chain 19 è stata fermata all’altezza 7.700, e tutti i 26 validatori sono stati riavviati insieme sulla chain 20, con le stesse chiavi, gli stessi peer id e gli stessi nodi di bootstrap. La chain 19 e la chain 18 sono ritirate. Un wallet richiede la v0.6.8 per inviare sulla chain 20: le prove e le firme di un wallet più vecchio non portano il legame con la genesi, e la chain le rifiuta.

Ciascuna è una chain nuova. I saldi RAND nei wallet dell’operatore e gli zUSD in circolazione sono stati riportati nella genesi successiva, e nient’altro: un programma distribuito su una chain non esiste sulla successiva. È software sperimentale: non è sottoposto ad audit, e RAND su di essa non ha alcun valore.

I programmi sulla chain 20 possono mantenere uno stato: le program cell di RPL-2, i program vault e l’azione Invoke sono attivi.

chain id20 (rand_chainId)
genesis hash6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135
file di genesisdeploy/genesis-chain20.json nel repository del fullnode
buildfullnode v0.6.8 (tag c9c9bd3c); un nodo riporta la propria build in rand_getVersion. Questa build rifiuta le chain da 14 a 17, e un wallet precedente alla v0.6.8 non può inviare sulla chain 20
vincolo al genesisbinding_domain 1: il vincolo di prova di ogni bundle e ogni messaggio di azione firmato includono l’hash di genesis, quindi nulla di ciò che è stato provato o firmato per una chain risulta valido su un’altra
indicatore testnettestnet true: il genesis si dichiara rete di test, ed è ciò che consente a un faucet di operare accanto al bridge
validatori26, ciascuno con uno stake di 1.000 RAND, il minimo di staking
quorum18 su 26: strettamente più di due terzi dello stake
intervallo tra i blocchiil valore predefinito --block-interval-ms 1000; circa un blocco al secondo
tempo di bloccoun timestamp oltre 60 s dopo quello del blocco padre non è valido, e un validatore non vota un blocco più avanti di 15 s rispetto al proprio orologio, perciò i validatori eseguono NTP
finestra di provaproof_window_blocks 1.024: l’ancora di un bundle deve essere una delle ultime 1.024 radici di fine blocco, e il suo time non deve essere più vecchio di così (256 blocchi sulle chain 18 e 19)
epoche1.000 blocchi; un nuovo bond attende due epoche in più prima di contare (bond_activation_epochs 2, con attivazione all’epoca e + 3), lo stake in svincolo viene rilasciato due epoche dopo
stakingle registrazioni sono v2 (rand-node register --v2), e una nuova chiave si registra solo dopo che i validatori che detengono più di due terzi del peso la approvano con il voto (admission_by_vote); il peso di un singolo validatore è limitato al 33,33 %; il nuovo stake che entra al confine di un’epoca è limitato al 25 % del peso attivo (max_stake_entry_bps_per_epoch 2.500); nessuno slashing
zkVMinsieme di vincoli 8, profilo FRI di produzione (80 query)
guest del bundlehc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: il bundle di asset nascosti 4 in ingresso e 4 in uscita, versione 3, tier 14
guest di autorizzazionehc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: l’autorizzazione di spesa che ogni bundle porta con sé, tier 10
gasuna chiamata dichiara un limite di gas che il circuito applica e paga gas_price per esso: 100 unità per gas e 800 unità per KiB al minimo, entrambi in movimento a ogni blocco verso un obiettivo di 262.144 gas e 10.485.760 byte, e mai oltre i massimi di 10.000 per gas e 80.000 per KiB. Solo i byte su cui si applica il prezzo per byte (la prova di una chiamata e la sua busta di input) contano nel carico di byte (byte_load: "paying"), perciò un blocco di trasferimenti non lo fa salire. Ogni bundle dichiara il limite fissato 20.479 e paga la quota fissa di 0,001 RAND
stato dei programmiRPL-2 attivo: celle di programma, vault di programma e Invoke (Action 33); una cella creata costa 0,01 RAND (cell_fee 10.000.000 unità); un invoke legge al massimo 8 celle, ne scrive al massimo 8 ed effettua al massimo 4 pagamenti (rand_getLimits.program_state)
busta della notaenvelope_bytes 1860: la busta di ogni nota è di 1.860 byte e contiene un memo cifrato
limite dei programmimax_program_words 65.535, ma con hardening_v6 un deploy che nessuna chiamata di tier 14 potrebbe contenere viene rifiutato (ProgramUncallable): 8.180 parole per un programma senza segmento pubblico
limite delle provemax_proof_bytes 4.194.304 (4 MiB); era 8 MiB sulle chain da 13 a 16
limite dei blocchimax_block_bytes 20.971.520 (20 MiB)
limite della busta di chiamatamax_call_envelope_bytes 65.536
input pubblico per programmamax_program_public_words 32.768, fissato al deploy
faucetattivo, ma solo per i 16 wallet nella allowlist del genesis (staking.faucet_recipients), e solo dai 18 validatori che il genesis indica come minter (staking.faucet_minters): fino a 100 RAND per chiamata, 10.000 RAND per epoca in totale
calcolo riservatoattivo; la prova di una chiamata è limitata al tier 14. I programmi non si trasferiscono con un cambio di chain; i programmi di esempio indicano su quale chain è distribuito ciascuno
tokenil registro RPL è attivo: tassa di registrazione 1 RAND, bruciato; al massimo 4.096 token; ogni valore di nota inferiore a 2⁶³. zUSD è elencato nel genesis all’indice 1
bridgeattivo: insieme di guardiani 1 con otto guardiani, otto guardiani PQ Dilithium2, una chiave di pausa, emettitori per quattro chain di origine, un tetto giornaliero di mint di 100.000 zUSD per garanzia e un tetto globale di 4.000 zUSD su 24 ore mobili per tutte le garanzie. zUSD ha sette garanzie; la sua offerta è quanto risulta bloccato, letto in tempo reale da rand_getTokenSupply. Dalla chain 20 una commissione di 10 bps è applicata a ogni mint e a ogni burn, in zUSD, come nota a un indirizzo di tesoreria (bridge.fees): un deposito accredita l’importo lordo meno la commissione, e un burn rilascia amount − fee sulla chain di origine. Una rotazione dei guardiani PQ o della chiave di pausa porta la firma propria di ciascuna nuova chiave e ha effetto 86.400 s dopo essere stata accettata (bridge.rotation)
cronologia24 validatori conservano 24 ore di blocchi (--prune-history 24h) e rispondono -32010 oltre tale limite; due nodi archivio conservano ogni blocco, e l’RPC pubblico https://rpc.randprotocol.org inoltra a un archivio
aggregazione dei blocchidisattivata (nessuna sezione aggregation nel genesis; la build si rifiuta di avviarsi con un genesis che ne contenga una)
valore del genesis26.000 RAND in staking nel registro dei validatori più sette note di deposito per un totale di 5.184,243719258 RAND, riportate dai wallet dell’operatore sulla chain 19: 31.184,243719258 RAND, prima dei mint del faucet (rand_getSupply riporta genesis_staked e genesis_deposited); più due note di genesis per un totale di 99 zUSD, corrispondenti ai 99 zUSD bloccati sulle rispettive garanzie

I nodi di bootstrap (deploy/nodes.env):

/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ

La chain 20 funziona con le chiavi dei validatori usate dalle chain da 14 a 19, perciò questi peer id non sono cambiati dalla rotazione delle chiavi della chain 14.

L’explorer su randscan.org indicizza la chain 20 ed espone un’API REST su https://randscan.org/api/v1 (API dell’explorer). Il JSON-RPC del full node è in ascolto su 127.0.0.1:8545 per impostazione predefinita; esegui un nodo (Eseguire un nodo), usane uno di cui ti fidi, oppure usa l’endpoint pubblico https://rpc.randprotocol.org (rand --rpc https://rpc.randprotocol.org …). L’endpoint pubblico serve tutto ciò di cui un wallet ha bisogno, compresa la prima sincronizzazione e l’invio di transazioni, con un limite di 1.200 letture e 6 invii al minuto per indirizzo. Non serve il faucet.

Ottenere RAND dal faucet

Il faucet è un tipo di transazione: un validatore conia una nota di importo pubblico verso un indirizzo schermato, e la nota può essere aperta solo dal titolare dell’indirizzo. Sulla chain 20 paga solo i 16 indirizzi nella allowlist del genesis: un mint verso qualsiasi altro indirizzo viene rifiutato con the faucet may not mint to this recipient (not in staking.faucet_recipients), perciò un wallet che non vi compare ottiene RAND di test ricevendone da qualcuno. Ciascuno dei tre percorsi seguenti chiede il mint a un nodo validatore; gli osservatori rispondono faucet mints are signed by validators; ask a validator node, e l’endpoint RPC pubblico non inoltra affatto rand_mint.

Con il wallet rand, puntato all’RPC di un validatore:

rand keygen                    # writes wallet.key.json; refuses to overwrite
rand address                   # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet                    # an allowlisted wallet: 100 RAND into a note only it can open
rand balance                   # scans the tree with this key; prints 100 RAND

rand faucet [ADDRESS] --amount <RAND> conia verso un altro indirizzo o per un importo minore; 100 RAND è sia il valore predefinito sia il limite per chiamata. Via JSON-RPC la stessa richiesta è rand_mint:

curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'

Il risultato è l’hash della transazione di mint; interroga rand_getTransaction finché non restituisce un blocco. Gli importi sono stringhe di unità, e 1 RAND corrisponde a 10⁹ unità. Le app wallet offrono lo stesso faucet con un solo tocco; invia da esse con Rand Wallet v0.6.8 o successivo, la prima versione per la chain 20. La pagina del faucet di questo sito accetta richieste in lista d’attesa per le assegnazioni su devnet.

L’importo di un mint è pubblico sulla chain: la visibilità a un solo passaggio propria di ogni deposito da trasparente a schermato. Quanto vale la nota, e per chi, da quel momento in poi resta nascosto come per ogni altra nota.

Dove andare dopo

La directory docs/ del repository fullnode è la fonte con cui queste pagine vengono verificate, e i paper forniscono il background crittografico.

Ultima verifica rispetto al commit c0878c3f del fullnode (chain 21) il 2026-10-12.