Rand Protocol
Документация
Основные понятия

Комиссии

Что транзакция платит сети в RAND: фиксированные минимальные комиссии за каждое действие, цены газа и байтов, которые платит вызов в chain 21, куда уходит комиссия и что сжигает chain 21, почему газ здесь — это цена, а не предел исполнения, и что отправитель платит вместо этого собственными вычислениями на своей машине.

Используйте эту страницу, чтобы задать комиссию транзакции, оценить стоимость развёртывания или вызова и понять, сколько получает валидатор. Комиссии — это нижние границы в RAND. Каждое действие, кроме вызова, платит фиксированную сумму. Начиная с chain 18 вызов платит за лимит газа, который объявляет его доказательство, и за свои байты по ценам, которые меняются вместе с заполненностью блоков и, начиная с chain 20, упираются в потолок. В chain 21 (fullnode v0.8.0, работает с 2026-10-12) сама нижняя граница сжигается, а пропозер оставляет себе только чаевые (ниже).

Нижние границы

Комиссии указаны в единицах 10⁻⁹ RAND. Константы находятся в randprotocol_core::gas:

транзакциянижняя границасейчас
любой пакет: перевод RAND или любого токена RPL, bond, bridge-депозит (BridgeAttest, оплачивает его релеер), TokenMint, SetAuthority, TokenBurn, ListBackingBUNDLE_BASE = 1 000 000 единиц0,001 RAND
DeployBUNDLE_BASE + DEPLOY_PER_WORD (100 000) × (слова программы + публичные слова)программа из 256 слов: 0,0266 RAND; программа из 4 096 слов: 0,4106 RAND; образ SPL Token из 65 096 слов с публичным входом из 27 151 слова: 9,2257 RAND (развёрнут в chain 13, 2026-09-19). Начиная с chain 16 (hardening_v6, включая chain 21) развёртывание, которое не может вызвать ни один вызов, отклоняется как ProgramUncallable: более 8 180 слов для программы без публичного входа, меньше — для программы с ним. Такой образ был бы отклонён в chain 21
Callв сети, чей genesis содержит секцию gas (chain 21, как и chain 18–20): BUNDLE_BASE + gas_price × лимит газа, объявленный доказательством вызова, + byte_price × каждый КиБ (неполный КиБ считается за целый) доказательства вызова плюс конверта входных данных, начиная с нулевого байта. См. Газ в chain 18. В сети без этой секции: BUNDLE_BASE + call_fee(tier), где call_fee = CALL_BASE (1 000 000) + 100 000 за каждые два уровня выше 10, плюс 1 000 единиц за каждый КиБ (неполный КиБ считается за целый) доказательства вызова плюс конверта входных данных сверх бесплатного объёма 2 097 152 + 18 432 байтchain 21, при начальных ценах 100 и 800 единиц (как в chain 20): вызов уровня 14, объявляющий потолок уровня в 20 479 газа и 1 350 000 байт доказательства и конверта, имеет нижнюю границу 0,0041 RAND; кошелёк по умолчанию платит больше (ниже). Без секции gas, как в chain 15: уровень 10: 0,002; уровень 14: 0,0022 RAND, в пределах бесплатного объёма. Начиная с v0.5.6 вызов выше уровня 14 отклоняется независимо от платы (MAX_CALL_TIER). Вызов ERC-20 approve, сделанный в chain 13 2026-09-19 (уровень 16, доказательство в 3 412 405 байт), заплатил 0,00357 RAND и был бы отклонён в любой сети начиная с v0.5.6
Invoke (RPL-2, начиная с chain 20)нижняя граница вызова плюс program_state.cell_fee из genesis за каждую ячейку, которую создаёт переход (ячейка, записанная ненулевым значением там, где ничего не хранилось); перезапись или удаление ячейки ничего не добавляетcell_fee равен 0,01 RAND в chain 21, как и в chain 20: вызов уровня 14 выше, создающий две ячейки, имеет нижнюю границу 0,0241 RAND
BridgeBurnBRIDGE_BURN_FEE = 10 × BUNDLE_BASE: база плюс собственный сбор моста, оба оплачиваются из одного пакета, который несёт burn0,01 RAND; начиная с chain 20 мост также удерживает 10 б. п. сожжённого zUSD (ниже)
RegisterToken, RegisterBridgedTokenBUNDLE_BASE + registration_fee реестра токенов (параметр genesis)chain 21, как и chain 20: 0,001 + 1 RAND = 1,001 RAND, из которых 1 RAND сжигается
Mint (faucet), Unbond0; без пакета, подписано валидатором—
PauseMints, UnpauseMints0; без пакета, авторизуется ключом паузы или кворумом PQ-гардианов, поэтому пауза работает из кошелька без RAND—
Withdraw0 в сети; база 0,001 RAND вычитается из выводимой суммывывод 1 000 RAND создаёт ноту стоимостью 999,999

