Rand Protocol
文档
参考

命令行

所有 rand-node 和 rand 命令及其参数与默认值——节点与运营者二进制程序、屏蔽钱包(shielded wallet)以及委托证明者(prover)。

本页介绍的三个二进制文件均由 cargo build --release 生成:rand-node(节点及运维命令)、rand(屏蔽钱包)和 rand-prover(委托证明者)。每个命令都接受 -h/--help。本页描述 v0.8.0 版本(c0878c3f),即 chain 21 自 2026-10-12 起运行的构建;v0.6.8(chain 20 的构建)行为不同之处会另行说明,v0.8.0 新增的内容集中在末尾的 What chain 21 and v0.8.0 add。早于 v0.8.0 的 rand 钱包无法在 chain 21 上发送交易:约束集 9 更改了每个证明的编码和每个验证密钥,而且自 chain 20 起每条链携带的创世绑定无论如何都会拒绝为另一条链生成的证明。前两者持有不同类型的密钥:节点密钥是用于签署区块的 Dilithium2 密钥对;钱包密钥是屏蔽花费密钥,不在链上签署任何内容。

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)
  multisig    id | status | pay | rotate: the signers' side of a multisig account (chains with a multisig section)
  price       status | sign | submit: the validator set's RAND/USD price vote (chains with fees.usd_subsidy)
  aggregator  register | unbond | withdraw — the aggregator role (aggregation chains only)
  aggregate   The aggregate daemon (aggregation chains only)

safety、admit 和 bridge-gov 是 v0.6.8 新增的;multisig 和 price 是 v0.8.0 新增的。没有 balance 和 transfer:转账需要屏蔽花费密钥,而只有钱包持有该密钥。

有一个全局标志 --allow-test-fri-profile(或 RAND_ALLOW_TEST_FRI_PROFILE=1),可让 init、run 和 verify 接受 fri_profile 为 test 的创世文件。该配置约有 17 位安全强度,而任何编写创世文件的人都可以指定它,因此自 v0.6.8 起,没有该标志时节点会拒绝这样的创世文件。测试套件会设置它;其他场景都不应设置。

keygen, address

命令参数默认值
keygen--out <OUT>node.key.json
address--key <KEY>必填

keygen 以 0600 权限写入 { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> }。该文件是种子的唯一副本。自 v0.6.8 起,keygen 会拒绝已存在的 --out(… already exists or cannot be created; refusing to overwrite a key file)并保持该文件不变;没有 --force,因此要替换旧文件,请先将其移开。v0.6.7 及更早版本会不加询问地覆盖。address 输出 address、public_key(1,312 字节十六进制)和 peer_id。

genesis

参数默认值含义
--chain-id <CHAIN_ID>1链 id;交易和 gossip 主题均与其绑定
--validator <KEY,STAKE,PAYOUT>必填,可重复一条注册项:密钥文件路径或十六进制公钥、以 RAND 计的质押量(至少 1,000)、rand1… 收款地址
--epoch-blocks <N>1000每个 epoch 的区块数
--alloc <ALLOCS>无,可重复一张存入票据:rand1<address>=<amount in RAND>
--out <OUT>genesis.json输出路径
--faucet关仅限 testnet:启用 Mint。与 bridge 部分并用时需要 --testnet
--testnet关v0.6.8:写入 "testnet": true,该标记允许水龙头与 bridge 部分并存。给出时计入创世哈希
--no-confidential关禁用 Deploy 和 Call
--fri-profile <production|test>productiontest 不安全,仅供测试套件使用;没有 --allow-test-fri-profile 时,init、run 和 verify 会拒绝这样的文件
--max-program-words <N>无(4096)一次部署可携带的最大程序,1..=65535。仅在给出时写入;只要存在就计入创世哈希,因此 --max-program-words 4096 与省略该参数是两条不同的链。在对这样的文件执行 init 之前,每个节点都需要 v0.4 二进制文件
--max-proof-bytes <N>无(2,097,152)一笔交易可携带的最大证明,1048576..=33554432。所有证明上限均随之而定
--max-block-bytes <N>无(4,194,304)最大区块,也即最大交易,4194304..=67108864,且至少为 2 × max_proof_bytes + 1 MiB;使用 --auth-guest 时至少为 3 × max_proof_bytes + 1 MiB,此时一次调用携带三个证明(bundle、auth、call)
--max-call-envelope-bytes <N>无(18,432)最大调用输入信封,18432..=1048576
--max-program-public-words <N>无(0)一次部署可固定的最大公开输入,0..=65535;0 表示不允许任何公开输入
--tokens <TOKENS.JSON>无RPL 的 tokens 部分,为 JSON 文件 {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}。省略时,文件没有该部分,哈希与此前相同。bridge 部分需要一个 mint_cap_per_day 非零的该文件(按每种支持资产、每个 UTC 日计,以代币的八位小数单位计);列出的代币需要 bridge 部分
--envelope-bytes <N>无(旧版 1,348 字节信封)每个票据信封的确切大小:bundle 输出、水龙头铸造、提现、bridge 存入、创世 alloc。仅接受 1860,即让每个信封都能携带加密备注的大小。给出时计入创世哈希,并在本命令自身的 --alloc 票据被封装之前设定
--vesting <VESTING.JSON>无vesting 部分:带时间锁的分配,{"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}。自 v0.6.8 起,可撤销的条目需列出 revokers(1 到 5 个密钥)、threshold 以及撤销时支付所至的 treasury,缺少其中任一项的文件会被拒绝
--staking <STAKING.JSON>无v0.6.8:staking 部分,为 JSON 文件(faucet_budget_per_epoch、bond_activation_epochs、max_weight_bps、max_stake_entry_per_epoch 或 max_stake_entry_bps_per_epoch、registration_v2、faucet_recipients、faucet_minters、admission_by_vote、slashing),由构建过程校验
--consensus-domain <0|1>无(0)v0.6.8:1 将每张投票、new-view 和提案与此创世绑定
--bundle-guest <v1|v2|v3>v1固定为 hc_bundle 的 bundle guest:v1(chain 14 和 15 运行的隐藏资产 guest)、v2(chain 16 的无分支 guest)或 v3(拆分授权:guest 接收 nk 和一个盐,而非花费密钥)。v3 需要 --auth-guest
--auth-guest关将本构建的 auth guest 固定为 hc_auth:此后每个 bundle 都携带一个针对花费密钥、与其交易绑定的 auth 证明,其输出等于该 bundle 的 auth_commit。与 --bundle-guest v3 并用时必需,与 v1 或 v2 并用时在写入任何文件之前即被拒绝。缺省时,文件没有 hc_auth 字段
--hardening-v6关将 v0.6 规则变为有效性规则(hardening_v6):pc 窗口、不可调用的部署、规范的证明形状与工作量证明字、调用绑定以及程序表下限。缺省时,节点仍会在其交易池处按策略拒绝这些内容
--gas-price <UNITS>无(没有 gas 部分)链本身对一次调用每单位 gas 收取的单位数(10⁻⁹ RAND)。写入 gas 部分(metering: "circuit")的正是此标志;没有它,下面三个标志会被拒绝。计入创世哈希
--byte-price <UNITS>800,仅与 --gas-price 并用调用证明加输入信封每 KiB(不足 1 KiB 也按一份计)的单位数,从第 0 字节起计
--bundle-gas-limit <N>20479,仅与 --gas-price 并用每个 bundle 证明必须声明的确切 GAS_LIMIT;声明其他值的 bundle 证明会被拒绝。创世只接受 20479,即 tier-14 bundle guest 的 gas_max(14, 0, 0)
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS>无(固定价格)启用逐区块价格控制器,以该部分自身的起始 gas_price 和 byte_price 为下限。与 --aggregation 并用时被拒绝
--max-gas-price <UNITS>, --max-byte-price <UNITS>无(没有上限)v0.6.8:控制器永不将价格抬高到其上的上限,每个至少等于起始价格。没有 --gas-dynamic 时被拒绝
--gas-byte-load paying无(每笔交易的字节)v0.6.8:只有调用的证明和输入信封会推动 byte_price,因此一个全是转账的区块不会推动任何价格。没有 --gas-dynamic 时被拒绝;paying 是唯一的取值
--binding-domain <0|1>无(没有该字段)v0.6.8:1 将创世哈希绑定到每个交易绑定和每条已签名的操作消息中(水龙头铸造、unbond、提现、RPL 代币消息、aggregator 操作、bridge 治理消息),因此为本链生成的证明或签名在其他任何链上都无法通过验证。省略时,该命令会发出警告:v0.6.8 钱包在 14 到 19 之外的每个链 id 上都生成绑定创世的形式,因此从 20 起的每条链都以 1 创建
--proof-window-blocks <N>无(256)v0.6.8:一个窗口,256 到 4,096 个区块,用于限定 bundle 的锚点及其 time 的最大陈旧程度。以 rand_getLimits.proof_window_blocks 提供
--program-state-cell-fee <UNITS>无(没有 program_state 部分)v0.6.8,RPL-2:启用程序 cell、程序 vault 和 Invoke 操作,并以此 cell 费用(以 RAND 单位计,至多 1,000 RAND)为 invoke 创建的每个 cell 在其费用下限之上加收。需要 --tokens、--gas-price、--hardening-v6 和 --auth-guest,缺少任一项都会在写入任何文件之前按名称被拒绝
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…>无aggregation 部分;v0.6.8 构建在遇到带有该部分的创世时拒绝启动

打印每个 --alloc 对应的一行 alloc,然后是创世哈希、验证者数与票据数、epoch 长度、五项上限、hc_bundle 与 hc_auth(未给 --auth-guest 时为 none),最后是 gas 行:gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying;未给 --gas-price 时为 gas: none;给了 --program-state-cell-fee 时再多一行 program_state: cell fee N RAND。init 打印同样的 gas 行。五个上限标志的行为一致:省略时,文件中没有该字段,链按默认值运行;给定时,即使取默认值,该字段也计入创世哈希。Chain 20 用这些标志切出(deploy/cut-chain20-genesis.sh);chain 21(deploy/cut-chain21-genesis.sh,v0.8.0)使用相同的标志,只是 --max-proof-bytes 6291456 --max-block-bytes 19922944 --gas-dynamic 9961472,262144,1250 不同,并增加了 --fees fees.json(burn_base 与 burn_floor)、--perps …(RPL-3,zUSD 上的一个 BTC-PERP 市场)、--multisig MULTISIG.JSON(基金会金库)以及 --auth-multisig-guest(私密多签 guest,hc_auth_multisig):

--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

Chain 18 与 chain 19 使用相同的标志,直至 --envelope-bytes 1860,且不含任何 v0.6.8 的标志。Chain 20 的证明上限为 4 MiB,低于 chain 13 至 16 的 8 MiB;chain 21 为 6 MiB,区块为 19 MiB,为 tier-18 多签授权证明留出空间:一笔拆分授权交易最多携带三个证明,3 × 4 MiB + 1 MiB 可放入 20 MiB 的区块。tokens.json 包含 1 RAND 的 registration_fee、10000000000000 的 mint_cap_per_day、max_tokens 4096、burn_registration_fee 与 bound_note_value,以及列有七项支持资产的 zUSD。没有 --bridge 标志,切出脚本仍会在事后把 bridge、staking 与 consensus_domain 各节拼接进文件(chain 20 与 21 上为:处于守护者集合 1、带八个后量子守护者密钥的桥、暂停密钥、rules_v2、rotation 与 fees;含水龙头白名单、admission_by_vote 以及 2,500 bps 准入额度的 staking 节;consensus_domain: 1;以及用 alloc-note --asset 1 --envelope-bytes 1860 生成的 zUSD 创世票据)。真正有效的创世哈希,是 init 在完成的文件上打印出的那个。

每个 --alloc 会用全新的承诺随机数构建一张存入票据,因此切两次会得到两个不同的哈希。该命令总是把票据的 opening 与 cm、amount 一并写出,带有 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>" } }
]

