Rand Protocol
Documentação
Guias

Executar um validator e um aggregator

Hardware para cada função na Rand: o que um validator, um observer, um prover e um aggregator fazem, a RAM, a CPU e o disco de que cada um precisa, os tamanhos da DigitalOcean em que a testnet funciona, os limites medidos de memória de prova e os comandos de configuração.

Use esta página para dimensionar uma máquina antes de executar uma. Um validador é barato. Provar não é: a memória de uma prova cresce de forma acentuada com o seu tier, e é o único número que decide se uma máquina consegue fazer o trabalho. Todos os valores aqui são medições da testnet ou dos registros do fullnode. Os valores que ainda não são definitivos estão marcados.

O que cada função faz

funçãoo que fazexecutaprova?
validadorordena as transações, verifica todas as provas de todos os blocos, vota no HotStuffrand-node run --validatornão
observadorsincroniza, reverifica todas as provas, serve JSON-RPC; sem votorand-node runnão
provador (uma carteira)prova localmente os próprios bundles e chamadas, e depois os enviarand send, rand call, rand program deploysim, toda transação
provador delegadoproduz a prova do bundle de uma carteira pareada com ele; na chain 20 recebe a viewing key dessa carteira, nunca a chave de gastorand-prover run, ou rand-node run --proversim, apenas provas de bundle
agregadorproduz uma prova recursiva sobre uma janela de provas de bundle, para um bloco de selagemrand-node aggregate --watchsim, as maiores provas
host de buildcompila rand-node e rand e entrega os binários a nós pequenoscargo build --releasenão

Validadores e observadores nunca provam. Uma transferência shielded ou uma chamada é provada pela carteira que a envia ou, no caso da prova do bundle apenas, por um provador ao qual essa carteira está pareada (Running a node). Os validadores da frota não provam nada hoje.

A agregação de blocos está construída, mas não está ativa. Ela exige uma seção aggregation no genesis. A chain 20 não tem nenhuma: a agregação está desligada, como nas chains 9 a 19, e o build se recusa a iniciar com um genesis que contenha a seção.

Dimensionamento em resumo

funçãoRAMCPUdisco
validador ou observador2 GB (a frota original); um validador também precisa de um relógio sincronizado (relógio)1 vCPU (a maior parte da frota original)com --prune-history 24h, cerca de um dia de blocos: tabelas de blocos de 3,3–4,4 GB medidas na chain 14; mantenha mais de 4 GB livres (disco)
arquivo (histórico completo)como um validadorcomo um validadorcresce com a chain: cerca de 3,6 GB por dia medidos na chain 14, com QCs de 18 assinaturas e blocos de 1,4 s; mais nas chains 18 a 20, cujos QCs carregam até 26 assinaturas, o que não foi remedido; os dois arquivos da testnet ficam em volumes de 250 GiB
host de build8 GB (nó E)4 vCPU (nó E)a árvore de código-fonte, target/ e pelo menos 20 GB livres
provador, transferência shielded (tier 14)pico de 6,1 GB para uma transferência na chain 18, de 6,1 a 6,6 GB para uma chamada com o bundle que a paga (2026-09-30)um núcleo; na chain 18 são duas provas, a prova do bundle de tier 14 em 102 a 134 s e a prova de autorização de tier 10 em 7 a 23 s (laptop Apple Silicon, 2026-09-30); cerca de 100 s só para o bundle de ativo oculto 4 entradas e 4 saídas na chain 14; 92,2–96,0 s medidos em um laptop para o bundle 2 entradas e 2 saídas da chain 13 (produção, 2026-09-19)pequeno
provador delegado5,74 GB para cada prova que executa ao mesmo tempo, mais 1 GiB de folga; recusa-se a iniciar com menos disponívelum núcleo por provapequeno
provador, chamada de tier 18 (o ERC-20; recusada na chain desde a v0.5.6, veja Proving memory)85,0 GB (transfer traduzido) / 85,5 GB (interpretado), medidos em m-16vcpu-128gbum núcleopequeno
provador, chamada de tier 20 (SPL Token; recusada na chain desde a v0.5.6)ainda não provada; extrapolada em cerca de 330 GB, mais do que o maior droplet de memória da DigitalOcean (m-32vcpu-256gb, 256 GB)um núcleopequeno
agregador, N = 1pelo menos 64 GB era o limite antes das execuções de 2026-09-28/29; veja AggregatorsCPU hojecomo um validador
agregador, N = 2 / N = 3133 GB / 221 GB medidos sob o constraint set 7 (2026-09-28/29)um nó com GPU para produção com N ≥ 2como um validador