Комиссия — публичное слово пакета, и она всегда в RAND. Гостевая программа пакета скрытых активов связывает её с балансовым соотношением группы RAND in₂ + in₃ = out₂ + out₃ + fee + burn_r (слоты 2–3), поэтому она оплачивается из скрытых нот без раскрытия, из каких именно; токен движется через слоты 0–1 того же пакета по собственному соотношению in₀ + in₁ = out₀ + out₁ + burn_a. Таким образом, одно доказательство перемещает токен и оплачивает его комиссию в RAND, а кошелёк, который держит токен, но не имеет доступного RAND, получает отказ ещё до построения доказательства.

Сбор моста падает на burn, потому что это единственная транзакция моста, отправитель которой наверняка держит RAND; депозит платит только базу, так как у вносящего RAND ещё нет. Плата за регистрацию — факт реестра, а не часть fee_floor, поэтому она проверяется по правилам самого действия (RegistrationFeeTooLow), так же как часть вызова, зависящая от газа или уровня, взимается после декодирования его доказательства. Нижняя граница вызова проверяется дважды, потому что объявленному можно доверять только после проверки доказательства. В сети с учётом газа (chain 21, как chain 18–20) первая проверка, до всякой верификации, оценивает байты вызова и объявленный лимит 1 (у Invoke там же добавляется плата за ячейки); вторая оценивает лимит, который объявляет проверенное доказательство. В сети без секции gas это BUNDLE_BASE + CALL_BASE и точная для уровня нижняя граница.

Спрашивайте узел, а не гадайте:

rand fee bundle          # 0.001 RAND
rand fee deploy 256      # 0.0266 RAND
rand fee call 14 --gas 20479 --bytes 1350000   # 0.0041 RAND at chain 21's starting prices (chain 20's)
→ {"method":"rand_estimateFee","params":[{"kind":"call","tier":14,"gas":20479,"bytes":1350000}]}
← "4103100"

Этот ответ равен 1,000,000 + 100 × 20,479 + 800 × 1,319 при начальных ценах; узел оценивает по ценам, действующим на вершине цепи в момент запроса. Начиная с chain 20 поле gas в спецификации вызова обязательно в JSON-RPC (без него -32602). rand fee call <tier> без --gas отправляет потолок уровня, а без --bytes не оценивает байты. Invoke оценивается так же, с "kind":"invoke" и "created_cells": c, что добавляет c плат за ячейки (24103100 для примера выше с двумя ячейками, запрошено у chain 20 2026-10-01). В chain 15, где секции gas не было, rand fee call 14 отвечал 0,0022 RAND.

Значения кошелька по умолчанию в точности равны нижним границам, кроме вызова в сети с учётом газа (chain 21): там к значению по умолчанию добавляется запас (ниже); rand send --fee <RAND> и флаг --fee у bond, call, bridge-mint, bridge-burn (по умолчанию 0,01) и подкоманд token повышают их. Всё, что выше нижней границы, — чаевые.

Газ в chain 18

Chain 18, работавший с 2026-09-29 по 2026-10-01, был первой сетью с учётом газа, а chain 19, его повторный genesis на той же сборке, нёс ту же секцию gas. Chain 20 (v0.6.8) сохранил все правила этого раздела и добавил два ценовых потолка и нагрузку байтами, считаемую только по оплачиваемым байтам (ниже). Chain 21 (v0.8.0, 2026-10-12) несёт секцию gas chain 20 без изменений, кроме целевого размера блока в байтах, который следует за его меньшим лимитом блока. Сеть без секции gas сохраняет схему уровней из таблицы выше.

Что считается. Один газ — это одна строка таблицы cpu в zkVM, поэтому обычная инструкция стоит 1. Единственные другие затраты — системные вызовы:

операциягаз
любая инструкция, HALT, WRITE_OUTPUT, READ_INPUT, READ_PUBLIC1
POSEIDON2 над n словами3 + 3 × ⌈n/4⌉ (каждая строка поглощения стоит 3)
SHA256, одно сжатие64
KECCAK, одна перестановка192

