Rand Protocol
Documentação
Início

Introdução

O que é o Rand Protocol, o que roda hoje na testnet pública e como obter RAND para desenvolver nela.

Leia esta página para decidir contra o que construir e por onde começar: o modelo da cadeia em poucos parágrafos, os parâmetros da testnet ativa, como obter RAND de teste e um mapa do restante da documentação.

O que é o Rand Protocol

Rand é uma cadeia blindada pós-quântica. Sua moeda nativa é o RAND, e o RAND vive em um pool totalmente blindado (shielded): não há contas nem saldos on-chain, apenas compromissos de notes e nullifiers, e uma transferência é uma prova de conhecimento zero de que quatro notes se tornaram outros quatro notes (notes fictícios preenchem os slots não usados), sem mostrar qual ativo se moveu. O RAND e todo token do padrão próprio da cadeia, o RPL, compartilham esse único pool. A mesma moeda paga por programas confidenciais: programas RISC-V que são executados off-chain dentro de uma máquina virtual de conhecimento zero e são liquidados on-chain com uma prova, em vez de com as suas entradas.

Cada primitiva é escolhida para resistir a um adversário quântico:

camadao que roda
AssinaturasDilithium2 (baseado em reticulados). Os validadores assinam blocos e votos com ele; o faucet, as ações de staking e os registros da bridge são assinados com ele. Uma carteira nunca assina uma transação: um bundle se autoriza por meio de sua prova.
Criptografia de notesEncapsulamento de chaves ML-KEM-768 mais ChaCha20-Poly1305. Cada note on-chain é acompanhado por um envelope que apenas o seu dono (e o seu remetente) pode abrir.
HashingBLAKE3 com separação de domínio para endereços, ids de transação, a raiz de estado e todo o resto fora do sistema de provas; Poseidon2 sobre o corpo Goldilocks para notes, nullifiers, a árvore de compromissos e tudo o que está dentro de uma prova.
ProvasUm STARK em lote Plonky3 com FRI de ocultação (80 consultas, blowup 8, 20 bits de proof-of-work). Transparente: sem trusted setup, sem curva de emparelhamento, e a hipótese é uma função hash resistente a colisões.
Computação confidencialO zkVM da Rand, uma máquina RV32IM provada sob esse STARK. Um programa é identificado por um digest dentro do circuito, e o verificador nunca vê uma única palavra de instrução.
ConsensoHotStuff BFT encadeado: quóruns ponderados por stake de mais de dois terços, líderes em rodízio, uma regra de commit de três views consecutivas.
Armazenamento e redeUm RocksDB por nó, com commits sincronizados em disco (fsync) e verificação de integridade na inicialização; libp2p (TCP, Noise, Yamux, gossipsub, Kademlia, mDNS em LANs).

A implementação de referência é randprotocol/fullnode, em Rust: o binário rand-node é o nó, o binário rand é a carteira, e os métodos JSON-RPC têm o prefixo rand_. O explorador é randscan.org.

A testnet: chain 20

A frota pública executa a chain 20, ativa desde 2026-10-01 06:17 UTC no fullnode v0.6.8. As chains 15 a 19 foram aposentadas. Quatro chains foram criadas em quatro dias, cada uma por uma mudança que altera todas as provas ou o formato da transação:

  • A Chain 16 (2026-09-28, fullnode v0.6.1) moveu o zkVM para o conjunto de restrições 7, que oculta o que uma prova costumava revelar sobre pequenas entradas privadas, e ativou as regras hardening_v6.
  • A Chain 17 (2026-09-29, v0.6.3) separou a autorização de uma transferência de sua prova: cada bundle carrega uma segunda prova, pequena, feita com a spend key, de modo que a prova grande possa ser feita por uma máquina que detém apenas uma viewing key.
  • A Chain 18 (2026-09-29, v0.6.7) mede as chamadas confidenciais em gas (conjunto de restrições 8) e ativa o memo criptografado em cada envelope de note.
  • A Chain 20 (2026-10-01, v0.6.8) vincula cada prova e cada mensagem assinada ao hash de gênese, adiciona estado de programa (RPL-2), cobra uma taxa sobre mints e burns da bridge de zUSD e ativa as regras audit-v6 listadas na tabela abaixo.

A chain 19 (2026-10-01 03:43 UTC, v0.6.7) foi um re-genesis da chain 18 sobre o mesmo build e não mudou nenhuma regra. A chain 18 foi parada na altura 143,776, e a chain 19 foi criada a partir de um snapshot na altura 141,935. Sua gênese diferia da gênese da chain 18 apenas no id da chain, no timestamp, nos notes transferidos e na seção da bridge: novos emissores para os endpoints de Ethereum, Binance Smart Chain e Tron, com os contadores de sequência mantidos.

