Rand Protocol
Документация
Руководства

Запуск валидатора и агрегатора

Аппаратные требования для каждой роли в Rand: что делают валидатор, наблюдатель, prover и агрегатор, сколько оперативной памяти, процессорных ресурсов и дискового пространства нужно каждому, какие размеры DigitalOcean используются в testnet, измеренные пределы памяти при доказательстве и команды настройки.

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

Что делает каждая роль

рольчто делаетзапускаетсядоказывает?
валидаторупорядочивает транзакции, проверяет каждое доказательство в каждом блоке, голосует в HotStuffrand-node run --validatorнет
наблюдательсинхронизируется, заново проверяет каждое доказательство, обслуживает JSON-RPC; не голосуетrand-node runнет
прувер (кошелёк)доказывает собственные пакеты и вызовы локально, затем отправляет ихrand send, rand call, rand program deployда, каждую транзакцию
делегированный пруверстроит доказательство пакета для привязанного к нему кошелька; в chain 20 ему передаётся ключ просмотра этого кошелька, но никогда не ключ расходованияrand-prover run или rand-node run --proverда, только доказательства пакетов
агрегаторстроит одно рекурсивное доказательство для окна из доказательств пакетов, для запечатывающего блокаrand-node aggregate --watchда, самые крупные доказательства
хост сборкикомпилирует rand-node и rand и передаёт бинарные файлы небольшим узламcargo build --releaseнет

Валидаторы и наблюдатели никогда не доказывают. Экранированный перевод или вызов доказывает кошелёк, который его отправляет, а само доказательство пакета — прувер, с которым этот кошелёк связан (Запуск узла). Валидаторы флота сегодня ничего не доказывают.

Агрегация блоков реализована, но не активна. Для неё нужна секция aggregation в genesis. В chain 20 её нет: агрегация выключена, как и в chain 9–19, а сборка отказывается запускаться на genesis, содержащем эту секцию.

Подбор ресурсов вкратце

рольRAMCPUдиск
валидатор или наблюдатель2 GB (исходный флот); валидатору также нужны синхронизированные часы (часы)1 vCPU (большая часть исходного флота)с --prune-history 24h — около суток блоков: таблицы блоков 3,3–4,4 GB, измерено в chain 14; держите свободными более 4 GB (диск)
архивный узел (полная история)как у валидаторакак у валидаторарастёт вместе с цепочкой: около 3,6 GB в сутки, измерено для QC из 18 подписей в chain 14 при блоках по 1,4 s; больше в chain 18–20, где QC несут до 26 подписей, что заново не измерялось; два архива testnet размещены на томах по 250 GiB
хост сборки8 GB (node E)4 vCPU (node E)дерево исходников, target/ и не менее 20 GB свободного места
прувер, экранированный перевод (уровень 14)пик 6,1 GB для перевода в chain 18, от 6,1 до 6,6 GB для вызова с оплачивающим его пакетом (2026-09-30)одно ядро; в chain 18 два доказательства: доказательство пакета уровня 14 за 102–134 s и доказательство авторизации уровня 10 за 7–23 s (ноутбук Apple Silicon, 2026-09-30); около 100 s только для пакета со скрытым активом 4-в-4 в chain 14; 92,2–96,0 s, измерено на ноутбуке для пакета 2-в-2 в chain 13 (production, 2026-09-19)небольшой
делегированный прувер5,74 GB на каждое одновременно выполняемое доказательство плюс 1 GiB запаса; при меньшем доступном объёме он отказывается запускатьсяодно ядро на доказательствонебольшой
прувер, вызов уровня 18 (ERC-20; в цепочке отклоняется начиная с v0.5.6, см. Память для доказательства)85,0 GB (транслированный transfer) / 85,5 GB (интерпретируемый), измерено на m-16vcpu-128gbодно ядронебольшой
прувер, вызов уровня 20 (SPL Token; в цепочке отклоняется начиная с v0.5.6)ещё не доказывался; экстраполяция — около 330 GB, больше, чем у самого ёмкого по памяти дроплета DigitalOcean (m-32vcpu-256gb, 256 GB)одно ядронебольшой
агрегатор, N = 1не менее 64 GB было границей до запусков 2026-09-28/29; см. Агрегаторысегодня CPUкак у валидатора
агрегатор, N = 2 / N = 3133 GB / 221 GB, измерено при наборе ограничений 7 (2026-09-28/29)узел с GPU для production при N ≥ 2как у валидатора