因此,创世票据的所有者与金额在文件发布后即按设计公开;只有它之后何时被花费、被花费到何处仍保持私密。创世只切一次,并保存好文件。

alloc-note

--to <rand1…>(必填)、--amount <N>(必填)、--asset <INDEX>(默认 0)、--envelope-bytes <N>(默认:旧格式)。以 JSON 打印一张 alloc 票据,并像 genesis --alloc 那样向 --to 密封。设置了 envelope_bytes 的创世会拒绝未带匹配 --envelope-bytes 密封的票据。--amount 以资产的整数单位计:RAND 为九位小数,桥接代币为八位(资产 1 上的 10 即 10 zUSD)。列入清单的代币的票据,要求该代币的支持资产携带的 locked 数额之和恰好等于其票据总额。

init

参数含义
--datadir <DATADIR>要创建的数据目录
--genesis <GENESIS>创世文件;复制到 <datadir>/genesis.json

打印创世哈希以及与 genesis 相同的 gas: 行。

run

参数默认值含义
--datadir <DATADIR>必填已初始化的数据目录
--key <KEY>必填密钥文件:验证者身份、p2p 身份、费用接收方
--listen <LISTEN>/ip4/0.0.0.0/tcp/30303libp2p 监听 multiaddr,可重复
--bootstrap <BOOTSTRAP>无,可重复/ip4/<ip>/tcp/<port>/p2p/<peer-id>,启动时拨号,断开期间每 30 秒重拨一次。自 v0.6.8 起,其 peer id 为保留项
--reserved-peer <PEER_ID>无,可重复v0.6.8:一个可越过入站连接上限、并从验证者的同步预算份额中获得服务的对等节点。引导节点以及本节点已见过其签名 peer 绑定的每个验证者无需此标志即为保留项;在新切出的链上,其存储尚无任何绑定,应在此列出集群中的验证者
--strict-gossip关闭v0.6.8:gossipsub 的严格校验,只接受作者签名、序列号与来源均有效的消息。严格节点与宽松节点可以互操作,因此可逐节点滚动启用
--rpc <RPC>127.0.0.1:8545运维方的 JSON-RPC 监听器:开放全部方法,并信任回环地址。应将其保持在回环上,切勿把公共端点转发到它
--public-rpc <ADDR>关闭v0.6.8:第二个公共监听器,方法集固定(不含查看密钥方法、rand_mint 或 rand_getPeers),不支持批量请求,不支持 WebSocket,所有调用方共用一个计量;反向代理或 SSH 转发应指向它(JSON-RPC)
--rpc-viewing-token-file <PATH>关闭v0.6.8:要求 --rpc 的查看密钥方法携带 Authorization: Bearer <文件第一行>(32 个或更多字符)
--validator关闭以此密钥参与共识
--no-mdns关闭禁用局域网发现
--block-interval-ms <MS>1000两次提议之间的最小间隔
--view-timeout-ms <MS>3000基础视图超时;每连续超时一次翻倍,最高至 8×
--verify-chain <MODE>quickoff、quick、full
--keep-raw-proofs关闭聚合链上的归档模式
--prune-history <WINDOW>无(保留全部)只保留这么多区块历史,格式为 <n>m、<n>h 或 <n>d,至少 1h:更早的区块会丢弃其区块、QC、交易与回执;账本保留。在 chain 21 上,与 chain 20 一样,26 个验证者中有 24 个运行 24h,两个节点为归档节点;归档节点与 mainnet 节点从不设置它。低于下限的高度查询返回 -32010(JSON-RPC)
--min-free-disk-mb <MB>1024数据目录所在文件系统的可用空间低于此值时拒绝启动;低于其四倍时,rand_getHealth 报告 disk_low。0 禁用此保护
--rpc-viewing-open关闭允许非回环调用方使用查看密钥方法;仅可置于具备身份认证的组件之后
--gas-price <UNITS>100本节点的交易池对一次调用要求的每 gas 单价(单位 10⁻⁹ RAND),作用于其证明头中 gas_max 之上。属于准入策略,而非链规则:携带更便宜调用的区块仍然有效。与 --byte-price 0 一并取 0 时不运行任何策略。在创世含 gas 节的链上(chain 20 如此,chain 21 亦然),链自身的价格即为有效性规则
--byte-price <UNITS>800一次调用的证明与输入信封每 KiB(不足 1 KiB 也按一份计)的单位数,自第 0 字节起算,适用同一策略
--prover <ADDR>关闭在此地址上托管委托证明者(prover_* JSON-RPC):一个独立的监听器,必须不同于 --rpc。若没有由 rand-prover keygen 生成的 <prover-home>/prover.key.json,节点拒绝启动
--prover-home <DIR><datadir>/prover证明者的 prover.key.json 与 pairings.json
--prover-accept-spend-key已停用自 v0.6.8 起启动即被拒绝:给定此标志的 run 会在读取节点密钥之前退出,并指明该标志。任何证明者都不再接受花费密钥见证;请把它从 unit 文件中删除。在 v0.6.7 上,它接受 bundle guest v1 或 v2 链的花费密钥见证
--prover-max-parallel <N>1托管证明者同时运行的证明数;除非有 5.74 GB × N + 1 GiB 的可用内存,否则拒绝启动
--prover-max-queue <N>8在运行中的任务之外排队的任务数
--prover-cuda关闭在 CUDA 后端上证明(需以 --features cuda 构建);无 CPU 回退
--prover-skip-memory-check关闭跳过可用内存检查
--prover-fee <RAND>, --prover-fee-address <rand1…>无发送到托管证明者的每个任务必须支付的费用,以 RAND 计,最多九位小数:向该地址的一笔 RAND 输出,包含在被证明的 bundle 之内。两个标志须同时给出
--prover-allow-origin <ORIGIN>浏览器扩展与回环页面其页面可读取证明者回复的浏览器来源,可重复;给定一次或多次时,这些值即为完整列表。* 允许所有网站,并打印警告