O provador é single-threaded hoje. Um droplet de 16 vCPU rodou a 99% de um núcleo. Mais núcleos não tornam uma prova mais rápida; mais RAM decide se ela termina.

Validadores e observadores

Memória e CPU

Os dezoito validadores originais rodam em droplets de 2 GB. Verificar uma prova é barato:

operaçãocusto
verificar uma prova de bundle, verifier key aquecidacerca de 16 ms
a primeira verificação em um novo formatocerca de 230 ms
construir a verifier key de um programa implantado (uma vez, em segundo plano)cerca de 7 s em um servidor de 2 vCPU
verificar uma prova agregada (quando a agregação está ativa)cerca de 0,8 s a frio, cerca de 16 ms aquecida (valores de projeto)

A memória de que um validador precisa para verificar uma prova de chamada de tier 18 ou tier 20 está agora parcialmente medida, em um laptop Apple Silicon de 48 GB, independentemente do droplet da DigitalOcean que produziu cada prova: verificar a prova do transfer de tier 18 levou 50,2 s com pico de 3,66 GB de RSS (traduzido) ou 49,6 s (interpretador, RSS não registrado separadamente); verificar a prova do approve de tier 16 levou 12,2 s (RSS não registrado separadamente). O tier 20 não foi medido — ainda não existe prova de tier 20 para verificar. Desde a v0.5.6 um validador nunca constrói uma key desse tamanho: o cabeçalho da prova de uma chamada é verificado antes de qualquer verifier key ser construída, e uma chamada acima do tier 14 (ou com uma tabela keccak acima de 2^12, ou uma tabela sha256 acima de 2^13) é recusada, na admissão e como regra de validade de bloco. O pior cabeçalho de chamada admissível levou 4,7 s e 312 MB para verificar.

Um droplet de 1 vCPU e 2 GB não consegue compilar os binários. Compile em uma máquina maior e copie-os (veja configuração).

Disco

valormedidafonte
um bloco ocioso da chain 14, antes da v0.5.5cerca de 60 KB em blocks mais cerca de 49 KB em qcs: o QC Dilithium2 de 18 assinaturas armazenado duas vezes, cerca de 6,6 GB por dia com blocos de 1,4 so incidente de disco de 2026-09-24, AGENTS.md
o mesmo bloco desde a v0.5.5cerca de 60 KB: o QC de um bloco confirmado é armazenado uma vez, no justify do bloco filho; cerca de 3,6 GB por dia com blocos de 1,4 sdocs/deploy.md, nota de roll da v0.5.5
write-ahead log do RocksDBlimitado a 256 MB desde a correção de 2026-09-24; antes dela, 13 GB de log não descartado por validadorAGENTS.md
um validador da chain 14 depois de --prune-history 24h esgotado (2026-09-25)tabelas de blocos de 3,3–4,4 GB, a partir de 19 GB; discos com 18–37% de usoAGENTS.md, v0.5.7
diretório de dados do nó A, chain 12 na altura 62.276cerca de 10 GBdeploy/README.md, o rollout da v0.3
uma chain que roda blocos cheios4 MiB a cada 2 s, cerca de 170 GB por dia (o limite de bloco das chains até a 12; o da chain 20 é de 20 MiB)docs/block-space.md
espaço livre que a frota mantém para buildspelo menos 20 GBdocs/block-space.md
um disco de 30 GB com os diretórios de dados de três chainscheio; RocksDB No space left on device, crash loopmkc1 e mem1, deploy/README.md