Сегодня прувер однопоточный. 16-vCPU дроплет работал на 99% одного ядра. Больше ядер не ускоряет одно доказательство; завершится ли оно, решает объём RAM.

Валидаторы и наблюдатели

Память и CPU

Исходные восемнадцать валидаторов работают на дроплетах по 2 GB. Проверка доказательства обходится дёшево:

операциястоимость
проверка доказательства пакета, ключ верификатора прогретоколо 16 ms
первая проверка для новой формыоколо 230 ms
построение ключа верификатора развёрнутой программы (один раз, в фоне)около 7 s на сервере с 2 vCPU
проверка одного агрегированного доказательства (когда агрегация активна)около 0,8 s холодной, около 16 ms прогретой (проектные оценки)

Память, нужная валидатору для проверки доказательства вызова уровня 18 или 20, теперь частично измерена на 48-GB ноутбуке Apple Silicon, независимо от дроплета DigitalOcean, который породил каждое доказательство: проверка доказательства transfer уровня 18 заняла 50,2 s при пиковом RSS 3,66 GB (транслированное) или 49,6 s (интерпретатор, RSS отдельно не записывался); проверка доказательства approve уровня 16 заняла 12,2 s (RSS отдельно не записывался). Уровень 20 не измерен — доказательства уровня 20 для проверки пока не существует. Начиная с v0.5.6 валидатор никогда не строит настолько большой ключ: заголовок доказательства вызова проверяется до построения любого ключа верификатора, а вызов выше уровня 14 (или с таблицей keccak больше 2^12, или с таблицей sha256 больше 2^13) отклоняется — при приёме и как правило валидности блока. Худший допустимый заголовок вызова проверялся за 4,7 s и 312 MB.

Дроплет с 1 vCPU и 2 GB не может собрать бинарные файлы. Собирайте на более мощной машине и копируйте их (см. настройка).

Диск

показательзначениеисточник
простаивающий блок chain 14 до v0.5.5около 60 KB в blocks плюс около 49 KB в qcs: QC из 18 подписей Dilithium2 хранился дважды, около 6,6 GB в сутки при блоках по 1,4 sинцидент с диском 2026-09-24, AGENTS.md
тот же блок начиная с v0.5.5около 60 KB: QC зафиксированного блока хранится один раз, в justify его потомка; около 3,6 GB в сутки при блоках по 1,4 sdocs/deploy.md, заметка о выкатке v0.5.5
журнал упреждающей записи RocksDBограничен 256 MB с исправления 2026-09-24; до него — 13 GB неочищенного журнала на валидаторAGENTS.md
валидатор chain 14 после завершения --prune-history 24h (2026-09-25)таблицы блоков 3,3–4,4 GB, было 19 GB; диски заполнены на 18–37%AGENTS.md, v0.5.7
каталог данных node A, chain 12 на высоте 62 276около 10 GBdeploy/README.md, выкатка v0.3
цепочка с полными блоками4 MiB каждые 2 s, около 170 GB в сутки (лимит блока в цепочках до chain 12; в chain 20 он равен 20 MiB)docs/block-space.md
свободное место, которое флот держит для сборокне менее 20 GBdocs/block-space.md
диск на 30 GB с каталогами данных трёх цепочекзаполнен; RocksDB No space left on device, цикл паденийmkc1 и mem1, deploy/README.md

В chain 20, как и в chain 19, 24 из 26 валидаторов работают с --prune-history 24h и хранят около суток блоков; сам реестр состояния (ноты, нуллификаторы, якоря, реестр) никогда не обрезается. Архивы, obs1 и rand-archive-2 (оба также являются валидаторами), работают без этого флага. Узел mainnet никогда его не передаёт. Узел отказывается запускаться, если на файловой системе его каталога данных свободно меньше --min-free-disk-mb (по умолчанию 1 024 MB), а rand_getHealth отвечает disk_low, когда свободно меньше четырёхкратного значения; выкатка, ожидающая ok, останавливается на заполняющемся узле. О том, на что отвечает обрезанный узел, см. Обрезка истории.