环境变量:RUST_LOG(默认 info,libp2p=warn,libp2p_mdns=off)。Ctrl-C 或 SIGTERM 会让节点干净地关闭。

公共端点 https://rpc.randprotocol.org 是位于归档节点之前的白名单代理;自 2026-10-01 起,其白名单即公共监听器的方法集。

safety

已停止的验证者的共识安全状态(v0.6.8)。每条命令都自行打开数据目录,因此不能与运行中的节点同时执行。

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 打印已提交的头部区块、当前视图与最后投票视图、最高 QC、验证者是否被锁定在其头部之上,以及已记录的安全停机。节点若发现一条经认证的三链试图提交一个并非源自其自身已提交头部的区块,便会停止并记录此事(audit v6,CON-5);此后 run 会带着该记录退出,直至执行 clear-halt。清除之前,请将本节点的头部与另外两个验证者的头部比对,若有差异,则先从归档重新同步。自 v0.6.8 起(CON-4),任何数量的“未持有”应答都不再能解除锁定:被锁定在一个无法获取的区块上的验证者保持静默,直到收到一个其 justify 高于该锁的提案,或该区块被取回。release-lock 将持久化的锁降至已提交头部的证书;一次只对一个验证者使用,并且仅在该区块确已永久丢失时使用。凡会写入的命令,若不带其确认标志,只打印将要执行的操作,不做任何更改。

verify

参数默认值含义
--datadir <DATADIR>必填节点不得处于运行状态
--mode <MODE>fullquick 或 full
--repair关闭截断受损的尾部;安全状态予以保留

若一致,退出码为 0;若发现问题且未使用 --repair,退出码为 2。

db

db drop-receipts-index --datadir <DATADIR>,须在节点停止时执行:在回滚到 v0.3 之前的构建之前,删除 receipts_by_program 索引,因为该构建无法打开带有此索引的数据库。之后再次启动时,将根据收据重建该索引。

status

