Rand Protocol
Документация
Справочник

Командная строка

Все команды rand-node и rand с аргументами и значениями по умолчанию: бинарный файл узла и оператора, защищённый кошелёк и делегированный prover.

Из 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>productiontest небезопасен и предназначен для набора тестов; 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>v1guest 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/30303multiaddr для прослушивания 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:8545JSON-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>quickoff, 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>/proverprover.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>fullquick или 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), --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отправить отзыв, имеющий не меньше 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_RPChttp://127.0.0.1:8545; http или https (публичная точка доступа — https://rpc.randprotocol.org). Ответ крупнее 64 MiB отклоняется
--key <KEY>RAND_KEYwallet.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, --cudaTO — это 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-waitv0.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 }
statusrand_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>). Потеря ключа кошелька означает потерю каждой ноты, которую он мог открыть; в этом выпуске нет фразы восстановления.

Последняя проверка по коммиту fullnode c0878c3f (chain 21) от 2026-10-12. Если код и эта страница расходятся, прав код; сообщите нам.