Na chain 20, como na chain 19, 24 dos 26 validadores rodam com --prune-history 24h e mantêm cerca de um dia de blocos; o próprio ledger (notes, nullifiers, anchors, o registro) nunca é podado. Os arquivos, obs1 e rand-archive-2 (ambos também validadores), rodam sem a flag. Um nó da mainnet nunca a utiliza. O nó se recusa a iniciar com menos de --min-free-disk-mb (1.024 MB por padrão) livres no sistema de arquivos do seu diretório de dados, e rand_getHealth responde disk_low abaixo de quatro vezes esse valor; um roll que espera por ok para em um nó que está enchendo. Veja History pruning para saber o que um nó podado ainda responde.

Apague o diretório de dados de uma chain desativada após uma transição. Os diretórios de dados são identificados pelo hash do genesis (data-<name>-<hash8>: -6210cf07 para a chain 20, -a3defc93 para a chain 19; os seis hosts guardiões usam /var/lib/randnode/data-20), portanto os antigos permanecem até que você os remova. Na transição para a chain 20, um validador regional (syd1) iniciou com disk_low, com 3,9 GB livres, e manteve a partida em 25 de 26, porque os diretórios das chains 14 a 17 ainda estavam nele; apagá-los liberou 22 GB. Mantenha o diretório da chain anterior por um dia como alvo de rollback e depois remova-o. Com blocos cheios, cada prova bruta de bundle tem cerca de 1,42 MB desde a chain 14 (cerca de 1,3 MB até a chain 13). Desde a chain 17, todo bundle também carrega uma prova de autorização, de modo que uma transferência tem cerca de 2,85 MB de provas: cerca de 1,49 MB da prova do bundle e 1,36 MB da prova de autorização (perfil de produção, medido em 2026-09-29). A agregação, quando ativa, reduz a prova de um bundle selado a cerca de 3 KB, a menos que o nó seja executado com --keep-raw-proofs. Ela não cobre a prova de autorização, que permanece com o tamanho integral.

Rede

Abra a porta TCP 30303 de entrada em um nó público. Nós atrás de NAT se conectam de saída com --bootstrap. Com blocos cheios de 4 MiB, o link de um validador transporta cerca de 2 MB/s.

Relógio

Um validador precisa de NTP. A chain 14 é a primeira chain em que o horário de relógio faz parte do consenso (endurecimento da ponte B2):

regralimitetipo
o timestamp de um bloco não pode ultrapassar o do bloco pai em mais do que isto60 s (MAX_TIMESTAMP_STEP_MS)regra de validade; o bloco é inválido (BlockError::TimestampLeap)
um validador não vota em um bloco cujo timestamp esteja adiantado em relação ao seu próprio relógio por mais do que isto15 s (MAX_CLOCK_DRIFT_MS)regra de voto

Um validador cujo relógio esteja 20 s atrasado deixa de votar silenciosamente: ele vê todo bloco honesto como adiantado em relação ao seu relógio e retém o voto, e nada falha. Na chain 20, dezoito dos vinte e seis precisam votar para que qualquer coisa seja confirmada. Verifique todos os validadores e instale o chrony onde o relógio não estiver sincronizado:

timedatectl                     # want "System clock synchronized: yes" and "NTP service: active"
chronyc tracking 2>/dev/null || timedatectl show-timesync --all 2>/dev/null
apt-get install -y chrony && systemctl enable --now chrony

O mesmo limite de 15 s se aplica a um genesis. Defina timestamp_ms próximo ao horário de lançamento e nunca à frente dele: um genesis mais de 15 s no futuro não confirma o bloco 1 até que o horário real o alcance, e um genesis muito no passado deixa o horário do bloco atrás do relógio real, recuperando-se no máximo 60 s por bloco (docs/deploy.md). Um observador não vota, portanto a regra de voto não o limita.

Tamanhos do DigitalOcean em que a testnet é executada

