Tres binarios resultan de cargo build --release: rand-node (el nodo y los comandos del operador), rand (la billetera protegida) y rand-prover (el prover delegado). Todos los comandos aceptan -h/--help. Esta página describe la versión v0.6.8 (c9c9bd3c), la compilación que ejecuta la chain 20; cuando v0.6.7 se comportaba de otro modo, se indica. Una billetera rand anterior a v0.6.8 no puede enviar en la chain 20, cuyo génesis vincula cada prueba y cada mensaje firmado a su hash. Los dos primeros usan claves de distinto tipo: una clave de nodo es un par de claves Dilithium2 que firma bloques; una clave de billetera es una clave de gasto protegida que no firma nada en la cadena.
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 y bridge-gov son nuevos en v0.6.8. No existe balance ni transfer: una transferencia necesita una clave de gasto protegida, y solo la billetera la tiene.
Una opción global, --allow-test-fri-profile (o RAND_ALLOW_TEST_FRI_PROFILE=1), permite que init, run y verify acepten un génesis cuyo fri_profile es test. Ese perfil ofrece unos 17 bits de solidez, y quien escribe un archivo de génesis puede nombrarlo, así que desde v0.6.8 un nodo rechaza ese génesis sin la opción. Las suites de pruebas la activan; nada más debería hacerlo.
keygen, address
| comando | argumento | valor por defecto |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | obligatorio |
keygen escribe { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } con modo 0600. El archivo es la única copia de la semilla. Desde v0.6.8, keygen rechaza un --out que ya existe (… already exists or cannot be created; refusing to overwrite a key file) y lo deja intacto; no hay --force, así que hay que mover a un lado el archivo antiguo para reemplazarlo. v0.6.7 y anteriores lo sobrescribían sin preguntar. address imprime address, public_key (1312 bytes en hex) y peer_id.
genesis
| argumento | valor por defecto | significado |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | id de la cadena; las transacciones y los temas de gossip están vinculados a él |
--validator <KEY,STAKE,PAYOUT> | obligatorio, repetible | una entrada del registro: la ruta de un archivo de clave o una clave pública en hex, el stake en RAND (al menos 1000) y la dirección de pago rand1… |
--epoch-blocks <N> | 1000 | bloques por época |
--alloc <ALLOCS> | ninguno, repetible | una nota de depósito: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | ruta de salida |
--faucet | desactivado | solo testnet: activa Mint. Junto a una sección bridge requiere --testnet |
--testnet | desactivado | v0.6.8: escribe "testnet": true, la marca que permite que un faucet conviva con una sección bridge. Forma parte del hash del génesis cuando se indica |
--no-confidential | desactivado | desactiva Deploy y Call |
--fri-profile <production|test> | production | test es inseguro y está pensado para la suite de pruebas; init, run y verify rechazan un archivo así sin --allow-test-fri-profile |
--max-program-words <N> | ninguno (4096) | el programa más grande que puede incluir un deploy, 1..=65535. Solo se escribe cuando se indica; forma parte del hash del génesis siempre que esté presente, así que --max-program-words 4096 es una cadena distinta de omitirlo. Todos los nodos necesitan un binario v0.4 antes de init sobre un archivo así |
--max-proof-bytes <N> | ninguno (2 097 152) | la prueba más grande que puede incluir una transacción, 1048576..=33554432. Todos los límites de prueba se derivan de él |
--max-block-bytes <N> | ninguno (4 194 304) | el bloque más grande y, por tanto, la transacción más grande, 4194304..=67108864, y al menos 2 × max_proof_bytes + 1 MiB, o 3 × max_proof_bytes + 1 MiB con --auth-guest, donde una llamada lleva tres pruebas (bundle, auth, call) |
--max-call-envelope-bytes <N> | ninguno (18 432) | el sobre de entrada de llamada más grande, 18432..=1048576 |
--max-program-public-words <N> | ninguno (0) | la entrada pública más grande que puede fijar un deploy, 0..=65535; 0 no admite ninguna |
--tokens <TOKENS.JSON> | ninguno | la sección tokens de RPL, como un archivo JSON {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Si se omite, el archivo no tiene esa sección y su hash no cambia. Una sección bridge requiere una con un mint_cap_per_day distinto de cero (por respaldo, por día UTC, en las unidades de ocho decimales del token); un token listado requiere una sección bridge |
--envelope-bytes <N> | ninguno (el sobre heredado de 1348 bytes) | el tamaño exacto de cada sobre de nota: una salida de bundle, un mint del faucet, un withdraw, un depósito del bridge, una alloc del génesis. Solo se acepta 1860, el tamaño que permite que cada sobre lleve un memo cifrado. Forma parte del hash del génesis cuando se indica, y se aplica antes de sellar las notas --alloc de este mismo comando |
--vesting <VESTING.JSON> | ninguno | la sección vesting: las asignaciones sujetas a bloqueo temporal, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Desde v0.6.8, una entrada revocable enumera revokers (de 1 a 5 claves), un threshold y el treasury al que paga una revocación, y se rechaza un archivo que omita alguno |
--staking <STAKING.JSON> | ninguno | v0.6.8: la sección staking como archivo JSON (faucet_budget_per_epoch, bond_activation_epochs, max_weight_bps, max_stake_entry_per_epoch o max_stake_entry_bps_per_epoch, registration_v2, faucet_recipients, faucet_minters, admission_by_vote, slashing), validada por la compilación |
--consensus-domain <0|1> | ninguno (0) | v0.6.8: 1 vincula cada voto, new-view y propuesta a este génesis |
--bundle-guest <v1|v2|v3> | v1 | el guest de bundle fijado como hc_bundle: v1 (el guest de activos ocultos que ejecutaron las chains 14 y 15), v2 (el guest sin ramificaciones de la chain 16) o v3 (autorización dividida: el guest recibe nk y una sal en lugar de la clave de gasto). v3 requiere --auth-guest |
--auth-guest | desactivado | fija el guest de auth de esta compilación como hc_auth: cada bundle lleva entonces una prueba de auth sobre la clave de gasto, vinculada a su transacción, cuya salida es igual al auth_commit del bundle. Obligatorio con --bundle-guest v3 y rechazado con v1 o v2, antes de escribir ningún archivo. Si falta, el archivo no tiene el campo hc_auth |
--hardening-v6 | desactivado | convierte las reglas de v0.6 en reglas de validez (hardening_v6): la ventana de pc, los deploys no invocables, las formas canónicas de prueba y las palabras de proof-of-work, el vínculo de la llamada y el mínimo de la tabla de programas. Si falta, un nodo sigue rechazándolas en su pool, como política |
--gas-price <UNITS> | ninguno (sin sección gas) | unidades (10⁻⁹ RAND) por gas que la propia cadena cobra por una llamada. Esta opción es la que escribe la sección gas (metering: "circuit"); las tres opciones siguientes se rechazan sin ella. Forma parte del hash del génesis |
--byte-price <UNITS> | 800, solo con --gas-price | unidades por KiB, o fracción de uno, de prueba de llamada más sobre de entrada, desde el byte 0 |
--bundle-gas-limit <N> | 20479, solo con --gas-price | el GAS_LIMIT exacto que debe declarar cada prueba de bundle; se rechaza una prueba de bundle que declare cualquier otro valor. El génesis solo acepta 20479, gas_max(14, 0, 0) para el guest de bundle de nivel 14 |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | ninguno (precios fijos) | activa el controlador de precios por bloque, con suelo en los propios gas_price y byte_price iniciales de la sección. Se rechaza junto a --aggregation |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | ninguno (sin techo) | v0.6.8: los techos sobre los que el controlador nunca eleva un precio, cada uno al menos igual al precio inicial. Se rechazan sin --gas-dynamic |
--gas-byte-load paying | ninguno (los bytes de toda transacción) | v0.6.8: solo la prueba y el sobre de entrada de una llamada mueven byte_price, de modo que un bloque de transferencias no mueve ninguno. Se rechaza sin --gas-dynamic; paying es el único valor |
--binding-domain <0|1> | ninguno (sin campo) | v0.6.8: 1 vincula el hash del génesis a cada vínculo de transacción y a cada mensaje de acción firmado (un mint del faucet, unbond, withdraw, los mensajes de token RPL, las acciones del aggregator, los mensajes de gobernanza del bridge), de modo que una prueba o firma de esta cadena no se verifica en ninguna otra. Si se omite, el comando avisa: una billetera v0.6.8 genera la forma vinculada al génesis en todo id de cadena fuera de 14 a 19, así que toda cadena desde la 20 se crea con 1 |
--proof-window-blocks <N> | ninguno (256) | v0.6.8: una ventana, de 256 a 4096 bloques, que fija la antigüedad máxima del ancla de un bundle y de su time. Se sirve como rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | ninguno (sin sección program_state) | v0.6.8, RPL-2: activa las celdas de programa, las bóvedas de programa y la acción Invoke, con esta tarifa de celda en unidades de RAND (como máximo 1000 RAND) que se suma al piso de comisión de un invoke por cada celda que crea. Requiere --tokens, --gas-price, --hardening-v6 y --auth-guest; cada una se rechaza por su nombre antes de escribir ningún archivo |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | ninguno | la sección aggregation; la compilación v0.6.8 se niega a arrancar con un génesis que la tenga |
Imprime una línea alloc por cada --alloc, luego el hash del génesis, los recuentos de validadores y de notas, la duración de la época, los cinco límites, hc_bundle y hc_auth (none sin --auth-guest), y después la línea de gas: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, o gas: none sin --gas-price, y con --program-state-cell-fee una línea program_state: cell fee N RAND. init imprime la misma línea de gas. Las cinco opciones de límite se comportan igual: si se omiten, el archivo no tiene ese campo y la cadena aplica el valor por defecto; si se indican, el campo forma parte del hash del génesis incluso con su valor por defecto. La chain 20 se creó con estas opciones (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
Las cadenas 18 y 19 se cortaron con las mismas flags hasta --envelope-bytes 1860 y sin ninguna de las de v0.6.8. El límite de las pruebas es de 4 MiB, frente a los 8 MiB de las cadenas 13 a 16: una transacción con autorización dividida lleva hasta tres pruebas, y 3 × 4 MiB + 1 MiB caben en el bloque de 20 MiB. tokens.json contiene un registration_fee de 1 RAND, un mint_cap_per_day de 10000000000000, max_tokens 4096, burn_registration_fee y bound_note_value, y zUSD figura con sus siete respaldos. No existe la flag --bridge, y el script de corte sigue incorporando después al archivo las secciones bridge, staking y consensus_domain (en la cadena 20: el puente en el conjunto de guardianes 1 con ocho claves de guardián PQ, la clave de pausa, rules_v2, rotation y fees; la sección staking con la lista de permitidos del faucet, admission_by_vote y un presupuesto de entrada de 2500 bps; consensus_domain: 1; y las notas de génesis de zUSD, creadas con alloc-note --asset 1 --envelope-bytes 1860). El hash de génesis que cuenta es el que init imprime sobre el archivo terminado.
Cada --alloc construye una nota de depósito con aleatoriedad de compromiso nueva, de modo que cortar dos veces produce dos hashes distintos. El comando siempre escribe la apertura de la nota junto a cm y amount, algo que exige una cadena con una sección tokens:
"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>" } }
]
Por tanto, el propietario y el importe de una nota de génesis son públicos por diseño una vez publicado el archivo; solo el momento en que se gasta después y en qué se gasta siguen siendo privados. Corte un génesis una sola vez y conserve el archivo.
alloc-note
--to <rand1…> (obligatorio), --amount <N> (obligatorio), --asset <INDEX> (por defecto 0), --envelope-bytes <N> (por defecto: el formato heredado). Imprime una nota de asignación como JSON, sellada para --to del mismo modo que genesis --alloc sella una. Un génesis que define envelope_bytes rechaza una nota sellada sin el --envelope-bytes correspondiente. --amount se expresa en unidades enteras del activo: nueve decimales para RAND, ocho para un token con puente (10 en el activo 1 son 10 zUSD). Una nota de un token listado exige que los respaldos de ese token tengan importes locked cuya suma sea exactamente la de sus notas.
init
| argumento | significado |
|---|---|
--datadir <DATADIR> | directorio de datos que se creará |
--genesis <GENESIS> | archivo de génesis; se copia a <datadir>/genesis.json |
Imprime el hash de génesis y la misma línea gas: que genesis.
run
| argumento | por defecto | significado |
|---|---|---|
--datadir <DATADIR> | obligatorio | directorio de datos inicializado |
--key <KEY> | obligatorio | archivo de claves: identidad de validador, identidad p2p, destinatario de comisiones |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | multiaddr de escucha de libp2p, repetible |
--bootstrap <BOOTSTRAP> | ninguno, repetible | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, se marca al iniciar y cada 30 s mientras no haya conexión. Desde v0.6.8 su peer id queda reservado |
--reserved-peer <PEER_ID> | ninguno, repetible | v0.6.8: un par admitido por encima del límite de conexiones entrantes y atendido con la parte del presupuesto de sincronización reservada a los validadores. Los bootstraps y todo validador cuyo vínculo de par firmado haya visto este nodo quedan reservados sin esta flag; en una cadena recién cortada, cuyo almacén aún no contiene vínculos, enumere aquí los validadores de la flota |
--strict-gossip | desactivado | v0.6.8: validación estricta de gossipsub, que acepta solo mensajes con firma de autor, número de secuencia y origen válidos. Los nodos estrictos y los permisivos interoperan, de modo que se despliega nodo por nodo |
--rpc <RPC> | 127.0.0.1:8545 | el listener JSON-RPC del operador: todos los métodos, y confía en loopback. Manténgalo en loopback y no reenvíe nunca un endpoint público hacia él |
--public-rpc <ADDR> | desactivado | v0.6.8: un segundo listener, público, con un conjunto fijo de métodos (sin métodos de clave de visualización, rand_mint ni rand_getPeers), sin lotes, sin WebSocket y con un único medidor para todos los llamantes; es a lo que debe apuntar un proxy inverso o un reenvío SSH (JSON-RPC) |
--rpc-viewing-token-file <PATH> | desactivado | v0.6.8: exige Authorization: Bearer <first line of the file> (32 o más caracteres) en los métodos de clave de visualización de --rpc |
--validator | desactivado | participa en el consenso con esta clave |
--no-mdns | desactivado | desactiva el descubrimiento en la LAN |
--block-interval-ms <MS> | 1000 | espaciado mínimo entre propuestas |
--view-timeout-ms <MS> | 3000 | tiempo de espera base de la vista; se duplica con cada tiempo de espera consecutivo hasta 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | desactivado | modo de archivo en una cadena de agregación |
--prune-history <WINDOW> | ninguno (se conserva todo) | conserva solo esta cantidad de historial de bloques, <n>m, <n>h o <n>d, como mínimo 1h: los bloques más antiguos pierden su bloque, QC, transacciones y recibos; el ledger permanece. En la cadena 20, 24 de los 26 validadores usan 24h y dos nodos son archivos. Un archivo y un nodo de mainnet nunca lo definen. Las consultas de altura por debajo del límite responden -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | se niega a iniciar con menos espacio libre en el sistema de archivos del directorio de datos; rand_getHealth indica disk_low por debajo de cuatro veces ese valor. 0 desactiva la protección |
--rpc-viewing-open | desactivado | permite que llamantes que no son loopback usen los métodos de clave de visualización; solo detrás de algo que autentique |
--gas-price <UNITS> | 100 | unidades (10⁻⁹ RAND) por gas que el pool de este nodo exige a una llamada, por encima de gas_max de la cabecera de su prueba. Es una política de admisión, no una regla de la cadena: un bloque que contenga una llamada más barata sigue siendo válido. 0 con --byte-price 0 no aplica ninguna política. En una cadena cuyo génesis tiene una sección gas, como la de la cadena 20, los precios de la propia cadena son la regla de validez |
--byte-price <UNITS> | 800 | unidades por KiB, o fracción de uno, de la prueba y del sobre de entrada de una llamada, desde el byte 0, bajo la misma política |
--prover <ADDR> | desactivado | aloja el prover delegado (el JSON-RPC prover_*) en esta dirección: un listener propio, que debe ser distinto de --rpc. El nodo se niega a iniciar sin <prover-home>/prover.key.json, creado por rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | el prover.key.json y el pairings.json del prover |
--prover-accept-spend-key | retirada | rechazada al iniciar desde v0.6.8: run con esta flag termina antes de leer la clave del nodo, nombrando la flag. Ningún prover acepta ya un testigo de clave de gasto; quítela del archivo de unidad. En v0.6.7 aceptaba testigos de clave de gasto para cadenas con bundle guest v1 o v2 |
--prover-max-parallel <N> | 1 | pruebas que el prover alojado ejecuta a la vez; el inicio se rechaza a menos que haya disponibles 5.74 GB × N + 1 GiB de memoria |
--prover-max-queue <N> | 8 | trabajos en cola además de los que se ejecutan |
--prover-cuda | desactivado | prueba en el backend CUDA (una compilación con --features cuda); sin recurso alternativo a CPU |
--prover-skip-memory-check | desactivado | omite la comprobación de memoria libre |
--prover-fee <RAND>, --prover-fee-address <rand1…> | ninguno | la comisión que debe pagar cada trabajo enviado al prover alojado, en RAND con hasta nueve decimales: una salida de un RAND a la dirección, dentro del bundle probado. Cada flag requiere la otra |
--prover-allow-origin <ORIGIN> | extensiones de navegador y páginas loopback | un origen de navegador cuyas páginas pueden leer las respuestas del prover, repetible; si se indica una o más veces, los valores son la lista completa. * permite todos los sitios web e imprime una advertencia |
Entorno: RUST_LOG (por defecto info,libp2p=warn,libp2p_mdns=off). Ctrl-C o SIGTERM apagan el nodo de forma limpia.
El endpoint público https://rpc.randprotocol.org es un proxy de lista de permitidos delante de un nodo de archivo; desde el 2026-10-01 su lista de permitidos es el conjunto de métodos del listener público.
safety
El estado de seguridad del consenso de un validador detenido (v0.6.8). Cada comando abre por sí mismo el directorio de datos, de modo que ninguno se ejecuta junto a un nodo activo.
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 la cabeza confirmada, la vista y la última vista votada, el QC alto, si el validador está bloqueado por encima de su cabeza y cualquier detención de seguridad registrada. Un nodo que ve que una cadena de tres certificada intenta confirmar un bloque que no desciende de su propia cabeza confirmada se detiene y lo registra (auditoría v6, CON-5); run termina entonces con ese registro hasta clear-halt. Compare la cabeza de este nodo con la de otros dos validadores y vuelva a sincronizar desde un archivo si difiere antes de borrar el registro. Desde v0.6.8 (CON-4) ningún quórum de respuestas «no lo tengo» libera ya un bloqueo: un validador bloqueado en un bloque que no puede obtener permanece en silencio hasta que llega una propuesta cuyo justify supera al bloqueo o se obtiene el bloque. release-lock reduce el bloqueo persistido al certificado de la cabeza confirmada; úselo en un validador a la vez, y solo cuando el bloque se haya perdido definitivamente. Sin su flag de confirmación, cada comando de escritura imprime lo que haría y no cambia nada.
verify
| argumento | por defecto | significado |
|---|---|---|
--datadir <DATADIR> | obligatorio | el nodo no debe estar en ejecución |
--mode <MODE> | full | quick o full |
--repair | desactivado | trunca la cola dañada; se conserva el estado de seguridad |
Código de salida 0 si es consistente, 2 si se encontró un problema sin --repair.
db
db drop-receipts-index --datadir <DATADIR>, con el nodo detenido: elimina el índice receipts_by_program antes de volver a una compilación anterior a v0.3, que no puede abrir una base de datos que lo tenga. Un inicio posterior reconstruye el índice a partir de los recibos.
status
--rpc <URL> (por defecto http://127.0.0.1:8545). Imprime rand_status textualmente.
register, unbond, withdraw
| comando | argumentos | significado |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | imprime una Registration en hexadecimal firmada con la clave de este nodo; se lee del RPC el id de la cadena y, con --v2, también el hash del génesis. --v2 es obligatorio en una cadena cuyo génesis establece staking.registration_v2, como el de la cadena 20; allí se rechaza un registro v1, y en cualquier otra se acepta uno v2 |
unbond <amount RAND> | --key, --rpc, --no-wait | pasa el stake a desvinculación; sin comisión; retirable dos épocas después |
withdraw <amount RAND> | --key, --rpc, --no-wait | paga el stake liberado y las recompensas en una nota en la dirección de pago, menos la base de 0.001 RAND |
admit sign|submit
Admisión por voto (v0.6.8). En una cadena cuyo génesis establece staking.admission_by_vote, como el de la cadena 20, una nueva clave de validador solo se registra después de que la hayan firmado validadores que sumen estrictamente más de dos tercios del peso de voto.
| comando | argumentos | significado |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | imprime el voto de este validador en una línea, <voter key hex>:<signature hex>, sobre el hash del génesis y la dirección del candidato, de modo que vale en una sola cadena. Sin conexión: no lee ningún nodo |
admit submit | --candidate …, --signature <line> (repetible), --rpc, --no-wait | comprueba cada voto contra el hash del génesis del nodo (se nombra todo voto para otro génesis o candidato, o un votante repetido), los ordena y envía el AdmitValidator sin comisión |
El candidato es la clave que llevará el registro; rand-node address --key la imprime, y el hexadecimal que imprimió register la contiene. Una vez confirmada la admisión, la vinculación sigue como antes (rand bond … --registration) y la consume. rand_getAdmitted enumera lo admitido y en espera.
bridge-gov
Las rotaciones poscuánticas del puente (v0.6.8), para los guardianes y el titular de la clave de pausa. Cada paso lee del --rpc (por defecto http://127.0.0.1:8545) el id de la cadena, su dominio de vinculación y rand_getBridgeState.rotation_nonce.
| comando | qué hace |
|---|---|
rotate-pq message --new-key K… | imprime el mensaje de rotación en hexadecimal para el nonce actual, para compararlo en cada firmante |
rotate-pq sign --new-key K… --key F --index I [--possession] | imprime I:signature: la línea de quórum de un guardián PQ actual (I es su índice en el conjunto actual) o, con --possession, la línea del titular de una clave nueva (I es su índice en el conjunto nuevo); rechaza un archivo de clave que no sea la clave en I |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | ensambla RotatePqGuardians, o la acción V2 con líneas de posesión, y la envía; rechaza la posesión en una cadena que no la admite y su ausencia en una que la exige, como la cadena 20 |
rotate-pause message|sign|submit --new-key K | lo mismo para la clave de pausa (índice de posesión 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | imprime 0:signature sobre el mensaje de cancelación, verificado contra la clave de pausa vigente de la cadena |
cancel-rotation submit --kind pq|pause --signature @F | envía CancelRotation, descartando una rotación pendiente antes de que termine su demora |
--new-key es una clave pública Dilithium2 en hexadecimal, @file que contenga una, o @key-file (su clave pública). Las líneas de firma son index:hex, separadas por espacios en blanco o saltos de línea; se admiten comentarios con #.
vesting status|claim|revoke|bond|unbond
El lado del titular y el del revocador de una asignación de génesis con bloqueo temporal, en una cadena cuyo génesis incluye una sección vesting. El de la cadena 20 no la tiene. La clave es un archivo de rand-node keygen.
| comando | argumentos | significado |
|---|---|---|
vesting status <ENTRY> | --rpc | la entrada tal como la sirve rand_getVesting: sus términos, lo ya adquirido (vested) y lo reclamable ahora |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> o --all, --key, --rpc, --no-wait | paga lo desbloqueado en una nota en --to, menos la base de 0.001 RAND; firmado con la clave del beneficiario |
vesting revoke prepare | --entry, --margin-secs (por defecto 600), --out (por defecto revoke.json), --rpc | v0.6.8, sin clave: escribe la revocación que firma cada revocador, una nota con la parte aún no adquirida --margin-secs después de la cabeza, pagada al treasury del génesis de la entrada (no existe --to) |
vesting revoke sign | --proposal <file>, --key, --index? | una clave de revocador, sin conexión: imprime <index>:<signature hex> |
vesting revoke submit | --proposal <file>, --signature <index:hex> (repetible), --rpc, --no-wait | envía la revocación con al menos el threshold de firmas de la entrada, dentro de los 256 bloques posteriores a prepare. El vesting revoke --to de clave única de v0.6.7 ya no existe |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | entradas irrevocables: vincula RAND bloqueados como stake de ese validador; un validador que aún no esté en el registro necesita lo que imprimió register |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | devuelve al bloqueo los RAND vinculados; vuelven a ser reclamables tras las épocas de desvinculación |
aggregator register|unbond|withdraw, aggregate
Los comandos del rol de agregador para una cadena con una sección aggregation: aggregator register --key --bond <RAND> --payout <rand1…> --rpc imprime un AggregatorRegistration firmado; aggregator unbond y aggregator withdraw replican el par del validador. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] es el demonio que consulta rand_getUnsealed, prueba un agregado y lo envía. Inerte en la cadena 20, cuyo génesis no tiene sección aggregation.
rand (wallet)
Opciones globales, antes o después del subcomando:
| opción | env | por defecto |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http o https (el endpoint público es https://rpc.randprotocol.org). Se rechaza una respuesta de más de 64 MiB |
--key <KEY> | RAND_KEY | wallet.key.json; el almacén de notas está junto a ella, en <key>.notes.json. El almacén queda vinculado a la cadena contra la que se escaneó (el rand_getGenesisHash del nodo): si se apunta a otra cadena, como una wallet conservada a través del corte de la cadena 19 a la 20, se vacía y se vuelve a escanear desde la hoja 0 con una advertencia. Desde v0.6.8 todo comando rechaza un archivo de clave que el grupo u otros puedan leer, e indica la solución (chmod 600 <key>) |
--prover | desactivado. Prueba el bundle en el prover emparejado con esta wallet (rand prover pair) en lugar de en esta máquina; la prueba se verifica aquí (su digest, su tamaño y una verificación local) antes de entrar en una transacción. Se aplica a todo comando que prueba un bundle; en call y program invoke, solo el bundle de pago va al prover y la prueba de la llamada permanece local. Se rechaza sin un emparejamiento, y junto con --cuda salvo en call. En una cadena de autorización dividida como la cadena 20, al prover se le envían la clave de visualización nk y un salt, nunca la clave de gasto: puede leer todo el historial de esta wallet y no puede gastar. La prueba de autorización siempre se hace en esta máquina. En una cadena cuyo guest de bundle es v1 o v2, v0.6.8 rechaza --prover antes de preguntar nada al prover | |
--max-prover-fee <RAND> | 1. Lo máximo que un prover emparejado puede cobrar por bundle. Una cotización superior se rechaza antes de construir ningún bundle; 0 rechaza cualquier comisión. La comisión es una salida de RAND más en el mismo bundle, mostrada como prover fee: <amount> RAND to <fingerprint> |
Los importes son RAND decimales con hasta nueve decimales (1, 1.5, .25, 0.000000001). Un importe de token en send, token mint y token burn, y en un enlace randpay:, está en las unidades de visualización del token, con los decimals propios de su fila del registro (10 de zUSD son 10 zUSD). bridge-burn, token create --fixed-supply y --initial toman enteros simples en la unidad mínima del token, y asset-balance los imprime. Dondequiera que un comando toma un token, acepta el índice del registro, el id rpl1… o el id de 64 caracteres hexadecimales; un id se resuelve a su índice a partir del listado completo del registro del nodo (rand_getTokens, todas las páginas), nunca mediante una consulta por token, que le revelaría al nodo qué token está a punto de moverse. Un índice numérico no llega nunca al nodo.
| comando | argumentos | comportamiento |
|---|---|---|
keygen | escribe un nuevo archivo de clave de gasto en --key, con modo 0600; se niega a sobrescribir | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | imprime en stdout la dirección rand1… de esta cartera, exactamente la dirección y un salto de línea, de modo que $(rand address) funcione en un script, y su fingerprint XXXX-XXXX-XXXX-XXXX en stderr: 16 caracteres base32 de Crockford, una verificación humana de la dirección que nunca se envía por la red. --uri imprime además un enlace randpay: (la dirección más un importe, un activo y un memo opcionales). --qr muestra ese enlace como código QR en el terminal; --qr-png lo escribe como PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | direcciones con nombre a las que esta cartera puede enviar por su nombre. TO es una dirección rand1… o un enlace randpay:, del cual solo se conserva la dirección. add imprime la huella y pregunta add? [y/N] salvo con --yes; un stdin que no sea un terminal se rechaza sin él. Se almacena en <key>.contacts.json, con modo 0600. Un nombre tiene de 1 a 64 caracteres, nunca empieza por rand1 ni por randpay:, y es único |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | empareja esta cartera con un probador delegado. pair toma el enlace randprover: que imprimió rand-prover pair, rechaza una URL que no sea https:// (http:// simple solo hacia localhost, 127.0.0.1 o [::1]), luego indica qué recibirá el probador (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) y pregunta pair? [y/N]; --yes omite la pregunta, y un stdin que no sea un terminal se rechaza sin él. A continuación consulta el prover_info del probador, se niega a continuar salvo que la huella de su clave sea la que nombra el enlace, y escribe <key>.prover.json, con modo 0600, reemplazando cualquier emparejamiento anterior. --trusted (v0.6.8) no toma ningún enlace: se empareja con el grupo de probadores de los validadores, https://prover.randprotocol.org, a partir del enlace que lleva la compilación; sus operadores pueden leer el historial de esta cartera y no pueden gastar. show imprime nombre, URL, huella, own y la clave del probador, nunca el token; forget elimina el archivo. v0.6.7 no preguntaba antes de emparejar |
viewing-key | imprime la clave de visualización nk de esta cartera, 64 hex: el parámetro que toma rand_importViewingKey. Lee todas las notas que la cartera envió o recibió y no gasta ninguna | |
balance | analiza el árbol, guarda el almacén e imprime el valor gastable y el número de notas sin gastar | |
sync | --rescan | analiza sin imprimir un saldo. Una primera sincronización lee todas las cabeceras de bloque (1.024 por llamada) antes que las hojas. --rescan olvida todas las notas, marcas de gastado y cursores (conservando el vínculo con la cadena) y vuelve a analizar desde la hoja 0: el camino de vuelta cuando un nodo informó erróneamente de que las notas de esta cartera estaban gastadas. Conviene ejecutarlo contra un nodo de confianza |
notes | --memo | todas las notas que esta cartera ha abierto: índice, activo, importe, altura, spent, pending, y el memo recortado a 24 caracteres, o completo con --memo |
asset-balance [INDEX] | analiza y luego imprime lo que esta cartera tiene en un activo, o una fila por cada activo que posee; los importes en la unidad más pequeña del propio activo | |
history | --memo | todas las notas que esta cartera creó para otra persona, con la misma columna de memo que notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (por defecto 0, RAND), --memo <M>, --fee <RAND> (por defecto 0.001), --no-wait, --yes, --cuda | TO es una dirección rand1…, un enlace randpay: o el nombre de un contacto guardado, probados en ese orden. El importe, el activo y el memo propios de un enlace rellenan lo que la línea de comandos omite; AMOUNT es opcional solo cuando el enlace trae uno, y un valor dado de ambas formas que no coincida se rechaza. El comando imprime la confirmación, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> y, cuando hay un memo, una línea propia memo: "<text>", y luego pregunta antes de generar la prueba salvo con --yes. Un script debe pasar --yes: un stdin que no sea un terminal se rechaza con stdin is not a terminal: pass --yes to send without confirmation. Después selecciona como máximo dos notas del activo y como máximo dos notas RAND para la comisión, sella el memo solo en la salida de pago, genera localmente la prueba de un paquete de cuatro ranuras con activo oculto y, en una cadena con autorización dividida, la autorización de gasto, lo envía y espera la confirmación. Un memo no vacío se rechaza antes de generar la prueba en una cadena cuyo génesis no tiene envelope_bytes. AMOUNT está en las unidades de visualización del activo: RAND decimal para RAND, y un token con los decimals propios de su fila del registro; solo 0 o rand leen RAND, sea cual sea el índice que respondió el nodo. Un id de token se decodifica antes de consultar al nodo, y se rechaza una fila de listado que lo responda con el índice 0 o con campos de id discrepantes. La confirmación muestra el importe de un token en unidades de visualización y en unidades base, 10.00000000 zUSD (1000000000 units), de modo que un nodo que mienta sobre los decimals de un token se hace visible antes de enviar nada. El índice del activo y la comisión se imprimen antes de generar la prueba. En la cadena, una transferencia de token es un paquete simple, indistinguible de un pago en RAND; su comisión es en RAND, y una cartera sin RAND gastable se rechaza antes de generar la prueba |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | hace staking en un validador: el paquete quema el importe |
faucet [ADDRESS] | --amount <RAND> (por defecto y máximo 100) | solo testnet: pide a un nodo validador que acuñe. En la cadena 20 el faucet paga únicamente a las 16 carteras de su lista de permitidos del génesis |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (repetible), --out <file> (por defecto program.json) | ensambla un guest integrado; imprime el id del programa. rpl2_counter (v0.6.8) es el programa de demostración de RPL-2 |
program deploy <FILE> | .json, un .bin en bruto, o el contenedor de imagen que escribe rand-guest build; --public <FILE>, --input <u32> (repetible) o --check-call, --cuda | imprime el id del programa, hc y el número de palabras; rechaza un programa que supere el límite de la cadena (mediante rand_estimateFee) antes de generar la prueba; paga el mínimo de despliegue mediante un paquete y espera. --public almacena una entrada pública con el programa (palabras u32 separadas por espacios, o un ELF .so), dentro del max_program_public_words de la cadena; el id del programa queda entonces vinculado a ella. Con --input o --check-call la cartera primero ejecuta en seco una llamada con esas entradas privadas en el emulador y se niega a continuar salvo que quepa en el límite del nivel de llamada (14); no se genera ninguna prueba para la comprobación |
program show <ID> | metadatos del programa desplegado | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (obligatorio), --input N (repetible, privada), --inputs-file <FILE.json> (un arreglo JSON de u32, se añade al final), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: declara una transición de estado del programa y hace que la cadena la aplique. Antes de generar ninguna prueba, comprueba que la cadena tiene una sección program_state, que el programa existe, que el contexto de la transición cabe en la regla de segmentos, que cada entrada de reads coincide con la celda viva (rand_getProgramCell; una discrepancia nombra la celda obsoleta y termina con código 3), que la bóveda puede pagar cada entrada de pays más lo que deposita esta transición, y que esta cartera posee el token y los RAND que necesitan el depósito y la comisión. Cuenta las celdas que crean las escrituras, ejecuta en seco el programa sobre las palabras reales del contexto, genera la prueba de la llamada vinculada a la transacción, luego la del paquete (la comisión, más deposit.rand quemado mediante burn_r y deposit.amount de deposit.asset mediante burn_a) y la prueba de autorización. La comisión por defecto es el mínimo de la llamada para el gas declarado más la comisión de celda por cada celda creada, con los mismos dos escalones de precio de margen que call. Imprime cada pago y, salvo con --no-wait, las ocho outputs del recibo. Una lectura obsoleta en el momento de la inclusión también termina con código 3, de modo que una herramienta que llama vuelve a leer y reintenta. No publica ninguna transcripción de entradas. El archivo de transición, con todos los campos opcionales: {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]}; las claves y los valores son Word8 de 64 hex, los importes son cadenas decimales en las unidades propias del activo, to es por defecto esta cartera |
program state <ID> | --cell <64 hex> | v0.6.8: todas las celdas del programa en orden de clave (rand_getProgramCells, paginado hasta el final), o una sola celda con --cell, 64 ceros cuando está ausente. Se rechaza en una cadena sin sección program_state |
program vault <ID> | v0.6.8: la bóveda del programa (rand_getProgramVault), una fila por cada activo que contiene, importes en unidades. Se rechaza en una cadena sin la sección | |
call <PROGRAM-ID> | --input N (repetible), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | ejecuta primero la llamada en el emulador e imprime gas: <exact> (declaring <limit>, tier <t>): el gas exacto es testigo y nunca sale de la cartera, el límite declarado es el GAS_LIMIT público de la prueba. En una cadena con sección de gas, el límite por defecto es el gas exacto redondeado hacia arriba a un múltiplo de 2^(t−2); max declara el techo de la cabecera gas_max, que no filtra nada que el nivel no filtre; N se rechaza si está por debajo del gas exacto o por encima del techo. Sin sección, o con --cuda, el valor por defecto es max. Luego genera localmente la prueba de la llamada sobre la entrada pública del programa, sella su transcripción de entradas, paga mediante un paquete e imprime el recibo. La comisión por defecto es el mínimo para el límite declarado, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB a los precios que sirve rand_getLimits, más dos escalones de precio de margen donde los precios se mueven, impresa como fee … RAND (incl. two price steps of headroom). En una cadena hardening_v6 la comisión se fija antes de que exista la prueba, así que el valor por defecto fija el precio con el límite de prueba de la cadena en lugar de la prueba, lo que solo puede suponer un pago excesivo; --fee paga un importe exacto. --expect-public se niega antes de generar la prueba salvo que la entrada pública del programa sean las palabras de ese archivo |
open-call <TXHASH> | --call-key <hex>, --as-auditor | abre la transcripción de una llamada, la comprueba contra H_IN, vuelve a ejecutar el programa; termina con código distinto de cero si hay una discrepancia |
receipt <TX> | el recibo de una llamada confirmada | |
bridge-mint <ATTESTATION> | hex o @path, --pq <JSON or @path> (obligatorio), --to <rand1…> (por defecto: esta cartera), --fee (por defecto: el mínimo de la acción), --no-wait, --cuda | deposita como nota una atestación firmada por los guardianes. --pq es el quórum de cofirmas Dilithium2 de los guardianes, [{"index":0,"signature":"<4840 hex>"},…]. Antes de generar ninguna prueba: decodifica la atestación, comprueba el quórum contra los pq_guardians del nodo y el id de cadena, comprueba el destinatario y el id del activo, lee el índice listado (rand_getAssets). El factor de cegado de la nota de depósito se deriva del resumen de la atestación, r = blake3("rand-deposit-r-1" || mu), la única r que admite la cadena. El paquete de la comisión se prueba contra la transacción completa, incluido el quórum. Imprime el owner, el time y la r de la nota |
bridge-rotate <ROTATION> | hex o @path, --pq <JSON or @path> (obligatorio), --fee (por defecto: el mínimo de la acción), --no-wait, --cuda | envía una rotación del conjunto de guardianes con el quórum de cofirmas del conjunto PQ actual, como un BridgeAttest que no deposita nada. Rechaza, antes de generar la prueba, cualquier cosa que no sea una rotación que avance en uno el conjunto de Rand. Imprime después el guardian_set_index |
bridge-pause | --sig <HEX or @path> (obligatorio), --no-wait | pausa la acuñación del puente: un PauseMints sin paquete y sin comisión, de modo que no hacen falta archivo de clave ni RAND. El archivo es la salida de rand-bridge-gov pause, la firma de 2.420 bytes de la clave de pausa en hex, hecha para el pause_nonce actual del puente; se comprueba contra la pause_key del nodo y el id de cadena antes de enviarse. Las quemas y las rotaciones siguen abiertas durante la pausa |
bridge-unpause | --pq <JSON or @path> (obligatorio), --no-wait | levanta una pausa con un quórum de guardianes PQ (el archivo de rand-bridge-gov pq-unpause) hecho para el pause_nonce actual. Sin paquete y sin comisión; la clave de pausa por sí sola nunca puede reanudar |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (por defecto 0.01), --no-wait, --cuda, --yes | quema un activo puenteado hacia el exterior: comprueba que la moneda TOKEN en TO_CHAIN respalda ASSET y tiene al menos AMOUNT bloqueado, y que AMOUNT y la comisión del relayer son unidades de liberación enteras; luego genera la prueba de un paquete que gasta el activo en las ranuras 0–1, quema exactamente AMOUNT de él (burn_a, burn_asset) y paga la comisión en RAND desde las ranuras 2–3. --relayer-fee es una parte de AMOUNT, no un cargo adicional. En una cadena con comisión de puente (rand_getBridgeState.fees), como lo es la cadena 20, v0.6.8 imprime primero la comisión que retiene la cadena (en el activo) y el importe que se liberará, y pide confirmación; --yes omite la pregunta, y un stdin que no sea un terminal se rechaza sin él. Las comprobaciones de bloqueado y de comisión del relayer se aplican entonces sobre el importe liberado |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (aleatorio si no se da), y luego o bien --fixed-supply <N> --to <rand1…>, --authority-key-out <FILE> [--initial <N> --to <rand1…>] o (v0.6.8) --program <PROGRAM-ID>, un token cuya autoridad de acuñación es ese programa, que solo sus invocaciones acuñan o queman, que parte de suministro cero y que requiere la sección program_state de la cadena, --fee (por defecto: la base del paquete más el registration_fee del registro; se rechaza cuando el nodo informa de una comisión de registro superior a 10 RAND, así que pase --fee para pagar una mayor de forma deliberada), --no-wait, --cuda | registra un token en el siguiente índice del registro: de suministro fijo (acuña una vez, autoridad none) o autorizado por Key (un archivo de clave Dilithium2 nuevo, escrito con 0600, que se niega a sobrescribir). La clave de autoridad queda en <FILE>.pending hasta que la cadena acepta el registro. Si otro registro toma antes el índice, imprime another token took index N first — re-run to register at N+1; si tiene éxito imprime el índice y el id, en hex y rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (en las unidades de visualización del token), --authority-key <FILE>, --fee (por defecto 0.001), --no-wait, --cuda | acuña más de un token autorizado por Key; se rechaza antes de cualquier prueba si el token no está autorizado por Key o si la clave no es su autoridad |
token set-authority | --asset, --authority-key <FILE>, y luego o bien --new-key <FILE> o --renounce, --fee (por defecto 0.001), --no-wait, --cuda | entrega un token autorizado por Key a otra clave, o renuncia a la acuñación para siempre |
token burn <ASSET> <AMOUNT> | --fee (por defecto 0.001), --no-wait, --cuda | destruye AMOUNT, en las unidades de visualización del token, de un token RPL que esta cartera posee; su suministro público baja exactamente esa cantidad. Un token puenteado se rechaza antes de generar la prueba: sale mediante bridge-burn |
token info <INDEX|rpl1…|hex> | la fila completa de rand_getTokens de un token: nombre, símbolo, decimales, autoridad, mint_nonce, suministro total, registered_at, id (hex e id_text) y, si está puenteado, cada respaldo (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (por defecto 0), --limit <N> (por defecto 1000) | una página de rand_getTokens: enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (los decimales de origen del primer respaldo), --pq <JSON or @path> (obligatorio), --fee (por defecto: la base del paquete más el registration_fee del nodo, con el mismo rechazo de 10 RAND que token create), --no-wait, --cuda | registra un token puenteado tras el génesis con su primer respaldo, autorizado por un quórum de guardianes PQ (el archivo de rand-bridge-gov pq-register) hecho para el list_nonce del nodo. Primero se lista en Rand, después setToken en el endpoint |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (obligatorio), --fee (por defecto: la base del paquete), --no-wait, --cuda | añade un respaldo a un token puenteado, autorizado por un quórum de guardianes PQ (el archivo de rand-bridge-gov pq-list) con el list_nonce del nodo |
bridge | el estado público del puente: guardianes, emisores, el registro de activos, la secuencia de quemas | |
bridge-message <SEQUENCE> | un mensaje de quema saliente, textual | |
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) | la comisión mínima según el calendario del nodo. En una cadena con sección de gas, fee call <tier> --gas N fija el precio del límite declarado que imprime rand call, a los precios de la punta y sin margen: el mínimo mismo. Sin --gas fija el precio del techo gas_max(tier, K, S), lo máximo que puede costar una llamada así. --bytes son los bytes de la prueba de la llamada más los del sobre de entradas |
tx <HASH> | transacción confirmada con su altura e índice | |
tx-key <HASH> | una fila por cada salida de esa transacción que esta cartera envió, recibió o conservó como cambio: output (bundle:0 … bundle:3, las cuatro ranuras del único paquete, o mint:0), rol, importe (en RAND, o N (asset I) para un token), el memo que llevaba (- si no había) y la clave por transacción con la que se selló. Entregue la clave de una fila sent a un beneficiario o auditor y rand_checkTransaction <HASH> <KEY> revela esa salida, memo incluido. Una ranura ficticia no se abre para nadie y no tiene fila | |
block <ID> | bloque por altura o por hash | |
head | { height, hash, view } | |
status | rand_status | |
peers | pares conectados | |
validators | el registro de validadores |
--cuda requiere una compilación con --features cuda y no tiene alternativa; todavía no se ha compilado ningún PTX. No puede sellar un sobre de entrada de llamada: rand call --cuda necesita --no-envelope. Declara únicamente el límite de gas y rechaza --gas-limit N.
Todo memo y todo nombre de contacto que imprime la CLI (la confirmación de send, notes, history, tx-key) pasa primero por una misma regla de visualización: los caracteres de control, los caracteres de formato Unicode (controles bidi, caracteres de ancho cero, el guion blando) y U+2028/U+2029 se muestran como U+FFFD, y una secuencia de separadores de espacio se muestra como un único espacio.
Una primera transferencia 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
Compartir una dirección y un 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
El memo va dentro del mismo cuerpo sellado que la nota, de modo que quien pueda abrir uno puede abrir el otro: el beneficiario mediante notes, y cualquiera que tenga la clave por transacción de esa salida mediante rand_checkTransaction <hash> <key>. Chain 18 es la primera cadena cuyo génesis establece envelope_bytes; en las cadenas 14 a 17 --memo se rechazaba antes de que se generara cualquier prueba.
Una llamada confidencial que puedes volver a abrir más tarde
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)
Un programa con estado: el contador RPL-2
En una cadena con una sección program_state, como lo es la chain 20. El contador acepta exactamente las transiciones que leen una celda y la reescriben con su primera palabra más uno; todo lo demás de la transición (lo que el bundle deposita, lo que la bóveda paga, lo que el programa acuña) pasa sin comprobarse, lo que lo convierte en una demostración y no en un programa sobre el que respaldar valor.
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)
Los … del archivo representan los 64 caracteres hexadecimales completos, que la wallet exige.
Qué imprimen un deploy y una llamada
En una cadena de autorización dividida, cada bundle consta de dos pruebas generadas en esta máquina: la autorización de gasto de nivel 10 y el bundle de nivel 14. Un program deploy con rand v0.6.7 en la chain 18, 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)
Una call imprime su gas y su comisión antes de la prueba de la llamada, y después genera la prueba del bundle de pago de la misma manera:
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 [...]
Aquí 6,144 es 5,636 redondeado al alza a un múltiplo de 2^10, y rand fee call 12 --gas 6144 --bytes <B> valora ese límite a los precios de la punta de la cadena, sin margen.
rand-prover
El prover delegado como binario independiente: genera la prueba del bundle de nivel 14 de una wallet en otra máquina. rand-node run --prover aloja el mismo servicio dentro de un nodo. Todos los subcomandos aceptan --home <DIR> (variable de entorno RAND_PROVER_HOME, por defecto ~/.rand-prover), el directorio que contiene prover.key.json y pairings.json.
| comando | argumentos | comportamiento |
|---|---|---|
keygen | escribe prover.key.json, con modo 0600, e imprime la huella de la clave; se niega a sobrescribir | |
pair | --name <LABEL> (obligatorio), --url <URL> (por defecto http://127.0.0.1:8600), --own, --qr | genera un token, almacena solo su hash bajo la etiqueta e imprime el enlace de emparejamiento randprover: que recibe rand prover pair. El token se muestra una sola vez, dentro del enlace. --url es la dirección por la que la wallet llega a este prover; --own añade own=1; --qr imprime además el enlace como código QR en el terminal |
unpair | --name <LABEL> | elimina un emparejamiento; un prover en ejecución lee el archivo al arrancar, por lo que el cambio surte efecto al reiniciar |
pairings | una línea por emparejamiento: etiqueta, own o -, fecha de creación | |
run | --listen <ADDR> (por defecto 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (repetible), --fee <RAND> con --fee-address <rand1…>, --accept-spend-key | sirve el JSON-RPC prover_* hasta recibir Ctrl-C o SIGTERM. El arranque se rechaza a menos que haya disponibles 5.74 GB × --max-parallel + 1 GiB de memoria. --per-token es el número de trabajos que un emparejamiento puede tener en cola o en proceso de prueba a la vez. --accept-spend-key queda retirado en v0.6.8: run se niega a arrancar con él, y un prover acepta únicamente testigos de clave de visualización. En v0.6.7 admitía testigos de clave de gasto, que solo envía una cadena con bundle guest v1 o v2 |
Un prover en la chain 20 recibe la clave de visualización nk de la wallet y una sal nueva. No puede gastar, y puede leer todo lo que esa wallet haya recibido o enviado alguna vez: empareja solo con un prover al que mostrarías tu historial. La wallet comprueba cada prueba que recibe de vuelta.
Formatos de los archivos de clave
Clave del nodo:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Clave de la wallet, versión 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen la escribe con modo 0600, y desde v0.6.8 todo comando de rand se niega a usar un archivo de clave de wallet que el grupo u otros puedan leer: una clave copiada o restaurada a mano debe volver a ponerse en 0600 (chmod 600 <key>). Perder una clave de wallet supone perder todas las notas que podía abrir; en esta versión no hay frase de recuperación.