Из cargo build --release получаются три бинарных файла: rand-node (узел и команды оператора), rand (экранированный кошелёк) и rand-prover (делегированный prover). Каждая команда принимает -h/--help. Эта страница описывает релиз v0.6.8 (c9c9bd3c), сборку, на которой работает chain 20; где v0.6.7 вёл себя иначе, это указано. Кошелёк rand старше v0.6.8 не может отправлять транзакции в chain 20: её genesis привязывает к своему хешу каждое доказательство и каждое подписанное сообщение. Первые два хранят ключи разного рода: ключ узла — это пара ключей 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)
aggregator register | unbond | withdraw — the aggregator role (aggregation chains only)
aggregate The aggregate daemon (aggregation chains only)
safety, admit и bridge-gov появились в v0.6.8. Команд balance и transfer нет: для перевода нужен экранированный ключ траты, а он есть только у кошелька.
Один глобальный флаг, --allow-test-fri-profile (или RAND_ALLOW_TEST_FRI_PROFILE=1), позволяет init, run и verify принять genesis с fri_profile, равным test. Этот профиль даёт около 17 бит стойкости, а назвать его может любой, кто пишет файл genesis, поэтому начиная с v0.6.8 узел отказывается принимать такой genesis без флага. Наборы тестов его задают; больше ничто не должно.
keygen, address
| команда | аргумент | по умолчанию |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | обязателен |
keygen записывает { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> } с правами 0600. Файл — единственная копия seed. Начиная с 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 байт в hex) и peer_id.
genesis
| аргумент | по умолчанию | значение |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | идентификатор цепочки; транзакции и топики gossip привязаны к нему |
--validator <KEY,STAKE,PAYOUT> | обязателен, повторяемый | одна запись реестра: путь к файлу ключа или публичный ключ в hex, ставка в RAND (не менее 1 000), адрес выплат rand1… |
--epoch-blocks <N> | 1000 | число блоков в эпохе |
--alloc <ALLOCS> | нет, повторяемый | нота-депозит: rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | путь вывода |
--faucet | выкл. | только testnet: включает Mint. Рядом с секцией bridge требует --testnet |
--testnet | выкл. | v0.6.8: записывает "testnet": true, маркер, позволяющий faucet соседствовать с секцией bridge. Если указан, входит в хеш genesis |
--no-confidential | выкл. | отключает Deploy и Call |
--fri-profile <production|test> | production | test небезопасен и предназначен для набора тестов; init, run и verify отказываются принимать такой файл без --allow-test-fri-profile |
--max-program-words <N> | нет (4096) | наибольшая программа, которую может нести deploy, 1..=65535. Записывается только при указании; входит в хеш genesis всякий раз, когда присутствует, поэтому --max-program-words 4096 — это другая цепочка, чем без флага. Каждому узлу нужен бинарный файл v0.4 до init на таком файле |
--max-proof-bytes <N> | нет (2 097 152) | наибольшее доказательство, которое может нести транзакция, 1048576..=33554432. Все остальные пределы на доказательства следуют за ним |
--max-block-bytes <N> | нет (4 194 304) | наибольший блок, а значит и наибольшая транзакция, 4194304..=67108864, и не менее 2 × max_proof_bytes + 1 MiB, либо 3 × max_proof_bytes + 1 MiB с --auth-guest, где вызов несёт три доказательства (bundle, auth, call) |
--max-call-envelope-bytes <N> | нет (18 432) | наибольший входной конверт вызова, 18432..=1048576 |
--max-program-public-words <N> | нет (0) | наибольший публичный вход, который может зафиксировать deploy, 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, mint из faucet, withdraw, депозита через bridge, alloc в genesis. Принимается только 1860 — размер, позволяющий каждому конверту нести зашифрованное memo. Если указан, входит в хеш genesis и задаётся до того, как будут запечатаны ноты --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 и proposal к этому genesis |
--bundle-guest <v1|v2|v3> | v1 | guest bundle, закрепляемый как hc_bundle: v1 (guest со скрытыми активами, на котором работали chain 14 и 15), v2 (guest без ветвлений из chain 16) или v3 (раздельная авторизация: guest принимает nk и salt вместо ключа траты). v3 требует --auth-guest |
--auth-guest | выкл. | закрепляет auth guest этой сборки как hc_auth: тогда каждый bundle несёт auth-доказательство над ключом траты, привязанное к его транзакции, выход которого равен auth_commit bundle. Обязателен с --bundle-guest v3 и отклоняется с v1 или v2 до записи любого файла. Если флаг отсутствует, в файле нет поля hc_auth |
--hardening-v6 | выкл. | превращает правила v0.6 в правила валидности (hardening_v6): окно pc, невызываемые deploy, канонические формы доказательств и слова proof-of-work, привязку вызова и нижнюю границу таблицы программ. Если флаг отсутствует, узел всё равно отклоняет их в своём пуле, как политику |
--gas-price <UNITS> | нет (секции gas нет) | единицы (10⁻⁹ RAND) за gas, которые сама цепочка списывает за вызов. Именно этот флаг записывает секцию gas (metering: "circuit"); три флага ниже без него отклоняются. Входит в хеш genesis |
--byte-price <UNITS> | 800, только с --gas-price | единиц за KiB или его часть доказательства вызова и входного конверта, начиная с байта 0 |
--bundle-gas-limit <N> | 20479, только с --gas-price | точное значение GAS_LIMIT, которое должно объявлять каждое доказательство bundle; доказательство bundle с любым другим значением отклоняется. Genesis принимает только 20479, gas_max(14, 0, 0) для guest bundle уровня 14 |
--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 привязывает хеш genesis к каждой привязке транзакции и каждому подписанному сообщению действия (mint из faucet, unbond, withdraw, сообщения токенов RPL, действия aggregator, сообщения управления bridge), так что доказательство или подпись для этой цепочки не проходят проверку ни в какой другой. Если флаг опущен, команда выдаёт предупреждение: кошелёк v0.6.8 строит доказательство в форме, привязанной к genesis, для каждого идентификатора цепочки вне диапазона от 14 до 19, поэтому каждая цепочка начиная с 20 создаётся с 1 |
--proof-window-blocks <N> | нет (256) | v0.6.8: одно окно, от 256 до 4 096 блоков, определяющее, насколько старыми могут быть anchor bundle и его time. Отдаётся как rand_getLimits.proof_window_blocks |
--program-state-cell-fee <UNITS> | нет (секции program_state нет) | v0.6.8, RPL-2: включает ячейки программ, хранилища программ и действие Invoke с этой платой за ячейку в единицах RAND (не более 1 000 RAND), добавляемой к нижней границе комиссии invoke за каждую создаваемую им ячейку. Требует --tokens, --gas-price, --hardening-v6 и --auth-guest, каждый из которых отклоняется по имени до записи любого файла |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>, --admitted-shape <…> | нет | секция aggregation; сборка v0.6.8 отказывается запускаться на genesis, в котором она есть |
Выводит по одной строке alloc на каждый --alloc, затем хеш genesis, числа валидаторов и нот, длину эпохи, пять пределов, hc_bundle и hc_auth (none без --auth-guest), затем строку gas: gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying, или gas: none без --gas-price, а с --program-state-cell-fee — ещё строку program_state: cell fee N RAND. init выводит ту же строку gas. Пять флагов пределов ведут себя одинаково: если опущены, в файле нет такого поля, и цепочка работает со значением по умолчанию; если указаны, поле входит в хеш genesis даже при значении по умолчанию. Chain 20 была создана с этими флагами (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
Цепочки 18 и 19 созданы с теми же флагами вплоть до --envelope-bytes 1860 и без флагов v0.6.8. Предел размера доказательства составляет 4 MiB вместо 8 MiB у цепочек 13–16: транзакция с раздельной авторизацией несёт до трёх доказательств, а 3 × 4 MiB + 1 MiB укладывается в блок размером 20 MiB. В tokens.json записаны registration_fee в 1 RAND, mint_cap_per_day со значением 10000000000000, max_tokens 4096, burn_registration_fee и bound_note_value, а также zUSD с семью обеспечениями. Флага --bridge нет, и скрипт создания по-прежнему добавляет в файл секции bridge, staking и consensus_domain уже после генерации (в цепочке 20: bridge с набором хранителей 1 и восемью PQ-ключами хранителей, ключ паузы, rules_v2, rotation и fees; секция staking с белым списком крана, admission_by_vote и бюджетом входа 2 500 bps; consensus_domain: 1; и генезисные ноты zUSD, созданные командой alloc-note --asset 1 --envelope-bytes 1860). Значение имеет тот хеш генезиса, который init печатает для готового файла.
Каждый --alloc создаёт одну депозитную ноту со свежей случайностью обязательства, поэтому двукратное создание даёт два разных хеша. Команда всегда записывает раскрытие ноты рядом с 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, запечатанную для --to так же, как её запечатывает genesis --alloc. Генезис, задающий envelope_bytes, отвергает ноту, запечатанную без соответствующего --envelope-bytes. --amount указывается в целых единицах актива: девять знаков после запятой для RAND, восемь для токена из моста (10 для актива 1 — это 10 zUSD). Нота токена из списка требует, чтобы в обеспечениях этого токена суммы locked в точности равнялись сумме его нот.
init
| аргумент | значение |
|---|---|
--datadir <DATADIR> | каталог данных, который будет создан |
--genesis <GENESIS> | файл генезиса; копируется в <datadir>/genesis.json |
Печатает хеш генезиса и ту же строку gas:, что и genesis.
run
| аргумент | по умолчанию | значение |
|---|---|---|
--datadir <DATADIR> | обязателен | инициализированный каталог данных |
--key <KEY> | обязателен | файл ключа: идентичность валидатора, p2p-идентичность, получатель комиссий |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | multiaddr для прослушивания libp2p, можно повторять |
--bootstrap <BOOTSTRAP> | нет, можно повторять | /ip4/<ip>/tcp/<port>/p2p/<peer-id>, подключение при запуске и каждые 30 s, пока соединения нет. Начиная с v0.6.8 его идентификатор пира резервируется |
--reserved-peer <PEER_ID> | нет, можно повторять | v0.6.8: пир, допускаемый сверх лимита входящих соединений и обслуживаемый из доли бюджета синхронизации, отведённой валидаторам. Bootstrap-узлы и каждый валидатор, чью подписанную привязку пира этот узел уже видел, резервируются и без этого флага; на только что созданной цепочке, чьё хранилище ещё не содержит привязок, перечислите здесь валидаторов флота |
--strict-gossip | выкл. | v0.6.8: строгая проверка gossipsub, принимающая только сообщения с корректной подписью автора, порядковым номером и источником. Строгие и нестрогие узлы совместимы, поэтому включение можно выкатывать узел за узлом |
--rpc <RPC> | 127.0.0.1:8545 | JSON-RPC-слушатель оператора: все методы, и он доверяет loopback. Держите его на loopback и никогда не пробрасывайте к нему публичную конечную точку |
--public-rpc <ADDR> | выкл. | v0.6.8: второй, публичный слушатель с фиксированным набором методов (без методов с ключом просмотра, rand_mint и rand_getPeers), без пакетных запросов, без WebSocket и с одним счётчиком нагрузки на всех вызывающих; именно на него должны указывать обратный прокси или SSH-проброс (JSON-RPC) |
--rpc-viewing-token-file <PATH> | выкл. | v0.6.8: требовать Authorization: Bearer <первая строка файла> (32 символа или больше) для методов с ключом просмотра на --rpc |
--validator | выкл. | участвовать в консенсусе с этим ключом |
--no-mdns | выкл. | отключить обнаружение в локальной сети |
--block-interval-ms <MS> | 1000 | минимальный интервал между предложениями |
--view-timeout-ms <MS> | 3000 | базовый тайм-аут вью; удваивается при каждом следующем тайм-ауте подряд, до 8× |
--verify-chain <MODE> | quick | off, quick, full |
--keep-raw-proofs | выкл. | архивный режим на цепочке с агрегацией |
--prune-history <WINDOW> | нет (хранить всё) | хранить историю блоков только за этот срок, <n>m, <n>h или <n>d, не меньше 1h: у более старых блоков удаляются сам блок, QC, транзакции и квитанции; состояние реестра остаётся. В цепочке 20 24 из 26 валидаторов работают с 24h, а два узла являются архивными; архивный узел и узел mainnet-beta никогда его не задают. Запросы по высоте ниже границы отвечают -32010 (JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | отказ запускаться, если на файловой системе каталога данных свободно меньше; rand_getHealth сообщает disk_low, когда свободно меньше чем в четыре раза больше этого значения. 0 отключает проверку |
--rpc-viewing-open | выкл. | разрешить вызывающим не с loopback использовать методы с ключом просмотра; только за прослойкой, выполняющей аутентификацию |
--gas-price <UNITS> | 100 | единиц (10⁻⁹ RAND) за газ, которые пул этого узла требует с вызова, сверх gas_max из заголовка его доказательства. Политика допуска, а не правило цепочки: блок с более дешёвым вызовом остаётся валидным. 0 вместе с --byte-price 0 отключает политику. В цепочке, чей генезис содержит секцию gas, как у цепочки 20, правилом валидности служат собственные цены цепочки |
--byte-price <UNITS> | 800 | единиц за KiB или его часть для доказательства вызова и входного конверта, начиная с байта 0, по той же политике |
--prover <ADDR> | выкл. | разместить на этом адресе делегированный prover (prover_* JSON-RPC): отдельный слушатель, который должен отличаться от --rpc. Узел отказывается запускаться без <prover-home>/prover.key.json, созданного командой rand-prover keygen |
--prover-home <DIR> | <datadir>/prover | prover.key.json и pairings.json prover’а |
--prover-accept-spend-key | снят | с v0.6.8 отвергается при запуске: run с этим флагом завершается до чтения ключа узла, называя флаг. Ни один prover больше не принимает свидетельство с ключом трат; уберите флаг из файла unit. В v0.6.7 он принимал свидетельства с ключом трат для цепочек с bundle guest v1 или v2 |
--prover-max-parallel <N> | 1 | число доказательств, которые размещённый prover выполняет одновременно; запуск отклоняется, если не доступно 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…> | нет | комиссия, которую обязана заплатить каждая задача, отправленная размещённому prover’у, в RAND с точностью до девяти знаков после запятой: один выход в RAND на этот адрес внутри доказываемого пакета. Каждый флаг требует второго |
--prover-allow-origin <ORIGIN> | расширения браузера и страницы с loopback | источник (origin) браузера, чьи страницы могут читать ответы prover’а, можно повторять; если задан один раз или больше, значения составляют весь список. * разрешает все сайты и печатает предупреждение |
Окружение: 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 печатает зафиксированную голову, вью и последний вью, в котором был подан голос, high QC, заблокирован ли валидатор выше своей головы, и любую записанную остановку по безопасности. Узел, увидевший, что certified three-chain пытается зафиксировать блок, не являющийся потомком его собственной зафиксированной головы, останавливается и записывает это (audit v6, CON-5); после этого run завершается с этой записью, пока не будет выполнена clear-halt. Прежде чем очищать, сравните голову этого узла с головами двух других валидаторов и, если она отличается, выполните повторную синхронизацию с архивного узла. Начиная с v0.6.8 (CON-4) никакой кворум ответов «не удерживается» больше не снимает блокировку: валидатор, заблокированный на блоке, который не может получить, молчит, пока не придёт предложение, чей justify старше блокировки, или пока блок не будет получен. release-lock понижает сохранённую блокировку до сертификата зафиксированной головы; применяйте её на одном валидаторе за раз и только тогда, когда блок утрачен безвозвратно. Без флага подтверждения каждая записывающая команда печатает, что она сделала бы, и ничего не меняет.
verify
| аргумент | по умолчанию | значение |
|---|---|---|
--datadir <DATADIR> | обязателен | узел не должен быть запущен |
--mode <MODE> | full | quick или full |
--repair | выкл. | обрезать повреждённый хвост; состояние безопасности сохраняется |
Код выхода 0, если данные согласованы, и 2, если проблема найдена без --repair.
db
db drop-receipts-index --datadir <DATADIR> при остановленном узле: удаляет индекс receipts_by_program перед откатом к сборке до v0.3, которая не может открыть базу данных с этим индексом. Последующий запуск перестраивает индекс по квитанциям.
status
--rpc <URL> (по умолчанию http://127.0.0.1:8545). Печатает rand_status дословно.
register, unbond, withdraw
| команда | аргументы | назначение |
|---|---|---|
register | --key, --payout <rand1…>, --rpc, --v2 | вывести hex-строку Registration, подписанную ключом этого узла; из RPC читается идентификатор цепочки, а с --v2 ещё и хеш генезиса. --v2 обязателен в цепочке, чей генезис задаёт staking.registration_v2, как у цепочки 20; регистрация v1 там отклоняется, а v2 принимается везде |
unbond <amount RAND> | --key, --rpc, --no-wait | перевести стейк в состояние вывода из залога; бесплатно; доступен к выводу через две эпохи |
withdraw <amount RAND> | --key, --rpc, --no-wait | выплатить освобождённый стейк и вознаграждения нотой на адрес выплат за вычетом базовой комиссии 0.001 RAND |
admit sign|submit
Допуск голосованием (v0.6.8). В цепочке, чей генезис задаёт staking.admission_by_vote, как у цепочки 20, ключ нового валидатора регистрируется только после того, как его подписали валидаторы, держащие строго больше двух третей весов голосования.
| команда | аргументы | назначение |
|---|---|---|
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, и он же входит в hex, выведенный register. После фиксации допуска залог вносится как прежде (rand bond … --registration) и расходует допуск. rand_getAdmitted перечисляет допущенных и ожидающих.
bridge-gov
Постквантовые ротации моста (v0.6.8) для хранителей и держателя ключа паузы. Каждый шаг читает из --rpc (по умолчанию http://127.0.0.1:8545) идентификатор цепочки, её домен привязки и rand_getBridgeState.rotation_nonce.
| команда | действие |
|---|---|
rotate-pq message --new-key K… | вывести hex-сообщение ротации для текущего 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 |
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 — это hex-открытый ключ Dilithium2, @file с таким ключом или @key-file (его открытый ключ). Строки подписей имеют вид index:hex, разделяются пробелами или переводами строк, комментарии # допускаются.
vesting status|claim|revoke|bond|unbond
Сторона держателя и сторона отзывающего для генезисного распределения с временной блокировкой, в цепочке, чей генезис содержит раздел vesting. У цепочки 20 его нет. Ключ — файл rand-node keygen.
| команда | аргументы | назначение |
|---|---|---|
vesting status <ENTRY> | --rpc | запись в том виде, как её отдаёт rand_getVesting: её условия, сколько уже разблокировано, сколько можно забрать сейчас |
vesting claim | --entry <id>, --to <rand1…>, --amount <RAND> или --all, --key, --rpc, --no-wait | выплатить разблокированное нотой на --to за вычетом базовой комиссии 0.001 RAND; подписывается ключом бенефициара |
vesting revoke prepare | --entry, --margin-secs (по умолчанию 600), --out (по умолчанию revoke.json), --rpc | v0.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 | отправить отзыв, имеющий не меньше threshold подписей записи, в пределах 256 блоков от prepare. Однокличевого vesting revoke --to из v0.6.7 больше нет |
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 обратно в блокировку; снова доступны к получению после эпох вывода из залога |
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, доказывает один агрегат и отправляет его. В цепочке 20, чей генезис не содержит раздела aggregation, не действует.
rand (кошелёк)
Глобальные параметры, до подкоманды или после неё:
| параметр | переменная окружения | по умолчанию |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545; http или https (публичная точка доступа — https://rpc.randprotocol.org). Ответ крупнее 64 MiB отклоняется |
--key <KEY> | RAND_KEY | wallet.key.json; хранилище нот лежит рядом, в <key>.notes.json. Хранилище привязано к цепочке, по которой оно сканировалось (rand_getGenesisHash узла): при указании другой цепочки, например у кошелька, сохранённого при переходе с цепочки 19 на 20, оно очищается и пересканируется с листа 0 с предупреждением. Начиная с v0.6.8 каждая команда отказывается работать с файлом ключа, доступным для чтения группе или остальным, и называет исправление (chmod 600 <key>) |
--prover | выключено. Доказывать пакет на доказывающем узле, спаренном с этим кошельком (rand prover pair), а не на этой машине; доказательство проверяется здесь (его дайджест, размер и локальная верификация) до того, как попадёт в транзакцию. Относится к каждой команде, доказывающей пакет; для call и program invoke доказывающему уходит только оплачивающий пакет, а доказательство вызова остаётся локальным. Отклоняется без спаривания, а также вместе с --cuda, кроме call. В цепочке с раздельной авторизацией, такой как цепочка 20, доказывающему отправляются ключ просмотра nk и соль, но никогда не ключ траты: он может прочитать всю историю этого кошелька, но потратить средства не может. Доказательство авторизации всегда строится на этой машине. В цепочке, где guest пакета — v1 или v2, v0.6.8 отклоняет --prover, прежде чем о чём-либо спросит доказывающего | |
--max-prover-fee <RAND> | 1. Наибольшая комиссия за пакет, которую может взять спаренный доказывающий. Котировка выше этой отклоняется до построения любого пакета; 0 отклоняет любую комиссию. Комиссия — ещё один выход в RAND в том же пакете, отображаемый как prover fee: <amount> RAND to <fingerprint> |
Суммы указываются в десятичных 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. Везде, где команда принимает токен, она принимает индекс в реестре, id rpl1… или 64-hex id; id сопоставляется с индексом по полному списку реестра узла (rand_getTokens, все страницы), а не поиском по отдельному токену, который сообщил бы узлу, какой токен вот-вот будет перемещён. Числовой индекс до узла не доходит вовсе.
| команда | аргументы | поведение |
|---|---|---|
keygen | записывает новый файл ключа траты по пути --key с режимом 0600; отказывается перезаписывать существующий | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | выводит rand1…-адрес этого кошелька в stdout, ровно адрес и перевод строки, так что $(rand address) работает в скрипте, а в stderr выводит его fingerprint XXXX-XXXX-XXXX-XXXX: 16 символов Crockford base32, проверку адреса человеком, которая никогда не передаётся по сети. --uri также выводит ссылку randpay: (адрес и необязательные сумма, актив и memo). --qr отображает эту ссылку как 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, не являющийся терминалом, без него отклоняется. Хранится в <key>.contacts.json, режим 0600. Имя содержит от 1 до 64 символов, никогда не начинается с rand1 или randpay: и уникально |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes (pair) | связывает этот кошелёк с одним делегированным доказывающим узлом (prover). pair принимает ссылку randprover:, которую вывел rand-prover pair, отклоняет URL, не начинающийся с https:// (простой http:// допускается только для localhost, 127.0.0.1 или [::1]), затем сообщает, что получит prover (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, не являющийся терминалом, без него отклоняется. Затем запрашивает у prover prover_info, отклоняет пару, если отпечаток его ключа не совпадает с названным в ссылке, и записывает <key>.prover.json с режимом 0600, заменяя любую прежнюю пару. --trusted (v0.6.8) не принимает ссылку: он связывает кошелёк с пулом prover валидаторов, https://prover.randprotocol.org, по ссылке, которую несёт сборка; его операторы могут читать историю этого кошелька, но не могут тратить средства. show выводит имя, URL, отпечаток, own и ключ prover, но никогда не токен; forget удаляет файл. v0.6.7 не спрашивал подтверждения перед связыванием |
viewing-key | выводит ключ просмотра этого кошелька nk, 64 hex-символа: параметр, который принимает rand_importViewingKey. Он читает каждую ноту, которую кошелёк отправил или получил, и не тратит ни одной | |
balance | сканирует дерево, сохраняет хранилище, выводит доступную для траты сумму и число непотраченных нот | |
sync | --rescan | сканирует без вывода баланса. Первая синхронизация читает заголовки всех блоков (по 1 024 за вызов) до листьев. --rescan забывает все ноты, отметки о тратах и курсор (сохраняя привязку к цепочке) и пересканирует с листа 0: способ вернуться, когда узел ошибочно сообщил о нотах этого кошелька как о потраченных. Лучше выполнять на узле, которому вы доверяете |
notes | --memo | каждая нота, которую открыл этот кошелёк: индекс, актив, сумма, высота, spent, pending и memo, обрезанное до 24 символов, или целиком с --memo |
asset-balance [INDEX] | сканирует, затем выводит, сколько этот кошелёк держит в одном активе, или строку на каждый удерживаемый актив; суммы в наименьших единицах самого актива | |
history | --memo | каждая нота, которую этот кошелёк создал для кого-то другого, с тем же столбцом memo, что и в notes |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex> (по умолчанию 0, RAND), --memo <M>, --fee <RAND> (по умолчанию 0.001), --no-wait, --yes, --cuda | TO — это rand1…-адрес, ссылка randpay: или имя сохранённого контакта; проверяются именно в таком порядке. Собственные сумма, актив и memo ссылки заполняют то, что не указано в командной строке; AMOUNT необязателен, только когда его несёт ссылка, а значение, заданное двумя способами и расходящееся, отклоняется. Команда выводит подтверждение, to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset> и, если есть memo, отдельную строку memo: "<text>", затем спрашивает перед доказательством, если не указан --yes. Скрипт обязан передать --yes: stdin, не являющийся терминалом, отклоняется с сообщением stdin is not a terminal: pass --yes to send without confirmation. Затем она выбирает не более двух нот актива и не более двух нот RAND для комиссии, запечатывает memo только в выход платежа, строит доказательство одного четырёхслотового пакета со скрытым активом и, в цепочке с раздельной авторизацией, локально доказывает авторизацию траты, отправляет транзакцию и ждёт фиксации. Непустое memo отклоняется до доказательства в цепочке, в генезисе которой нет envelope_bytes. AMOUNT задаётся в отображаемых единицах актива: десятичный RAND для RAND, а токен — с собственным decimals его строки в реестре; RAND читается только при 0 или rand, какой бы индекс ни ответил узел. Идентификатор токена декодируется до обращения к узлу, а строка списка, которая отвечает на него индексом 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: просит узел-валидатор выпустить монеты. В цепочке 20 faucet платит только 16 кошелькам из своего генезисного списка допуска |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N (повторяемый), --out <file> (по умолчанию program.json) | собирает встроенный гостевой образ; выводит идентификатор программы. rpl2_counter (v0.6.8) — демонстрационная программа RPL-2 |
program deploy <FILE> | .json, необработанный .bin или контейнер образа, который записывает rand-guest build; --public <FILE>, --input <u32> (повторяемый) или --check-call, --cuda | выводит идентификатор программы, hc и число слов; отклоняет программу сверх лимита цепочки (через rand_estimateFee) до доказательства; оплачивает минимальную плату за развёртывание через пакет, ждёт. --public сохраняет публичный вход вместе с программой (слова u32, разделённые пробелами, или ELF .so) в пределах max_program_public_words цепочки; идентификатор программы затем привязывает его. С --input или --check-call кошелёк сначала прогоняет вызов на этих приватных входах в эмуляторе и отклоняет программу, если она не укладывается в лимит яруса вызова (14); для проверки ничего не доказывается |
program show <ID> | метаданные развёрнутой программы | |
program invoke <PROGRAM-ID> | --transition <FILE.json> (обязателен), --input N (повторяемый, приватный), --inputs-file <FILE.json> (JSON-массив u32, добавляется), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8, RPL-2: объявляет переход состояния программы и просит цепочку применить его. До какого-либо доказательства проверяет, что в цепочке есть секция program_state, что программа существует, что контекст перехода укладывается в правило сегмента, что каждая запись reads совпадает с живой ячейкой (rand_getProgramCell; несовпадение называет устаревшую ячейку и завершается с кодом 3), что хранилище способно оплатить каждую запись pays плюс то, что вносит этот переход, и что у этого кошелька есть токен и RAND, нужные для взноса и комиссии. Подсчитывает ячейки, создаваемые записями, прогоняет программу в эмуляторе на реальных словах контекста, доказывает вызов, привязанный к транзакции, затем пакет (комиссия плюс deposit.rand, сжигаемый через burn_r, и deposit.amount актива deposit.asset через burn_a) и доказательство авторизации. Комиссия по умолчанию — минимальная плата за вызов при объявленном газе плюс плата за ячейку за каждую созданную ячейку, с тем же запасом в два шага цены, что и у 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-символьные hex 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), по строке на каждый удерживаемый актив, суммы в единицах. Отклоняется в цепочке без этой секции | |
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_LIMIT доказательства. В цепочке с секцией газа лимит по умолчанию — точный газ, округлённый вверх до кратного 2^(t−2); max объявляет потолок заголовка gas_max, который не раскрывает ничего сверх того, что раскрывает ярус; N отклоняется, если он меньше точного газа или больше потолка. Без секции или с --cuda по умолчанию используется max. Затем локально доказывает вызов над публичным входом программы, запечатывает транскрипт его входов, оплачивает через пакет, выводит квитанцию. Комиссия по умолчанию — минимальная плата за объявленный лимит, BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB по ценам, которые отдаёт rand_getLimits, плюс два шага цены в запас там, где цены меняются, выводится как 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> | hex или @path, --pq <JSON or @path> (обязателен), --to <rand1…> (по умолчанию: этот кошелёк), --fee (по умолчанию: минимум для этого действия), --no-wait, --cuda | вносит аттестацию, подписанную хранителями (guardians), как ноту. --pq — кворум совместных подписей Dilithium2 от хранителей, [{"index":0,"signature":"<4840 hex>"},…]. До какого-либо доказательства: декодирует аттестацию, сверяет кворум с pq_guardians узла и идентификатором цепочки, проверяет получателя и идентификатор актива, читает указанный индекс (rand_getAssets). Ослепление ноты депозита выводится из дайджеста аттестации, r = blake3("rand-deposit-r-1" || mu), единственное r, которое допускает цепочка. Пакет комиссии доказывается относительно всей транзакции, включая кворум. Выводит owner, time и r ноты |
bridge-rotate <ROTATION> | hex или @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-байтовая подпись ключа паузы в виде hex, созданная для текущего pause_nonce моста; перед отправкой проверяется по pause_key узла и идентификатору цепочки. Сжигание и ротации остаются доступными на время паузы |
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 | сжигает мостовой актив для вывода вовне: проверяет, что монета TOKEN в TO_CHAIN обеспечивает ASSET и что заблокировано не меньше AMOUNT, а также что AMOUNT и комиссия релейера — целые единицы выпуска; затем доказывает один пакет, который тратит актив в слотах 0–1, сжигает ровно AMOUNT этого актива (burn_a, burn_asset) и платит комиссию в RAND из слотов 2–3. --relayer-fee — это часть AMOUNT, а не дополнительный сбор. В цепочке с комиссией моста (rand_getBridgeState.fees), как цепочка 20, v0.6.8 сначала выводит комиссию, которую оставляет себе цепочка (в активе), и сумму, которая будет выпущена, и просит подтверждения; --yes пропускает вопрос, а stdin, не являющийся терминалом, без него отклоняется. Проверки заблокированной суммы и комиссии релейера затем применяются к выпускаемой сумме |
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; при успехе выводит индекс и идентификатор, hex и 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 | уничтожает AMOUNT, в отображаемых единицах токена, токена RPL, который держит этот кошелёк; его публичное предложение уменьшается ровно на эту величину. Мостовой токен отклоняется до доказательства: он уходит через bridge-burn |
token info <INDEX|rpl1…|hex> | полная строка одного токена из rand_getTokens: имя, символ, decimals, полномочие, mint_nonce, общее предложение, registered_at, идентификатор (hex и 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 узла, с тем же отказом при превышении 10 RAND, что и у token create), --no-wait, --cuda | регистрирует мостовой токен после генезиса с его первым обеспечением, авторизованный PQ-кворумом хранителей (файл rand-bridge-gov pq-register), созданным для list_nonce узла. Сначала листинг в Rand, затем setToken на конечной точке |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path> (обязателен), --fee (по умолчанию: база пакета), --no-wait, --cuda | добавляет обеспечение мостовому токену, авторизованное PQ-кворумом хранителей (файл rand-bridge-gov pq-list) при list_nonce узла |
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) | минимальная комиссия по расписанию узла. В цепочке с секцией газа 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) для токена), memo, которое он нёс (-, если его нет), и ключ транзакции, под которым он был запечатан. Передайте ключ из строки sent получателю или аудитору, и rand_checkTransaction <HASH> <KEY> раскроет этот один выход, включая memo. Фиктивный слот не открывается никому и строки не имеет | |
block <ID> | блок по высоте или хешу | |
head | { height, hash, view } | |
status | rand_status | |
peers | подключённые пиры | |
validators | реестр валидаторов |
--cuda требует сборки с --features cuda и не имеет запасного варианта; PTX пока не собран. Он не может запечатать конверт с входными данными вызова: для rand call --cuda нужен --no-envelope. Он объявляет только потолок газа и отклоняет --gas-limit N.
Каждое примечание и каждое имя контакта, которые печатает CLI (подтверждение send, notes, history, tx-key), сначала проходят одно правило отображения: управляющие символы, символы формата Unicode (управляющие символы двунаправленного текста, символы нулевой ширины, мягкий перенос) и U+2028/U+2029 показываются как U+FFFD, а последовательность пробельных разделителей — как один пробел.
Первый 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
Передача адреса и примечание
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
Примечание лежит внутри того же запечатанного тела, что и нота, поэтому тот, кто может открыть одно, может открыть и другое: получатель — через notes, а любой, у кого есть ключ данной транзакции для этого выхода, — через rand_checkTransaction <hash> <key>. Chain 18 — первая цепочка, в genesis которой задан envelope_bytes; в цепочках с 14 по 17 --memo отклонялся до начала любого доказательства.
Конфиденциальный вызов, который можно открыть позже
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)
Программа с состоянием: счётчик RPL-2
В цепочке с разделом program_state, как у chain 20. Счётчик принимает ровно те переходы, которые читают одну ячейку и записывают её обратно с первым словом, увеличенным на единицу; всё остальное в переходе (что бандл вносит, что выплачивает хранилище, что выпускает программа) проходит без проверки, поэтому это демонстрация, а не программа, под которую стоит помещать ценности.
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 шестнадцатеричных символа, которых требует кошелёк.
Что печатают deploy и call
В цепочке с раздельной авторизацией каждый бандл — это два доказательства, построенных на этой машине: авторизация траты уровня 10 и бандл уровня 14. program deploy с rand v0.6.7 в chain 18, 2026-09-30:
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1368908 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 116.7s: tier 14, 1500710 bytes
submitted deploy <hash>
0 RAND out, 59.8545 RAND change, fee 0.1007 RAND, anchored at height 97831, proved in 116.7s (bundle) + 6.8s (auth)
call печатает свой газ и свою комиссию до доказательства вызова, а затем так же доказывает оплачивающий бандл:
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
Делегированный prover как отдельный бинарный файл: он строит доказательство бандла уровня 14 для кошелька на другой машине. rand-node run --prover размещает тот же сервис внутри узла. Каждая подкоманда принимает --home <DIR> (переменная окружения RAND_PROVER_HOME, по умолчанию ~/.rand-prover) — каталог, в котором лежат prover.key.json и pairings.json.
| команда | аргументы | поведение |
|---|---|---|
keygen | записать prover.key.json с правами 0600 и напечатать отпечаток ключа; отказывается перезаписывать | |
pair | --name <LABEL> (обязательно), --url <URL> (по умолчанию http://127.0.0.1:8600), --own, --qr | создать токен, сохранить под меткой только его хеш и напечатать ссылку сопряжения randprover:, которую принимает rand prover pair. Токен показывается один раз, внутри ссылки. --url — адрес, по которому кошелёк обращается к этому prover; --own добавляет own=1; --qr дополнительно печатает ссылку в виде QR-кода в терминале |
unpair | --name <LABEL> | удалить сопряжение; работающий prover читает файл при запуске, поэтому изменение вступает в силу после перезапуска |
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 | обслуживать JSON-RPC prover_* до Ctrl-C или SIGTERM. Запуск отклоняется, если не доступно 5,74 GB × --max-parallel + 1 GiB памяти. --per-token — число задач, которые одно сопряжение может одновременно держать в очереди или в доказательстве. --accept-spend-key снят в v0.6.8: run отказывается запускаться с ним, а prover принимает только свидетельства с ключом просмотра. В v0.6.7 он допускал свидетельства с ключом траты, которые присылает только цепочка на гостевой программе бандла v1 или v2 |
Prover в chain 20 получает ключ просмотра кошелька nk и свежую соль. Он не может тратить, но может прочитать всё, что этот кошелёк когда-либо получил или отправил: сопрягайтесь с тем prover, которому вы показали бы свою историю. Кошелёк проверяет каждое полученное обратно доказательство.
Форматы файлов ключей
Ключ узла:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
Ключ кошелька, версия 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>). Потеря ключа кошелька означает потерю каждой ноты, которую он мог открыть; в этом выпуске нет фразы восстановления.