tamanhoRAM, vCPU, disconósobservações
s-1vcpu-2gb2 GB, 1a maioria dos validadores regionais (ams3, nyc1, nyc2, sfo2, entre eles)não consegue compilar; os binários são copiados
s-1vcpu-2gb-amd2 GB, 1atl1como acima
s-2vcpu-2gb-intel2 GB, 2D (ric1)
s5-1vcpu-2gb-30gb2 GB, 1, 30 GBmkc1, mem1 (o único tamanho pequeno ali)os discos estavam cheios (29 GB) na transição da chain 13; 7 GB livres depois que os diretórios de dados da chain 11, já morta, foram apagados; precisam de redimensionamento
4 vCPU, 8 GB8 GB, 4E (sgp1)validador, host de compilação e explorer

Esta tabela cobre os dezoito validadores originais. Desde 2026-09-27, o validador A também é executado em um droplet (sgp1), não em um laptop. Mais oito validadores foram vinculados com bond na chain 15 (2026-09-27): os dois arquivos, obs1 e rand-archive-2 (fra1), e os seis hosts guardiões. Os tamanhos de seus droplets não estão registrados aqui, nem se mkc1 e mem1 foram redimensionados. Todos os 26 são validadores de genesis na chain 20, como na chain 19, com 1.000 RAND cada, e, em 2026-09-30, as 26 chaves estão em poder de um único operador.

Memória de prova

A carteira gera a prova de cada transação que envia, portanto quem chama um programa precisa da memória correspondente ao tier desse programa. Estes são os limites medidos. As execuções do tier 18 terminaram, geraram prova e foram verificadas no DigitalOcean; o tier 20 não. Desde a v0.5.6, a chain recusa uma prova de chamada acima do tier 14 (MAX_CALL_TIER); portanto, as linhas dos tiers 16, 18 e 20 abaixo são medições, não chamadas que a chain 20 admite; toda chamada confirmada na chain 14 era de tier 10.

cargatiercicloso que foi medidorequer
transferência shielded (o guest bundle)14cerca de 9.160 na chain 13 (o guest de 2 entradas e 2 saídas)92,2–96,0 s em um laptop Apple Silicon (produção, chain 13, 2026-09-19); pico de memória não registrado. O guest de ativo oculto de 4 entradas e 4 saídas da chain 14 está fixado no mesmo tier: cerca de 100 s e uma prova de cerca de 1,42 MB. Na chain 20, uma transferência são duas provas (autorização dividida, desde a chain 17): a prova do bundle de tier 14, de 102 a 134 s e cerca de 1,49 MB, e uma prova de autorização de tier 10, de 7 a 23 s e cerca de 1,36 MB. Pico de memória de 6,1 a 6,6 GB para uma transação inteira (laptop Apple Silicon, chain 18, 2026-09-30)roda no laptop de desenvolvimento
approve de ERC-20 (produção, na chain 13, 2026-09-19)1648.119prova de chamada 388,7 s, 3.412.405 bytes; o rand call inteiro 622,8 s com 22,9 GB de RSS de pico em um laptop M-series de 48 GBum laptop de 48 GB
chamadas ERC-2018cerca de 66 mil a 162 milo transfer do primeiro estágio (79.203 ciclos, antes da proteção de código) recebeu SIGKILL em um laptop de 48 GB, com 24,7 GB, após 1.016 s; uma execução em um droplet de 64 GB passou de 47 GB aos 25 minutos85,0 GB (traduzido) / 85,5 GB (interpretado) de RSS de pico, 3.230,5 s / 3.143,3 s de tempo de prova, provas de 811.600 / 805.108 bytes. Medido em m-16vcpu-128gb, 2026-09-19
vetores SPL Token20cerca de 700 mil a 770 milo Transfer traduzido (692.854 ciclos, antes da proteção de ELF) foi interrompido em um laptop de 48 GB, com 30,77 GB, após 225 s, ainda em prova; uma execução de tier 20 foi encerrada por OOM em um droplet de 64 GB, com 65,1 GB, após 10 min 41 sainda não provado; extrapolado em cerca de 330 GB e cerca de 3,6 h (escala medida nos tiers 16/18: memória cerca de ×3,9, tempo cerca de ×4,1 a cada +2 tiers) — mais do que o maior droplet de memória do DigitalOcean (m-32vcpu-256gb, 256 GB)
saída de produção rVM de tier 21 (uma prova de bundle verificada dentro da VM de recursão)211.968.619 linhasrequisito derivado de 48,6 GB antes de ser executado; sob o constraint set 7, precisou de mais do que um droplet de 256 GB tinha (2026-09-28/29)mais de 256 GB; não medido novamente sob o constraint set 8