--rpc <URL>(默认 http://127.0.0.1:8545)。原样打印 rand_status。

register, unbond, withdraw

命令参数含义
register--key, --payout <rand1…>, --rpc, --v2打印由本节点密钥签名的十六进制 Registration;从 RPC 读取链 id,若使用 --v2,还读取创世哈希。在创世设置了 staking.registration_v2 的链上(如链 20 和 21)必须使用 --v2;该处拒绝 v1 注册,其余各处则接受 v2 注册
unbond <amount RAND>--key, --rpc, --no-wait将质押转入解绑;免费;两个 epoch 后可提取
withdraw <amount RAND>--key, --rpc, --no-wait将已释放的质押和奖励支付到收款地址处的一张票据中,扣除 0.001 RAND 的基础费用

admit sign|submit

投票准入(v0.6.8)。在创世设置了 staking.admission_by_vote 的链上(如链 20 和 21),新的验证者密钥须经持有严格多于三分之二投票权重的验证者签名准入后,方可注册。

命令参数含义
admit sign--candidate <key hex, registration hex, or a file holding either>, --key <validator key>, --genesis-hash <hex>将本验证者的投票打印为一行 <voter key hex>:<signature hex>,签名覆盖创世哈希与候选者的地址,因此仅在这一条链上有效。离线:不读取任何节点
admit submit--candidate …, --signature <line>(可重复), --rpc, --no-wait对照节点的创世哈希检查每一张投票(指向其他创世或其他候选者的投票,或同一投票者重复投票,都会被指明),将其排序并提交免费的 AdmitValidator

候选者是注册将携带的密钥;rand-node address --key 会将其打印出来,register 打印的十六进制中也包含它。准入提交之后,绑定质押照旧(rand bond … --registration),并消耗该准入。rand_getAdmitted 列出已获准入且在等待的项目。

bridge-gov

桥的后量子轮换(v0.6.8),供守护者与暂停密钥持有者使用。每一步都从 --rpc(默认 http://127.0.0.1:8545)读取链 id、其绑定域以及 rand_getBridgeState.rotation_nonce。

命令作用
rotate-pq message --new-key K…打印当前 nonce 对应的十六进制轮换消息,供各签名者相互比对
rotate-pq sign --new-key K… --key F --index I [--possession]打印 I:signature:当前 PQ 守护者的法定人数行(I 为其在当前集合中的索引),或在使用 --possession 时,打印新密钥持有者的行(I 为其在新集合中的索引);拒绝并非 I 处密钥的密钥文件
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait]组装 RotatePqGuardians,或带持有证明行的 V2 操作,并发送;在不接受持有证明的链上拒绝持有证明,在要求持有证明的链上(如链 20 和 21)拒绝缺少持有证明
rotate-pause message|sign|submit --new-key K对暂停密钥的同样操作(持有证明索引为 0)
cancel-rotation sign --kind pq|pause --key PAUSE_KEY打印对取消消息的 0:signature,并对照链当前的暂停密钥进行检查
cancel-rotation submit --kind pq|pause --signature @F发送 CancelRotation,在延迟期结束前撤销待生效的轮换

--new-key 是十六进制的 Dilithium2 公钥、存放有一个公钥的 @file,或 @key-file(取其公钥)。签名行的格式为 index:hex,以空白或换行分隔,允许使用 # 注释。

vesting status|claim|revoke|bond|unbond

在创世带有 vesting 部分的链上,这是带时间锁的创世分配的持有者一侧与撤销者一侧的命令。链 20 没有该部分,链 21 也没有。密钥为 rand-node keygen 文件。

命令参数含义
vesting status <ENTRY>--rpcrand_getVesting 所提供的条目:其条款、已归属的部分、当前可领取的部分
vesting claim--entry <id>, --to <rand1…>, --amount <RAND> or --all, --key, --rpc, --no-wait将已解锁的部分支付到 --to 处的一张票据中,扣除 0.001 RAND 的基础费用;由受益人密钥签名
vesting revoke prepare--entry, --margin-secs(默认 600), --out(默认 revoke.json), --rpcv0.6.8,无需密钥:写出每位撤销者都要签名的撤销,即一张票据,包含仍未归属的部分,时间为头部之后 --margin-secs,支付给该条目创世中的 treasury(没有 --to)
vesting revoke sign--proposal <file>, --key, --index?单个撤销者密钥,离线:打印 <index>:<signature hex>
vesting revoke submit--proposal <file>, --signature <index:hex>(可重复), --rpc, --no-wait在 prepare 之后的 256 个区块内,携带至少达到该条目 threshold 的签名数发送撤销。v0.6.7 的单密钥 vesting revoke --to 已被移除
vesting bond <amount RAND>--entry, --validator <address>, --registration <hex>, --key, --rpc, --no-wait不可撤销的条目:将锁定的 RAND 作为该验证者的质押进行绑定;尚未进入登记册的验证者需要 register 打印的内容
vesting unbond <amount RAND>--entry, --key, --rpc, --no-wait将已绑定的 RAND 取回锁中;经过解绑 epoch 之后可再次领取

aggregator register|unbond|withdraw, aggregate

适用于带有 aggregation 部分的链上聚合者角色的命令:aggregator register --key --bond <RAND> --payout <rand1…> --rpc 打印一份已签名的 AggregatorRegistration;aggregator unbond 与 aggregator withdraw 与验证者的那一对命令相对应。aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] 是轮询 rand_getUnsealed、证明一个聚合并提交的守护进程。在链 21 上不起作用,链 20 亦然:两者的创世都没有 aggregation 部分。自 v0.8.0 起,一次失败的轮次(RPC 失败、nonce 已变动、聚合被拒绝)会被记录并按该间隔重试,而不是令守护进程停止,最多连续 --watch-max-failures(20)次。

multisig id|status|pay|rotate

v0.8.0,多签账户(multisig accounts)的签名者一侧,适用于创世带有 multisig 部分的链,如链 21。创建账户和为其注资属于钱包的命令(rand multisig create / deposit,见下文);此处的密钥是 rand-node keygen 文件,每位签名者一个。

命令标志作用
multisig id--chain-id, --salt <64 hex>, --threshold, --signer <pubkey hex>(重复,按顺序)离线推导账户 id,拒绝链本身也会拒绝的集合(超过 10 个签名者、阈值为 0 或超过人数)
multisig status <id>--rpcrand_getMultisig 所提供的账户:签名者、阈值、nonce 和金库
multisig pay prepare--account <id>, --to <rand1…>(重复), --amount <A>(每个 --to 一个,以资产的显示单位计), --asset <N>(省略则为 RAND), --out(pay.json), --rpc无需密钥:写出每位签名者都要签名的支付——每笔支付的票据均向其接收者加密封装、账户的 nonce、以头部高度作为 time;账户还从其自身的 RAND 行支付 0.001 RAND 的基础费用
multisig pay sign--proposal <file>, --key, --index单个签名者,离线:打印 <index>:<signature hex>
multisig pay submit--proposal <file>, --signature <index:hex>(重复), --rpc, --no-wait在 prepare 之后的 proof_window_blocks(链 21 上为 1,024)个区块内,携带至少达到账户阈值的签名数发送支付
multisig rotate prepare / sign / submit同 pay,另加 --signer <pubkey hex>(重复,新的顺序)和 --threshold新的签名者集合,由当前签名者中至少达到当前阈值的人数签名;免费

链 21 的金库 d5fd1883…1958 就是这样一个账户:3 位签名者中需 2 位,在切换时注入了 100,000 RAND。

price status|sign|submit

v0.8.0,验证者集合针对美元挂钩的封装补贴(创世配置 fees.usd_subsidy)所投的 RAND/USD 价格投票,形态与 admit 相同并带有 nonce:price status --rpc 打印已投出的价格、设定该价格的区块高度、该价格对下一个区块是否仍然有效,以及下一个 nonce;price sign --price <dollars> --nonce <N> --key <validator key> --genesis-hash <hex> 离线打印单个验证者的投票;price submit --price … --nonce <N> --signature <line or file> … --rpc 会对照节点的创世哈希、价格和 nonce 检查每一张投票,然后发送免手续费的 SetRandPrice。在链 21 上不生效,因为其创世配置中没有 usd_subsidy:该操作在那里会被拒绝。

run:证明、验证检查点与应用线程(v0.8.0)

run 新增三个标志。--verify-chain quick 是默认的启动检查,若同一个干净构建已将存储验证至其头部(启动检查点,在节点运行时写入),则跳过该检查;--verify-chain replay 强制逐块遍历,而 rand-node verify 始终会遍历。--apply-proposals-inline 恢复 v0.8.0 之前的行为,即在共识循环上应用收到的提案;默认情况下,跟随者在阻塞线程上应用提案(同时最多四个),而预检查和插入仍留在循环上。--msauth-vk <PATH>(默认为 $RAND_MSAUTH_VK,否则为二进制文件旁的 msauth-vk-<profile>.bin)指定固定的多签验证密钥:在指定了 hc_auth_multisig 的链上(如链 21),run 和 verify 会在启动时加载它,没有它则拒绝启动,因此每个链 21 节点都在 rand-node 旁附带 msauth-vk-production.bin(Running a node)。

rand(钱包)

全局选项,可置于子命令之前或之后:

optionenvdefault
--rpc <RPC>RAND_RPChttp://127.0.0.1:8545;http 或 https(公共端点为 https://rpc.randprotocol.org)。超过 64 MiB 的回复会被拒绝
--key <KEY>RAND_KEYwallet.key.json;note 存储位于其旁,路径为 <key>.notes.json。该存储与扫描时所对应的链绑定(即节点的 rand_getGenesisHash):若指向另一条链,例如跨越从链 19 到链 20 切换后仍保留的钱包,则会被清空,并带警告从叶子 0 重新扫描。自 v0.6.8 起,每个命令都会拒绝群组或其他用户可读的密钥文件,并指明修复方法(chmod 600 <key>)
--prover关闭。在与此钱包配对的证明者(rand prover pair)上而不是在本机上证明该 bundle;证明在本地经过检查(其摘要、大小和一次本地验证)后才会进入交易。适用于所有需要证明 bundle 的命令;对于 call 和 program invoke,只有支付 bundle 交给证明者,调用证明仍在本地生成。没有配对时会被拒绝,并且与 --cuda 同用时也会被拒绝,call 除外。在链 20 和 21 这类拆分授权的链上,证明者拿到的是查看密钥 nk 和一个盐值,绝不会拿到花费密钥:它可以读取此钱包的全部历史,但无法花费。授权证明始终在本机生成。在 bundle guest 为 v1 或 v2 的链上,v0.6.8 会在询问证明者任何信息之前就拒绝 --prover
--max-prover-fee <RAND>1。已配对的证明者每个 bundle 最多可收取的费用。高于此值的报价会在构建任何 bundle 之前被拒绝;0 表示拒绝任何费用。该费用是同一 bundle 中多出的一个 RAND 输出,显示为 prover fee: <amount> RAND to <fingerprint>
--threads <N>全部核心(v0.7.1)。在本机生成证明时使用的 CPU 线程数;未指定标志但设置了 RAYON_NUM_THREADS 时取其值;0 会被拒绝。钱包在有人等待的情况下证明一个 bundle,因此默认使用全部核心(在 M4 Max 上,一个 bundle 用 8 个线程为 17.1 s,16 个线程为 13.9 s,见 fullnode docs/node-hardware.md §6)
--cpu关闭(v0.7.1)。即使带有 CUDA 后端的构建能看到 GPU,也在 CPU 上证明;未指定 --cpu 或 --cuda 时,这样的构建会使用 GPU,并在 stderr 上提示一次

金额为十进制 RAND,最多九位小数(1、1.5、.25、0.000000001)。send、token mint 和 token burn 上的代币金额,以及 randpay: 链接中的代币金额,均以该代币的显示单位计,精度取其登记表行自身的 decimals(10 个 zUSD 即 10 zUSD)。bridge-burn、token create --fixed-supply 和 --initial 取以代币最小单位表示的纯整数,asset-balance 也以此打印。凡是命令需要指定代币之处,都可以使用登记表索引、rpl1… id 或 64 位十六进制 id;id 是根据节点的完整登记表列表(rand_getTokens,每一页)解析为索引的,绝不通过逐个代币的查询,否则会让节点得知哪个代币即将被转移。数字索引则根本不会到达节点。