Удаляйте каталог данных выведенной из обращения цепочки после переключения. Каталоги данных именуются по хешу генезиса (data-<name>-<hash8>: -6210cf07 для цепочки 20, -a3defc93 для цепочки 19; шесть хостов-хранителей используют /var/lib/randnode/data-20), поэтому старые остаются, пока вы их не удалите. При переключении на цепочку 20 один региональный валидатор (syd1) поднялся в состоянии disk_low при 3,9 GB свободного места и задержал запуск на 25 из 26, потому что на нём ещё лежали каталоги цепочек с 14 по 17; их удаление освободило 22 GB. Каталог предыдущей цепочки держите сутки как цель отката, затем удаляйте. При полных блоках каждое необработанное доказательство пакета занимает около 1,42 MB начиная с цепочки 14 (около 1,3 MB до цепочки 13). Начиная с цепочки 17 каждый пакет несёт ещё и доказательство авторизации, так что перевод — это около 2,85 MB доказательств: около 1,49 MB на доказательство пакета и 1,36 MB на доказательство авторизации (производственный профиль, измерено 2026-09-29). Агрегация после активации сокращает доказательство запечатанного пакета примерно до 3 KB, если только узел не запущен с --keep-raw-proofs. На доказательство авторизации она не распространяется: оно остаётся полного размера.

Сеть

Откройте входящий TCP 30303 на публичном узле. Узлы за NAT подключаются наружу с помощью --bootstrap. При полных блоках по 4 MiB канал валидатора передаёт около 2 MB/s.

Часы

Валидатору нужен NTP. Цепочка 14 — первая, в которой системное время входит в консенсус (усиление моста, B2):

правилопределвид
временная метка блока не может опережать временную метку его родителя больше чем на это значение60 s (MAX_TIMESTAMP_STEP_MS)правило валидности; блок недействителен (BlockError::TimestampLeap)
валидатор не голосует за блок, чья временная метка опережает его собственные часы больше чем на это значение15 s (MAX_CLOCK_DRIFT_MS)правило голосования

Валидатор, чьи часы отстают на 20 s, молча перестаёт голосовать: каждый честный блок он видит опережающим его часы и не отдаёт голос, при этом ничего не сообщает об ошибке. В цепочке 20 для фиксации чего-либо должны проголосовать восемнадцать из двадцати шести. Проверьте каждый валидатор и установите chrony там, где часы не синхронизированы:

timedatectl                     # want "System clock synchronized: yes" and "NTP service: active"
chronyc tracking 2>/dev/null || timedatectl show-timesync --all 2>/dev/null
apt-get install -y chrony && systemctl enable --now chrony

Тот же предел в 15 s действует для генезиса. Задавайте timestamp_ms близко ко времени запуска и никогда не позже него: генезис, лежащий в будущем более чем на 15 s, не зафиксирует блок 1, пока системное время не дойдёт до него, а генезис из далёкого прошлого оставляет время блока позади системных часов, и оно догоняет их не быстрее чем на 60 s за блок (docs/deploy.md). Наблюдатель не голосует, поэтому правило голосования его не связывает.

Размеры DigitalOcean, на которых работает testnet

размерRAM, vCPU, дискузлыпримечания
s-1vcpu-2gb2 GB, 1большинство региональных валидаторов (среди них ams3, nyc1, nyc2, sfo2)сборка невозможна; бинарные файлы копируются
s-1vcpu-2gb-amd2 GB, 1atl1как выше
s-2vcpu-2gb-intel2 GB, 2D (ric1)
s5-1vcpu-2gb-30gb2 GB, 1, 30 GBmkc1, mem1 (единственный малый размер там)диски были заполнены (29 GB) при переключении на цепочку 13; 7 GB свободно после удаления каталогов данных мёртвой цепочки 11; требуется увеличение диска
4 vCPU, 8 GB8 GB, 4E (sgp1)валидатор, сборочный хост и обозреватель