A chain 20 é um hard fork da chain 19: sua gênese foi criada a partir de um snapshot da chain 19 na altura 7,258, a chain 19 foi parada na altura 7,700, e todos os 26 validadores foram reiniciados juntos na chain 20, com as mesmas chaves, ids de peer e nós de bootstrap. A chain 19 e a chain 18 estão aposentadas. Uma carteira precisa da v0.6.8 para enviar na chain 20: as provas e assinaturas de uma carteira mais antiga não carregam o vínculo com a gênese, e a chain as recusa.

Cada uma é uma chain nova. Os saldos de RAND nas carteiras do operador e o zUSD em circulação foram levados para a gênese seguinte, e nada mais: um programa implantado em uma chain não existe na seguinte. É um software experimental: não auditado, e o RAND nele não tem valor.

Os Programas na chain 20 podem manter estado: as células de programa, os cofres de programa (program vaults) e a ação Invoke do RPL-2 estão ativos.

chain id20 (rand_chainId)
genesis hash6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135
arquivo de genesisdeploy/genesis-chain20.json no repositório do fullnode
buildfullnode v0.6.8 (tag c9c9bd3c); um nó informa a própria build em rand_getVersion. Esta build recusa as chains 14 a 17, e uma carteira anterior à v0.6.8 não consegue enviar na chain 20
vínculo com o genesisbinding_domain 1: o vínculo de prova de cada bundle e toda mensagem de ação assinada incluem o hash do genesis, de modo que nada provado ou assinado para uma chain é verificado em outra
marcador de testnettestnet true: o genesis se declara uma rede de teste, o que permite que um faucet funcione ao lado da bridge
validadores26, cada um com stake de 1.000 RAND, o mínimo de staking
quórum18 de 26: estritamente mais de dois terços do stake
intervalo de blocoo padrão --block-interval-ms 1000; cerca de um bloco por segundo
tempo de blocoum timestamp mais de 60 s além do de seu bloco pai é inválido, e um validador não vota em um bloco mais de 15 s à frente do próprio relógio, por isso os validadores executam NTP
janela de provaproof_window_blocks 1.024: a âncora de um bundle deve ser uma das últimas 1.024 raízes de fim de bloco, e seu time não pode ser mais antigo que isso (256 blocos nas chains 18 e 19)
épocas1.000 blocos; um novo bond espera duas épocas extras antes de contar (bond_activation_epochs 2, ativando na época e + 3), e o stake desvinculado é liberado duas épocas depois
stakingos registros são v2 (rand-node register --v2), e uma nova chave só se registra depois que validadores com mais de dois terços do peso a votam (admission_by_vote); o peso de um validador é limitado a 33,33 %; o novo stake que entra em um limite de época é limitado a 25 % do peso ativo (max_stake_entry_bps_per_epoch 2.500); sem slashing
zkVMconjunto de restrições 8, perfil FRI de produção (80 consultas)
guest do bundlehc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: o bundle de ativo oculto de 4 entradas e 4 saídas, versão 3, tier 14
guest de autenticaçãohc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: a autorização de gasto que todo bundle carrega, tier 10
gasuma chamada declara um limite de gas que o circuito impõe e paga gas_price por ele: 100 unidades por gas e 800 unidades por KiB no piso, ambos se movendo a cada bloco rumo a uma meta de 262.144 de gas e 10.485.760 bytes, e nunca acima dos tetos de 10.000 por gas e 80.000 por KiB. Apenas os bytes sobre os quais o preço por byte é cobrado (a prova de uma chamada e seu envelope de entrada) contam para a carga de bytes (byte_load: "paying"), de modo que um bloco de transferências não a eleva. Todo bundle declara o limite fixo 20.479 e paga os 0,001 RAND fixos
estado de programaRPL-2 ativado: células de programa, cofres de programa e Invoke (Action 33); uma célula criada custa 0,01 RAND (cell_fee 10.000.000 unidades); uma invocação lê no máximo 8 células, escreve no máximo 8 e faz no máximo 4 pagamentos (rand_getLimits.program_state)
envelope de noteenvelope_bytes 1860: o envelope de cada note tem 1.860 bytes e carrega um memo criptografado
limite de programamax_program_words 65.535, mas sob hardening_v6 um deploy que nenhuma chamada de tier 14 conseguiria comportar é recusado (ProgramUncallable): 8.180 palavras para um programa sem segmento público
limite de provamax_proof_bytes 4.194.304 (4 MiB); eram 8 MiB nas chains 13 a 16
limite de blocomax_block_bytes 20.971.520 (20 MiB)
limite de envelope de chamadamax_call_envelope_bytes 65.536
entrada pública por programamax_program_public_words 32.768, fixado no deploy
faucetativado, mas apenas para as 16 carteiras da allowlist do genesis (staking.faucet_recipients), e apenas a partir dos 18 validadores que o genesis nomeia como minters (staking.faucet_minters): até 100 RAND por chamada, 10.000 RAND por época no total
computação confidencialativada; a prova de uma chamada é limitada ao tier 14. Os programas não são transferidos por uma troca de chain; os programas de exemplo indicam em qual chain cada um está implantado
tokenso registro RPL está ativado: taxa de registro de 1 RAND, queimada; no máximo 4.096 tokens; todo valor de note abaixo de 2⁶³. O zUSD está listado no genesis no índice 1
bridgeativada: conjunto de guardiões 1 com oito guardiões, oito guardiões PQ Dilithium2, uma chave de pausa, emissores para quatro chains de origem, um limite diário de mint de 100.000 zUSD por lastro e um limite global de 4.000 zUSD por 24 horas contínuas em todos os lastros. O zUSD tem sete lastros; sua oferta é o que estiver bloqueado, lido ao vivo em rand_getTokenSupply. Desde a chain 20, uma taxa de 10 bps é cobrada em cada mint e em cada burn, em zUSD, como uma note para um endereço de tesouraria (bridge.fees): um depósito credita o valor bruto menos a taxa, e um burn libera amount − fee na chain de origem. Uma rotação dos guardiões PQ ou da chave de pausa carrega a assinatura própria de cada nova chave e entra em vigor 86.400 s depois de aceita (bridge.rotation)
histórico24 validadores mantêm 24 horas de blocos (--prune-history 24h) e respondem -32010 abaixo disso; dois nós de arquivo mantêm todos os blocos, e o RPC público https://rpc.randprotocol.org encaminha para um nó de arquivo
agregação de blocosdesativada (nenhuma seção aggregation no genesis; a build se recusa a iniciar com um genesis que tenha uma)
valor do genesis26.000 RAND em stake no registro de validadores mais sete notes de depósito totalizando 5.184,243719258 RAND, trazidas das carteiras do operador na chain 19: 31.184,243719258 RAND, antes dos mints do faucet (rand_getSupply informa genesis_staked e genesis_deposited); mais duas notes de genesis totalizando 99 zUSD, correspondendo aos 99 zUSD bloqueados em seus lastros