As chamadas ERC-20 caem nos tiers 16 e 18, e o SPL Token no tier 20 (Ethereum, Solana). Nenhuma prova de tier 18 ou 20 foi gerada em uma máquina de 48 GB.

Agregadores

Um agregador observa a chain, reúne as provas de bundle de uma janela de blocos finalizados, gera uma prova agregada recursiva sobre elas e a submete. O bloco que a inclui é um bloco de selagem. O agregador recebe a parcela de prova dos bundles cobertos mais um subsídio de bloco em novos RAND, em seu endereço de pagamento registrado. A agregação é sem permissão: qualquer operador com um bond pode se registrar.

Ela só existe em uma chain cujo genesis tenha uma seção aggregation. A chain 20 não tem nenhuma, e sua compilação se recusa a iniciar com um genesis que tenha uma.

Hardware

agregadoRAM do hostbackend
N = 1 bundlepelo menos 64 GBCPU; o perfil de teste gerou uma em cerca de 26 minutos em um laptop sob carga (327.035 bytes)
N = 2133 GB medidos; o limite anterior era de pelo menos 128 GBo backend de GPU para produção
N = 3221 GB medidos; o limite anterior era de pelo menos 160 GBo backend de GPU para produção
o nó de GPU da frotapelo menos 160 GB de host, um dispositivo de 80 GB (H100 ou A100-80G)Linux, driver R580+, CUDA 13, LLVM 21, sm_80+; ainda não existe nenhum

Os valores de N = 2 e N = 3 foram medidos em um droplet DigitalOcean de 256 GB em 2026-09-28/29, sob o constraint set 7, e a prova de saída de produção precisou de mais do que os 256 GB dessa máquina. Nenhum foi medido novamente sob o constraint set 8, que as chains 18 a 20 executam; portanto, trate a linha de N = 1 como um limite inferior. O backend CUDA rodou pela primeira vez em hardware real em 2026-09-28, em uma NVIDIA H100: seus kernels são compilados para PTX em sm_80 e sm_90 e coincidem com a referência de CPU. A medição de produção em um nó de GPU da frota ainda está por fazer. Todo nó também paga uma construção de chave de inicialização única para o programa de agregação: 13,0 a 13,4 s no perfil de teste (2¹⁹) e, esperados, 30 a 70 s em produção (2²¹).

Comandos

# print a signed registration; the bond burns out of a wallet bundle as the register bundle's burn
rand-node aggregator register --key agg.key.json --bond <RAND> --payout rand1… --rpc http://127.0.0.1:8545

# the daemon: poll rand_getUnsealed, fetch the raw bundles, prove, seal the payment note, submit
rand-node aggregate --key agg.key.json --rpc http://127.0.0.1:8545 --watch

# leave, then withdraw the released bond into a note at the payout address
rand-node aggregator unbond --key agg.key.json --rpc http://127.0.0.1:8545
rand-node aggregator withdraw --key agg.key.json --rpc http://127.0.0.1:8545
flag de aggregatepadrãosignificado
--keyobrigatóriaa chave de agregador que o registro conhece; assina cada agregação
--rpchttp://127.0.0.1:8545o nó a consultar e ao qual enviar
--watchdesligadacontinua consultando em vez de enviar uma única vez
--interval-secs15intervalo de consulta com --watch
--no-waitdesligadaretorna assim que o nó aceita a agregação

rand status mostra uma seção aggregation em uma chain desse tipo: agregadores registrados, blocos não selados e o índice do cronograma de subsídio. rand_getUnsealed é a lista de trabalho.

Configuração