Эта таблица охватывает первоначальные восемнадцать валидаторов. С 2026-09-27 валидатор A тоже работает на droplet (sgp1), а не на ноутбуке. Ещё восемь валидаторов внесли залог в цепочке 15 (2026-09-27): два архивных, obs1 и rand-archive-2 (fra1), и шесть хостов-хранителей. Размеры их droplet здесь не записаны, как и то, были ли mkc1 и mem1 увеличены. Все 26 — валидаторы генезиса цепочки 20, как и цепочки 19, по 1 000 RAND каждый, и по состоянию на 2026-09-30 все 26 ключей находятся у одного оператора.

Память для доказательств

Кошелёк доказывает каждую отправляемую транзакцию, поэтому вызывающему программу нужна память под ярус этой программы. Ниже приведены измеренные границы. Прогоны яруса 18 завершились, доказательства построены и проверены на DigitalOcean; ярус 20 — нет. Начиная с v0.5.6 цепочка отклоняет доказательство вызова выше яруса 14 (MAX_CALL_TIER), поэтому строки ярусов 16, 18 и 20 ниже — это измерения, а не вызовы, которые допускает цепочка 20; каждый вызов, зафиксированный в цепочке 14, был яруса 10.

нагрузкаярусциклычто измеренотребуется
экранированный перевод (гостевая программа bundle)14около 9 160 в цепочке 13 (гостевая программа с 2 входами и 2 выходами)92,2–96,0 s на ноутбуке с Apple Silicon (производственный профиль, цепочка 13, 2026-09-19); пиковая память не записана. Гостевая программа цепочки 14 с 4 входами и 4 выходами и скрытым активом привязана к тому же ярусу: около 100 s и доказательство около 1,42 MB. В цепочке 20 перевод — это два доказательства (раздельная авторизация, начиная с цепочки 17): доказательство пакета яруса 14, от 102 до 134 s и около 1,49 MB, и доказательство авторизации яруса 10, от 7 до 23 s и около 1,36 MB. Пиковая память от 6,1 до 6,6 GB на всю транзакцию (ноутбук с Apple Silicon, цепочка 18, 2026-09-30)работает на ноутбуке разработчика
ERC-20 approve (производственный профиль, в цепочке 13, 2026-09-19)1648 119доказательство вызова 388,7 s, 3 412 405 байт; весь rand call — 622,8 s при пиковом RSS 22,9 GB на ноутбуке серии M с 48 GBноутбук с 48 GB
вызовы ERC-2018от 66k до 162ktransfer первой стадии (79 203 цикла, до защиты кода) был завершён сигналом SIGKILL на ноутбуке с 48 GB при 24,7 GB через 1 016 s; прогон на droplet с 64 GB превысил 47 GB на 25-й минутепиковый RSS 85,0 GB (транслированный) / 85,5 GB (интерпретируемый), время доказательства 3 230,5 s / 3 143,3 s, доказательства 811 600 / 805 108 байт. Измерено на m-16vcpu-128gb, 2026-09-19
векторы SPL Token20от 700k до 770kтранслированный Transfer (692 854 цикла, до защиты ELF) был остановлен на ноутбуке с 48 GB при 30,77 GB через 225 s, доказательство ещё шло; прогон яруса 20 был убит из-за нехватки памяти (OOM) на droplet с 64 GB при 65,1 GB через 10 m 41 sещё не доказано; экстраполяция: около 330 GB и около 3,6 h (измеренное масштабирование ярусов 16/18: память примерно ×3,9, время примерно ×4,1 на каждые +2 яруса) — больше, чем у самого большого по памяти droplet DigitalOcean (m-32vcpu-256gb, 256 GB)
производственный выход rVM яруса 21 (одно доказательство пакета, проверенное внутри рекурсивной VM)211 968 619 строкрасчётная потребность 48,6 GB до запуска; при наборе ограничений 7 потребовалось больше, чем было у droplet с 256 GB (2026-09-28/29)больше 256 GB; при наборе ограничений 8 заново не измерялось