命令参数行为
keygen在 --key 处写入新的花费密钥文件,权限 0600;拒绝覆盖已有文件
address--uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE>在 stdout 打印此钱包的 rand1… 地址,内容恰为地址加一个换行,因此 $(rand address) 可在脚本中使用;在 stderr 打印其 fingerprint XXXX-XXXX-XXXX-XXXX:16 个 Crockford base32 字符,用于人工核对地址,不会在网络上传输。--uri 还会打印 randpay: 链接(地址加可选的金额、资产和备注)。--qr 在终端中将该链接渲染为二维码;--qr-png 将其写为 PNG
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME>--yes (add)此钱包可按名称发送的命名地址。TO 为 rand1… 地址或 randpay: 链接,只保留其中的地址。add 打印指纹并询问 add? [y/N],除非带 --yes;stdin 不是终端时,不带 --yes 会被拒绝。存储于 <key>.contacts.json,权限 0600。名称为 1 至 64 个字符,不得以 rand1 或 randpay: 开头,且必须唯一
prover pair <LINK> / prover pair --trusted / show / forget--name <NAME>, --yes (pair)将此钱包与一个委托证明者(prover)配对。pair 接收 rand-prover pair 打印的 randprover: 链接,拒绝非 https:// 的 URL(明文 http:// 仅限 localhost、127.0.0.1 或 [::1]),然后说明证明者将收到什么(this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend)并询问 pair? [y/N];--yes 跳过该询问,stdin 不是终端时不带 --yes 会被拒绝。随后它向证明者查询 prover_info,除非其密钥指纹与链接所指定的一致,否则拒绝,并写入 <key>.prover.json,权限 0600,替换任何先前的配对。--trusted(v0.6.8)不接收链接:它与验证者(validator)的证明者池 https://prover.randprotocol.org 配对,所用链接由构建内置;其运营者可以读取此钱包的历史记录,但无法花费。show 打印名称、URL、指纹、own 和证明者的密钥,从不打印令牌;forget 删除该文件。v0.6.7 在配对前不会询问
viewing-key打印此钱包的查看密钥 nk(64 位十六进制):即 rand_importViewingKey 所接收的参数。它能读取钱包发送或接收的每一张票据,但不能花费任何票据
balance扫描树,保存存储,打印可花费的数额和未花费票据的数量
sync--rescan扫描但不打印余额。首次同步先读取每个区块头(每次调用 1,024 个),再读取叶子。--rescan 会忘记所有票据、已花费标记和游标(保留链绑定),并从叶子 0 开始重新扫描:当节点错误地将此钱包的票据报告为已花费时,这是恢复的办法。最好对你信任的节点运行
notes--memo此钱包已打开的每一张票据:索引、资产、数额、高度、spent、pending,以及截断为 24 个字符的备注;带 --memo 时显示完整备注
asset-balance [INDEX]扫描后,打印此钱包持有的某一资产的数额,或每个所持资产一行;数额以该资产自身的最小单位表示
history--memo此钱包为他人创建的每一张票据,备注列与 notes 相同
send <TO> [AMOUNT]--asset <INDEX|rand|rpl1…|hex>(默认 0,即 RAND), --memo <M>, --fee <RAND>(默认 0.001), --no-wait, --yes, --cudaTO 为 rand1… 地址、randpay: 链接或已保存联系人的名称,按此顺序尝试。链接自带的金额、资产和备注会补全命令行未给出的内容;仅当链接携带金额时 AMOUNT 才可省略,同一值以两种方式给出且不一致则被拒绝。命令打印确认信息 to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset>,有备注时另起一行打印 memo: "<text>",然后在证明之前询问,除非带 --yes。脚本必须传入 --yes:stdin 不是终端时会被拒绝,并提示 stdin is not a terminal: pass --yes to send without confirmation。随后它至多选取该资产的两张票据和至多两张用于手续费的 RAND 票据,仅将备注封入支付输出,在本地证明一个四槽隐藏资产捆绑包,以及在分离授权链上证明花费授权,提交并等待提交完成。在创世块没有 envelope_bytes 的链上,非空备注会在证明之前被拒绝。AMOUNT 以资产的显示单位表示:RAND 为十进制 RAND,代币按其注册表行自身的 decimals;只有 0 或 rand 读作 RAND,无论节点返回何种索引。代币 id 在询问节点之前先解码,列表行若以索引 0 或不一致的 id 字段作答,则被拒绝。确认信息同时以显示单位和基本单位显示代币数额,10.00000000 zUSD (1000000000 units),因此在发送任何内容之前,谎报代币 decimals 的节点就会暴露。资产索引和手续费在证明之前打印。在链上,代币转账是一个普通捆绑包,与 RAND 支付无法区分;其手续费为 RAND,没有可花费 RAND 的钱包会在证明之前被拒绝
bond <VALIDATOR> <AMOUNT>--registration <hex>, --fee, --no-wait, --cuda质押到某个验证者:捆绑包销毁该数额
faucet [ADDRESS]--amount <RAND>(默认且最大为 100)仅限 testnet:请求验证者节点铸造。在链 21 上,与链 20 相同,水龙头只向其创世白名单上的 16 个钱包发放
program build--guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N(可重复), --out <file>(默认 program.json)汇编一个内置 guest;打印程序 id。rpl2_counter(v0.6.8)是 RPL-2 的演示程序
program deploy <FILE>.json、原始 .bin,或 rand-guest build 写出的镜像容器;--public <FILE>, --input <u32>(可重复)或 --check-call, --cuda打印程序 id、hc 和字数;在证明之前拒绝超过链上限的程序(通过 rand_estimateFee);通过捆绑包支付部署底价,然后等待。--public 将一个公开输入与程序一同存储(以空白分隔的 u32 字,或 ELF .so),不得超过链的 max_program_public_words;程序 id 随后绑定该输入。使用 --input 或 --check-call 时,钱包会先在模拟器中对这些私有输入试运行一次调用,除非其符合调用层级上限(14),否则拒绝;检查不会产生任何证明
program show <ID>已部署程序的元数据
program invoke <PROGRAM-ID>--transition <FILE.json>(必需), --input N(可重复,私有), --inputs-file <FILE.json>(u32 的 JSON 数组,追加其后), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-waitv0.6.8,RPL-2:声明程序的一次状态转换并让链应用它。在证明任何内容之前,它检查链是否有 program_state 部分,程序是否存在,转换的上下文是否符合分段规则,每个 reads 条目是否与实时单元匹配(rand_getProgramCell;不匹配时会指出过期的单元并以 3 退出),金库能否支付每个 pays 条目加上此转换存入的数额,以及此钱包是否持有存入和手续费所需的代币和 RAND。它统计写入所创建的单元数,在真实上下文字上对程序试运行,证明绑定到该交易的调用,然后证明捆绑包(手续费,加上经 burn_r 销毁的 deposit.rand 以及经 burn_a 销毁的 deposit.asset 的 deposit.amount)和授权证明。默认手续费为所声明 gas 的调用底价加上每个新建单元的单元费,并与 call 一样留出两个价格档位的余量。打印每笔支付,除非带 --no-wait,还打印回执的八个 outputs。纳入时的过期读取同样以 3 退出,因此调用方工具会重新读取并重试。不发布输入转录。转换文件的每个字段均为可选:{"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]};键和值为 64 位十六进制的 Word8,数额为以资产自身单位表示的十进制字符串,to 默认为此钱包
program state <ID>--cell <64 hex>v0.6.8:按键顺序列出程序的每个单元(rand_getProgramCells,分页至末尾),或用 --cell 给出单个单元,不存在时为 64 个零。在没有 program_state 部分的链上被拒绝
program vault <ID>v0.6.8:程序的金库(rand_getProgramVault),每个所持资产一行,数额以单位表示。在没有该部分的链上被拒绝
multisig create--signer <pubkey hex>(重复,按顺序), --threshold N, --salt <64 hex>, --fund <RAND>, --fund-token <asset> <amount>, --fee <RAND>, --no-wait, --cudav0.8.0,多签账户(具有 multisig 部分的链,如链 21):创建由 rand-node keygen 密钥组成的 M-of-N 账户;发送前打印派生的 id。此钱包的一个捆绑包经 burn_r(代币则为 burn_a)销毁 1 RAND 的 create_fee 和任何首次存入;最多 10 个签名者
multisig deposit <ID> <AMOUNT>--asset <index|id>, --fee, --no-wait, --cudav0.8.0:用此钱包销毁的数额为现有账户入账;任何人都可存入,无需签名。支付和轮换由签名者通过 rand-node multisig pay|rotate 完成
perp keygen / deposit / order / cancel / withdraw / oracle / prove / state / account / inputs / genesis-root / image-hc账户命令使用 --trading-key <FILE>;deposit --amount <A>(抵押品:链 21 上为 zUSD,以显示单位表示),order --market <ID> --side buy|sell --size <lots> --price <ticks> [--kind limit|market] [--tif gtc|ioc|post] [--reduce-only],cancel --target <NONCE>,withdraw --amount <UNITS>,oracle --node-key <FILE> --price <MARKET>=<UNITS>[,…] [--every <SECS>],prove --image <FILE> --job <FILE> --tier <N>;--nonce <N>(默认:账户 nonce_high 加一), --no-waitv0.8.0,RPL-3 永续期货(具有 perps 部分的链,如链 21:一个市场 BTC-PERP,一手 100,000,最小报价单位 100,000,000 = 一美元)。交易密钥是 rand-node keygen 格式的 Dilithium2 密钥文件,它所拥有的账户即其地址的八个字。存入是唯一通过捆绑包进行的操作(此钱包的 --key 销毁抵押品并支付 RAND 手续费);订单、撤单、提款请求以及验证者的预言机价格均为签名的、无捆绑包且免手续费。withdraw 携带链在状态证明结算后支付给此钱包的票据。prove 在 perp-prover 任务上运行固定版本的引擎并提交 PerpStateProof(未签名,因此任何人都可以证明;每个证明约 22 GB)。state、account 和 inputs 分别原样对应 rand_getPerps、rand_getPerpAccount 和 rand_getPerpInputs
call <PROGRAM-ID>--input N(可重复), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda先在模拟器中运行该调用并打印 gas: <exact> (declaring <limit>, tier <t>):精确 gas 是见证数据,绝不离开钱包,所声明的上限是证明的公开 GAS_LIMIT。在具有 gas 部分的链上,默认上限为精确 gas 向上取整到 2^(t−2) 的倍数;max 声明区块头的上界 gas_max,它泄露的信息不超过层级本身所泄露的;N 若低于精确 gas 或高于上界则被拒绝。没有该部分,或使用 --cuda 时,默认为 max。然后在本地针对程序的公开输入证明该调用,封存其输入转录,通过捆绑包支付,并打印回执。默认手续费是所声明上限的底价,即按 rand_getLimits 所提供的价格计算的 BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB,在价格会变动之处再加两个价格档位的余量,打印为 fee … RAND (incl. two price steps of headroom)。在 hardening_v6 链上,手续费在证明存在之前就已确定,因此默认以链的证明上限代替证明本身来定价,这只可能多付;--fee 支付确切的数额。--expect-public 在证明之前拒绝,除非程序的公开输入正是该文件中的字
open-call <TXHASH>--call-key <hex>, --as-auditor打开某次调用的转录,与 H_IN 核对,重新运行程序;不匹配时以非零退出
receipt <TX>已提交调用的回执
bridge-mint <ATTESTATION>十六进制或 @path, --pq <JSON or @path>(必需), --to <rand1…>(默认:此钱包), --fee(默认:该操作的底价), --no-wait, --cuda将守护者签名的证明作为票据存入。--pq 是守护者的 Dilithium2 联署法定人数,[{"index":0,"signature":"<4840 hex>"},…]。在任何证明之前:解码证明,对照节点的 pq_guardians 和链 id 检查法定人数,检查接收方和资产 id,读取所列索引(rand_getAssets)。存入票据的盲化因子由证明的摘要派生,r = blake3("rand-deposit-r-1" || mu),这是链所接受的唯一的 r。手续费捆绑包针对整笔交易(包括法定人数)进行证明。打印票据的 owner、time 和 r
bridge-rotate <ROTATION>十六进制或 @path, --pq <JSON or @path>(必需), --fee(默认:该操作的底价), --no-wait, --cuda以当前 PQ 集合的联署法定人数提交守护者集合轮换,作为不存入任何内容的 BridgeAttest。在证明之前,拒绝任何不是将 Rand 的集合前进一步的轮换。之后打印 guardian_set_index
bridge-pause--sig <HEX or @path>(必需), --no-wait暂停桥的铸造:一个无捆绑包、免手续费的 PauseMints,因此既不需要密钥文件,也不需要 RAND。该文件是 rand-bridge-gov pause 的输出,即暂停密钥的 2,420 字节签名(十六进制),针对桥当前的 pause_nonce 生成;发送之前对照节点的 pause_key 和链 id 检查。暂停期间,销毁和轮换仍保持开放
bridge-unpause--pq <JSON or @path>(必需), --no-wait用 PQ 守护者法定人数解除暂停(rand-bridge-gov pq-unpause 的文件),针对当前的 pause_nonce 生成。无捆绑包且免手续费;仅有暂停密钥永远无法解除暂停
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO>--relayer-fee N, --fee(默认 0.01), --no-wait, --cuda, --yes向外销毁桥接资产:检查 TO_CHAIN 上的币 TOKEN 是否为 ASSET 提供支持且至少锁定了 AMOUNT,以及 AMOUNT 和中继者费用是否为整数个释放单位;然后证明一个捆绑包,它在槽 0–1 中花费该资产,恰好销毁其 AMOUNT(burn_a、burn_asset),并从槽 2–3 支付 RAND 手续费。--relayer-fee 是 AMOUNT 的一部分,而非额外收费。在具有桥费用(rand_getBridgeState.fees)的链上,如链 20 和链 21,钱包(自 v0.6.8 起)先打印链所保留的费用(以该资产计)和将被释放的数额,并请求确认;--yes 跳过该询问,stdin 不是终端时不带 --yes 会被拒绝。锁定量和中继者费用检查随后针对释放的数额进行
token create--name, --symbol, --decimals <0..=9>, --salt <hex32>(未给出则随机), 然后是 --fixed-supply <N> --to <rand1…>、--authority-key-out <FILE> [--initial <N> --to <rand1…>],或(v0.6.8)--program <PROGRAM-ID>,即铸造权限属于该程序的代币,只有该程序的调用才能铸造或销毁,从零供应量开始,并需要链的 program_state 部分, --fee(默认:捆绑包基础费加注册表的 registration_fee;当节点报告的注册费高于 10 RAND 时被拒绝,因此若有意支付更高的费用,请传入 --fee), --no-wait, --cuda在注册表的下一个索引处注册代币:固定供应量(铸造一次,权限为 none)或由 Key 授权(一个新的 Dilithium2 密钥文件,以 0600 写入,拒绝覆盖)。在链接受注册之前,权限密钥位于 <FILE>.pending。如果另一个注册先占用了该索引,则打印 another token took index N first — re-run to register at N+1;成功时打印索引和 id,包括十六进制和 rpl1…
token mint--asset, --to <rand1…>, --amount <N>(代币的显示单位), --authority-key <FILE>, --fee(默认 0.001), --no-wait, --cuda铸造更多由 Key 授权的代币;如果代币不是由 Key 授权,或密钥不是其权限密钥,则在任何证明之前被拒绝
token set-authority--asset, --authority-key <FILE>, 然后是 --new-key <FILE> 或 --renounce, --fee(默认 0.001), --no-wait, --cuda将由 Key 授权的代币移交给另一个密钥,或永久放弃铸造权
token burn <ASSET> <AMOUNT>--fee(默认 0.001), --no-wait, --cuda销毁此钱包所持有的 RPL 代币的 AMOUNT(以代币的显示单位表示);其公开供应量恰好减少该数额。桥接代币在证明之前被拒绝:它通过 bridge-burn 离开
token info <INDEX|rpl1…|hex>某个代币完整的 rand_getTokens 行:名称、符号、decimals、权限、mint_nonce、总供应量、registered_at、id(十六进制和 id_text),以及(若为桥接代币)每个支持项(locked、mint_cap_per_day、minted_today、mint_day)
token list--from <index>(默认 0), --limit <N>(默认 1000)rand_getTokens 的一页:enabled、registration_fee、next_index、tokens
token register-bridged--name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals(第一个支持项的源 decimals), --pq <JSON or @path>(必需), --fee(默认:捆绑包基础费加节点的 registration_fee,与 token create 有相同的 10 RAND 拒绝限制), --no-wait, --cuda在创世之后连同其第一个支持项注册桥接代币,由针对节点 list_nonce 生成的 PQ 守护者法定人数(rand-bridge-gov pq-register 的文件)授权。先在 Rand 上列出,再在端点上 setToken
token list-backing--asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path>(必需), --fee(默认:捆绑包基础费), --no-wait, --cuda为桥接代币添加一个支持项,由针对节点 list_nonce 的 PQ 守护者法定人数(rand-bridge-gov pq-list 的文件)授权
bridge桥的公开状态:守护者、发射者、资产注册表、销毁序号
bridge-message <SEQUENCE>一条出站销毁消息,原样给出
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)来自节点费用表的最低费用。在具有 gas 部分的链上,fee call <tier> --gas N 按链头的价格、不留余量地为 rand call 所打印的声明上限定价:即底价本身。不带 --gas 时,它为上界 gas_max(tier, K, S) 定价,即此类调用可能的最高成本。--bytes 是调用的证明加输入信封的字节数
tx <HASH>已提交的交易及其高度和索引
tx-key <HASH>该交易中此钱包所发送、接收或作为找零保留的每个输出一行:output(bundle:0 … bundle:3,即那一个捆绑包的四个槽,或 mint:0)、角色、数额(以 RAND 表示,代币则为 N (asset I))、其携带的备注(无则为 -)以及封存它所用的每笔交易密钥。将 sent 行的密钥交给收款人或审计方,rand_checkTransaction <HASH> <KEY> 即可披露该输出,包括备注。虚设槽对任何人都无法打开,也没有行
block <ID>按高度或哈希查询区块
head{ height, hash, view }
statusrand_status
peers已连接的对等节点
validators验证者注册表

