Execute um nó Rand
O full node de referência e sua carteira são escritos em Rust e compilados a partir do código-fonte. Resultam dois binários: rand-node, o nó e as ferramentas do operador, e rand, uma carteira que guarda uma chave de gasto blindada, se comunica com qualquer nó por JSON-RPC e executa localmente o prover da zkVM em cada transferência e em cada chamada confidencial. Uma testnet experimental, a chain 21, está no ar com 26 validadores em droplets da DigitalOcean. Ela não foi auditada e não tem valor real. Os binários de ambos para Linux x86_64 estão anexados à release v0.8.0, a versão para a qual a frota foi atualizada.
# 1. Rust (o rustup instala a toolchain 1.98.1 fixada) e as dependências de compilação do RocksDB
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install build-essential clang cmake pkg-config libssl-dev # Linux
# 2. Clone e compile (10–20 min na primeira vez)
git clone https://github.com/randprotocol/fullnode.git
cd fullnode
cargo build --release # target/release/rand-node, target/release/rand
# 3. Uma chain de dois validadores nesta máquina (RPC em 8545 e 8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
# 4. Testes; em release porque a prova STARK é lenta em debug (678 testes, cerca de 43 minutos, medidos em 2026-09-14)
cargo test --workspace --release
# A versão v0.8.0 (c0878c3f) executa a chain 21, e nenhuma versão anterior o faz: a chain 21 executa o conjunto de restrições 9, cujas chaves do verificador e cuja codificação de provas nenhuma versão mais antiga contém. Compile a partir da tag, ou em Linux x86_64
# use os binários da release e confira-os com o SHA256SUMS publicado junto a ela
git checkout v0.8.0 && cargo build --release
curl -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand-node -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand \
-LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/msauth-vk-production.bin# a chave fixada do verificador multisig: o rand-node a carrega a partir do diretório do seu binário e se recusa a iniciar sem ela
sha256sum rand-node rand msauth-vk-production.bin # deve imprimir os valores da versão (SHA256SUMS, assinado como SHA256SUMS.sig):
# 324a4ab1029d39e67fc2de36b036341b0f88f13089997d7fe24c596363a58278 rand-node
# e3a38e74ee28743a960fc1c3eb1ac6c538e18dc259411e10afff7f54e268bbf4 rand
# 68facb06c7f321aaf1d4d541acf6b5c0e9d7f17788ed1c9add6c5a8a8f7acd30 msauth-vk-production.bin
# A identidade do seu nó: a chave de validador Dilithium2 e o peer id p2p em um único arquivo. Gere a sua própria
# e mantenha-a fora do checkout; o repositório não rastreia mais nenhuma chave
rand-node keygen --out node.key.json
# O genesis acompanha o repositório; todo nó deve conter o arquivo idêntico.
# o init imprime o seu hash, que deve coincidir com o abaixo
rand-node init --datadir ./data --genesis deploy/genesis-chain21.json
# Conecte-se aos validadores públicos (a chain 21 manteve as chaves da chain 14, portanto seus peer ids e IPs).
# Omita --validator: a sua chave não está no conjunto de validadores. Um validador também precisa de NTP
rand-node run --datadir ./data --key node.key.json \
--listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns \
--bootstrap /ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe \
--bootstrap /ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw \
--bootstrap /ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
# Uma carteira é uma chave separada e protegida (shielded). O seu endereço rand1… tem cerca de 1,6 KB de texto
rand keygen && rand address
# Uma emissão do faucet é assinada por um validador, portanto exige o RPC de um validador: funciona na
# chain local de dois validadores tal como está; um observador responde "ask a validator node". Na chain 21
# o faucet emite apenas para as 16 carteiras que o seu genesis inclui na lista de permissão, e apenas a partir dos validadores que ele nomeia
rand faucet # 100 RAND em uma nota que só você pode abrir
rand balance # varre a árvore com a sua chave; mais ninguém pode
rand send <rand1 address> 1.5 # pede confirmação, gera a prova (~2 min), aguarda o commit
# Monte um guest embutido: pague o excedente acima de 1000 se quatro saldos privados o cobrirem
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json # imprime o id do programa (seu hash de conteúdo)
# Prove localmente; só a prova, oito palavras de saída e uma transcrição de entrada selada vão para a chain
rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx> # saídas [1, 0, 25, 0, ...]: o excedente, publicado como dado
# Depois, abra a transcrição e confira-a com o H_IN que a prova publicou
rand open-call <tx> # entradas: [400, 250, 300, 75] — veredito: faithful
Requisitos
- SO
- Linux x86_64 ou macOS arm64
- Rust
- 1.98.1, fixado pelo rust-toolchain.toml; o rustup o instala
- Dependências de compilação
- Compilador C++, cmake, pkg-config, headers do OpenSSL (RocksDB)
- Primeira compilação
- 10 a 20 minutos: RocksDB e Plonky3 a partir do código-fonte
- Portas
- TCP 30303 de entrada em nós públicos; RPC em 127.0.0.1:8545
- Servidor
- Uma instância de nuvem com 1 a 2 vCPU executa um validador da testnet
- Relógio
- NTP (chrony) em um validador: ele retém o voto em um bloco que esteja mais de 15 s à frente do seu próprio relógio, de modo que um relógio atrasado deixa de votar sem aviso
- Prova
- Hoje apenas em CPU: uma transferência blindada leva cerca de dois minutos em um laptop (uma prova de autorização de 7 s e uma prova de pacote de cerca de 110 s) e cerca de 6 GB de memória; uma chamada pequena acrescenta cerca de 30 s
Escolha uma função
- Observador aberta a qualquer pessoa
O mesmo binário, sem --validator. Sincroniza a chain, verifica cada certificado e cada prova de pacote e de chamada, reexecuta cada bloco, compara os recibos e atende JSON-RPC. É isso que uma chave nova executa na testnet pública.
- Validador com bond
Vota e propõe sob o HotStuff encadeado. Na chain 21, como na chain 20, um novo validador é admitido primeiro por votação: validadores que detêm mais de dois terços do stake assinam uma ação AdmitValidator para a sua chave. Em seguida, ele registra a chave do nó (rand-node register --v2), vincula (bond) pelo menos 1.000 RAND a partir de uma carteira e entra no conjunto na terceira fronteira de época de 1.000 blocos após o bond (o atraso de bond de duas épocas da chain 18). A chain 18 partiu de 26 validadores com 1.000 RAND cada; mais de dois terços do stake, 18 de 26, precisam estar online e votando para que haja commit. Gere a sua própria chave: nenhuma chave de validador é mais mantida no repositório, e os arquivos de chave versionados para chains anteriores são seeds publicadas.
- Carteira e prover local
O cliente rand guarda uma chave de gasto de 256 bits e não assina nada: duas provas são a autorização, uma pequena feita com a chave de gasto e a prova de pacote de 4 entradas e 4 saídas. Ele varre a árvore em busca das suas próprias notas, gera ambas as provas na sua máquina, com o mesmo formato para RAND e para qualquer token RPL, e, em uma chamada confidencial, prova também o programa. Só provas, compromissos, nullifiers e envelopes selados chegam à chain.
Não vai executar um nó? A mesma carteira está disponível como app para iOS, Android, Chrome e Firefox: Carteiras.
Todo nó verifica tudo
Um nó que sincroniza reverifica cada certificado, reexecuta cada bloco, incluindo as suas provas, e compara os recibos antes de aceitar. Na inicialização, verifica o próprio banco de dados, trunca o que estiver inconsistente preservando o seu estado de segurança de voto e busca de novo nos pares o trecho que faltou.
# Nó parado: hashes, QCs, assinaturas, provas, replay
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair
Testes de falha rodam na testnet ativa
- ›Pare um de quatro validadores: a chain continua fazendo commit e o nó se atualiza em segundos quando volta.
- ›Pare dois de quatro: a chain para sem quórum e retoma sem fork quando eles voltam.
- ›Corrompa o banco de dados de um nó: detectado na inicialização, truncado, ressincronizado a partir dos pares e idêntico byte a byte depois.
- ›Transferências por nós diferentes: todas confirmadas, saldos idênticos em toda parte, oferta inalterada.
- ›Um vínculo com um par que caiu é restabelecido pela lógica de rediscagem em cerca de 30 segundos.
Ainda não implementado
Listado para que a distância entre o paper e o nó fique legível, e não deduzida.
- ›Estado persistente por programa e chamadas entre programas
- ›Um compilador na própria carteira: um programa é um guest montado integrado ou uma imagem construída com a toolchain rand-guest separada
- ›Slashing e jailing, recompensas de bloco, mercados de taxas, o farol de líder por hash-sortition
- ›Um acumulador de nullifiers, poda de provas após a finalidade, agrupamento de provas em lote
- ›Uma prova de tier 20 da transferência do SPL Token e o mercado de provers em GPU do paper