Вызовы ERC-20 приходятся на ярусы 16 и 18, а SPL Token — на ярус 20 (Ethereum, Solana). Ни одно доказательство яруса 18 или 20 не построено на машине с 48 GB.

Агрегаторы

Агрегатор следит за цепочкой, берёт доказательства пакетов из окна финализированных блоков, строит по ним одно рекурсивное агрегированное доказательство и отправляет его. Блок, который его включает, — запечатывающий блок. Агрегатору выплачивается доля за доказательство охваченных пакетов плюс субсидия блока в новых RAND на его зарегистрированный адрес выплат. Агрегация не требует разрешений: зарегистрироваться может любой оператор с залогом.

Она существует только в цепочке, генезис которой содержит секцию aggregation. В цепочке 20 такой секции нет, и её сборка отказывается запускаться на генезисе, который её содержит.

Оборудование

агрегатRAM хостабэкенд
N = 1 пакетне менее 64 GBCPU; тестовый профиль доказал один примерно за 26 минут на загруженном ноутбуке (327 035 байт)
N = 2133 GB измерено; прежняя оценка — не менее 128 GBGPU-бэкенд для производства
N = 3221 GB измерено; прежняя оценка — не менее 160 GBGPU-бэкенд для производства
GPU-узел паркане менее 160 GB у хоста, устройство с 80 GB (H100 или A100-80G)Linux, драйвер R580+, CUDA 13, LLVM 21, sm_80+; пока ни одного нет

Значения для N = 2 и N = 3 измерены на droplet DigitalOcean с 256 GB 2026-09-28/29 при наборе ограничений 7, а производственному доказательству выхода потребовалось больше, чем 256 GB этой машины. Ни одно из них не измерялось заново при наборе ограничений 8, который используют цепочки с 18 по 20, поэтому строку N = 1 следует считать нижней границей. Бэкенд CUDA впервые запустился на реальном оборудовании 2026-09-28, на NVIDIA H100: его ядра собираются в PTX для sm_80 и sm_90 и совпадают с эталоном на CPU. Производственное измерение на GPU-узле парка ещё предстоит сделать. Кроме того, каждый узел один раз при запуске платит за сборку ключей для программы агрегации: от 13,0 до 13,4 s в тестовом профиле (2¹⁹) и ожидаемые от 30 до 70 s в производственном (2²¹).

Команды

# print a signed registration; the bond burns out of a wallet bundle as the register bundle's burn
rand-node aggregator register --key agg.key.json --bond <RAND> --payout rand1… --rpc http://127.0.0.1:8545

# the daemon: poll rand_getUnsealed, fetch the raw bundles, prove, seal the payment note, submit
rand-node aggregate --key agg.key.json --rpc http://127.0.0.1:8545 --watch

# leave, then withdraw the released bond into a note at the payout address
rand-node aggregator unbond --key agg.key.json --rpc http://127.0.0.1:8545
rand-node aggregator withdraw --key agg.key.json --rpc http://127.0.0.1:8545
флаг aggregateпо умолчаниюзначение
--keyобязателенключ агрегатора, известный реестру; подписывает каждый агрегат
--rpchttp://127.0.0.1:8545узел, который опрашивается и которому отправляются агрегаты
--watchвыкл.продолжать опрос вместо однократной отправки
--interval-secs15интервал опроса при --watch
--no-waitвыкл.вернуться, как только узел примет агрегат

В такой цепочке rand status показывает раздел aggregation: зарегистрированные агрегаторы, незапечатанные блоки и индекс графика субсидий. rand_getUnsealed возвращает список работы.

Установка

Эти шаги повторяют скрипты, которыми пользуется testnet (deploy/vps-setup.sh, deploy/update-droplet.sh). В результате получается Linux-валидатор или наблюдатель.

1. Сборка на сборочном хосте

Для сборки нужны build-essential clang cmake pkg-config libssl-dev, Rust 1.98.1 (закреплён в rust-toolchain.toml) и репозиторий circuits рядом с репозиторием fullnode. Первая сборка занимает от 10 до 20 минут.