--cuda 需要使用 --features cuda 构建,且没有回退路径;目前尚未构建 PTX。它无法封装调用输入信封(envelope):rand call --cuda 需要 --no-envelope。它只声明 gas 上限,并拒绝 --gas-limit N。

CLI 打印的每个备注(memo)和联系人名称(send 的确认信息、notes、history、tx-key)都会先经过同一条显示规则:控制字符、Unicode 格式字符(双向控制符、零宽字符、软连字符)以及 U+2028/U+2029 显示为 U+FFFD,连续的空格分隔符显示为一个空格。

multisig-private:外观与任何钱包无异的 T-of-N 账户

v0.8.0,位于 rand_status 中列有 hc_auth_multisig 的链上,如 chain 21。私有多签账户是由 Dilithium2 签名者密钥组成的 T-of-N 策略,其地址和支出与任何钱包无异:账户有查看密钥而没有支出密钥;一次支出是一份提案,由 T 位签名者离线检查并签名,签名隐藏在授权证明之内,因此链上只能得知该交易包已获授权。策略文件保存账户的秘密 msk(它对每个 note 的查看权限),提案则保存见证数据(witness):二者均以 0600 权限写入,绝不覆盖已有文件,也绝不打印。签名者需要策略文件(通过带外方式交给他们)以及各自用 rand-node keygen 生成的密钥。