Estes passos seguem os scripts que a testnet usa (deploy/vps-setup.sh, deploy/update-droplet.sh). Eles produzem um validador ou um observador Linux.

1. Compilar em uma máquina de build

A compilação exige build-essential clang cmake pkg-config libssl-dev, Rust 1.98.1 (fixado por rust-toolchain.toml) e um checkout de circuits ao lado do checkout do fullnode. A primeira compilação leva de 10 a 20 minutos.

git clone https://github.com/randprotocol/fullnode
git clone https://github.com/randprotocol/zkp-circuits circuits
cd fullnode
git checkout v0.6.8                       # c9c9bd3c, the build chain 20 runs
git -C ../circuits checkout "$(sed -n 's/^circuits: //p' crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"   # aeacf31 for v0.6.8
git show origin/main:deploy/genesis-chain20.json > deploy/genesis-chain20.json   # committed after the tag
cargo build --release -p randprotocol-node -p randprotocol-client
sha256sum target/release/rand-node         # compare on every node you copy it to

A chain 20 exige a v0.6.8 em todos os nós antes do init. Seu genesis traz campos que nenhuma compilação anterior lê (testnet, binding_domain, proof_window_blocks, program_state, os grupos rotation e fees da bridge, os tetos de gas, a admissão de staking por voto), e a v0.6.8 traz as mudanças de consenso CON-4 e CH-1 da auditoria v6. As provas continuam sendo feitas sob o conjunto de restrições 8, como nas chains 18 e 19, com uma prova de autorização ao lado de cada prova de bundle (hc_auth). Uma compilação v0.6.8 recusa o genesis das chains 14 a 17 em run e verify. Execute a mesma compilação que a frota executa. O arquivo de genesis está no main do fullnode (commit 74cfaca0), não na tag v0.6.8, daí a terceira linha git. O checkout de circuits deve estar no commit a partir do qual a release foi vendorizada, que a segunda linha git acima lê da árvore do fullnode. Acrescente -p randprotocol-prover para compilar também o rand-prover.

2. Instalar os binários no nó

scp target/release/rand-node target/release/rand deploy/genesis-chain20.json root@<node>:/root/
ssh root@<node> 'install -m 755 /root/rand-node /root/rand /usr/local/bin/'

3. Chave, genesis, firewall

No nó:

install -d -m 700 /root/keys
test -e /root/keys/node.key.json || rand-node keygen --out /root/keys/node.key.json   # prints the address; keep the seed secret
rand-node init --datadir /root/data-6210cf07 --genesis /root/genesis-chain20.json
timedatectl                                        # "System clock synchronized: yes" (see Clock)
ufw allow 22/tcp && ufw allow 30303/tcp && ufw enable

Gere a chave no nó, como acima, e mantenha-a fora de qualquer checkout. Nenhuma chave é mais versionada no repositório do fullnode (auditoria v3, OPS-1). Os arquivos deploy/node-*.key.json commitados para as chains 8 a 13 são seeds publicadas; as chaves de validador da chain 20 (as dezoito geradas para a chain 14 e as oito vinculadas na chain 15) foram geradas fora do repositório, e a frota guarda a chave de cada droplet em /root/keys/node-<name>.key.json, fora da árvore de código-fonte. O local importa em um nó provisionado pelos scripts da frota: deploy/rebuild-vps.sh e deploy/push-to-vps.sh sincronizam /root/fullnode com rsync usando --delete, de modo que uma chave mantida dentro dessa árvore é apagada pela próxima reconstrução e a unit então falha ao reiniciar. Desde a v0.6.8, keygen se recusa a sobrescrever um arquivo existente (a v0.6.7 o sobrescrevia sem perguntar); o test -e mantém a linha segura para reexecução em ambos os casos. Faça o backup da chave fora do host antes de vinculá-la.

init imprime o hash do genesis. Ele deve ser 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 (chain 20). O arquivo de genesis é genesis-chain20.json, em deploy/ no main do repositório do fullnode. Nomeie o diretório de dados com os oito primeiros caracteres do hash, como a frota faz (data-<name>-6210cf07), para que nunca colida com o da chain 19 (-a3defc93) nem com o de uma chain posterior. O genesis define estes limites. O limite de prova era de 8 MiB nas chains 13 a 16 e é de 4 MiB desde a chain 17, quando uma transação passou a carregar até três provas:

limitechain 20
max_program_words65.535
max_proof_bytes4.194.304 (4 MiB)
max_block_bytes20.971.520 (20 MiB)
max_call_envelope_bytes65.536
max_program_public_words32.768
envelope_bytes1.860 (cada envelope de note, com seu campo de memo cifrado)
proof_window_blocks1.024 (256 na chain 19)
program_statetaxa de célula de 0,1 RAND (10.000.000 unidades); no máximo 8 leituras, 8 escritas e 4 pagamentos por invoke
seção aggregationnenhuma (agregação desligada)

O genesis da chain 20 também traz consensus_domain: 1, binding_domain: 1, testnet: true, uma seção staking com admissão por voto, uma seção gas com tetos de preço, os grupos rotation e fees da bridge, hardening_v6 e os dois pins de guest hc_bundle e hc_auth; Executando um nó lista o que eles definem.

4. Uma unit do systemd

Esta é a unit que deploy/vps-setup.sh escreve, com os caminhos acima:

[Unit]
Description=RAND full node
After=network-online.target
[Service]
Environment=RUST_LOG=info,libp2p=warn,libp2p_mdns=off
ExecStart=/usr/local/bin/rand-node run --datadir /root/data-6210cf07 --key /root/keys/node.key.json --validator --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns --prune-history 24h --bootstrap <multiaddr> --bootstrap <multiaddr>
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target

Remova --validator para um observador. --prune-history 24h é o que os validadores da testnet executam, exceto os arquivos; remova-o para um nó que mantém o histórico completo, e nunca o passe na mainnet. Os multiaddrs de bootstrap da chain 20 são os nós C (fra1), D (ric1) e E (sgp1), inalterados desde a chain 19. A chain 20 roda com as chaves de validador geradas para a chain 14, e uma identidade p2p é derivada da chave do validador, de modo que estes peer ids são os que a chain 14 usava. Um novo nó que sincroniza desde o genesis também precisa de um peer com histórico completo; portanto, acrescente um dos dois arquivos (obs1, depois rand-archive-2):

/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
/ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf
/ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh

Mantenha o RPC em 127.0.0.1, a menos que um firewall o proteja. Um nó que deva atender ao público abre ao lado dele o listener público da v0.6.8 (--public-rpc <ADDR>) e coloca um proxy na frente dele, nunca na frente de --rpc (JSON-RPC). Uma unit herdada da v0.6.7 não deve passar --prover-accept-spend-key, que a v0.6.8 recusa na inicialização.

systemctl daemon-reload && systemctl enable --now rand-node
journalctl -u rand-node -f
rand status                       # height climbing, peer_count rising

5. Entrar no conjunto de validadores

Uma chave nova não pertence ao conjunto de nenhuma época. Na chain 20, ela precisa primeiro ser aprovada por voto: o genesis define staking.admission_by_vote, de modo que validadores que detêm mais de dois terços do peso de voto assinam, cada um, com rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash <chain 20's hash>, e um deles envia os votos com rand-node admit submit; rand_getAdmitted então a lista. Depois, vincule ao menos 1.000 RAND a ela: imprima um registro com rand-node register --key /root/keys/node.key.json --payout rand1… --v2 (a chain 20 recusa um registro v1) e, então, faça o bond a partir de uma carteira com rand bond <address> 1000 --registration <hex>. O bond aguarda sua época de ativação, no mínimo três fronteiras de 1.000 blocos depois de sua confirmação, e no máximo 2.500 bps do peso ativo se tornam peso novo por fronteira (a chain 19 o limitava a 10.000 RAND fixos). Staking percorre o processo.

6. Atualização