git clone https://github.com/randprotocol/fullnode
git clone https://github.com/randprotocol/zkp-circuits circuits
cd fullnode
git checkout v0.6.8                       # c9c9bd3c, the build chain 20 runs
git -C ../circuits checkout "$(sed -n 's/^circuits: //p' crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"   # aeacf31 for v0.6.8
git show origin/main:deploy/genesis-chain20.json > deploy/genesis-chain20.json   # committed after the tag
cargo build --release -p randprotocol-node -p randprotocol-client
sha256sum target/release/rand-node         # compare on every node you copy it to

Цепочке 20 требуется v0.6.8 на каждом узле до init. Её genesis содержит поля, которых не читает ни одна более ранняя сборка (testnet, binding_domain, proof_window_blocks, program_state, группы rotation и fees моста, потолки gas, допуск в стейкинг по голосованию), а v0.6.8 включает изменения консенсуса CON-4 и CH-1 из аудита v6. Доказательства по-прежнему строятся по набору ограничений 8, как в цепочках 18 и 19, и рядом с каждым доказательством пакета идёт доказательство авторизации (hc_auth). Сборка v0.6.8 отказывается принимать genesis цепочек с 14 по 17 при run и verify. Собирайте ту же сборку, что и весь парк узлов. Файл genesis лежит в ветке main репозитория fullnode (коммит 74cfaca0), а не в теге v0.6.8, отсюда третья строка git. Репозиторий circuits должен находиться на коммите, из которого был взят вендоринг релиза; его читает вторая строка git выше из дерева fullnode. Добавьте -p randprotocol-prover, чтобы собрать и rand-prover.

2. Установка бинарных файлов на узел

scp target/release/rand-node target/release/rand deploy/genesis-chain20.json root@<node>:/root/
ssh root@<node> 'install -m 755 /root/rand-node /root/rand /usr/local/bin/'

3. Ключ, genesis, брандмауэр

На узле:

install -d -m 700 /root/keys
test -e /root/keys/node.key.json || rand-node keygen --out /root/keys/node.key.json   # prints the address; keep the seed secret
rand-node init --datadir /root/data-6210cf07 --genesis /root/genesis-chain20.json
timedatectl                                        # "System clock synchronized: yes" (see Clock)
ufw allow 22/tcp && ufw allow 30303/tcp && ufw enable

Генерируйте ключ на самом узле, как показано выше, и храните его вне любого checkout. В репозитории fullnode больше не отслеживается ни один ключ (аудит v3, OPS-1). Файлы deploy/node-*.key.json, закоммиченные для цепочек с 8 по 13, — это опубликованные seed; ключи валидаторов цепочки 20 (восемнадцать, созданных для цепочки 14, и восемь, вошедших в залог в цепочке 15) были сгенерированы вне репозитория, а парк узлов хранит ключ каждого droplet в /root/keys/node-<name>.key.json, за пределами дерева исходников. Расположение важно на узле, развёрнутом скриптами парка: deploy/rebuild-vps.sh и deploy/push-to-vps.sh синхронизируют /root/fullnode через rsync с --delete, поэтому ключ внутри этого дерева будет удалён при следующей пересборке, и после этого юнит не сможет перезапуститься. Начиная с v0.6.8 keygen отказывается перезаписывать существующий файл (v0.6.7 перезаписывал его без предупреждения); test -e делает строку безопасной для повторного запуска в любом случае. Сделайте резервную копию ключа вне хоста, прежде чем вносить его в залог.

init печатает хеш genesis. Он должен быть равен 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 (цепочка 20). Файл genesis называется genesis-chain20.json и лежит в deploy/ репозитория fullnode в ветке main. Назовите каталог данных по первым восьми символам хеша, как это делает парк узлов (data-<name>-6210cf07), чтобы он никогда не совпал с каталогом цепочки 19 (-a3defc93) или более поздней цепочки. Genesis задаёт следующие лимиты. Предел размера доказательства составлял 8 MiB в цепочках с 13 по 16 и равен 4 MiB начиная с цепочки 17, где транзакция стала нести до трёх доказательств:

лимитцепочка 20
max_program_words65,535
max_proof_bytes4,194,304 (4 MiB)
max_block_bytes20,971,520 (20 MiB)
max_call_envelope_bytes65,536
max_program_public_words32,768
envelope_bytes1,860 (каждый конверт ноты, вместе с полем зашифрованной памятки)
proof_window_blocks1,024 (256 в цепочке 19)
program_stateплата за ячейку 0.1 RAND (10,000,000 единиц); не более 8 чтений, 8 записей и 4 выплат на один invoke
раздел aggregationотсутствует (агрегация выключена)

Genesis цепочки 20 также содержит consensus_domain: 1, binding_domain: 1, testnet: true, раздел staking с допуском по голосованию, раздел gas с потолками цен, группы моста rotation и fees, hardening_v6 и две привязки guest-программ hc_bundle и hc_auth; что именно они задают, перечислено в Running a node.

4. Юнит systemd

Это юнит, который записывает deploy/vps-setup.sh, с указанными выше путями:

[Unit]
Description=RAND full node
After=network-online.target
[Service]
Environment=RUST_LOG=info,libp2p=warn,libp2p_mdns=off
ExecStart=/usr/local/bin/rand-node run --datadir /root/data-6210cf07 --key /root/keys/node.key.json --validator --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns --prune-history 24h --bootstrap <multiaddr> --bootstrap <multiaddr>
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target

Для наблюдателя уберите --validator. --prune-history 24h — то, с чем работают валидаторы testnet, кроме архивных; уберите его для узла, хранящего полную историю, и никогда не передавайте его на mainnet-beta. Bootstrap-мультиадреса цепочки 20 — узлы C (fra1), D (ric1) и E (sgp1), без изменений по сравнению с цепочкой 19. Цепочка 20 работает на ключах валидаторов, созданных для цепочки 14, а p2p-идентификатор выводится из ключа валидатора, поэтому эти peer id — те же, что использовались в цепочке 14. Новому узлу, синхронизирующемуся с genesis, также нужен пир с полной историей, поэтому добавьте один из двух архивов (obs1, затем rand-archive-2):

/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
/ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf
/ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh

Держите RPC на 127.0.0.1, если его не защищает брандмауэр. Узел, который должен обслуживать публику, открывает рядом с ним публичный listener v0.6.8 (--public-rpc <ADDR>) и ставит прокси перед ним, но никогда не перед --rpc (JSON-RPC). Юнит, перенесённый из v0.6.7, не должен передавать --prover-accept-spend-key: v0.6.8 отказывается стартовать с этим флагом.

systemctl daemon-reload && systemctl enable --now rand-node
journalctl -u rand-node -f
rand status                       # height climbing, peer_count rising

5. Вход в набор валидаторов

Новый ключ не входит в набор ни одной эпохи. В цепочке 20 его сначала нужно принять голосованием: её genesis задаёт staking.admission_by_vote, поэтому валидаторы, держащие более двух третей веса голосов, подписывают его каждый командой rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash <chain 20's hash>, а один из них отправляет голоса командой rand-node admit submit; после этого rand_getAdmitted показывает ключ в списке. Затем внесите в залог за него не менее 1,000 RAND: напечатайте регистрацию командой rand-node register --key /root/keys/node.key.json --payout rand1… --v2 (цепочка 20 отклоняет регистрацию v1), затем внесите залог из кошелька командой rand bond <address> 1000 --registration <hex>. Залог ждёт своей эпохи активации, не раньше чем через три границы по 1,000 блоков после его фиксации, и на каждой границе новым весом может стать не более 2,500 bps активного веса (цепочка 19 ограничивала это фиксированными 10,000 RAND). Пошаговый разбор — в Staking.

6. Обновление

