Эта страница поясняет, как запустить кран на тестовой цепочке, что такое транзакция Mint на уровне протокола и как именно залог или сжигание для моста выводит стоимость из пула. Каждый вход и каждый выход публичны; всё, что между ними, — ноты.
Выпуск через кран
Mint — единственный способ создания RAND после генезиса в цепочке 21, как и в цепочке 20, и он существует только в цепочках, генезис которых содержит "faucet": true. Это транзакция, подписанная валидатором, без пакета:
Action::Mint { cm: Word8, pk: Word8, time: u32, r: Word8, envelope: Envelope, amount: u64,
minter: PublicKey, signature: Signature }
rand_mint(address[, amount]) на узле-валидаторе строит ноту на amount для заданного адреса rand1…, запечатывает её конверт одноразовым ключом отправителя, подписывает выпуск собственным ключом Dilithium2 узла и отправляет его через обычный мемпул, так что выпуск проходит консенсус и применяется каждым узлом. Лимит — 100000000000 единиц, 100 RAND, за вызов, и значение по умолчанию равно лимиту. Начиная с цепочки 14 выпуск несёт раскрытие ноты — pk, time и r — и подпись охватывает его: при допуске пересчитывается обязательство для (pk, no sender, amount, asset 0, time, r), а cm, который не совпадает, отклоняется с сообщением the mint's commitment does not open to its published note and amount; кроме того, time должно укладываться в окно пакета. Параметры rand_mint не изменились. Подписываемое сообщение — blake3("rand-mint-2" ‖ bincode(chain_id, cm, pk, time, r, envelope, amount)) в цепочках с 14 по 19; в цепочке 20, генезис которой задаёт binding_domain: 1, это rand-mint-3 над хешем генезиса, за которым следуют те же поля, поэтому выпуск, подписанный для одной цепочки, отклоняется в любой другой, даже если она использует тот же идентификатор цепочки и те же ключи валидаторов. У наблюдателя нет ключа валидатора, и он отвечает faucet mints are signed by validators; ask a validator node; цепочка без этого флага отвечает faucet is disabled on this chain.
Кран цепочки 21 включён, но ограничен секцией генезиса staking с теми же значениями, что и в цепочке 20:
| правило | цепочка 21 (как цепочка 20) | отказ |
|---|---|---|
| получатели | список разрешённых из 16 кошельков (staking.faucet_recipients); опубликованный pk выпуска должен входить в него | the faucet may not mint to this recipient (not in staking.faucet_recipients), постоянный |
| бюджет | 10 000 RAND на эпоху в 1000 блоков (staking.faucet_budget_per_epoch), суммарно по всем валидаторам | the faucet budget of … for this epoch is exhausted (… minted); следующая эпоха его допустит |
| эмитенты | 18 из 26 валидаторов (staking.faucet_minters, перечислены начиная с цепочки 16); выпуск должен быть подписан одним из них | minter … is not a faucet minter on this chain |
Поэтому rand faucet в цепочке 21 работает только для кошелька из списка и только при обращении к узлу-валидатору, ключ которого входит в число эмитентов; любой другой адрес должен получить средства от того, у кого есть RAND.
rand faucet # 100 RAND to this wallet's address, waits for the commit
rand faucet rand1… --amount 25 # to another address, less than the cap
→ {"method":"rand_mint","params":["rand1…", "100000000000"]}
← "9ab1c0…4f"
Публичны: обязательство новой ноты, её конверт, сумма в открытом виде, а также открытый ключ выпускающего валидатора (показанный как его адрес) и подпись. Раскрытие публикует и ключ владельца ноты pk, поэтому владелец ноты из крана публичен, как и получатель выплаты при выводе; скрытыми остаются время и место, где эта нота будет потрачена позднее. Связь в один шаг между «выпущено 100 RAND» и «существует нота на 100 RAND» — та же видимость, какую даёт любой депозит из прозрачного пула в экранированный. При допуске проверяется, что кран включён, сумма не превышает лимит, в бюджете эпохи есть место, получатель входит в список разрешённых там, где он есть в генезисе, обязательство раскрывается в опубликованную ноту, эмитент является валидатором и входит в список эмитентов там, где он есть в генезисе, и подпись верна; выпуск не оплачивает комиссию.
rand_getTransaction отображает такую транзакцию как { "kind": "mint", "cm": "…", "amount": "100000000000", "minter": "<validator base58>" } при "bundle": null — сумма представлена десятичной строкой, как и любая сумма u64, которую RPC отдаёт начиная с цепочки 14; обозреватель перечисляет их под kind=mint, это один из немногих видов с публичным amount.
Генезисные депозиты
Другой способ входа стоимости — файл генезиса: каждый --alloc rand1<address>=<RAND> в rand-node genesis становится одной депозитной нотой { cm, envelope, amount, opening } со свежей случайностью обязательства, первыми листьями дерева. В цепочке 21 (fullnode v0.8.0, запущена 2026-10-12) десять генезисных нот: семь нот RAND, всего 3 938,879078887 RAND (genesis_deposited), — балансы операторов, найденные сканированием пула цепочки 20 на высотах от 822 056 до 822 229, — и три ноты zUSD на 10, 89,002999 и 0,999 zUSD, то есть 100,001999 zUSD из хранилища моста, перенесённые из состояния цепочки 20 на высоте 814 702 (Мост); они не являются RAND и не входят в genesis_deposited. RAND, которым в цепочке 20 владеют кошельки не из числа операторских, около 36 025 RAND (35 040 из них — выпуски крана для получателей из списка), и 2,606 RAND невыведенных комиссий валидаторов не переносились. Ещё одна генезисная запись вообще не нота: казначейство фонда, 100 000 RAND новой эмиссии на мультиподписном счёте с тремя подписантами Dilithium2 при пороге 2 из 3, публичный баланс в реестре мультиподписей (multisig_issued), который попадает в пул только как вычисляемые цепочкой ноты, создаваемые MultisigPay. История: в цепочке 20 было девять нот — семь нот RAND на 5 184,243719258 RAND и две ноты zUSD на 10 и 89, перенесённые из цепочки 19; в цепочке 19 — восемь: семь нот RAND на 5 294,644359629 RAND и одна на 10 zUSD; в цепочке 18 — шесть нот RAND, пять по 1000 RAND и одна на 300 RAND; в цепочках 14 и 15 — пять по 1000 RAND. Сумма публична, чтобы каждый мог сложить начальное предложение, а начиная с цепочки 14 нота несёт и своё раскрытие, поэтому владелец генезисной ноты публичен по замыслу. Повторная нарезка тех же аллокаций даёт другие ноты и другой хеш генезиса — намеренно.
Сжигания
Каждая транзакция несёт один пакет скрытых активов из четырёх слотов, и у него два слова сжигания: burn_r — это RAND, уходящий из пула в публичное место, а burn_a — количество токена, названного в burn_asset. Гостевая программа пакета балансирует обе группы в одном доказательстве, и при допуске все три значения должны быть нулевыми, кроме следующих действий:
| сжигание | правило | куда уходит стоимость |
|---|---|---|
пакет Bond | burn_r == amount | публичный stake валидатора в реестре |
пакет BridgeBurn | burn_asset == asset, burn_a == amount, burn_r == 0, asset != 0 | уничтожается в Rand; контракт исходной цепочки выпускает amount названной монеты по сообщению о сжигании, подписанному хранителями. Начиная с цепочки 20 цепочка удерживает комиссию 10 bps в виде ноты zUSD для казначейства, и выплата составляет amount − fee |
пакет TokenBurn | та же форма, что у сжигания для моста | уничтожается; публичный total_supply токена RPL уменьшается ровно на эту величину |
пакет Invoke (RPL-2, начиная с цепочки 20) | burn_r и burn_a для burn_asset, как объявляет переход программы | RAND и токены вносятся в публичное хранилище программы, либо уничтожается собственный токен программы; хранилище выплачивает снова только вычисляемыми цепочкой нотами (Программы) |
пакет CreateMultisig или MultisigDeposit (цепочка 21) | burn_r — внесённый RAND | переходит на публичный баланс мультиподписного счёта (multisig_rand_in); возвращается в пул только как вычисляемые цепочкой ноты, создаваемые MultisigPay (Транзакции) |
пакет PerpDeposit (RPL-3, цепочка 21) | burn_a залогового актива рынка, zUSD в цепочке 21 | зачисляется на торговый счёт в движке бессрочных контрактов; вывод выплачивается нотой, которую вычисляет цепочка |
(Пакет register_aggregator также сжигает свой генезисный залог через burn_r; агрегация в цепочке 21 отключена.)
Сжигания не являются комиссиями. Сжигание залога — это RAND, переходящий из пула в реестр, он учитывается в burned аудита предложения (и вновь появляется в register_total). Сжигание для моста — это один пакет начиная с цепочки 14 (раньше было два): слоты 0–1 сжигают переносимый актив, слоты 2–3 оплачивают комиссию, так что оно затрагивает предложение RAND только через эту комиссию, BRIDGE_BURN_FEE, 0,01 RAND. Оно должно называть монету, обеспечивающую актив, выпускать целое число единиц этой монеты и укладываться в то, что заблокировано в этом обеспечении (Мост). В цепочке 20 её генезисная секция bridge.fees также берёт 10 bps с каждого перенесённого через мост выпуска и сжигания в zUSD: депозит зачисляет брутто за вычетом комиссии, а сжигание выплачивает amount − fee, причём каждая комиссия — это экранированная нота zUSD для казначейства. Нота комиссии остаётся выпущенной и обеспеченной, так что total_supply == Σ locked для zUSD по-прежнему выполняется; это не движение RAND, и оно не входит в аудит предложения RAND. TokenBurn оплачивает базу пакета 0,001 RAND; токен, перенесённый через мост, там отклоняется и выходит через bridge-burn.
На всех цепях начиная с 15, включая цепь 21, одна из комиссий тоже сжигается: в генезисе задан tokens.burn_registration_fee, поэтому registration_fee в 1 RAND за RegisterToken или RegisterBridgedToken уничтожается, а не выплачивается пропозеру, который получает только базовую часть бандла. Она учитывается в burned и отдельно в registration_fees_burned (токены RPL). На цепи 21 нижний порог каждого бандла сжигается так же: раздел fees генезиса (burn_base, burn_floor) уничтожает собственный нижний порог реестра для бандла — базовые 0.001 RAND, пословную составляющую развёртывания, составляющие газа и байтов вызова, 0.01 RAND за сжигание через мост, — а пропозер оставляет себе fee − floor; сожжённое учитывается в burned и в base_fees_burned (Комиссии).
rand bond <validator> 1000 [--registration <hex>] # burns 1000 RAND out of this wallet's notes
rand bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> # burns AMOUNT of a bridged asset, released as TOKEN on TO_CHAIN
rand token burn <ASSET> <AMOUNT> # destroys AMOUNT of an RPL token this wallet holds
Комиссии — второй выход
fee каждого бандла уходит из пула в rewards пропозера блока — публичное поле реестра — и возвращается в пул только тогда, когда валидатор выводит его в виде ноты (Стейкинг). Withdraw выплачивает базовые 0.001 RAND из выводимой суммы пропозеру блока, который его применяет; эта база никогда не покидает реестр, поэтому пересечением границы не считается.
Как движется предложение
in: genesis_deposited, faucet_minted, withdraw_deposited, program_rand_out
out: fees_paid, burned
pool_value = in − out
total_supply = pool_value + Σ register (stake + pending + rewards) + program_rand_held
== genesis_deposited + genesis_staked + faucet_minted − slashed − registration_fees_burned
program_rand_held и program_rand_out присутствуют начиная с цепи 20 (RPL-2): RAND, который Invoke сжигает в хранилище программы через burn_r, учитывается в burned на стороне пула и удерживается в хранилище, а то, что хранилище выплачивает в виде нот, возвращается в пул. rand_getSupply отдаёт оба значения вместе с invariant_holds. Цепь 21 добавляет такую же пару для движка перпетуалов (perps_rand_held, perps_rand_out; оба равны 0, пока его единственный рынок обеспечен в zUSD) и пять счётчиков multisig_*: multisig_issued (100 000 RAND казначейства), multisig_rand_in и multisig_rand_out (сколько сожгли создания и пополнения и сколько платежи выплатили в виде нот), multisig_base_out (базовые 0.001 RAND, которые платежи выплатили пропозерам из счетов) и multisig_rand_held — их нетто (Предложение).
Только минт крана добавляет к выпущенному цепью после генезиса (сам генезис цепи 21 выпустил 26 000 RAND стейка, 3 938.879078887 RAND нот и 100 000 RAND казначейства), а на цепи 21 из выпущенного вычитаются сожжённая комиссия за регистрацию и каждый сожжённый нижний порог комиссии: slashed учитывал бы срезанный залог агрегатора или, при наличии в генезисе раздела staking.slashing, срезанный стейк валидатора, а на цепи 21 нет ни того, ни другого (агрегация отключена, slashing равен null). Залог, вывод, внесение в хранилище, пополнение или платёж мультисига и депозит перпетуалов перемещают стоимость между пулом и публичными реестрами и ничего не создают; чаевые переходят из пула в строку пропозера, а нижний порог под ними уничтожается. Счётчики и разобранный пример приведены в разделе Предложение. Субсидия за агрегацию блоков — новый RAND за каждый запечатанный блок по графику с халвингом, выплачиваемый агрегатору в виде депозитной ноты, — стала бы первой плановой эмиссией, и на цепи 21 она не активна.