Os nós de 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

A chain 20 roda com as chaves de validador que as chains 14 a 19 usaram, portanto estes peer ids não mudaram desde a rotação de chaves da chain 14.

O explorador em randscan.org indexa a chain 20 e serve uma API REST em https://randscan.org/api/v1 (API do explorador). O JSON-RPC do nó completo escuta em 127.0.0.1:8545 por padrão; execute um nó (Executando um nó), use um em que você confie, ou use o endpoint público https://rpc.randprotocol.org (rand --rpc https://rpc.randprotocol.org …). O endpoint público serve tudo de que uma carteira precisa, inclusive a primeira sincronização e o envio de transações, sob um limite de 1.200 leituras e 6 envios por minuto por endereço. Ele não serve o faucet.

Obtendo RAND no faucet

O faucet é um tipo de transação: um validador cunha uma note de valor público para um endereço shielded, e a note só pode ser aberta pelo titular do endereço. Na chain 20 ele paga apenas os 16 endereços da allowlist do genesis: um mint para qualquer outro endereço é recusado com the faucet may not mint to this recipient (not in staking.faucet_recipients), de modo que uma carteira que não esteja nela obtém RAND de teste recebendo um envio. Qualquer um dos três caminhos abaixo pede um mint a um nó validador; os observadores respondem faucet mints are signed by validators; ask a validator node, e o endpoint RPC público não encaminha rand_mint de forma alguma.

Com a carteira rand, apontada para o RPC de um validador:

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> cunha para outro endereço ou um valor menor; 100 RAND é tanto o padrão quanto o limite por chamada. Via JSON-RPC, a mesma requisição é 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"]}'

O resultado é o hash da transação de mint; consulte rand_getTransaction até que ela retorne um bloco. Os valores são strings de unidades, e 1 RAND equivale a 10⁹ unidades. Os aplicativos de carteira têm o mesmo faucet em um toque; envie a partir deles com a Rand Wallet v0.6.8 ou posterior, a primeira versão para a chain 20. A página do faucet deste site recebe pedidos da lista de espera para concessões na devnet.

Um mint tem valor público on-chain: a visibilidade de um salto que qualquer depósito de transparente para shielded tem. O que a note vale, e para quem, depois disso fica oculto como em qualquer outra note.

Para onde ir a seguir

O diretório docs/ do próprio repositório do fullnode é a fonte com a qual estas páginas são conferidas, e os papers trazem o embasamento criptográfico.

Última verificação em relação ao commit c0878c3f do fullnode (chain 21) em 2026-10-12.