Это относится к сборке, работающей в той же цепочке. Переход с более ранней цепочки на цепочку 20 обновлением не является: он требует нового бинарного файла, нового genesis и нового каталога данных, а каталог данных старой цепочки после этого можно удалить (deploy/retire-chain-dirs.sh; парк узлов хранит его сутки на случай отката). Чтобы выкатить новую сборку без смены цепочки, соберите её один раз, сравните sha256 у rand-node и rand, остановите сервис, установите и перезапустите, по одному узлу за раз. Некоторые релизы выкатываются иначе: все узлы останавливаются, затем все запускаются (правило уровня вызовов в v0.5.6, изменение wire-формата Status в v0.5.7, более строгая проверка доказательств в v0.6); в примечаниях к каждому релизу сказано, как именно. v0.6.7 выкатывался на цепочку 18 по одному узлу; v0.6.8 пришёл вместе с цепочкой 20 по схеме «остановить все, запустить все», потому что его изменения консенсуса CON-4 и CH-1 ни в коем случае нельзя выкатывать узел за узлом. Дожидайтесь, пока каждый узел вернётся в сеть, прежде чем переходить к следующему, чтобы кворум никогда не оказывался неполным больше чем на один узел. deploy/update-droplet.sh <ip> [build-host] делает именно это по SSH.

Релизы до v0.6.8 включительно собирались вручную на одном хосте и не подписаны. Релиз v0.6.8 на GitHub содержит rand-node, rand, rand-prover и SHA256SUMS, собранные на узле E; эта контрольная сумма выявляет повреждённую загрузку, но не ручается за сборочный хост. v0.6.8 поставляется с release workflow, который собирает бинарные файлы из тега, а deploy/update-droplet.sh отказывается от установки без подписанного SHA256SUMS, если не задано ALLOW_UNSIGNED=1. deploy/release-signers пока не содержит ни одного ключа, поэтому подписанный путь ещё не использовался.

Цепочки 15, 16, 17 и 18 были запущены за 2.7 суток (с 2026-09-26 по 2026-09-29), и каждая означала остановку всего парка узлов. Цепочка 19 последовала 2026-10-01 в 03:43 UTC как повторный genesis цепочки 18 на той же сборке, а цепочка 20 — в тот же день в 06:17 UTC, вырезанная из снимка цепочки 19 при хардфорке v0.6.8; все узлы остановились на высоте 7,700 цепочки 19. Письменная политика смены цепочки (2026-09-30) действует начиная с цепочки 20; запись о смене цепочки 20 освободила от пересборки вторым оператором, потому что все ключи держит один оператор. Смена цепочки требует причины, которую не может устранить поэтапное обновление, опубликованного списка того, что она вносит и что убирает, заранее выполненного чек-листа пересборки клиентов, второго оператора, который пересобирает genesis до того же хеша, плана отката и идентификатора цепочки, никогда прежде не использовавшегося.

Последняя проверка по коммиту fullnode c0878c3f (chain 21) от 2026-10-12, а также fullnode v0.8.0 `c0878c3f` (`docs/deploy.md`, `docs/cli.md`, `docs/staking.md`, `docs/node-hardware.md`, `deploy/cutover-fleet-chain21.sh`, `CHANGELOG.md`) and `main` `246cb5f9` (`deploy/genesis-chain21.json`, `deploy/cut-records/chain21.record`); the live chain-21 RPC, 2026-10-12, fullnode `90e7716` (v0.6.7 `86941a1` and `main` after it, 2026-09-30: `deploy/nodes.env`, `deploy/genesis-chain18.json`, `deploy/README.md`, `deploy/vps-setup.sh`, `docs/deploy.md`, `docs/node-hardware.md`, `docs/prover.md`, `docs/cli.md`, `docs/staking.md`, `README.md`, `CHANGELOG.md`, `AGENTS.md`), fullnode `8abf85e` (v0.5.9: `docs/rpc.md`), fullnode `ed88241` (`deploy/README.md`, `deploy/nodes.env`, `deploy/genesis-chain14.json`, `deploy/run-a.sh`, `deploy/vps-setup.sh`, `deploy/update-droplet.sh`, `docs/deploy.md`, `docs/superpowers/handoffs/2026-09-20-chain14-cut-runbook.md`, `docs/aggregation.md`, `docs/block-space.md`, `docs/zkvm-m4-m5-progress.md`, `docs/cli.md`). Если код и эта страница расходятся, прав код; сообщите нам.