Объявленный лимит. Доказательство вызова несёт на одно публичное значение больше, чем раньше, GAS_LIMIT, и схема (набор ограничений 8) доказывает, что газ выполнения не превышает его. Точный газ остаётся приватным. Лимит выше потолка собственного заголовка доказательства отклоняется до построения любого ключа верификатора:

gas_max = (2ᵗ − 1) + 2^(t−2) + 191 × (keccak rows / 32) + 63 × (sha256 rows / 64)

Это 1 279 на уровне 10, 5 119 на уровне 12 и 20 479 на уровне 14 для вызова, который не использует ни одну из хеш-таблиц.

Нижняя граница. Реестр взимает плату за объявленный лимит и байты по ценам, действующим на начало блока:

fee ≥ BUNDLE_BASE + gas_price × gas_limit + byte_price × ⌈bytes / 1024⌉

bytes — это доказательство вызова плюс конверт входных данных. Схема уровней и её бесплатный объём в такой сети не применяются. Пул требует ровно то же, что и блок, и отклоняет более дешёвый вызов как FeeTooLow.

Пакеты и доказательство авторизации объявляют фиксированные лимиты. Каждое доказательство пакета должно объявлять ровно bundle_gas_limit из genesis, 20 479 (потолок уровня 14), иначе транзакция отклоняется как BundleGasLimit. Chain 21, как и каждая сеть начиная с 17, использует раздельную авторизацию, поэтому каждый пакет несёт доказательство авторизации уровня 10, которое обязано объявлять 1 279 (AuthGasLimit); пакет, авторизованный приватной мультиподписной политикой (новое в chain 21), вместо этого несёт доказательство уровня 18 второй guest-программы авторизации (Транзакции). Ни одно из них не является платой: перевод, bond или развёртывание по-прежнему платит свою фиксированную нижнюю границу из таблицы выше. Оба значения кошелёк объявляет сам.

Цены меняются. Начиная с цепочки 18 в разделе gas есть контроллер dynamic, поэтому gas_price и byte_price являются состоянием реестра и входят в корень состояния. Раз в блок, после его транзакций, каждая цена сдвигается в зависимости от того, насколько блок заполнен относительно цели:

price' = min(max_price, max(min_price, price + ⌊price × adjust_bps × (used − target) / (10,000 × target)⌋))

used ограничено удвоенной целью, поэтому adjust_bps — это наибольший сдвиг, который один блок может сделать в любую сторону. max_price — потолок, заданный в genesis; в цепочках 18 и 19 потолка не было. byte_price следует за оплачиваемыми байтами блока (см. ниже); gas_price следует за суммой заявленных лимитов его вызовов и invoke-операций плюс 20 479 за каждый бандл.

раздел gas цепочки 21 (как в цепочке 20, кроме целевого числа байт)значение
gas_price, byte_price в genesis100 единиц за gas; 800 единиц за KiB
min_gas_price, min_byte_price100; 800, так что стартовые цены одновременно являются нижними границами
max_gas_price, max_byte_price10 000; 80 000: потолки, в 100 раз выше нижних границ (новое в цепочке 20)
byte_loadpaying (новое в цепочке 20)
target_block_bytes9 961 472 в цепочке 21, половина лимита блока в 19 MiB (10 485 760 в цепочке 20, половина от 20 MiB)
target_block_gas262 144
adjust_bps1 250: не более 12,5% за блок
bundle_gas_limit20 479
meteringcircuit

Блок ниже своих целей сдвигает цены вниз, поэтому в спокойной сети они держатся на нижних границах. rand_getLimits отдаёт текущие gas_price и byte_price на вершине цепочки вместе с gas_metering: "circuit", bundle_gas_limit, adjust_bps, а начиная с v0.6.8 ещё max_gas_price, max_byte_price и byte_load (null в цепочке, где их нет); rand_status сообщает те же две цены как gas_prices.

Потолки и оплачиваемая байтовая нагрузка