Isto vale para uma compilação que roda a mesma chain. Passar de uma chain anterior para a chain 20 não é uma atualização: exige o novo binário, o novo genesis e um diretório de dados novo, e o diretório de dados da chain antiga pode ser apagado depois (deploy/retire-chain-dirs.sh; a frota o mantém por um dia para rollback). Para distribuir uma nova compilação sem um corte de chain, compile uma vez, compare o sha256 de rand-node e de rand, pare o serviço, instale e reinicie, um nó de cada vez. Algumas releases são distribuídas com parada total e início total (a regra de call-tier da v0.5.6, a mudança de wire de Status da v0.5.7, a verificação de provas mais estrita da v0.6); as notas de cada release dizem qual. A v0.6.7 foi distribuída na chain 18 um nó de cada vez; a v0.6.8 veio com a chain 20, com parada total e início total, porque suas mudanças de consenso CON-4 e CH-1 nunca devem ser distribuídas nó a nó. Espere cada nó voltar ao conjunto antes do próximo, para que o quórum nunca fique desfalcado em mais de um. deploy/update-droplet.sh <ip> [build-host] faz exatamente isso por SSH.

As releases até a v0.6.8 foram compiladas à mão em um único host e não são assinadas. A release v0.6.8 no GitHub traz rand-node, rand, rand-prover e SHA256SUMS, compilados no nó E; esse checksum detecta um download corrompido e não atesta a máquina de build. A v0.6.8 inclui um workflow de release que compila os binários a partir da tag, e deploy/update-droplet.sh recusa uma instalação sem um SHA256SUMS assinado, a menos que ALLOW_UNSIGNED=1 esteja definido. deploy/release-signers ainda não lista nenhuma chave, de modo que o caminho assinado não foi usado.

As chains 15, 16, 17 e 18 entraram no ar em 2,7 dias (de 2026-09-26 a 2026-09-29), cada uma com parada total da frota. A chain 19 veio em 2026-10-01 às 03:43 UTC, um re-genesis da chain 18 na mesma compilação, e a chain 20 no mesmo dia às 06:17 UTC, cortada de um snapshot da chain 19 no hard fork da v0.6.8; todos os nós pararam na altura 7.700 da chain 19. Uma política escrita de cortes (2026-09-30) vale a partir da chain 20; o registro de corte da chain 20 dispensou a reconstrução pelo segundo operador, porque um único operador detém todas as chaves. Um corte exige um motivo que uma atualização gradual não possa atender, uma lista publicada do que ele traz e do que descarta, uma lista de verificação de reconstrução dos clientes cumprida de antemão, um segundo operador que reconstrua o genesis até o mesmo hash, um plano de rollback e um id de chain nunca usado antes.

Última verificação em relação ao commit c0878c3f do fullnode (chain 21) em 2026-10-12, e fullnode v0.8.0 `c0878c3f` (`docs/deploy.md`, `docs/cli.md`, `docs/staking.md`, `docs/node-hardware.md`, `deploy/cutover-fleet-chain21.sh`, `CHANGELOG.md`) and `main` `246cb5f9` (`deploy/genesis-chain21.json`, `deploy/cut-records/chain21.record`); the live chain-21 RPC, 2026-10-12, fullnode `90e7716` (v0.6.7 `86941a1` and `main` after it, 2026-09-30: `deploy/nodes.env`, `deploy/genesis-chain18.json`, `deploy/README.md`, `deploy/vps-setup.sh`, `docs/deploy.md`, `docs/node-hardware.md`, `docs/prover.md`, `docs/cli.md`, `docs/staking.md`, `README.md`, `CHANGELOG.md`, `AGENTS.md`), fullnode `8abf85e` (v0.5.9: `docs/rpc.md`), fullnode `ed88241` (`deploy/README.md`, `deploy/nodes.env`, `deploy/genesis-chain14.json`, `deploy/run-a.sh`, `deploy/vps-setup.sh`, `deploy/update-droplet.sh`, `docs/deploy.md`, `docs/superpowers/handoffs/2026-09-20-chain14-cut-runbook.md`, `docs/aggregation.md`, `docs/block-space.md`, `docs/zkvm-m4-m5-progress.md`, `docs/cli.md`). Onde o código e esta página divergirem, o código está certo; avise-nos.