Trois binaires sortent de cargo build --release : rand-node (le nœud et les commandes d’opérateur), rand (le portefeuille protégé) et rand-prover (le prouveur délégué). Chaque commande accepte -h/--help. Cette page décrit la version v0.6.8 (c9c9bd3c), le build qu’exécute la chain 20 ; lorsque v0.6.7 se comportait autrement, elle le signale. Un portefeuille rand antérieur à v0.6.8 ne peut pas envoyer sur la chain 20, dont le genesis lie chaque preuve et chaque message signé à son hash. Les deux premiers détiennent des clés de nature différente : une clé de nœud est une paire de clés Dilithium2 qui signe les blocs ; une clé de portefeuille est une clé de dépense protégée qui ne signe rien 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 et bridge-gov sont nouveaux dans v0.6.8. Il n’existe ni balance ni transfer : un transfert exige une clé de dépense protégée, que seul le portefeuille détient.
Un indicateur global, --allow-test-fri-profile (ou RAND_ALLOW_TEST_FRI_PROFILE=1), permet à init, run et verify d’accepter un genesis dont le fri_profile vaut test. Ce profil offre environ 17 bits de sécurité, et quiconque écrit un fichier genesis peut le nommer ; c’est pourquoi, depuis v0.6.8, un nœud refuse un tel genesis sans cet indicateur. Les suites de tests l’activent ; rien d’autre ne devrait le faire.
keygen, address
| commande | argument | défaut |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | obligatoire |
keygen écrit { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } avec le mode 0600. Le fichier est la seule copie de la graine. Depuis v0.6.8, keygen refuse un --out qui existe déjà (… already exists or cannot be created; refusing to overwrite a key file) et le laisse intact ; il n’existe pas de --force, il faut donc déplacer l’ancien fichier pour le remplacer. v0.6.7 et les versions antérieures l’écrasaient sans rien demander. address affiche address, public_key (1 312 octets en hexadécimal) et peer_id.
genesis
| argument | défaut | signification |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | identifiant de chaîne ; les transactions et les topics de gossip y sont liés |
--validator <KEY,STAKE,PAYOUT> | obligatoire, répétable | une entrée du registre : un chemin de fichier de clé ou une clé publique en hexadécimal, la mise en RAND (au moins 1 000), l’adresse de versement rand1… |
--epoch-blocks <N> | 1000 | blocs par époque |
--alloc <ALLOCS> | aucun, répétable | une note de dépôt : rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | chemin de sortie |
--faucet | désactivé | testnet uniquement : active Mint. À côté d’une section bridge, il exige --testnet |
--testnet | désactivé | v0.6.8 : écrit "testnet": true, le marqueur qui permet à un faucet de coexister avec une section bridge. Fait partie du hash du genesis lorsqu’il est donné |
--no-confidential | désactivé | désactive Deploy et Call |
--fri-profile <production|test> | production | test n’est pas sûr et réservé à la suite de tests ; init, run et verify refusent un tel fichier sans --allow-test-fri-profile |
--max-program-words <N> | aucun (4096) | le plus grand programme qu’un déploiement peut porter, 1..=65535. Écrit uniquement lorsqu’il est donné ; fait partie du hash du genesis dès qu’il est présent, de sorte que --max-program-words 4096 est une autre chaîne que son omission. Chaque nœud a besoin d’un binaire v0.4 avant init sur un tel fichier |
--max-proof-bytes <N> | aucun (2 097 152) | la plus grande preuve qu’une transaction peut porter, 1048576..=33554432. Toutes les limites de preuve en découlent |
--max-block-bytes <N> | aucun (4 194 304) | le plus grand bloc, et donc la plus grande transaction, 4194304..=67108864, et au moins 2 × max_proof_bytes + 1 MiB, ou 3 × max_proof_bytes + 1 MiB avec --auth-guest, où un appel porte trois preuves (bundle, auth, call) |
--max-call-envelope-bytes <N> | aucun (18 432) | la plus grande enveloppe d’entrée d’un appel, 18432..=1048576 |
--max-program-public-words <N> | aucun (0) | la plus grande entrée publique qu’un déploiement peut fixer, 0..=65535 ; 0 n’en admet aucune |
--tokens <TOKENS.JSON> | aucun | la section tokens RPL, sous forme de fichier JSON {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}. Omise, le fichier n’a pas cette section et son hash reste celui d’avant. Une section bridge exige un tel fichier avec un mint_cap_per_day non nul (par backing, par jour UTC, en unités à huit décimales du jeton) ; un jeton listé exige une section bridge |
--envelope-bytes <N> | aucun (l’ancienne enveloppe de 1 348 octets) | la taille exacte de chaque enveloppe de note : une sortie de bundle, un mint de faucet, un retrait, un dépôt bridge, une alloc du genesis. Seul 1860 est accepté, la taille qui permet à chaque enveloppe de porter un mémo chiffré. Fait partie du hash du genesis lorsqu’il est donné, et s’applique avant que les notes --alloc de cette commande soient scellées |
--vesting <VESTING.JSON> | aucun | la section vesting : les allocations soumises à un verrouillage temporel, {"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}. Depuis v0.6.8, une entrée révocable liste des revokers (1 à 5 clés), un threshold et le treasury que verse une révocation, et un fichier qui en omet un est refusé |
--staking <STAKING.JSON> | aucun | v0.6.8 : la section staking sous forme de fichier 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), validée par le build |
--consensus-domain <0|1> | aucun (0) | v0.6.8 : 1 lie chaque vote, chaque new-view et chaque proposition à ce genesis |
--bundle-guest <v1|v2|v3> | v1 | le guest de bundle épinglé comme hc_bundle : v1 (le guest à actif caché qu’ont exécuté les chains 14 et 15), v2 (le guest sans branchement de la chain 16) ou v3 (autorisation scindée : le guest prend nk et un sel au lieu de la clé de dépense). v3 exige --auth-guest |
--auth-guest | désactivé | épingle l’auth guest de ce build comme hc_auth : chaque bundle porte alors une preuve d’authentification sur la clé de dépense, liée à sa transaction, dont la sortie est égale à l’auth_commit du bundle. Obligatoire avec --bundle-guest v3 et refusé avec v1 ou v2, avant l’écriture de tout fichier. Absent, le fichier n’a pas de champ hc_auth |
--hardening-v6 | désactivé | transforme les règles v0.6 en règles de validité (hardening_v6) : la fenêtre du pc, les déploiements non appelables, les formes de preuve canoniques et les mots de preuve de travail, la liaison d’appel et le plancher de la table des programmes. Absent, un nœud les refuse tout de même dans son pool, à titre de politique |
--gas-price <UNITS> | aucun (pas de section gas) | unités (10⁻⁹ RAND) par gas que la chaîne elle-même facture pour un appel. Cet indicateur est ce qui écrit la section gas (metering: "circuit") ; les trois indicateurs ci-dessous sont refusés sans lui. Fait partie du hash du genesis |
--byte-price <UNITS> | 800, uniquement avec --gas-price | unités par KiB, ou fraction de KiB, de preuve d’appel plus enveloppe d’entrée, dès l’octet 0 |
--bundle-gas-limit <N> | 20479, uniquement avec --gas-price | le GAS_LIMIT exact que chaque preuve de bundle doit déclarer ; une preuve de bundle déclarant une autre valeur est refusée. Le genesis n’accepte que 20479, gas_max(14, 0, 0) pour le guest de bundle de palier 14 |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | aucun (prix fixes) | active le contrôleur de prix par bloc, plafonné par le bas au gas_price et au byte_price de départ de la section. Refusé à côté de --aggregation |
--max-gas-price <UNITS>, --max-byte-price <UNITS> | aucun (pas de plafond) | v0.6.8 : les plafonds au-delà desquels le contrôleur ne relève jamais un prix, chacun au moins égal au prix de départ. Refusés sans --gas-dynamic |
--gas-byte-load paying | aucun (les octets de chaque transaction) | v0.6.8 : seuls la preuve et l’enveloppe d’entrée d’un appel font bouger byte_price, de sorte qu’un bloc de transferts n’en fait bouger aucun. Refusé sans --gas-dynamic ; paying est la seule valeur |
--binding-domain <0|1> | aucun (pas de champ) | v0.6.8 : 1 lie le hash du genesis à chaque liaison de transaction et à chaque message d’action signé (un mint de faucet, un unbond, un retrait, les messages de jeton RPL, les actions d’agrégateur, les messages de gouvernance du bridge), de sorte qu’une preuve ou une signature valable pour cette chaîne ne se vérifie sur aucune autre. Omis, la commande avertit : un portefeuille v0.6.8 produit la forme liée au genesis sur tout identifiant de chaîne hors 14 à 19, donc chaque chaîne à partir de la 20 est créée avec 1 |
--proof-window-blocks <N> | aucun (256) | v0.6.8 : une fenêtre, de 256 à 4 096 blocs, pour l’ancienneté admise de l’ancre d’un bundle et de son time. Servie comme rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | aucun (pas de section program_state) | v0.6.8, RPL-2 : active les cellules de programme, les coffres de programme et l’action Invoke, avec ce frais de cellule en unités RAND (au plus 1 000 RAND) ajouté au plancher de frais d’une invocation pour chaque cellule qu’elle crée. Exige --tokens, --gas-price, --hardening-v6 et --auth-guest, chacun refusé par son nom avant l’écriture de tout fichier |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | aucun | la section aggregation ; le build v0.6.8 refuse de démarrer sur un genesis qui en contient une |
Affiche une ligne alloc par --alloc, puis le hash du genesis, le nombre de validateurs et de notes, la longueur de l’époque, les cinq limites, hc_bundle et hc_auth (none sans --auth-guest), puis la ligne 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 sans --gas-price, et avec --program-state-cell-fee une ligne program_state: cell fee N RAND. init affiche la même ligne gas. Les cinq indicateurs de limite se comportent de la même façon : omis, le fichier n’a pas ce champ et la chaîne applique la valeur par défaut ; donné, le champ fait partie du hash du genesis même à sa valeur par défaut. La chain 20 a été créée avec ces indicateurs (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
Les chaînes 18 et 19 ont été créées avec les mêmes options, jusqu’à --envelope-bytes 1860, et sans aucune de celles de la v0.6.8. Le plafond des preuves est de 4 MiB, contre 8 MiB pour les chaînes 13 à 16 : une transaction à autorisation partagée porte jusqu’à trois preuves, et 3 × 4 MiB + 1 MiB tiennent dans le bloc de 20 MiB. tokens.json contient un registration_fee de 1 RAND, un mint_cap_per_day de 10000000000000, max_tokens à 4096, burn_registration_fee et bound_note_value, ainsi que zUSD, listé avec ses sept garanties. Il n’existe pas d’option --bridge, et le script de création insère encore a posteriori dans le fichier les sections bridge, staking et consensus_domain (sur la chaîne 20 : le bridge au guardian set 1 avec huit clés de guardians post-quantiques, la clé de pause, rules_v2, rotation et fees ; la section staking avec la liste d’autorisation du faucet, admission_by_vote et un budget d’entrée de 2 500 bps ; consensus_domain: 1 ; et les notes de genèse de zUSD, produites avec alloc-note --asset 1 --envelope-bytes 1860). Le hash de genèse qui fait foi est celui qu’affiche init sur le fichier terminé.
Chaque --alloc construit une note de dépôt avec une aléa d’engagement neuf ; créer deux fois la chaîne donne donc deux hashs différents. La commande écrit toujours l’ouverture de la note à côté de cm et amount, ce que requiert une chaîne dotée d’une section 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>" } }
]
Le propriétaire et le montant d’une note de genèse sont donc publics par conception dès la publication du fichier ; seuls le moment où elle est dépensée par la suite, et ce en quoi elle l’est, restent privés. Ne créez une genèse qu’une seule fois et conservez le fichier.
alloc-note
--to <rand1…> (obligatoire), --amount <N> (obligatoire), --asset <INDEX> (par défaut 0), --envelope-bytes <N> (par défaut : le format historique). Affiche une note d’allocation au format JSON, scellée pour --to comme le fait genesis --alloc. Une genèse qui définit envelope_bytes refuse toute note scellée sans l’option --envelope-bytes correspondante. --amount est exprimé en unités entières de l’actif : neuf décimales pour RAND, huit pour un jeton ponté (10 pour l’actif 1 correspond à 10 zUSD). Une note d’un jeton listé exige que les garanties de ce jeton portent des montants locked dont la somme égale exactement ses notes.
init
| argument | signification |
|---|---|
--datadir <DATADIR> | répertoire de données à créer |
--genesis <GENESIS> | fichier de genèse ; copié dans <datadir>/genesis.json |
Affiche le hash de genèse et la même ligne gas: que genesis.
run
| argument | par défaut | signification |
|---|---|---|
--datadir <DATADIR> | obligatoire | répertoire de données initialisé |
--key <KEY> | obligatoire | fichier de clé : identité de validateur, identité p2p, destinataire des frais |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | multiadresse d’écoute libp2p, répétable |
--bootstrap <BOOTSTRAP> | aucun, répétable | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, contactée au démarrage puis toutes les 30 s tant que la connexion est coupée. Depuis la v0.6.8, son identifiant de pair est réservé |
--reserved-peer <PEER_ID> | aucun, répétable | v0.6.8 : un pair admis au-delà du plafond de connexions entrantes et servi sur la part de validateurs du budget de synchronisation. Les bootstraps et tous les validateurs dont ce nœud a vu la liaison de pair signée sont réservés sans cette option ; listez-y les validateurs de la flotte sur une chaîne fraîchement créée, dont le magasin ne contient encore aucune liaison |
--strict-gossip | off | v0.6.8 : validation stricte de gossipsub, qui n’accepte que les messages dotés d’une signature d’auteur, d’un numéro de séquence et d’une source valides. Les nœuds stricts et permissifs interopèrent, de sorte que la bascule se fait nœud par nœud |
--rpc <RPC> | 127.0.0.1:8545 | l’écouteur JSON-RPC de l’opérateur : toutes les méthodes, et il fait confiance à la boucle locale. Gardez-le sur la boucle locale et ne lui redirigez jamais un point d’accès public |
--public-rpc <ADDR> | off | v0.6.8 : un second écouteur, public, au jeu de méthodes fixe (sans méthodes de clé de visualisation, ni rand_mint ni rand_getPeers), sans lots, sans WebSocket et avec un seul compteur pour tous les appelants ; c’est vers lui que doivent pointer un reverse proxy ou une redirection SSH (JSON-RPC) |
--rpc-viewing-token-file <PATH> | off | v0.6.8 : exige Authorization: Bearer <first line of the file> (32 caractères ou plus) sur les méthodes de clé de visualisation de --rpc |
--validator | off | participer au consensus avec cette clé |
--no-mdns | off | désactive la découverte sur le réseau local |
--block-interval-ms <MS> | 1000 | espacement minimal entre deux propositions |
--view-timeout-ms <MS> | 3000 | délai de vue de base ; double à chaque expiration consécutive, jusqu’à 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | off | mode archive sur une chaîne d’agrégation |
--prune-history <WINDOW> | aucun (tout conserver) | ne garde que cette quantité d’historique de blocs, <n>m, <n>h ou <n>d, au moins 1h : les blocs plus anciens perdent leur bloc, leur QC, leurs transactions et leurs reçus ; le registre reste. Sur la chaîne 20, 24 des 26 validateurs utilisent 24h et deux nœuds sont des archives ; une archive et un nœud mainnet ne l’activent jamais. Les recherches par hauteur en dessous du plancher répondent -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | refuse de démarrer s’il reste moins d’espace libre que cette valeur sur le système de fichiers du répertoire de données ; rand_getHealth indique disk_low en dessous de quatre fois cette valeur. 0 désactive la protection |
--rpc-viewing-open | off | autorise les appelants hors boucle locale à utiliser les méthodes de clé de visualisation ; uniquement derrière un dispositif qui authentifie |
--gas-price <UNITS> | 100 | unités (10⁻⁹ RAND) par gaz que le pool de ce nœud exige d’un appel, au-delà de gas_max de son en-tête de preuve. Politique d’admission, non règle de la chaîne : un bloc contenant un appel moins cher reste valide. 0 avec --byte-price 0 n’applique aucune politique. Sur une chaîne dont la genèse comporte une section gas, comme celle de la chaîne 20, ce sont les prix propres à la chaîne qui font règle de validité |
--byte-price <UNITS> | 800 | unités par KiB, ou fraction de KiB, de preuve et d’enveloppe d’entrée d’un appel, dès l’octet 0, selon la même politique |
--prover <ADDR> | off | héberge le prover délégué (le JSON-RPC prover_*) sur cette adresse : un écouteur distinct, qui doit différer de --rpc. Le nœud refuse de démarrer sans <prover-home>/prover.key.json, produit par rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | le prover.key.json et le pairings.json du prover |
--prover-accept-spend-key | retiré | refusée au démarrage depuis la v0.6.8 : run lancé avec cette option se termine avant la lecture de la clé du nœud, en nommant l’option. Aucun prover n’accepte plus de témoin de clé de dépense ; retirez-la du fichier d’unité. Sur la v0.6.7, elle acceptait les témoins de clé de dépense pour les chaînes à guest de bundle v1 ou v2 |
--prover-max-parallel <N> | 1 | preuves que le prover hébergé exécute en même temps ; le démarrage est refusé si 5,74 GB × N + 1 GiB de mémoire ne sont pas disponibles |
--prover-max-queue <N> | 8 | tâches en file d’attente au-delà de celles en cours |
--prover-cuda | off | prouve sur le backend CUDA (build avec --features cuda) ; aucun repli sur le CPU |
--prover-skip-memory-check | off | ignore le contrôle de mémoire libre |
--prover-fee <RAND>, --prover-fee-address <rand1…> | aucun | les frais que doit payer toute tâche envoyée au prover hébergé, en RAND avec jusqu’à neuf décimales : une sortie de RAND vers l’adresse, dans le bundle prouvé. Chaque option exige l’autre |
--prover-allow-origin <ORIGIN> | extensions de navigateur et pages en boucle locale | une origine de navigateur dont les pages peuvent lire les réponses du prover, répétable ; si elle est donnée une fois ou plus, les valeurs constituent la liste complète. * autorise tous les sites web et affiche un avertissement |
Environnement : RUST_LOG (par défaut info,libp2p=warn,libp2p_mdns=off). Ctrl-C ou SIGTERM arrête proprement le nœud.
Le point d’accès public https://rpc.randprotocol.org est un proxy à liste d’autorisation placé devant un nœud d’archive ; depuis le 2026-10-01, sa liste d’autorisation est le jeu de méthodes de l’écouteur public.
safety
L’état de sûreté du consensus d’un validateur arrêté (v0.6.8). Chaque commande ouvre elle-même le répertoire de données ; aucune ne s’exécute donc en parallèle d’un nœud actif.
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 affiche la tête validée, la vue et la dernière vue votée, le high QC, si le validateur est verrouillé au-dessus de sa tête, et tout arrêt de sûreté enregistré. Un nœud qui voit une chaîne de trois blocs certifiée tenter de valider un bloc ne descendant pas de sa propre tête validée s’arrête et l’enregistre (audit v6, CON-5) ; run se termine alors avec cet enregistrement jusqu’à clear-halt. Comparez la tête de ce nœud avec celles de deux autres validateurs et resynchronisez-le depuis une archive si elle diffère, avant d’effacer l’arrêt. Depuis la v0.6.8 (CON-4), aucun quorum de réponses « non détenu » ne lève plus un verrou : un validateur verrouillé sur un bloc qu’il ne peut obtenir reste silencieux jusqu’à l’arrivée d’une proposition dont le justify surclasse le verrou, ou jusqu’à ce que le bloc soit récupéré. release-lock abaisse le verrou persistant au certificat de la tête validée ; ne l’utilisez que sur un validateur à la fois, et seulement lorsque le bloc est définitivement perdu. Sans son option de confirmation, chaque commande d’écriture affiche ce qu’elle ferait et ne modifie rien.
verify
| argument | par défaut | signification |
|---|---|---|
--datadir <DATADIR> | obligatoire | le nœud ne doit pas être en cours d’exécution |
--mode <MODE> | full | quick ou full |
--repair | off | tronque la fin endommagée ; l’état de sûreté est conservé |
Code de sortie 0 si l’état est cohérent, 2 si un problème a été trouvé sans --repair.
db
db drop-receipts-index --datadir <DATADIR>, nœud arrêté : supprime l’index receipts_by_program avant un retour à une version antérieure à la v0.3, qui ne peut pas ouvrir une base qui le contient. Un démarrage ultérieur reconstruit l’index à partir des reçus.
status
--rpc <URL> (par défaut http://127.0.0.1:8545). Affiche rand_status tel quel.
register, unbond, withdraw
| commande | arguments | signification |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | affiche un Registration hexadécimal signé par la clé de ce nœud ; le RPC est lu pour l’identifiant de chaîne et, avec --v2, pour le hash de genèse également. --v2 est obligatoire sur une chaîne dont la genèse définit staking.registration_v2, comme celle de la chaîne 20 ; une inscription v1 y est refusée, une inscription v2 est acceptée partout ailleurs |
unbond <amount RAND> | --key, --rpc, --no-wait | fait passer du stake en désengagement ; sans frais ; retirable deux époques plus tard |
withdraw <amount RAND> | --key, --rpc, --no-wait | verse le stake libéré et les récompenses dans une note à l’adresse de paiement, moins la base de 0.001 RAND |
admit sign|submit
Admission par vote (v0.6.8). Sur une chaîne dont la genèse définit staking.admission_by_vote, comme celle de la chaîne 20, une nouvelle clé de validateur ne s’inscrit qu’une fois qu’elle a été validée par des validateurs détenant strictement plus des deux tiers du poids de vote.
| commande | arguments | signification |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex> | affiche le vote de ce validateur sur une seule ligne, <voter key hex>:<signature hex>, portant sur le hash de genèse et l’adresse du candidat, de sorte qu’il n’est valable que sur une seule chaîne. Hors ligne : ne lit aucun nœud |
admit submit | --candidate …, --signature <line> (répétable), --rpc, --no-wait | vérifie chaque vote par rapport au hash de genèse du nœud (un vote pour une autre genèse ou un autre candidat, ou un votant en double, est signalé nommément), les ordonne et soumet l’AdmitValidator sans frais |
Le candidat est la clé que portera l’inscription ; rand-node address --key l’affiche, et l’hexadécimal que register a affiché la contient. Une fois l’admission validée, l’engagement se fait comme auparavant (rand bond … --registration) et la consomme. rand_getAdmitted liste ce qui est admis et en attente.
bridge-gov
Les rotations post-quantiques du bridge (v0.6.8), pour les gardiens et le détenteur de la clé de pause. Chaque étape lit l’identifiant de chaîne, son domaine de liaison et rand_getBridgeState.rotation_nonce depuis --rpc (par défaut http://127.0.0.1:8545).
| commande | effet |
|---|---|
rotate-pq message --new-key K… | affiche le message de rotation en hexadécimal pour le nonce courant, à comparer chez chaque signataire |
rotate-pq sign --new-key K… --key F --index I [--possession] | affiche I:signature : la ligne de quorum d’un gardien PQ actuel (I étant son index dans l’ensemble courant) ou, avec --possession, la ligne d’un détenteur de la nouvelle clé (I étant son index dans le nouvel ensemble) ; refuse un fichier de clé qui n’est pas la clé à l’index I |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | assemble RotatePqGuardians, ou l’action V2 avec les lignes de possession, et l’envoie ; refuse la possession sur une chaîne qui ne la prend pas en charge, et son absence sur une chaîne qui l’exige, comme le fait la chaîne 20 |
rotate-pause message|sign|submit --new-key K | la même chose pour la clé de pause (index de possession 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | affiche 0:signature sur le message d’annulation, vérifiée par rapport à la clé de pause actuelle de la chaîne |
cancel-rotation submit --kind pq|pause --signature @F | envoie CancelRotation, qui abandonne une rotation en attente avant la fin de son délai |
--new-key est une clé publique Dilithium2 en hexadécimal, @file en contenant une, ou @key-file (sa clé publique). Les lignes de signature ont la forme index:hex, séparées par des espaces ou des retours à la ligne ; les commentaires # sont autorisés.
vesting status|claim|revoke|bond|unbond
Le côté du titulaire et celui du révocateur pour une allocation de genèse soumise à un verrouillage temporel, sur une chaîne dont la genèse comporte une section vesting. Celle de la chaîne 20 n’en a pas. La clé est un fichier produit par rand-node keygen.
| commande | arguments | signification |
|---|---|---|
vesting status <ENTRY> | --rpc | l’entrée telle que la sert rand_getVesting : ses conditions, ce qui a été acquis, ce qui est réclamable maintenant |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> ou --all, --key, --rpc, --no-wait | verse ce qui a été débloqué dans une note à --to, moins la base de 0.001 RAND ; signé par la clé du bénéficiaire |
vesting revoke prepare | --entry, --margin-secs (par défaut 600), --out (par défaut revoke.json), --rpc | v0.6.8, sans clé : écrit la révocation que signe chaque révocateur, une note de la part non encore acquise --margin-secs après la tête, versée au treasury de genèse de l’entrée (il n’y a pas de --to) |
vesting revoke sign | --proposal <file>, --key, --index? | une clé de révocateur, hors ligne : affiche <index>:<signature hex> |
vesting revoke submit | --proposal <file>, --signature <index:hex> (répétable), --rpc, --no-wait | envoie la révocation avec au moins le threshold de signatures de l’entrée, dans les 256 blocs suivant prepare. Le vesting revoke --to à clé unique de la v0.6.7 a disparu |
vesting bond <amount RAND> | --entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait | entrées irrévocables : engage du RAND verrouillé comme stake de ce validateur ; un validateur qui n’est pas encore dans le registre a besoin de ce qu’a affiché register |
vesting unbond <amount RAND> | --entry, --key, --rpc, --no-wait | ramène du RAND engagé dans le verrou ; de nouveau réclamable après les époques de désengagement |
aggregator register|unbond|withdraw, aggregate
Les commandes du rôle d’agrégateur pour une chaîne dotée d’une section aggregation : aggregator register --key --bond <RAND> --payout <rand1…> --rpc affiche une AggregatorRegistration signée ; aggregator unbond et aggregator withdraw reprennent la paire du validateur. aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] est le démon qui interroge rand_getUnsealed, prouve un agrégat et le soumet. Inerte sur la chaîne 20, dont la genèse n’a pas de section aggregation.
rand (portefeuille)
Options globales, avant ou après la sous-commande :
| option | env | défaut |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545 ; http ou https (le point d’accès public est https://rpc.randprotocol.org). Une réponse de plus de 64 MiB est refusée |
--key <KEY> | RAND_KEY | wallet.key.json ; le magasin de notes se trouve à côté, dans <key>.notes.json. Le magasin est lié à la chaîne sur laquelle il a été scanné (le rand_getGenesisHash du nœud) : s’il est pointé vers une autre chaîne, comme un portefeuille conservé lors du passage de la chaîne 19 à la chaîne 20, il est vidé et rescanné depuis la feuille 0, avec un avertissement. Depuis la v0.6.8, toute commande refuse un fichier de clé que le groupe ou les autres peuvent lire, en indiquant le correctif (chmod 600 <key>) |
--prover | désactivé. Prouve le bundle sur le prover associé à ce portefeuille (rand prover pair) plutôt que sur cette machine ; la preuve est vérifiée ici (son condensat, sa taille et une vérification locale) avant d’entrer dans une transaction. S’applique à toute commande qui prouve un bundle ; pour call et program invoke, seul le bundle de paiement va au prover et la preuve de l’appel reste locale. Refusé sans association, et conjointement avec --cuda sauf sur call. Sur une chaîne à autorisation séparée comme la chaîne 20, le prover reçoit la clé de visualisation nk et un sel, jamais la clé de dépense : il peut lire tout l’historique de ce portefeuille et ne peut rien dépenser. La preuve d’autorisation est toujours produite sur cette machine. Sur une chaîne dont le guest de bundle est en v1 ou v2, la v0.6.8 refuse --prover avant d’interroger le prover | |
--max-prover-fee <RAND> | 1. Le maximum qu’un prover associé peut facturer par bundle. Un devis supérieur est refusé avant la construction de tout bundle ; 0 refuse toute commission. La commission est une sortie RAND supplémentaire dans le même bundle, affichée sous la forme prover fee: <amount> RAND to <fingerprint> |
Les montants sont en RAND décimaux, avec jusqu’à neuf décimales (1, 1.5, .25, 0.000000001). Un montant de jeton sur send, token mint et token burn, ainsi que dans un lien randpay:, est exprimé dans les unités d’affichage du jeton, selon les decimals propres à sa ligne du registre (10 de zUSD valent 10 zUSD). bridge-burn, token create --fixed-supply et --initial prennent des entiers simples dans la plus petite unité du jeton, et asset-balance les affiche. Partout où une commande prend un jeton, elle accepte l’index du registre, l’id rpl1… ou l’id de 64 caractères hexadécimaux ; un id est résolu en index à partir de la liste complète du registre du nœud (rand_getTokens, toutes les pages), jamais par une recherche jeton par jeton, qui indiquerait au nœud quel jeton est sur le point de bouger. Un index numérique n’atteint jamais le nœud.
| commande | arguments | comportement |
|---|---|---|
keygen | écrit un nouveau fichier de clé de dépense à --key, en mode 0600 ; refuse d’écraser un fichier existant | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | affiche l’adresse rand1… de ce portefeuille sur stdout, exactement l’adresse et un saut de ligne, de sorte que $(rand address) fonctionne dans un script, et son fingerprint XXXX-XXXX-XXXX-XXXX sur stderr : 16 caractères en base32 de Crockford, un contrôle humain de l’adresse qui n’est jamais envoyé sur le réseau. --uri affiche aussi un lien randpay: (l’adresse plus un montant, un actif et un mémo facultatifs). --qr affiche ce lien sous forme de code QR dans le terminal ; --qr-png l’écrit au format PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes (add) | adresses nommées auxquelles ce portefeuille peut envoyer par leur nom. TO est une adresse rand1… ou un lien randpay:, dont seule l’adresse est conservée. add affiche l’empreinte et demande add? [y/N] sauf avec --yes ; une entrée standard qui n’est pas un terminal est refusée sans cette option. Stocké dans <key>.contacts.json, en mode 0600. Un nom compte de 1 à 64 caractères, ne commence jamais par rand1 ni randpay:, et est unique |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | associe ce portefeuille à un prouveur délégué. pair prend le lien randprover: qu’a affiché rand-prover pair, refuse une URL qui n’est pas en https:// (le http:// simple n’est admis que vers localhost, 127.0.0.1 ou [::1]), puis indique ce que le prouveur recevra (this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend) et demande pair? [y/N] ; --yes supprime la question, et une entrée standard qui n’est pas un terminal est refusée sans cette option. Il interroge ensuite le prover_info du prouveur, refuse si l’empreinte de sa clé n’est pas celle que nomme le lien, et écrit <key>.prover.json, en mode 0600, en remplaçant tout appairage antérieur. --trusted (v0.6.8) ne prend aucun lien : il associe le portefeuille au pool de prouveurs des validateurs, https://prover.randprotocol.org, à partir du lien que porte le build ; ses opérateurs peuvent lire l’historique de ce portefeuille et ne peuvent pas dépenser. show affiche le nom, l’URL, l’empreinte, own et la clé du prouveur, jamais le jeton ; forget supprime le fichier. v0.6.7 ne demandait pas de confirmation avant l’appairage |
viewing-key | affiche la clé de visualisation nk de ce portefeuille, en 64 caractères hexadécimaux : le paramètre que prend rand_importViewingKey. Elle lit toutes les notes que le portefeuille a envoyées ou reçues et n’en dépense aucune | |
balance | parcourt l’arbre, enregistre le magasin, affiche la valeur dépensable et le nombre de notes non dépensées | |
sync | --rescan | parcourt la chaîne sans afficher de solde. Une première synchronisation lit tous les en-têtes de bloc (1 024 par appel) avant les feuilles. --rescan oublie toutes les notes, les marques de dépense et le curseur (en conservant la liaison à la chaîne) et reparcourt depuis la feuille 0 : le recours lorsqu’un nœud a déclaré à tort que des notes de ce portefeuille étaient dépensées. À exécuter de préférence auprès d’un nœud de confiance |
notes | --memo | toutes les notes que ce portefeuille a ouvertes : index, actif, montant, hauteur, spent, pending, et le mémo tronqué à 24 caractères, ou entier avec --memo |
asset-balance [INDEX] | parcourt la chaîne, puis affiche ce que ce portefeuille détient dans un actif, ou une ligne par actif détenu ; montants dans la plus petite unité propre à l’actif | |
history | --memo | toutes les notes que ce portefeuille a créées pour un tiers, avec la même colonne de mémo que notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (par défaut 0, RAND), --memo <M>, --fee <RAND> (par défaut 0.001), --no-wait, --yes, --cuda | TO est une adresse rand1…, un lien randpay: ou le nom d’un contact enregistré, essayés dans cet ordre. Le montant, l’actif et le mémo propres à un lien complètent ce que la ligne de commande omet ; AMOUNT n’est facultatif que si le lien en porte un, et une valeur donnée des deux façons qui diverge est refusée. La commande affiche la confirmation, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> et, lorsqu’il y a un mémo, une ligne memo: "<text>" distincte, puis demande confirmation avant de prouver, sauf avec --yes. Un script doit passer --yes : une entrée standard qui n’est pas un terminal est refusée avec stdin is not a terminal: pass --yes to send without confirmation. Elle sélectionne ensuite au plus deux notes de l’actif et au plus deux notes RAND pour les frais, scelle le mémo dans la seule sortie de paiement, prouve localement un lot à quatre emplacements à actif masqué et, sur une chaîne à autorisation scindée, l’autorisation de dépense, soumet la transaction et attend la validation. Un mémo non vide est refusé avant la preuve sur une chaîne dont la genèse n’a pas de envelope_bytes. AMOUNT est exprimé dans les unités d’affichage de l’actif : RAND décimal pour RAND, et un jeton selon les decimals propres à sa ligne du registre ; seuls 0 ou rand désignent RAND, quel que soit l’index renvoyé par le nœud. Un identifiant de jeton est décodé avant d’interroger le nœud, et une ligne de liste qui y répond avec l’index 0 ou avec des champs d’identifiant discordants est refusée. La confirmation montre un montant de jeton en unités d’affichage et en unités de base, 10.00000000 zUSD (1000000000 units), de sorte qu’un nœud qui mentirait sur les decimals d’un jeton est visible avant tout envoi. L’index de l’actif et les frais sont affichés avant la preuve. Sur la chaîne, un transfert de jeton est un lot ordinaire, indiscernable d’un paiement en RAND ; ses frais sont en RAND, et un portefeuille sans RAND dépensable est refusé avant la preuve |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | mise en jeu (staking) auprès d’un validateur : le lot brûle le montant |
faucet [ADDRESS] | --amount <RAND> (par défaut et maximum 100) | testnet uniquement : demande à un nœud validateur de frapper des fonds. Sur la chaîne 20, le faucet ne paie que les 16 portefeuilles de sa liste d’autorisation de genèse |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (répétable), --out <file> (par défaut program.json) | assemble un guest intégré ; affiche l’identifiant du programme. rpl2_counter (v0.6.8) est le programme de démonstration RPL-2 |
program deploy <FILE> | .json, un .bin brut, ou le conteneur d’image qu’écrit rand-guest build ; --public <FILE>, --input <u32> (répétable) ou --check-call, --cuda | affiche l’identifiant du programme, hc et le nombre de mots ; refuse un programme dépassant le plafond de la chaîne (via rand_estimateFee) avant de prouver ; paie le plancher de déploiement par un lot, puis attend. --public enregistre une entrée publique avec le programme (mots u32 séparés par des espaces, ou un ELF .so), dans la limite du max_program_public_words de la chaîne ; l’identifiant du programme la lie alors. Avec --input ou --check-call, le portefeuille exécute d’abord à blanc un appel sur ces entrées privées dans l’émulateur et refuse si l’appel ne respecte pas le plafond du palier d’appel (14) ; rien n’est prouvé pour cette vérification |
program show <ID> | métadonnées du programme déployé | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (obligatoire), --input N (répétable, privé), --inputs-file <FILE.json> (un tableau JSON de u32, ajouté à la suite), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2 : déclare une transition d’état du programme et la fait appliquer par la chaîne. Avant toute preuve, il vérifie que la chaîne possède une section program_state, que le programme existe, que le contexte de la transition respecte la règle de segment, que chaque entrée reads correspond à la cellule en vigueur (rand_getProgramCell ; une discordance nomme la cellule périmée et se termine avec le code 3), que le coffre peut payer chaque entrée pays plus ce que cette transition dépose, et que ce portefeuille détient le jeton et le RAND dont le dépôt et les frais ont besoin. Il compte les cellules que créent les écritures, exécute à blanc le programme sur les vrais mots de contexte, prouve l’appel lié à la transaction, puis le lot (les frais, plus deposit.rand brûlé par burn_r et deposit.amount de deposit.asset par burn_a) et la preuve d’autorisation. Les frais par défaut sont le plancher de l’appel pour le gaz déclaré plus les frais de cellule par cellule créée, avec les mêmes deux paliers de prix de marge que call. Affiche chaque paiement et, sauf avec --no-wait, les huit outputs du reçu. Une lecture périmée au moment de l’inclusion se termine aussi avec le code 3, de sorte qu’un outil appelant relit et réessaie. Ne publie aucune transcription d’entrée. Le fichier de transition, dont chaque champ est facultatif : {"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]} ; les clés et les valeurs sont des Word8 en 64 caractères hexadécimaux, les montants des chaînes décimales dans les unités propres à l’actif, to désigne par défaut ce portefeuille |
program state <ID> | --cell <64 hex> | v0.6.8 : toutes les cellules du programme dans l’ordre des clés (rand_getProgramCells, paginé jusqu’à la fin), ou une seule cellule avec --cell, 64 zéros si elle est absente. Refusé sur une chaîne sans section program_state |
program vault <ID> | v0.6.8 : le coffre du programme (rand_getProgramVault), une ligne par actif détenu, montants en unités. Refusé sur une chaîne sans cette section | |
call <PROGRAM-ID> | --input N (répétable), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | exécute d’abord l’appel dans l’émulateur et affiche gas: <exact> (declaring <limit>, tier <t>) : le gaz exact est un témoin et ne quitte jamais le portefeuille, la limite déclarée est le GAS_LIMIT public de la preuve. Sur une chaîne dotée d’une section gaz, la limite par défaut est le gaz exact arrondi au multiple supérieur de 2^(t−2) ; max déclare le plafond de l’en-tête gas_max, qui ne divulgue rien que le palier ne divulgue déjà ; N est refusé s’il est inférieur au gaz exact ou supérieur au plafond. Sans section, ou avec --cuda, la valeur par défaut est max. Il prouve ensuite l’appel localement sur l’entrée publique du programme, scelle sa transcription d’entrée, paie par un lot, puis affiche le reçu. Les frais par défaut sont le plancher pour la limite déclarée, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB aux prix que sert rand_getLimits, plus deux paliers de prix de marge là où les prix évoluent, affichés sous la forme fee … RAND (incl. two price steps of headroom). Sur une chaîne hardening_v6, les frais sont fixés avant que la preuve n’existe, de sorte que la valeur par défaut tarife le plafond de preuve de la chaîne à la place de la preuve, ce qui ne peut que surpayer ; --fee paie un montant exact. --expect-public refuse avant de prouver sauf si l’entrée publique du programme correspond aux mots de ce fichier |
open-call <TXHASH> | --call-key <hex>, --as-auditor | ouvre la transcription d’un appel, la vérifie par rapport à H_IN, ré-exécute le programme ; se termine avec un code non nul en cas de discordance |
receipt <TX> | le reçu d’un appel validé | |
bridge-mint <ATTESTATION> | hex ou @path, --pq <JSON or @path> (obligatoire), --to <rand1…> (par défaut : ce portefeuille), --fee (par défaut : le plancher de l’action), --no-wait, --cuda | dépose une attestation signée par les gardiens sous forme de note. --pq est le quorum de cosignatures Dilithium2 des gardiens, [{"index":0,"signature":"<4840 hex>"},…]. Avant toute preuve : décode l’attestation, vérifie le quorum par rapport aux pq_guardians du nœud et à l’identifiant de chaîne, vérifie le destinataire et l’identifiant de l’actif, lit l’index listé (rand_getAssets). Le facteur d’aveuglement de la note de dépôt est dérivé du condensat de l’attestation, r = blake3("rand-deposit-r-1" || mu), le seul r que la chaîne admet. Le lot de frais est prouvé par rapport à la transaction entière, quorum compris. Affiche l’owner, le time et le r de la note |
bridge-rotate <ROTATION> | hex ou @path, --pq <JSON or @path> (obligatoire), --fee (par défaut : le plancher de l’action), --no-wait, --cuda | soumet une rotation de l’ensemble de gardiens avec le quorum de cosignatures de l’ensemble PQ en cours, sous la forme d’un BridgeAttest qui ne dépose rien. Refuse, avant de prouver, tout ce qui n’est pas une rotation faisant avancer d’un cran l’ensemble de Rand. Affiche ensuite le guardian_set_index |
bridge-pause | --sig <HEX or @path> (obligatoire), --no-wait | suspend la frappe via le bridge : un PauseMints sans lot et sans frais, de sorte qu’aucun fichier de clé et aucun RAND ne sont nécessaires. Le fichier est la sortie de rand-bridge-gov pause, la signature de 2 420 octets de la clé de pause en hexadécimal, établie pour le pause_nonce courant du bridge ; vérifiée par rapport à la pause_key du nœud et à l’identifiant de chaîne avant l’envoi. Les destructions et les rotations restent ouvertes pendant la pause |
bridge-unpause | --pq <JSON or @path> (obligatoire), --no-wait | lève une pause avec un quorum de gardiens PQ (le fichier de rand-bridge-gov pq-unpause) établi pour le pause_nonce courant. Sans lot et sans frais ; la clé de pause seule ne peut jamais lever la pause |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee (par défaut 0.01), --no-wait, --cuda, --yes | brûle un actif ponté en sortie : vérifie que la pièce TOKEN sur TO_CHAIN adosse ASSET et qu’au moins AMOUNT y est verrouillé, et que AMOUNT et les frais de relayeur sont des unités de libération entières ; prouve ensuite un lot qui dépense l’actif dans les emplacements 0–1, en brûle exactement AMOUNT (burn_a, burn_asset) et paie les frais en RAND depuis les emplacements 2–3. --relayer-fee est une fraction de AMOUNT, non une charge supplémentaire. Sur une chaîne dotée de frais de bridge (rand_getBridgeState.fees), comme l’est la chaîne 20, v0.6.8 affiche d’abord les frais que conserve la chaîne (dans l’actif) et le montant qui sera libéré, et demande confirmation ; --yes supprime la question, et une entrée standard qui n’est pas un terminal est refusée sans cette option. Les vérifications du montant verrouillé et des frais de relayeur portent alors sur le montant libéré |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32> (aléatoire si absent), puis soit --fixed-supply <N> --to <rand1…>, soit --authority-key-out <FILE> [--initial <N> --to <rand1…>], soit (v0.6.8) --program <PROGRAM-ID>, un jeton dont l’autorité de frappe est ce programme, dont seules les invocations frappent ou brûlent, qui part d’une offre nulle et exige la section program_state de la chaîne, --fee (par défaut : la base du lot plus la registration_fee du registre ; refusé lorsque le nœud annonce des frais d’enregistrement supérieurs à 10 RAND, il faut alors passer --fee pour en payer délibérément de plus élevés), --no-wait, --cuda | enregistre un jeton à l’index suivant du registre : offre fixe (frappe unique, autorité none) ou autorisé par Key (un nouveau fichier de clé Dilithium2, écrit en 0600, qui refuse d’écraser un fichier existant). La clé d’autorité reste à <FILE>.pending jusqu’à ce que la chaîne accepte l’enregistrement. Si un autre enregistrement prend l’index en premier, affiche another token took index N first — re-run to register at N+1 ; en cas de succès, affiche l’index et l’identifiant, en hexadécimal et en rpl1… |
token mint | --asset, --to <rand1…>, --amount <N> (en unités d’affichage du jeton), --authority-key <FILE>, --fee (par défaut 0.001), --no-wait, --cuda | frappe davantage d’un jeton autorisé par Key ; refusé avant toute preuve si le jeton n’est pas autorisé par Key ou si la clé n’en est pas l’autorité |
token set-authority | --asset, --authority-key <FILE>, puis soit --new-key <FILE>, soit --renounce, --fee (par défaut 0.001), --no-wait, --cuda | transmet un jeton autorisé par Key à une autre clé, ou renonce définitivement à la frappe |
token burn <ASSET> <AMOUNT> | --fee (par défaut 0.001), --no-wait, --cuda | détruit AMOUNT, en unités d’affichage du jeton, d’un jeton RPL que ce portefeuille détient ; son offre publique diminue exactement d’autant. Un jeton ponté est refusé avant la preuve : il sort par bridge-burn |
token info <INDEX|rpl1…|hex> | la ligne complète de rand_getTokens pour un jeton : nom, symbole, decimals, autorité, mint_nonce, offre totale, registered_at, identifiant (hex et id_text) et, s’il est ponté, chaque adossement (locked, mint_cap_per_day, minted_today, mint_day) | |
token list | --from <index> (par défaut 0), --limit <N> (par défaut 1000) | une page de rand_getTokens : enabled, registration_fee, next_index, tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals (les décimales sources du premier adossement), --pq <JSON or @path> (obligatoire), --fee (par défaut : la base du lot plus la registration_fee du nœud, avec le même refus au-delà de 10 RAND que token create), --no-wait, --cuda | enregistre après la genèse un jeton ponté avec son premier adossement, autorisé par un quorum de gardiens PQ (le fichier de rand-bridge-gov pq-register) établi pour le list_nonce du nœud. D’abord le listage sur Rand, ensuite setToken sur le point d’extrémité |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (obligatoire), --fee (par défaut : la base du lot), --no-wait, --cuda | ajoute un adossement à un jeton ponté, autorisé par un quorum de gardiens PQ (le fichier de rand-bridge-gov pq-list) au list_nonce du nœud |
bridge | l’état public du bridge : gardiens, émetteurs, le registre des actifs, la séquence de destruction | |
bridge-message <SEQUENCE> | un message de destruction sortant, tel quel | |
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) | les frais minimaux selon le barème du nœud. Sur une chaîne dotée d’une section gaz, fee call <tier> --gas N tarife la limite déclarée qu’affiche rand call, aux prix de la tête de chaîne et sans marge : le plancher lui-même. Sans --gas, il tarife le plafond gas_max(tier, K, S), le maximum que peut coûter un tel appel. --bytes est le nombre d’octets de la preuve de l’appel plus de l’enveloppe d’entrée |
tx <HASH> | transaction validée, avec sa hauteur et son index | |
tx-key <HASH> | une ligne par sortie de cette transaction que ce portefeuille a envoyée, reçue ou conservée comme monnaie rendue : output (bundle:0 … bundle:3, les quatre emplacements du lot unique, ou mint:0), rôle, montant (en RAND, ou N (asset I) pour un jeton), le mémo qu’elle portait (- s’il n’y en a pas) et la clé par transaction sous laquelle elle a été scellée. Remettez la clé d’une ligne sent à un bénéficiaire ou à un auditeur, et rand_checkTransaction <HASH> <KEY> divulgue cette seule sortie, mémo compris. Un emplacement factice ne s’ouvre pour personne et n’a pas de ligne | |
block <ID> | bloc par hauteur ou par condensat | |
head | { height, hash, view } | |
status | rand_status | |
peers | pairs connectés | |
validators | le registre des validateurs |
--cuda nécessite une compilation avec --features cuda et n’a pas de solution de repli ; aucun PTX n’a encore été compilé. Il ne peut pas sceller une enveloppe d’entrée d’appel : rand call --cuda exige --no-envelope. Il ne déclare que le plafond de gas et refuse --gas-limit N.
Chaque mémo et chaque nom de contact que la CLI affiche (la confirmation de send, notes, history, tx-key) passe d’abord par une règle d’affichage unique : les caractères de contrôle, les caractères de format Unicode (contrôles bidirectionnels, caractères de largeur nulle, trait d’union conditionnel) et U+2028/U+2029 sont affichés sous la forme U+FFFD, et une suite de séparateurs d’espace est réduite à une seule espace.
Un premier transfert 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
Partager une adresse, et un mémo
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
Le mémo se trouve dans le même corps scellé que la note : qui peut ouvrir l’un peut ouvrir l’autre, à savoir le destinataire au moyen de notes, et toute personne détenant la clé par transaction de cette sortie au moyen de rand_checkTransaction <hash> <key>. La chain 18 est la première chaîne dont le genesis définit envelope_bytes ; sur les chains 14 à 17, --memo était refusé avant toute preuve.
Un appel confidentiel que vous pourrez rouvrir plus tard
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 programme avec état : le compteur RPL-2
Sur une chaîne dotée d’une section program_state, comme l’est la chain 20. Le compteur n’accepte que les transitions qui lisent une cellule et la réécrivent avec son premier mot augmenté de un ; tout le reste de la transition (ce que le bundle dépose, ce que le vault verse, ce que le programme émet) passe sans être vérifié, ce qui en fait une démonstration et non un programme auquel confier de la valeur.
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)
Les … dans le fichier représentent les 64 caractères hexadécimaux complets, que le wallet exige.
Ce qu’affichent un déploiement et un appel
Sur une chaîne à autorisation scindée, chaque bundle correspond à deux preuves produites sur cette machine : l’autorisation de dépense de niveau 10 et le bundle de niveau 14. Un program deploy avec rand v0.6.7 sur la chain 18, le 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)
Un call affiche son gas et ses frais avant la preuve d’appel, puis prouve le bundle payeur de la même manière :
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 [...]
Ici, 6,144 correspond à 5,636 arrondi au multiple supérieur de 2^10, et rand fee call 12 --gas 6144 --bytes <B> tarife cette limite aux prix du tip, sans marge.
rand-prover
Le prover délégué sous forme de binaire autonome : il produit la preuve du bundle de niveau 14 d’un wallet sur une autre machine. rand-node run --prover héberge le même service au sein d’un nœud. Chaque sous-commande accepte --home <DIR> (variable d’environnement RAND_PROVER_HOME, par défaut ~/.rand-prover), le répertoire qui contient prover.key.json et pairings.json.
| command | arguments | behaviour |
|---|---|---|
keygen | écrit prover.key.json, en mode 0600, et affiche l’empreinte de la clé ; refuse d’écraser un fichier existant | |
pair | --name <LABEL> (obligatoire), --url <URL> (par défaut http://127.0.0.1:8600), --own, --qr | génère un jeton, n’enregistre que son hachage sous l’étiquette et affiche le lien d’appairage randprover: que prend rand prover pair. Le jeton n’est affiché qu’une fois, dans le lien. --url est l’adresse à laquelle le wallet joint ce prover ; --own ajoute own=1 ; --qr affiche aussi le lien sous forme de code QR dans le terminal |
unpair | --name <LABEL> | supprime un appairage ; un prover en cours d’exécution lit le fichier au démarrage, la suppression prend donc effet au redémarrage |
pairings | une ligne par appairage : étiquette, own ou -, date de création | |
run | --listen <ADDR> (par défaut 127.0.0.1:8600), --max-parallel <N> (1), --max-queue <N> (8), --per-token <N> (2), --cuda, --skip-memory-check, --allow-origin <ORIGIN> (répétable), --fee <RAND> avec --fee-address <rand1…>, --accept-spend-key | sert le JSON-RPC prover_* jusqu’à Ctrl-C ou SIGTERM. Le démarrage est refusé si 5.74 GB × --max-parallel + 1 GiB de mémoire ne sont pas disponibles. --per-token est le nombre de tâches qu’un appairage peut avoir simultanément en file d’attente ou en cours de preuve. --accept-spend-key est retiré dans la v0.6.8 : run refuse de démarrer avec cette option, et un prover n’accepte que des témoins à clé de visualisation. Dans la v0.6.7, elle admettait les témoins à clé de dépense, que seule envoie une chaîne sur le bundle guest v1 ou v2 |
Un prover sur la chain 20 reçoit la clé de visualisation nk du wallet et un salt frais. Il ne peut pas dépenser, mais il peut lire tout ce que ce wallet a jamais reçu ou envoyé : appairez-vous à un prover auquel vous montreriez votre historique. Le wallet vérifie chaque preuve qu’il reçoit en retour.
Formats des fichiers de clé
Clé de nœud :
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Clé de wallet, version 2 :
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen l’écrit en mode 0600, et depuis la v0.6.8 toute commande rand refuse un fichier de clé de wallet lisible par le groupe ou par les autres : une clé copiée ou restaurée à la main doit être remise en 0600 (chmod 600 <key>). La perte d’une clé de wallet fait perdre toutes les notes qu’elle pouvait ouvrir ; cette version ne comporte aucune phrase de récupération.