Três binários resultam de cargo build --release: rand-node (o nó e os comandos do operador), rand (a carteira blindada) e rand-prover (o provador delegado). Todos os comandos aceitam -h/--help. Esta página descreve a versão v0.6.8 (c9c9bd3c), o build que a chain 20 executa; onde a v0.6.7 se comportava de outra forma, a página o indica. Uma carteira rand anterior à v0.6.8 não consegue enviar na chain 20, cujo genesis vincula ao seu hash cada prova e cada mensagem assinada. Os dois primeiros guardam tipos diferentes de chave: uma chave de nó é um par de chaves Dilithium2 que assina blocos; uma chave de carteira é uma chave de gasto blindada que não assina nada 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 são novos na v0.6.8. Não existe balance nem transfer: uma transferência exige uma chave de gasto blindada, que só a carteira possui.
Uma flag global, --allow-test-fri-profile (ou RAND_ALLOW_TEST_FRI_PROFILE=1), permite que init, run e verify aceitem um genesis cujo fri_profile seja test. Esse perfil tem cerca de 17 bits de segurança, e quem escreve um arquivo de genesis pode nomeá-lo; por isso, desde a v0.6.8, um nó recusa esse genesis sem a flag. As suítes de testes a ativam; nada mais deveria fazê-lo.
keygen, address
| comando | argumento | padrão |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | obrigatório |
keygen grava { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } com modo 0600. O arquivo é a única cópia da seed. Desde a v0.6.8, keygen recusa um --out que já exista (… already exists or cannot be created; refusing to overwrite a key file) e o deixa intacto; não há --force, portanto mova o arquivo antigo para outro lugar para substituí-lo. A v0.6.7 e as anteriores o sobrescreviam sem perguntar. address imprime address, public_key (1.312 bytes em hex) e peer_id.
genesis
| argumento | padrão | significado |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | id da chain; as transações e os tópicos de gossip estão vinculados a ele |
--validator <KEY,STAKE,PAYOUT> | obrigatório, repetível | uma entrada do registro: o caminho de um arquivo de chave ou uma chave pública em hex, o stake em RAND (no mínimo 1.000), o endereço de pagamento rand1… |
--epoch-blocks <N> | 1000 | blocos por época |
--alloc <ALLOCS> | nenhum, repetível | uma nota de depósito: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | caminho de saída |
--faucet | desligado | somente testnet: habilita Mint. Junto de uma seção bridge, exige --testnet |
--testnet | desligado | v0.6.8: grava "testnet": true, a marca que permite que um faucet conviva com uma seção bridge. Faz parte do hash do genesis quando informada |
--no-confidential | desligado | desativa Deploy e Call |
--fri-profile <production|test> | production | test é inseguro e destinado à suíte de testes; init, run e verify recusam esse arquivo sem --allow-test-fri-profile |
--max-program-words <N> | nenhum (4096) | o maior programa que um deploy pode conter, 1..=65535. Gravado somente quando informado; faz parte do hash do genesis sempre que presente, de modo que --max-program-words 4096 é uma chain diferente de omiti-lo. Todo nó precisa de um binário v0.4 antes de init num arquivo assim |
--max-proof-bytes <N> | nenhum (2.097.152) | a maior prova que uma transação pode conter, 1048576..=33554432. Todos os limites de prova o acompanham |
--max-block-bytes <N> | nenhum (4.194.304) | o maior bloco e, portanto, a maior transação, 4194304..=67108864, e no mínimo 2 × max_proof_bytes + 1 MiB, ou 3 × max_proof_bytes + 1 MiB com --auth-guest, em que uma chamada carrega três provas (bundle, auth, call) |
--max-call-envelope-bytes <N> | nenhum (18.432) | o maior envelope de entrada de uma chamada, 18432..=1048576 |
--max-program-public-words <N> | nenhum (0) | a maior entrada pública que um deploy pode fixar, 0..=65535; 0 não admite nenhuma |
--tokens <TOKENS.JSON> | nenhum | a seção tokens do RPL, como um arquivo JSON {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Se omitida, o arquivo não tem essa seção e o hash permanece como antes. Uma seção bridge exige um arquivo com mint_cap_per_day diferente de zero (por lastro, por dia UTC, nas unidades de oito decimais do token); um token listado exige uma seção bridge |
--envelope-bytes <N> | nenhum (o envelope legado de 1.348 bytes) | o tamanho exato de cada envelope de nota: uma saída de bundle, um mint do faucet, um withdraw, um depósito de bridge, uma alloc do genesis. Só 1860 é aceito, o tamanho que permite que todo envelope carregue um memo criptografado. Faz parte do hash do genesis quando informado, e é aplicado antes de as notas --alloc deste mesmo comando serem seladas |
--vesting <VESTING.JSON> | nenhum | a seção vesting: as alocações com bloqueio de tempo, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Desde a v0.6.8, uma entrada revogável lista revokers (de 1 a 5 chaves), um threshold e o treasury que uma revogação paga, e um arquivo que omita qualquer um deles é recusado |
--staking <STAKING.JSON> | nenhum | v0.6.8: a seção staking como arquivo JSON (faucet_budget_per_epoch, bond_activation_epochs, max_weight_bps, max_stake_entry_per_epoch ou max_stake_entry_bps_per_epoch, registration_v2, faucet_recipients, faucet_minters, admission_by_vote, slashing), validada pelo build |
--consensus-domain <0|1> | nenhum (0) | v0.6.8: 1 vincula cada voto, new-view e proposta a este genesis |
--bundle-guest <v1|v2|v3> | v1 | o guest de bundle fixado como hc_bundle: v1 (o guest de ativo oculto que as chains 14 e 15 executaram), v2 (o guest sem ramificações da chain 16) ou v3 (autorização dividida: o guest recebe nk e um salt em vez da chave de gasto). v3 exige --auth-guest |
--auth-guest | desligado | fixa o guest de autenticação deste build como hc_auth: cada bundle passa a carregar então uma prova de autenticação sobre a chave de gasto, vinculada à sua transação, cuja saída é igual ao auth_commit do bundle. Obrigatório com --bundle-guest v3 e recusado com v1 ou v2, antes de qualquer arquivo ser gravado. Ausente, o arquivo não tem o campo hc_auth |
--hardening-v6 | desligado | transforma as regras da v0.6 em regras de validade (hardening_v6): a janela de pc, deploys não chamáveis, formatos canônicos de prova e palavras de proof-of-work, o vínculo da chamada e o piso da tabela de programas. Ausente, um nó ainda as recusa em seu pool, como política |
--gas-price <UNITS> | nenhum (sem seção gas) | unidades (10⁻⁹ RAND) por gas que a própria chain cobra de uma chamada. Esta flag é a que grava a seção gas (metering: "circuit"); as três flags abaixo são recusadas sem ela. Faz parte do hash do genesis |
--byte-price <UNITS> | 800, somente com --gas-price | unidades por KiB, ou fração dele, de prova da chamada mais envelope de entrada, a partir do byte 0 |
--bundle-gas-limit <N> | 20479, somente com --gas-price | o GAS_LIMIT exato que toda prova de bundle deve declarar; uma prova de bundle que declare qualquer outro valor é recusada. O genesis aceita apenas 20479, gas_max(14, 0, 0) para o guest de bundle do tier 14 |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | nenhum (preços fixos) | ativa o controlador de preço por bloco, com piso nos próprios gas_price e byte_price iniciais da seção. Recusado junto de --aggregation |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | nenhum (sem teto) | v0.6.8: os tetos que o controlador nunca ultrapassa, cada um no mínimo igual ao preço inicial. Recusados sem --gas-dynamic |
--gas-byte-load paying | nenhum (os bytes de toda transação) | v0.6.8: somente a prova e o envelope de entrada de uma chamada movem byte_price, de modo que um bloco de transferências não move nenhum. Recusado sem --gas-dynamic; paying é o único valor |
--binding-domain <0|1> | nenhum (sem campo) | v0.6.8: 1 vincula o hash do genesis a cada vínculo de transação e a cada mensagem de ação assinada (um mint do faucet, unbond, withdraw, as mensagens de token RPL, as ações do agregador, as mensagens de governança da bridge), de modo que uma prova ou assinatura desta chain não é verificada em nenhuma outra. Se omitida, o comando avisa: uma carteira v0.6.8 prova a forma vinculada ao genesis em todo chain id fora de 14 a 19, portanto toda chain a partir da 20 é criada com 1 |
--proof-window-blocks <N> | nenhum (256) | v0.6.8: uma janela, de 256 a 4.096 blocos, para a idade máxima do anchor de um bundle e de seu time. Servida como rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | nenhum (sem seção program_state) | v0.6.8, RPL-2: ativa as células de programa, os cofres de programa e a ação Invoke, com esta taxa de célula em unidades de RAND (no máximo 1.000 RAND) somada ao piso de taxa de um invoke por célula que ele cria. Exige --tokens, --gas-price, --hardening-v6 e --auth-guest, cada um recusado pelo nome antes de qualquer arquivo ser gravado |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | nenhum | a seção aggregation; o build v0.6.8 se recusa a iniciar com um genesis que a contenha |
Imprime uma linha alloc por --alloc, depois o hash do genesis, as contagens de validadores e de notas, a duração da época, os cinco limites, hc_bundle e hc_auth (none sem --auth-guest), e então a linha de gas: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, ou gas: none sem --gas-price, e, com --program-state-cell-fee, uma linha program_state: cell fee N RAND. init imprime a mesma linha de gas. As cinco flags de limite se comportam de modo semelhante: omitidas, o arquivo não tem esse campo e a chain executa o valor padrão; informadas, o campo faz parte do hash do genesis mesmo no valor padrão. A chain 20 foi criada com estas flags (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
As cadeias 18 e 19 foram criadas com as mesmas flags, até --envelope-bytes 1860, e sem nenhuma das flags da v0.6.8. O limite de prova é de 4 MiB, abaixo dos 8 MiB das cadeias 13 a 16: uma transação com autorização dividida carrega até três provas, e 3 × 4 MiB + 1 MiB cabem no bloco de 20 MiB. O tokens.json contém um registration_fee de 1 RAND, um mint_cap_per_day de 10000000000000, max_tokens 4096, burn_registration_fee e bound_note_value, e o zUSD listado com seus sete lastros. Não existe a flag --bridge, e o script de criação ainda insere depois no arquivo as seções bridge, staking e consensus_domain (na chain 20: a bridge no conjunto de guardiões 1 com oito chaves PQ de guardiões, a chave de pausa, rules_v2, rotation e fees; a seção staking com a lista de permissão do faucet, admission_by_vote e um orçamento de entrada de 2.500 bps; consensus_domain: 1; e as notas de gênese do zUSD, feitas com alloc-note --asset 1 --envelope-bytes 1860). O hash de gênese que vale é o que init imprime sobre o arquivo finalizado.
Cada --alloc cria uma nota de depósito com aleatoriedade de compromisso nova, de modo que criar duas vezes resulta em dois hashes diferentes. O comando sempre grava a abertura da nota ao lado de cm e amount, o que uma cadeia com seção tokens exige:
"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>" } }
]
O proprietário e o valor de uma nota de gênese são, portanto, públicos por concepção assim que o arquivo é publicado; apenas o momento em que ela é gasta depois, e com que destino, permanece privado. Crie a gênese uma única vez e guarde o arquivo.
alloc-note
--to <rand1…> (obrigatório), --amount <N> (obrigatório), --asset <INDEX> (padrão 0), --envelope-bytes <N> (padrão: o formato legado). Imprime uma nota de alocação como JSON, selada para --to como genesis --alloc sela uma. Uma gênese que define envelope_bytes recusa uma nota selada sem o --envelope-bytes correspondente. --amount é em unidades inteiras do ativo: nove casas decimais para RAND, oito para um token com bridge (10 no ativo 1 são 10 zUSD). Uma nota de um token listado exige que os lastros desse token tenham valores locked que somem exatamente as suas notas.
init
| argumento | significado |
|---|---|
--datadir <DATADIR> | diretório de dados a criar |
--genesis <GENESIS> | arquivo de gênese; copiado para <datadir>/genesis.json |
Imprime o hash de gênese e a mesma linha gas: de genesis.
run
| argumento | padrão | significado |
|---|---|---|
--datadir <DATADIR> | obrigatório | diretório de dados inicializado |
--key <KEY> | obrigatório | arquivo de chave: identidade de validador, identidade p2p, destinatário das taxas |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | multiaddr de escuta do libp2p, repetível |
--bootstrap <BOOTSTRAP> | nenhum, repetível | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, discado na inicialização e a cada 30 s enquanto estiver desconectado. Desde a v0.6.8 o seu peer id é reservado |
--reserved-peer <PEER_ID> | nenhum, repetível | v0.6.8: um peer admitido além do limite de conexões de entrada e atendido com a parcela do orçamento de sincronização reservada aos validadores. Os bootstraps e todo validador cujo vínculo de peer assinado este nó já viu são reservados sem ela; liste aqui os validadores da frota em uma cadeia recém-criada, cujo armazenamento ainda não tem vínculos |
--strict-gossip | desligado | v0.6.8: validação estrita do gossipsub, aceitando apenas mensagens com assinatura de autor, número de sequência e origem válidos. Nós estritos e permissivos interoperam, de modo que a mudança se faz nó a nó |
--rpc <RPC> | 127.0.0.1:8545 | o listener JSON-RPC do operador: todos os métodos, e confia no loopback. Mantenha-o no loopback e nunca encaminhe um endpoint público para ele |
--public-rpc <ADDR> | desligado | v0.6.8: um segundo listener, público, com um conjunto fixo de métodos (sem métodos de chave de visualização, rand_mint nem rand_getPeers), sem lotes, sem WebSocket e com um único medidor para todos os chamadores; é para onde um proxy reverso ou um encaminhamento SSH deve apontar (JSON-RPC) |
--rpc-viewing-token-file <PATH> | desligado | v0.6.8: exige Authorization: Bearer <first line of the file> (32 caracteres ou mais) nos métodos de chave de visualização de --rpc |
--validator | desligado | participa do consenso com esta chave |
--no-mdns | desligado | desativa a descoberta na LAN |
--block-interval-ms <MS> | 1000 | espaçamento mínimo entre propostas |
--view-timeout-ms <MS> | 3000 | timeout base da view; dobra a cada timeout consecutivo, até 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | desligado | modo de arquivo em uma cadeia de agregação |
--prune-history <WINDOW> | nenhum (mantém tudo) | mantém apenas esta quantidade de histórico de blocos, <n>m, <n>h ou <n>d, no mínimo 1h: os blocos mais antigos perdem o bloco, o QC, as transações e os recibos; o ledger permanece. Na chain 20, 24 dos 26 validadores usam 24h e dois nós são de arquivo; um nó de arquivo e um nó de mainnet nunca a definem. Consultas por altura abaixo do piso respondem -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | recusa iniciar com menos espaço livre no sistema de arquivos do diretório de dados; rand_getHealth informa disk_low abaixo de quatro vezes esse valor. 0 desativa a proteção |
--rpc-viewing-open | desligado | permite que chamadores fora do loopback usem os métodos de chave de visualização; somente atrás de algo que autentique |
--gas-price <UNITS> | 100 | unidades (10⁻⁹ RAND) por gas que o pool deste nó exige de uma chamada, acima de gas_max do cabeçalho da sua prova. Política de admissão, não regra da cadeia: um bloco que carregue uma chamada mais barata continua válido. 0 com --byte-price 0 não aplica política alguma. Em uma cadeia cuja gênese tem uma seção gas, como a da chain 20, os preços da própria cadeia são a regra de validade |
--byte-price <UNITS> | 800 | unidades por KiB, ou fração de um, da prova e do envelope de entrada de uma chamada, a partir do byte 0, sob a mesma política |
--prover <ADDR> | desligado | hospeda o prover delegado (o JSON-RPC prover_*) neste endereço: um listener próprio, que deve ser diferente de --rpc. O nó se recusa a iniciar sem <prover-home>/prover.key.json, gerado por rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | o prover.key.json e o pairings.json do prover |
--prover-accept-spend-key | aposentada | recusada na inicialização desde a v0.6.8: run com esta flag encerra antes de a chave do nó ser lida, citando a flag. Nenhum prover aceita mais uma testemunha com chave de gasto; retire-a do arquivo de unidade. Na v0.6.7 ela aceitava testemunhas com chave de gasto para cadeias com bundle guest v1 ou v2 |
--prover-max-parallel <N> | 1 | provas que o prover hospedado executa ao mesmo tempo; a inicialização é recusada a menos que haja 5,74 GB × N + 1 GiB de memória disponível |
--prover-max-queue <N> | 8 | tarefas enfileiradas além das que estão em execução |
--prover-cuda | desligado | prova no backend CUDA (um build com --features cuda); sem fallback para a CPU |
--prover-skip-memory-check | desligado | ignora a verificação de memória livre |
--prover-fee <RAND>, --prover-fee-address <rand1…> | nenhum | a taxa que toda tarefa enviada ao prover hospedado deve pagar, em RAND com até nove casas decimais: uma saída de RAND para o endereço, dentro do bundle provado. Cada flag exige a outra |
--prover-allow-origin <ORIGIN> | extensões de navegador e páginas em loopback | uma origem de navegador cujas páginas podem ler as respostas do prover, repetível; quando dada uma ou mais vezes, os valores são a lista inteira. * permite todos os sites e imprime um aviso |
Ambiente: RUST_LOG (padrão info,libp2p=warn,libp2p_mdns=off). Ctrl-C ou SIGTERM encerra o nó de forma limpa.
O endpoint público https://rpc.randprotocol.org é um proxy de lista de permissão na frente de um nó de arquivo; desde 2026-10-01 a sua lista de permissão é o conjunto de métodos do listener público.
safety
O estado de segurança de consenso de um validador parado (v0.6.8). Cada comando abre o diretório de dados por conta própria, portanto nenhum roda ao lado de um nó ativo.
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 imprime o head confirmado, a view e a última view votada, o QC mais alto, se o validador está travado acima do seu head e qualquer parada de segurança registrada. Um nó que vê uma cadeia de três certificada tentar confirmar um bloco que não descende do seu próprio head confirmado para e registra o fato (auditoria v6, CON-5); run então encerra com o registro até clear-halt. Compare o head deste nó com o de dois outros validadores e ressincronize a partir de um nó de arquivo se ele diferir, antes de limpar. Desde a v0.6.8 (CON-4), nenhum quórum de respostas “não possuo” libera mais um lock: um validador travado em um bloco que não consegue obter permanece em silêncio até que chegue uma proposta cujo justify supere o lock ou que o bloco seja buscado. release-lock reduz o lock persistido ao certificado do head confirmado; use-o em um validador por vez, e somente quando o bloco estiver perdido de vez. Sem a sua flag de confirmação, cada comando de escrita imprime o que faria e não altera nada.
verify
| argumento | padrão | significado |
|---|---|---|
--datadir <DATADIR> | obrigatório | o nó não pode estar em execução |
--mode <MODE> | full | quick ou full |
--repair | desligado | trunca a cauda danificada; o estado de segurança é mantido |
Código de saída 0 se estiver consistente, 2 se um problema for encontrado sem --repair.
db
db drop-receipts-index --datadir <DATADIR>, com o nó parado: remove o índice receipts_by_program antes de reverter para um build anterior à v0.3, que não consegue abrir um banco de dados que o tenha. Uma inicialização posterior reconstrói o índice a partir dos recibos.
status
--rpc <URL> (padrão http://127.0.0.1:8545). Imprime rand_status literalmente.
register, unbond, withdraw
| comando | argumentos | significado |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | imprime um Registration em hexadecimal, assinado pela chave deste nó; o RPC é consultado para obter o chain id e, com --v2, também o hash de gênese. --v2 é obrigatório em uma chain cujo genesis define staking.registration_v2, como a da chain 20; um registro v1 é recusado ali, e um v2 é aceito em todas as outras |
unbond <amount RAND> | --key, --rpc, --no-wait | move o stake para o desbonding; sem custo; sacável duas épocas depois |
withdraw <amount RAND> | --key, --rpc, --no-wait | paga o stake liberado e as recompensas em uma note no endereço de pagamento, menos a base de 0,001 RAND |
admit sign|submit
Admissão por voto (v0.6.8). Em uma chain cujo genesis define staking.admission_by_vote, como a da chain 20, uma nova chave de validador só é registrada depois que validadores que detêm estritamente mais de dois terços do peso de voto a tiverem assinado.
| comando | argumentos | significado |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | imprime o voto deste validador em uma linha, <voter key hex>:<signature hex>, sobre o hash de gênese e o endereço do candidato, de modo que vale em exatamente uma chain. Offline: não lê nenhum nó |
admit submit | --candidate …, --signature <line> (repetível), --rpc, --no-wait | verifica cada voto contra o hash de gênese do nó (um voto para outro genesis ou candidato, ou um votante repetido, é apontado pelo nome), ordena-os e submete o AdmitValidator sem taxa |
O candidato é a chave que o registro carregará; rand-node address --key a imprime, e o hexadecimal que register imprimiu a contém. Depois que a admissão é confirmada, o bond é feito como antes (rand bond … --registration) e a consome. rand_getAdmitted lista o que foi admitido e está em espera.
bridge-gov
As rotações pós-quânticas da bridge (v0.6.8), para guardiões e o detentor da chave de pausa. Cada etapa lê o chain id, seu domínio de vinculação e rand_getBridgeState.rotation_nonce de --rpc (padrão http://127.0.0.1:8545).
| comando | função |
|---|---|
rotate-pq message --new-key K… | imprime a mensagem de rotação em hexadecimal para o nonce atual, para comparar em cada signatário |
rotate-pq sign --new-key K… --key F --index I [--possession] | imprime I:signature: a linha de quórum de um guardião PQ atual (I é seu índice no conjunto atual) ou, com --possession, a linha de um detentor da nova chave (I é seu índice no novo conjunto); recusa um arquivo de chave que não seja a chave em I |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | monta RotatePqGuardians, ou a ação V2 com linhas de posse, e a envia; recusa a posse em uma chain que não a aceita e a sua ausência em uma que a exige, como a chain 20 |
rotate-pause message|sign|submit --new-key K | o mesmo para a chave de pausa (índice de posse 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | imprime 0:signature sobre a mensagem de cancelamento, verificada contra a chave de pausa atual da chain |
cancel-rotation submit --kind pq|pause --signature @F | envia CancelRotation, descartando uma rotação pendente antes de seu prazo terminar |
--new-key é uma chave pública Dilithium2 em hexadecimal, @file contendo uma, ou @key-file (sua chave pública). As linhas de assinatura têm o formato index:hex, separadas por espaços em branco ou quebras de linha, e comentários com # são permitidos.
vesting status|claim|revoke|bond|unbond
O lado do titular e do revogador de uma alocação de gênese com bloqueio temporal, em uma chain cujo genesis traz uma seção vesting. A da chain 20 não tem nenhuma. A chave é um arquivo de rand-node keygen.
| comando | argumentos | significado |
|---|---|---|
vesting status <ENTRY> | --rpc | a entrada como rand_getVesting a serve: seus termos, o que já foi liberado (vested) e o que pode ser reivindicado agora |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> ou --all, --key, --rpc, --no-wait | paga o que foi desbloqueado em uma note em --to, menos a base de 0,001 RAND; assinado pela chave do beneficiário |
vesting revoke prepare | --entry, --margin-secs (padrão 600), --out (padrão revoke.json), --rpc | v0.6.8, sem chave: grava a revogação que todo revogador assina, uma note da parte ainda não liberada --margin-secs após o head, paga ao treasury de gênese da entrada (não há --to) |
vesting revoke sign | --proposal <file>, --key, --index? | uma chave de revogador, offline: imprime <index>:<signature hex> |
vesting revoke submit | --proposal <file>, --signature <index:hex> (repetível), --rpc, --no-wait | envia a revogação com pelo menos o threshold de assinaturas da entrada, dentro de 256 blocos após o prepare. O vesting revoke --to de chave única da v0.6.7 não existe mais |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | entradas irrevogáveis: faz o bond de RAND bloqueados como stake desse validador; um validador que ainda não está no registro precisa do que register imprimiu |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | devolve RAND em bond ao bloqueio; reivindicável de novo após as épocas de unbonding |
aggregator register|unbond|withdraw, aggregate
Os comandos do papel de agregador para uma chain com uma seção aggregation: aggregator register --key --bond <RAND> --payout <rand1…> --rpc imprime um AggregatorRegistration assinado; aggregator unbond e aggregator withdraw espelham o par do validador. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] é o daemon que consulta rand_getUnsealed, prova um agregado e o submete. Inerte na chain 20, cujo genesis não tem seção aggregation.
rand (wallet)
Opções globais, antes ou depois do subcomando:
| opção | env | padrão |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http ou https (o endpoint público é https://rpc.randprotocol.org). Uma resposta acima de 64 MiB é recusada |
--key <KEY> | RAND_KEY | wallet.key.json; o armazenamento de notes fica ao lado dele, em <key>.notes.json. O armazenamento está vinculado à chain contra a qual foi escaneado (o rand_getGenesisHash do nó): se apontado para outra chain, como uma wallet mantida na passagem da chain 19 para a 20, ele é esvaziado e reescaneado desde a folha 0, com um aviso. Desde a v0.6.8, todo comando recusa um arquivo de chave que o grupo ou outros possam ler, indicando a correção (chmod 600 <key>) |
--prover | desligado. Prova o bundle no prover pareado com esta wallet (rand prover pair) em vez de nesta máquina; a prova é verificada aqui (seu digest, seu tamanho e uma verificação local) antes de entrar em uma transação. Vale para todo comando que prova um bundle; em call e program invoke, apenas o bundle de pagamento vai ao prover e a prova da chamada permanece local. Recusado sem um pareamento, e junto com --cuda, exceto em call. Em uma chain de autorização dividida, como a chain 20, o prover recebe a chave de visualização nk e um salt, nunca a chave de gasto: ele pode ler todo o histórico desta wallet e não pode gastar. A prova de autorização é sempre feita nesta máquina. Em uma chain cujo guest de bundle é v1 ou v2, a v0.6.8 recusa --prover antes de perguntar qualquer coisa ao prover | |
--max-prover-fee <RAND> | 1. O máximo que um prover pareado pode cobrar por bundle. Uma cotação acima disso é recusada antes de qualquer bundle ser montado; 0 recusa qualquer taxa. A taxa é mais uma saída em RAND no mesmo bundle, exibida como prover fee: <amount> RAND to <fingerprint> |
Os valores são RAND decimais com até nove casas decimais (1, 1.5, .25, 0.000000001). Um valor de token em send, token mint e token burn, e em um link randpay:, está nas unidades de exibição do token, nas decimals da própria linha do registro (10 de zUSD é 10 zUSD). bridge-burn, token create --fixed-supply e --initial recebem inteiros simples na menor unidade do token, e asset-balance os imprime. Sempre que um comando recebe um token, aceita o índice do registro, o id rpl1… ou o id de 64 hex; um id é resolvido para seu índice a partir da listagem completa do registro do nó (rand_getTokens, todas as páginas), nunca por uma consulta por token, que informaria ao nó qual token está prestes a se mover. Um índice numérico nunca chega ao nó.
| comando | argumentos | comportamento |
|---|---|---|
keygen | grava um novo arquivo de chave de gasto em --key, com modo 0600; recusa sobrescrever | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | imprime o endereço rand1… desta carteira na saída padrão, exatamente o endereço e uma quebra de linha, de modo que $(rand address) funcione em um script, e seu fingerprint XXXX-XXXX-XXXX-XXXX no stderr: 16 caracteres base32 Crockford, uma verificação humana do endereço que nunca é enviada pela rede. --uri também imprime um link randpay: (o endereço mais valor, ativo e memo opcionais). --qr renderiza esse link como um código QR no terminal; --qr-png o grava como PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | endereços nomeados para os quais esta carteira pode enviar pelo nome. TO é um endereço rand1… ou um link randpay:, do qual apenas o endereço é guardado. add imprime a impressão digital e pergunta add? [y/N], a menos que haja --yes; um stdin que não seja um terminal é recusado sem ele. Armazenado em <key>.contacts.json, modo 0600. Um nome tem de 1 a 64 caracteres, nunca começa com rand1 nem randpay: e é único |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | emparelha esta carteira com um provador delegado. pair recebe o link randprover: que rand-prover pair imprimiu, recusa uma URL que não seja https:// (http:// simples apenas para localhost, 127.0.0.1 ou [::1]), depois informa o que o provador receberá (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) e pergunta pair? [y/N]; --yes dispensa a pergunta, e um stdin que não seja um terminal é recusado sem ele. Em seguida consulta o prover_info do provador, recusa a menos que a impressão digital de sua chave seja a que o link indica, e grava <key>.prover.json, modo 0600, substituindo qualquer emparelhamento anterior. --trusted (v0.6.8) não recebe link: emparelha com o pool de provadores dos validadores, https://prover.randprotocol.org, a partir do link que o build carrega; seus operadores podem ler o histórico desta carteira e não podem gastar. show imprime nome, URL, impressão digital, own e a chave do provador, nunca o token; forget apaga o arquivo. A v0.6.7 não pedia confirmação antes de emparelhar |
viewing-key | imprime a chave de visualização nk desta carteira, 64 hex: o parâmetro que rand_importViewingKey recebe. Ela lê toda nota que a carteira enviou ou recebeu e não gasta nenhuma | |
balance | varre a árvore, salva o armazenamento, imprime o valor gastável e a contagem de notas não gastas | |
sync | --rescan | varre sem imprimir um saldo. A primeira sincronização lê todos os cabeçalhos de bloco (1.024 por chamada) antes das folhas. --rescan esquece todas as notas, marcas de gasto e cursores (mantendo o vínculo com a cadeia) e varre de novo a partir da folha 0: o caminho de volta quando um nó informou erroneamente que as notas desta carteira estavam gastas. O ideal é executá-lo contra um nó em que você confie |
notes | --memo | toda nota que esta carteira abriu: índice, ativo, valor, altura, spent, pending, e o memo cortado em 24 caracteres, ou inteiro com --memo |
asset-balance [INDEX] | varre, depois imprime o que esta carteira possui em um ativo, ou uma linha por ativo possuído; valores na menor unidade do próprio ativo | |
history | --memo | toda nota que esta carteira criou para outra pessoa, com a mesma coluna de memo de notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (padrão 0, RAND), --memo <M>, --fee <RAND> (padrão 0.001), --no-wait, --yes, --cuda | TO é um endereço rand1…, um link randpay: ou o nome de um contato salvo, tentados nessa ordem. O valor, o ativo e o memo do próprio link preenchem o que a linha de comando deixa de fora; AMOUNT é opcional apenas quando o link traz um, e um valor dado das duas formas que divirja é recusado. O comando imprime a confirmação, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> e, quando há memo, uma linha própria memo: "<text>", e então pergunta antes de provar, a menos que haja --yes. Um script deve passar --yes: um stdin que não seja um terminal é recusado com stdin is not a terminal: pass --yes to send without confirmation. Em seguida seleciona no máximo duas notas do ativo e no máximo duas notas RAND para a taxa, sela o memo apenas na saída de pagamento, prova localmente um pacote de ativo oculto de quatro slots e, em uma cadeia de autorização dividida, a autorização de gasto, envia e espera a confirmação. Um memo não vazio é recusado antes da prova em uma cadeia cujo genesis não tem envelope_bytes. AMOUNT está nas unidades de exibição do ativo: RAND decimal para RAND, e um token com os próprios decimals da linha de seu registro; somente 0 ou rand lê RAND, seja qual for o índice que o nó respondeu. Um id de token é decodificado antes de o nó ser consultado, e uma linha de listagem que o responda com índice 0 ou com campos de id divergentes é recusada. A confirmação mostra o valor de um token em unidades de exibição e em unidades base, 10.00000000 zUSD (1000000000 units), de modo que um nó que minta sobre os decimals de um token fique visível antes de qualquer envio. O índice do ativo e a taxa são impressos antes da prova. Na cadeia, a transferência de um token é um pacote simples, indistinguível de um pagamento em RAND; sua taxa é em RAND, e uma carteira sem RAND gastável é recusada antes da prova |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | faz stake em um validador: o pacote queima o valor |
faucet [ADDRESS] | --amount <RAND> (padrão e máximo 100) | somente testnet: pede a um nó validador que emita. Na chain 20, o faucet paga apenas as 16 carteiras de sua lista de permissão do genesis |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (repetível), --out <file> (padrão program.json) | monta um guest embutido; imprime o id do programa. rpl2_counter (v0.6.8) é o programa de demonstração do RPL-2 |
program deploy <FILE> | .json, um .bin bruto, ou o contêiner de imagem que rand-guest build grava; --public <FILE>, --input <u32> (repetível) ou --check-call, --cuda | imprime o id do programa, hc e a contagem de palavras; recusa um programa acima do limite da cadeia (via rand_estimateFee) antes de provar; paga o piso de deploy por meio de um pacote, espera. --public armazena uma entrada pública com o programa (palavras u32 separadas por espaço em branco, ou um ELF .so), dentro do max_program_public_words da cadeia; o id do programa então a vincula. Com --input ou --check-call, a carteira primeiro executa a seco, no emulador, uma chamada sobre essas entradas privadas e recusa a menos que ela caiba no limite da camada de chamada (14); nada é provado para a verificação |
program show <ID> | metadados do programa implantado | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (obrigatório), --input N (repetível, privada), --inputs-file <FILE.json> (um array JSON de u32, acrescentado), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: declara uma transição de estado do programa e faz a cadeia aplicá-la. Antes de provar qualquer coisa, verifica que a cadeia tem uma seção program_state, que o programa existe, que o contexto da transição se ajusta à regra de segmento, que cada entrada de reads corresponde à célula viva (rand_getProgramCell; uma divergência nomeia a célula desatualizada e sai com 3), que o cofre pode pagar cada entrada de pays mais o que esta transição deposita, e que esta carteira possui o token e o RAND de que o depósito e a taxa precisam. Conta as células que as escritas criam, executa o programa a seco sobre as palavras reais do contexto, prova a chamada vinculada à transação, depois o pacote (a taxa, mais deposit.rand queimado por burn_r e deposit.amount de deposit.asset por burn_a) e a prova de autorização. A taxa padrão é o piso da chamada para o gás declarado mais a taxa de célula por célula criada, com os mesmos dois degraus de preço de folga que call. Imprime cada pagamento e, a menos que haja --no-wait, as oito outputs do recibo. Uma leitura desatualizada na inclusão também sai com 3, de modo que uma ferramenta chamadora releia e tente de novo. Não publica nenhuma transcrição de entrada. O arquivo de transição, todos os campos opcionais: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}; chaves e valores são Word8s de 64 hex, valores são strings decimais nas unidades do próprio ativo, to assume por padrão esta carteira |
program state <ID> | --cell <64 hex> | v0.6.8: toda célula do programa em ordem de chave (rand_getProgramCells, paginado até o fim), ou uma célula com --cell, 64 zeros quando ausente. Recusado em uma cadeia sem seção program_state |
program vault <ID> | v0.6.8: o cofre do programa (rand_getProgramVault), uma linha por ativo que ele detém, valores em unidades. Recusado em uma cadeia sem a seção | |
call <PROGRAM-ID> | --input N (repetível), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | executa primeiro a chamada no emulador e imprime gas: <exact> (declaring <limit>, tier <t>): o gás exato é testemunha e nunca sai da carteira, o limite declarado é o GAS_LIMIT público da prova. Em uma cadeia com seção de gás, o limite padrão é o gás exato arredondado para cima a um múltiplo de 2^(t−2); max declara o teto do cabeçalho gas_max, que não vaza nada que a camada já não vaze; N é recusado abaixo do gás exato ou acima do teto. Sem seção, ou com --cuda, o padrão é max. Depois prova a chamada localmente sobre a entrada pública do programa, sela sua transcrição de entrada, paga por meio de um pacote, imprime o recibo. A taxa padrão é o piso para o limite declarado, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB aos preços que rand_getLimits serve, mais dois degraus de preço de folga onde os preços se movem, impressa como fee … RAND (incl. two price steps of headroom). Em uma cadeia hardening_v6, a taxa é fixada antes de a prova existir, então o padrão precifica o limite de prova da cadeia no lugar da prova, o que só pode pagar a mais; --fee paga um valor exato. --expect-public recusa antes de provar a menos que a entrada pública do programa sejam as palavras daquele arquivo |
open-call <TXHASH> | --call-key <hex>, --as-auditor | abre a transcrição de uma chamada, confere-a com H_IN, reexecuta o programa; sai com código diferente de zero em caso de divergência |
receipt <TX> | o recibo de uma chamada confirmada | |
bridge-mint <ATTESTATION> | hex ou @path, --pq <JSON or @path> (obrigatório), --to <rand1…> (padrão: esta carteira), --fee (padrão: o piso da ação), --no-wait, --cuda | deposita uma atestação assinada por guardiões como uma nota. --pq é o quórum de coassinaturas Dilithium2 dos guardiões, [{"index":0,"signature":"<4840 hex>"},…]. Antes de qualquer prova: decodifica a atestação, confere o quórum com os pq_guardians do nó e o id da cadeia, confere o destinatário e o id do ativo, lê o índice listado (rand_getAssets). O blinding da nota de depósito é derivado do digest da atestação, r = blake3("rand-deposit-r-1" || mu), o único r que a cadeia admite. O pacote da taxa é provado contra a transação inteira, quórum incluído. Imprime owner, time e r da nota |
bridge-rotate <ROTATION> | hex ou @path, --pq <JSON or @path> (obrigatório), --fee (padrão: o piso da ação), --no-wait, --cuda | envia uma rotação do conjunto de guardiões com o quórum de coassinaturas do conjunto PQ atual, como um BridgeAttest que não deposita nada. Recusa, antes de provar, tudo que não seja uma rotação que avance o conjunto da Rand em um passo. Imprime o guardian_set_index depois |
bridge-pause | --sig <HEX or @path> (obrigatório), --no-wait | pausa a emissão da bridge: um PauseMints sem pacote e sem taxa, de modo que não são necessários arquivo de chave nem RAND. O arquivo é a saída de rand-bridge-gov pause, a assinatura de 2.420 bytes da chave de pausa em hex, feita para o pause_nonce atual da bridge; conferida com a pause_key do nó e o id da cadeia antes de ser enviada. Queimas e rotações continuam abertas durante a pausa |
bridge-unpause | --pq <JSON or @path> (obrigatório), --no-wait | suspende uma pausa com um quórum de guardiões PQ (o arquivo de rand-bridge-gov pq-unpause) feito para o pause_nonce atual. Sem pacote e sem taxa; a chave de pausa sozinha nunca pode retomar |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (padrão 0.01), --no-wait, --cuda, --yes | queima um ativo da bridge em saída: confere que a moeda TOKEN em TO_CHAIN lastreia ASSET e tem ao menos AMOUNT bloqueado, e que AMOUNT e a taxa do relayer são unidades de liberação inteiras; depois prova um pacote que gasta o ativo nos slots 0–1, queima exatamente AMOUNT dele (burn_a, burn_asset) e paga a taxa em RAND a partir dos slots 2–3. --relayer-fee é uma parcela de AMOUNT, não uma cobrança extra. Em uma cadeia com taxa de bridge (rand_getBridgeState.fees), como é a chain 20, a v0.6.8 primeiro imprime a taxa que a cadeia retém (no ativo) e o valor que será liberado, e pede confirmação; --yes dispensa a pergunta, e um stdin que não seja um terminal é recusado sem ele. As verificações de bloqueado e de taxa do relayer passam então a valer sobre o valor liberado |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (aleatório se não informado), depois --fixed-supply <N> --to <rand1…>, --authority-key-out <FILE> [--initial <N> --to <rand1…>] ou (v0.6.8) --program <PROGRAM-ID>, um token cuja autoridade de emissão é esse programa, que só os invokes dele emitem ou queimam, começando com oferta zero e exigindo a seção program_state da cadeia, --fee (padrão: a base do pacote mais o registration_fee do registro; recusado quando o nó informa uma taxa de registro acima de 10 RAND, então passe --fee para pagar uma maior deliberadamente), --no-wait, --cuda | registra um token no próximo índice do registro: oferta fixa (emite uma vez, autoridade none) ou autorizado por Key (um novo arquivo de chave Dilithium2, gravado com 0600, recusando sobrescrever). A chave de autoridade fica em <FILE>.pending até a cadeia aceitar o registro. Se outro registro tomar o índice primeiro, imprime another token took index N first — re-run to register at N+1; em caso de sucesso imprime o índice e o id, hex e rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (as unidades de exibição do token), --authority-key <FILE>, --fee (padrão 0.001), --no-wait, --cuda | emite mais de um token autorizado por Key; recusado antes de qualquer prova se o token não for autorizado por Key ou se a chave não for sua autoridade |
token set-authority | --asset, --authority-key <FILE>, depois --new-key <FILE> ou --renounce, --fee (padrão 0.001), --no-wait, --cuda | entrega um token autorizado por Key a outra chave, ou renuncia à emissão para sempre |
token burn <ASSET> <AMOUNT> | --fee (padrão 0.001), --no-wait, --cuda | destrói AMOUNT, nas unidades de exibição do token, de um token RPL que esta carteira possui; sua oferta pública cai exatamente nesse valor. Um token da bridge é recusado antes de provar: ele sai por bridge-burn |
token info <INDEX|rpl1…|hex> | a linha completa de rand_getTokens de um token: nome, símbolo, decimals, autoridade, mint_nonce, oferta total, registered_at, id (hex e id_text) e, se for da bridge, cada lastro (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (padrão 0), --limit <N> (padrão 1000) | uma página de rand_getTokens: enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (os decimals de origem do primeiro lastro), --pq <JSON or @path> (obrigatório), --fee (padrão: a base do pacote mais o registration_fee do nó, com a mesma recusa de 10 RAND de token create), --no-wait, --cuda | registra um token da bridge após o genesis com seu primeiro lastro, autorizado por um quórum de guardiões PQ (o arquivo de rand-bridge-gov pq-register) feito para o list_nonce do nó. Liste primeiro na Rand, setToken depois no endpoint |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (obrigatório), --fee (padrão: a base do pacote), --no-wait, --cuda | adiciona um lastro a um token da bridge, autorizado por um quórum de guardiões PQ (o arquivo de rand-bridge-gov pq-list) no list_nonce do nó |
bridge | o estado público da bridge: guardiões, emissores, o registro de ativos, a sequência de queimas | |
bridge-message <SEQUENCE> | uma mensagem de queima de saída, literal | |
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) | a taxa mínima segundo a tabela do nó. Em uma cadeia com seção de gás, fee call <tier> --gas N precifica o limite declarado que rand call imprime, aos preços do topo e sem folga: o próprio piso. Sem --gas, precifica o teto gas_max(tier, K, S), o máximo que uma chamada assim pode custar. --bytes são os bytes da prova da chamada mais os do envelope de entrada |
tx <HASH> | transação confirmada com sua altura e índice | |
tx-key <HASH> | uma linha por saída dessa transação que esta carteira enviou, recebeu ou manteve como troco: output (bundle:0 … bundle:3, os quatro slots do único pacote, ou mint:0), papel, valor (em RAND, ou N (asset I) para um token), o memo que ela carregava (- se nenhum) e a chave por transação sob a qual foi selada. Entregue a chave de uma linha sent a um beneficiário ou auditor e rand_checkTransaction <HASH> <KEY> revela aquela saída, memo incluído. Um slot fictício não abre para ninguém e não tem linha | |
block <ID> | bloco por altura ou hash | |
head | { height, hash, view } | |
status | rand_status | |
peers | pares conectados | |
validators | o registro de validadores |
--cuda exige uma build com --features cuda e não tem fallback; nenhum PTX foi compilado ainda. Ele não consegue selar um envelope de entrada de chamada: rand call --cuda precisa de --no-envelope. Declara apenas o teto de gas e recusa --gas-limit N.
Todo memo e nome de contato que a CLI imprime (a confirmação de send, notes, history, tx-key) passa antes por uma regra de exibição: caracteres de controle, caracteres de formatação Unicode (controles bidi, caracteres de largura zero, o hífen suave) e U+2028/U+2029 são mostrados como U+FFFD, e uma sequência de separadores de espaço vira um único espaço.
Uma primeira transferência 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
Compartilhando um endereço, e um 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
O memo fica dentro do mesmo corpo selado que a nota, de modo que quem consegue abrir um consegue abrir o outro: o destinatário por meio de notes, e qualquer pessoa que possua a chave por transação daquela saída por meio de rand_checkTransaction <hash> <key>. A chain 18 é a primeira chain cujo genesis define envelope_bytes; nas chains 14 a 17, --memo era recusado antes de qualquer prova.
Uma chamada confidencial que você pode abrir de novo depois
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)
Um programa com estado: o contador RPL-2
Em uma chain com uma seção program_state, como é a chain 20. O contador aceita exatamente as transições que leem uma célula e a gravam de volta com a primeira palavra mais um; todo o resto da transição (o que o bundle deposita, o que o cofre paga, o que o programa cunha) passa sem verificação, o que o torna uma demonstração e não um programa para se colocar valor por trás.
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)
O … no arquivo representa os 64 caracteres hexadecimais completos, que a carteira exige.
O que um deploy e uma chamada imprimem
Em uma chain de autorização dividida, cada bundle consiste em duas provas feitas nesta máquina: a autorização de gasto do tier 10 e o bundle do tier 14. Um program deploy com rand v0.6.7 na chain 18, em 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)
Um call imprime seu gas e sua taxa antes da prova da chamada e, em seguida, prova o bundle pagador da mesma forma:
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 [...]
Aqui, 6,144 é 5,636 arredondado para cima até um múltiplo de 2^10, e rand fee call 12 --gas 6144 --bytes <B> precifica esse limite aos preços do topo da chain, sem folga.
rand-prover
O prover delegado como um binário próprio: ele gera a prova de bundle do tier 14 de uma carteira em outra máquina. rand-node run --prover hospeda o mesmo serviço dentro de um nó. Todo subcomando aceita --home <DIR> (env RAND_PROVER_HOME, padrão ~/.rand-prover), o diretório que contém prover.key.json e pairings.json.
| comando | argumentos | comportamento |
|---|---|---|
keygen | grava prover.key.json, modo 0600, e imprime a impressão digital da chave; recusa sobrescrever | |
pair | --name <LABEL> (obrigatório), --url <URL> (padrão http://127.0.0.1:8600), --own, --qr | emite um token, armazena apenas o hash dele sob o rótulo e imprime o link de pareamento randprover: que rand prover pair recebe. O token é exibido uma única vez, dentro do link. --url é o endereço pelo qual a carteira alcança este prover; --own acrescenta own=1; --qr também imprime o link como um código QR no terminal |
unpair | --name <LABEL> | remove um pareamento; um prover em execução lê o arquivo ao iniciar, então a mudança vale a partir da reinicialização |
pairings | uma linha por pareamento: rótulo, own ou -, data de criação | |
run | --listen <ADDR> (padrão 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (repetível), --fee <RAND> com --fee-address <rand1…>, --accept-spend-key | atende o JSON-RPC prover_* até Ctrl-C ou SIGTERM. A inicialização é recusada a menos que haja 5,74 GB × --max-parallel + 1 GiB de memória disponível. --per-token é o número de jobs que um pareamento pode ter enfileirados ou em prova ao mesmo tempo. --accept-spend-key foi aposentado na v0.6.8: run se recusa a iniciar com ele, e um prover aceita apenas witnesses de chave de visualização. Na v0.6.7 ele admitia witnesses de chave de gasto, que só uma chain com bundle guest v1 ou v2 envia |
Um prover na chain 20 recebe a chave de visualização nk da carteira e um salt novo. Ele não pode gastar, e pode ler tudo o que aquela carteira já recebeu ou enviou: pareie com um prover para o qual você mostraria seu histórico. A carteira verifica cada prova que recebe de volta.
Formatos dos arquivos de chave
Chave do nó:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Chave da carteira, versão 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen a grava com modo 0600 e, desde a v0.6.8, todo comando rand recusa um arquivo de chave de carteira que o grupo ou outros possam ler: uma chave copiada ou restaurada à mão deve voltar a 0600 (chmod 600 <key>). Perder a chave da carteira significa perder todas as notas que ela conseguia abrir; não há frase de recuperação nesta versão.