Оба параметра — поля genesis в gas.dynamic, появились в v0.6.8 (аудит v6, POOL-2), и цепочка 20 первой их задаёт. Они устраняют дефект цепочек 18 и 19. Там byte_price двигался вместе с закодированной длиной каждой транзакции, хотя платит за неё только вызов. Семь переводов (около 2,85 MB каждый, плоская комиссия) заполняют блок примерно до 1,9 байтовой цели и поднимают цену примерно на 11% за блок, причём без потолка: около 65 таких блоков доводят её до 1 000 стартовых значений, и вызов тогда стоит около 1 RAND вместо около 0,004.

  • Потолки. max_gas_price и max_byte_price — цены, выше которых контроллер их не поднимает. Шаг вычисляется тот же, а затем ограничивается (gas::next_price_capped), поэтому цена на потолке остаётся там при любой серии полных блоков и снижается с первого же блока ниже цели. Genesis обязан задавать каждый потолок не ниже стартовой цены. При этих потолках (цепочка 21 сохраняет потолки цепочки 20) вызов уровня 14 из примера выше, 20 479 gas и 1 319 KiB, имеет нижнюю границу 0,3113 RAND — это наибольшее значение, которого она может достичь.
  • Оплачиваемая байтовая нагрузка. При byte_load: "paying" значение bytes_used блока учитывает только те байты, за которые взимается байтовая цена: доказательство и входной конверт каждого Call и Invoke (gas::call_bytes), но ничего от перевода, залога или сжигания. Блок из переводов не двигает байтовую цену. Ledger::block_usage вычисляет это значение и для пропозера, и для реплики, так что оба согласуются.

При оплачиваемой нагрузке блок, целиком состоящий из переводов, не даёт вызовам ценового сигнала, поэтому честный пропозер дополнительно резервирует место для вызовов. Это политика узла, а не правило валидности: пока вызов или invoke находится в пуле и платит текущую нижнюю границу, транзакции с плоской комиссией занимают на первом проходе не более трёх четвертей байтов блока, а то, что вызовы оставляют от последней четверти, затем заполняется отложенными переводами (Мемпул).

Что кошелёк платит за вызов

rand call сначала запускает программу в эмуляторе и печатает gas: <exact> (declaring <limit>, tier <t>). По умолчанию он заявляет точное значение gas, округлённое вверх до кратного 2^(tier − 2); --gas-limit N заявляет точное значение, а --gas-limit max — потолок заголовка.

Две вещи делают комиссию по умолчанию выше нижней границы:

  • Доказательство оценивается по лимиту. Начиная с цепочки 16 (hardening_v6, цепочка 21 включена) доказательство вызова привязано к своей транзакции, поэтому комиссия фиксируется до появления доказательства. Кошелёк оценивает лимит доказательства в цепочке — 6 MiB в цепочке 21, 4 MiB в цепочках с 18 по 20 — вместо реального размера доказательства (wallet::hardened_call_quote_bytes). Это может привести только к переплате.
  • Запас в два шага цены. rand_getLimits отдаёт цены зафиксированной головы, а вызов попадает в блок через два-три блока, поэтому по умолчанию нижняя граница умножается на (1 + adjust_bps / 10,000)², то есть на 1,125² в цепочке 21, как и в цепочке 20.

Измерения в цепочке 18 на 2026-09-30: четыре вызова при этих значениях по умолчанию стоили от 0,0057 до 0,0075 RAND каждый (Примеры программ). --fee переопределяет значение по умолчанию; перед отправкой кошелёк заново оценивает реальное доказательство и отказывается от комиссии ниже нижней границы.

Куда уходит комиссия

В цепочке 21 нижняя граница сжигается, а чаевые достаются пропозеру. Genesis цепочки 21 содержит раздел fees с заданными burn_base и burn_floor (fullnode v0.8.0; rand_getLimits.fee_rules отдаёт его как {"burn_base": true, "burn_floor": true, "subsidy_net_of_fees": false, "proposer_share_bps": null, "prove_base": null, "usd_subsidy": null}). В разбиении комиссии каждого бандла собственная нижняя граница реестра для этого бандла — BUNDLE_BASE для перевода, залога, действия с токеном или аттестации; BUNDLE_BASE плюс слагаемое за слово для Deploy; точная для уровня нижняя граница вызова по ценам блока для Call, плюс комиссия за ячейку для Invoke; BRIDGE_BURN_FEE для BridgeBurn, так что собственный сбор моста уничтожается вместе с базой — сжигается (burned = min(fee, floor)), а rewards пропозера блока в реестре валидаторов, единственном месте этой цепочки, где сумма хранится в открытом виде, растут только на чаевые, fee − floor. rand_getSupply учитывает сжигание в base_fees_burned, справа в тождестве предложения рядом с registration_fees_burned (Предложение), а fees_paid меняется на то, что оставляет себе пропозер. Для отправителя ничего не меняется: нижние границы и значения кошелька по умолчанию — те же числа, что выше, отличается лишь то, куда уходит нижняя граница. Точная форма EIP-1559 выбрана вместо сжигания одной только базы, чтобы пропозер ничего не выигрывал от блока, поднимающего цену. registration_fee регистрации не входит в нижнюю границу; он сжигается по собственному флагу, как и прежде.