commandflagsdoes
multisig-private new-policy--signer <pubkey hex>(可重复,按顺序:顺序是地址的一部分)、--threshold <T>、--out(policy.json)、--public-account <ID>(可重复)使用全新的 msk 生成策略;打印地址及其指纹。凡证明者永远无法支出的情形均被拒绝:T 大于 3、签名者超过 16 个、密钥重复。每个 --public-account 都会从节点读取,并对同时也为其签名的每位签名者打印一条警告,因为任何同时知道两份策略的人都可以将两者关联起来
multisig-private address--policy地址、其指纹(每位签名者通过带外方式比对)、所有者指纹和策略哈希
multisig-private balance--policy、--store扫描链上属于该账户的 note;打印余额
multisig-private prepare--policy、--to <rand1…> --amount <RAND> 或 --sweep-to <rand1…>、--memo、--fee <RAND>、--out(proposal.json)写出每位签名者都要检查的提案:一笔付款,或将账户的全部 RAND note(至多两个)扣除费用后转入新地址,策略的轮换即通过此方式完成。打印摘要以及必须在其之前完成证明的区块高度
multisig-private check / sign--proposal、--policy、--key(sign)、--expect-to <rand1…[:AMOUNT]>(可重复)签名者离线进行的检查;sign 打印 <index>:<hex>。指明收款方:使用 --expect-to 时,每个转移价值且不属于账户找零的输出都必须支付给所列地址之一(且每个地址都必须收到付款;ADDR:AMOUNT 固定总额),否则不予签名
multisig-private prove--proposal、--policy、--signature <index:hex>(可重复,至少 T 个)、--out(proposal.tx)、--cuda验证各份签名并生成证明。授权证明在本机以 tier 18 生成——耗时数分钟,在 Test 配置下实测峰值内存约 76 GB,因此需要 96 GB 或更多内存的机器;交易包证明在本机或配对的证明者(--prover)上生成。在距过期不足 16 个区块时被拒绝
multisig-private submit--tx、--no-wait发送已生成证明的交易并等待提交

提案在准备后经过 proof_window_blocks 个区块过期(chain 21 上为 1,024 个区块):必须在此之前收齐签名并完成交易证明,否则需重新 prepare。目前尚无 chain-21 交易包含私有多签支出。

A first shielded transfer

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

Sharing an address, and a 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

备注与 note 位于同一个密封体内,因此能打开其一者即能打开另一者:收款方通过 notes,以及持有该输出每笔交易密钥的任何人通过 rand_checkTransaction <hash> <key>。Chain 18 是首条在创世中设置 envelope_bytes 的链;在 chain 14 至 17 上,--memo 会在任何证明生成之前被拒绝。

A confidential call you can open again later

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)

A stateful program: the RPL-2 counter

在具有 program_state 部分的链上,如 chain 20 和 21。该计数器恰好接受那些读取一个单元并将其写回、且其第一个字加一的状态转换;转换中的其余一切(交易包存入的内容、金库支付的内容、程序铸造的内容)均不加检查地随行,因此它只是一个演示,而不是可以托付价值的程序。

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)

文件中的 … 代表完整的 64 个十六进制字符,钱包要求如此。

What a deploy and a call print

在拆分授权的链上,每个交易包都是在本机生成的两份证明:tier-10 的支出授权和 tier-14 的交易包。2026-09-30 在 chain 18 上使用 rand v0.6.7 执行 program deploy:

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)

call 会在调用证明之前打印其 gas 和费用,然后以同样方式为支付交易包生成证明:

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 [...]

这里 6,144 是 5,636 向上取整到 2^10 的倍数,而 rand fee call 12 --gas 6144 --bytes <B> 按链尖的价格为该上限定价,不留余量。

rand-prover

作为独立二进制文件的委托证明者:它在另一台机器上生成钱包的 tier-14 交易包证明。rand-node run --prover 在节点内部托管同一服务。每个子命令都接受 --home <DIR>(环境变量 RAND_PROVER_HOME,默认 ~/.rand-prover),即存放 prover.key.json 和 pairings.json 的目录。

commandargumentsbehaviour
keygen写入 prover.key.json,权限 0600,并打印该密钥的指纹;拒绝覆盖
pair--name <LABEL>(必填)、--url <URL>(默认 http://127.0.0.1:8600)、--own、--qr生成令牌,仅以标签存储其哈希,并打印 rand prover pair 所接受的 randprover: 配对链接。令牌只显示一次,位于链接之内。--url 是钱包访问此证明者的地址;--own 添加 own=1;--qr 还会将链接以终端二维码形式打印
unpair--name <LABEL>移除一个配对;运行中的证明者在启动时读取该文件,因此需重启后生效
pairings每个配对一行:标签、own 或 -、创建日期
run--listen <ADDR>(默认 127.0.0.1:8600)、--max-parallel <N>(1)、--max-queue <N>(8)、--per-token <N>(2)、--cuda、--skip-memory-check、--allow-origin <ORIGIN>(可重复)、--fee <RAND> 搭配 --fee-address <rand1…>、--accept-spend-key提供 prover_* JSON-RPC 服务,直至 Ctrl-C 或 SIGTERM。除非有 5.74 GB × --max-parallel + 1 GiB 的可用内存,否则拒绝启动。--per-token 是单个配对同一时刻可排队或正在证明的任务数。--accept-spend-key 在 v0.6.8 中已停用:run 带此参数会拒绝启动,证明者只接受查看密钥见证数据。在 v0.6.7 上它允许支出密钥见证数据,只有处于交易包 guest v1 或 v2 的链才会发送此类数据

在 chain 21 上,与 chain 20 一样,证明者会收到钱包的查看密钥 nk 和一个新的盐值。它无法支出,但可以读取该钱包收到或发出的一切:请与你愿意向其展示历史记录的证明者配对。钱包会检查它收到的每一份证明。

Key file formats

Node key:

{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }

Wallet key, version 2:

{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }

rand keygen 以 0600 权限写入它,自 v0.6.8 起,每个 rand 命令都会拒绝组或其他用户可读的钱包密钥文件:手工复制或恢复的密钥必须重新设置为 0600(chmod 600 <key>)。丢失钱包密钥即丢失它能打开的每一个 note;此版本中没有助记词。

What chain 21 and v0.8.0 add

Chain 21 于 2026-10-12 在 fullnode v0.8.0(c0878c3f)上上线。相对于本页为 chain 20 给出的 v0.6.8 命令集:

  • rand-node: multisig id|status|pay|rotate 和 price status|sign|submit;run --verify-chain replay、--apply-proposals-inline 和 --msauth-vk;verify --mode;aggregate --watch-max-failures;genesis --fees、--perps、--multisig、--auth-multisig-guest 和 --aggregation-tree(最后一项迄今在每条链上都被拒绝)。每个 chain-21 节点都需要将 msauth-vk-production.bin 放在 rand-node 旁边。
  • rand: multisig create|deposit、perp …、multisig-private …、--threads 和 --cpu(v0.7.1),以及对信封头分页的扫描(rand_getScanLeaves),在较旧节点上回退为完整分页。v0.8.0 钱包只能在 chain 21 上发送;早于 v0.8.0 的钱包无法在任何仍在运行的链上发送。
  • rand-prover: 同一个 --threads/--cpu 模块(默认为核心数 − 1,上限为 8)、证明超时(v0.7.0,审计 v7),以及限于回环地址并带有系统调用过滤器的池单元。

fullnode 在 c0878c3f 处自己的 docs/cli.md 即是本页所对照阅读的依据。

最近一次核对所依据的 fullnode 提交为 c0878c3f(链 21),日期为 2026-10-12。 若代码与本页不一致,以代码为准;请告知我们。