В цепочках с 15 по 20 всё — и нижняя граница, и чаевые — зачислялось пропозеру, за одним исключением. В genesis с tokens.burn_registration_fee (цепочка 21, как и каждая цепочка с 15) registration_fee у RegisterToken или RegisterBridgedToken сжигается, а пропозер оставляет себе fee − registration_fee; rand_getSupply учитывает его в registration_fees_burned. В цепочке 14, где этого флага не было, пропозер оставлял себе всю комиссию. Валидатор превращает накопленные награды в ноту командой rand-node withdraw (Стейкинг). В цепочке 21 нет ни наград за блок, ни инфляции: чаевые — весь доход валидатора. База Withdraw оплачивается на стороне реестра из выводимой суммы и никогда не проходит через разбиение комиссии бандла, поэтому не сжигается.

Одна комиссия с цепочки 20 не в RAND и не достаётся ни одному валидатору. По genesis-разделу bridge.fees (новое в v0.6.8, перенесено в цепочку 21) мост оставляет себе 10 bps от каждого депозита zUSD и от каждого сжигания zUSD, округлённых вниз до целой единицы выпуска обеспечения, в виде ноты zUSD на адрес казначейства, названный в genesis. Депозит зачисляет вкладчику брутто за вычетом комиссии; сжигание высвобождает amount − fee в исходной цепочке. Нота комиссии остаётся выпущенной и обеспеченной. См. Мост и токены RPL.

Мемпул упорядочивает кандидатов по тому, сколько они платят сверх своей нижней границы на KiB, затем по комиссии (Мемпул), поэтому более высокая комиссия имеет значение только при перегрузке. Перевод занимает около 2,85 MB (измерено в цепочке 18): доказательство бандла 1,49 MB и доказательство авторизации 1,36 MB, так что при таком размере в блок цепочки 20 в 20 MiB помещается около семи, а в блок цепочки 21 в 19 MiB — шесть (размеры доказательств набора ограничений 9 в цепочке 21 здесь пока не измерены). Собственное замечание fullnode состояло в том, что рынок комиссий на байты, а не на опкоды, — это то, чем должна стать нижняя граница до mainnet-beta. С цепочки 20 байтовая цена и есть такой рынок для вызовов: её двигают только байты, за которые платят вызовы; нижняя граница перевода по-прежнему плоская, а с цепочки 21 она сжигается.

Почему gas здесь — цена, а не предел

Ethereum тарифицирует каждый опкод, потому что каждый узел выполняет каждую транзакцию, а выполнение не ограничено. В Rand ни один узел ничего не выполняет: отправитель один раз запускает программу вне цепочки и передаёт цепочке доказательство. Работа узла на транзакцию — фиксированная последовательность: декодировать публичные поля, выполнить бесплатные проверки, проверить один STARK, — и эта проверка занимает около 16 ms при прогретом ключе верификатора, что бы ни делала программа. Поэтому три задачи gas распадаются:

  • Завершаемость обеспечивается ярусом: запуск, который не останавливается за 2ᵗ − 1 циклов, вообще не может быть доказан, и сбой поглощает prover.
  • Оценка работы — это то, что делает нижняя граница gas, начиная с chain 18. Стоимость сети на одну инструкцию близка к нулю, но работа отправителя по построению доказательства реальна, а фиксированная нижняя граница оценивала вызов в миллион циклов так же, как вызов в тысячу циклов. До chain 18 нижняя граница была фиксированной для каждого яруса.
  • Размер блока задаётся бюджетом в байтах (MAX_BLOCK_BYTES = 4 MiB по умолчанию, иначе max_block_bytes из genesis) и числом транзакций (2 000).

Две оговорки, которые fullnode формулирует прямо: байты действительно различаются (доказательство занимает более мегабайта, поэтому дефицитным ресурсом оказывается пространство блока, а не вычисления), а рост состояния — дерево, множество нуллификаторов, байты развёрнутых программ — оценивается только платой за слово при развёртывании и фиксированной базой, чего достаточно для testnet и что стоит пересмотреть, когда размер состояния станет существенным.

Что отправитель платит вместо этого: построение доказательства

Единственная переменная стоимость — построение доказательства STARK, и платит её только машина отправителя. В порядке влияния:

  1. Ярус t ∈ {10, 12, 14, 16, 18, 20} (вызов выше 14 отклоняется в сети начиная с v0.5.6; bundle закреплён за ярусом 14 и, начиная с chain 17, несёт рядом с собой доказательство авторизации яруса 10, это ещё около 7 с): таблица cpu дополняется до 2ᵗ строк, и каждый шаг примерно вчетверо увеличивает дополненную трассу. Измерено на ноутбуке разработки: private_payment на ярусе 10 — около 7 с; guest-программа bundle скрытого актива на ярусе 14 — около 100 с, какой бы актив она ни перемещала.
  2. Выполненные циклы, поскольку они определяют ярус: учитываются выполненные инструкции, а не написанные.
  3. Размер программы, слабо: одна строка дайджеста на четыре слова в начале трассы.
  4. Размер приватного входа, так же.
  5. Какие таблицы присутствуют: таблица keccak или sha256 стоит доли своих столбцов, только если guest-программа её использовала.
  6. Профиль FRI: 80 запросов вместо 27 утраивают размер доказательства, но почти не меняют время построения.

Построение доказательства не зависит от сумм, от того, сколько нот у отправителя, и от размера цепи: принадлежность доказывается относительно дерева фиксированной глубины, поэтому перевод стоит одинаково на десятом блоке и на десятимиллионном.

Справочник

constantvalue
BUNDLE_BASE1 000 000 units
BRIDGE_BURN_FEE10 000 000 units (10 × BUNDLE_BASE)
registration_fee (раздел tokens в genesis)1 000 000 000 units в chain 21, как и в chain 20, сжигается (burn_registration_fee)
DEPLOY_PER_WORD100 000 units
CALL_BASE, CALL_PER_TIER_STEP1 000 000; 100 000 units; расписание ярусов для цепи без раздела gas
GAS_PRICE_DEFAULT, BYTE_PRICE_DEFAULT100 units за gas; 800 units за KiB. Начальные цены chain 21 и их нижние границы, как в chain 20
KECCAK_GAS, SHA256_GAS, POSEIDON2_ABSORB_GAS192; 64; 3 gas за строку
max_gas_price, max_byte_price (gas.dynamic в genesis)10 000 units за gas; 80 000 units за KiB в chain 20 и 21; верхней границы нет, если параметр отсутствует (chain 18 и 19)
byte_load (gas.dynamic в genesis)paying в chain 20 и 21: на byte_price влияют только байты доказательств и оболочек call и invoke; если параметр отсутствует, то байты каждой транзакции
cell_fee (program_state в genesis)10 000 000 units (0,01 RAND) за созданную ячейку в chain 20 и 21; не более 1 000 RAND
bundle_gas_limit (раздел gas в genesis)20 479 в chain 21, как и с chain 18, gas_max(14, 0, 0); доказательство авторизации объявляет 1 279, gas_max(10, 0, 0)
adjust_bps (gas.dynamic в genesis)1 250 в chain 21, как и с chain 18; genesis может задавать от 1 до 5 000
target_block_bytes, target_block_gas (gas.dynamic в genesis)9 961 472 байт в chain 21 (10 485 760 в chain 20); 262 144 gas
раздел fees (genesis, chain 21)burn_base и burn_floor равны true: нижняя граница каждого bundle сжигается и учитывается в rand_getSupply.base_fees_burned; proposer оставляет себе fee − floor. subsidy_net_of_fees, proposer_share_bps, prove_base и usd_subsidy не заданы: они относятся к цепям с агрегацией, а в chain 21 раздела aggregation нет
MAX_PROGRAM_WORDS4 096, если genesis не задаёт max_program_words (не более 65 535; chain 20 и 21 задают 65 535, а hardening_v6 отклоняет программу свыше 8 180 слов, которую не вместил бы ни один вызов)
MAX_PROOF_BYTES2 MiB, если genesis не задаёт max_proof_bytes (6 MiB в chain 21, с запасом под доказательство авторизации private-multisig яруса 18; 4 MiB в chain 18–20; 8 MiB в chain 13–15)
MAX_BLOCK_BYTES, MAX_BLOCK_TXS4 MiB (если genesis не задаёт max_block_bytes; 19 MiB в chain 21, 20 MiB в chain 20), 2 000
ярусы10, 12, 14, 16, 18, 20; циклы ≤ 2ᵗ − 1
MAX_CALL_TIER14: доказательство вызова выше этого яруса отклоняется при допуске и в блоке (начиная с v0.5.6)

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