Rand — проект с открытым исходным кодом. Полный узел, обозреватель, мост, исследования по доказательствам и клиенты кошелька находятся каждый в своём репозитории на GitHub. Читайте код, запускайте тесты, присылайте патчи. Эта страница — карта: где живёт каждый компонент, на чём он построен, как далеко продвинулась система доказательств и где она останавливается сегодня.
Репозитории
| репозиторий | что содержит | язык |
|---|---|---|
randprotocol/fullnode | Эталонный полный узел и кошелёк: chained HotStuff BFT, сетевой стек libp2p, экранированный пул нот RAND, верификатор доказательств zkVM, JSON-RPC, CLI-кошелёк rand и делегированный провер rand-prover. | Rust |
randprotocol/randscan.org | Обозреватель блоков randscan.org: индексатор на axum с REST- и WebSocket-API поверх PostgreSQL и фронтенд на Next.js. | Rust · TypeScript |
randprotocol/bridge | Мост хранителей (guardian bridge) для USDT и USDC из Ethereum, Binance Smart Chain, Tron и Solana: контракты хранения, общий формат аттестаций и его тестовые векторы. | Solidity · Rust |
randprotocol/zkp-circuits | Разборы систем доказательств (Groth16 и STARK, экранированный пул, кольцевые подписи, миксер), research/, эталонная zkVM Rand, recursion/, рекурсивная ВМ, инструментарий для гостевых программ и два транслятора, а также ядра CUDA. Для сборки fullnode этот репозиторий должен быть расположен рядом с ним как circuits/. | Rust |
randprotocol/clients | Клиенты кошелька: для настольных систем, веба, iOS и Android. | Rust · Swift · Java · JavaScript |
Стек
Rust от начала до конца. Rand — самостоятельная цепочка: узел HotStuff BFT со слоем gossip на libp2p, полностью экранированный пул нот в роли реестра, постквантовые подписи и шифрование нот, а также zkVM Rand для конфиденциальных вычислений — всё это в репозитории fullnode. Сама система доказательств — та часть, над которой идёт активное исследование; о ней ниже.
| уровень | что работает |
|---|---|
| Консенсус | Chained HotStuff BFT, кворумы, взвешенные по стейку, коммит по трёхцепочечному правилу |
| Сеть | libp2p: TCP, Noise, Yamux, gossipsub, Kademlia, mDNS в локальных сетях |
| Реестр | Экранированный пул нот: дерево Poseidon2 глубины 32, множество нуллификаторов, один пакет 4-в-4 со скрытым активом на транзакцию (2-в-2 вплоть до chain 13); начиная с chain 17 — второе доказательство авторизации уровня 10 рядом с доказательством пакета (раздельная авторизация); начиная с chain 18 — конверты нот по 1 860 байт с зашифрованной припиской |
| Токены | RPL: токен — это запись в реестре с идентификатором rpl1…, а не контракт; он перемещается нотами в том же пуле |
| Стейкинг | Публичный реестр валидаторов: залог из пакета, двухэпохальный вывод из залога, эпохи по 1 000 блоков; начиная с chain 20 новый валидатор принимается голосованием набора |
| Конфиденциальные вычисления | zkVM Rand: RV32IM под пакетным STARK на Plonky3, FRI со скрытием ZK, набор ограничений 8; начиная с chain 18 вызов объявляет лимит газа, который обеспечивает схема, и оплачивается за газ и за КиБ; начиная с chain 20 программа хранит состояние в ячейках и держит стоимость в хранилище (RPL-2) |
| Криптография | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| Хранение | Одна RocksDB на узел, коммиты с fsync, проверка целостности при запуске; опциональная обрезка истории (--prune-history 24h), архивные узлы хранят всё |
| Мост | Блокировки, заверенные хранителями, в четырёх цепочках, с кворумом сопутствующих подписей Dilithium2 на каждый выпуск; мостовой актив — это нота в том же пуле |
| Язык | Rust везде; Solidity для моста, TypeScript для обозревателя |
Одно отношение для каждой программы
Универсальное отношение исполнения R_exec из whitepaper существует в виде кода: rand_zkvm — машина RV32IM, доказываемая единым пакетным STARK на Plonky3 над полем Goldilocks. Оно доказывает, что некоторая трасса выполнила программу hc с данными публичными выходами на входах, зафиксированных посоленным H_IN, и ничто в программе никогда не является параметром верификатора. Публикация конфиденциальной программы означает регистрацию хеша, а не создание специальной схемы.
Система доказательств прозрачна: без доверенной настройки и без кривой со спариванием, а её допущение — устойчивая к коллизиям хеш-функция. Ожидается, что все остальные компоненты, работающие с доказательствами, сойдутся на этом крейте, а не обзаведутся собственным. Крейт находится в zkp-circuits/research и вендорится в fullnode на наборе ограничений 8 (circuits aeacf31, fullnode v0.6.7 и v0.6.8). Таблицы и измерения ниже описывают набор ограничений 5 (этап M4.2), если строка не называет более поздний набор; они взяты из docs/zkvm.md, docs/zkvm-milestones.md и docs/confidential.md fullnode по состоянию на 2026-09-13, а измерения приведены такими, какими были получены на ноутбуке с Apple Silicon, а не как целевые значения.
Восемь таблиц на именованных шинах, девятая по требованию
Одно обязательство, одно открытие FRI. Таблицы никогда не вызывают друг друга; они обмениваются фактами по именованным шинам LogUp (PROGRAM, PROGRAM_WORD, MEMORY, ALU, POSEIDON2, INPUT_DIGEST, INPUT_READ, KECCAK и таблицы поиска для диапазонов и ниблов), а верификатор проверяет, что каждая шина сбалансирована глобально. Максимальная степень ограничений каждой таблицы закреплена тестом под пределом 8, который допускает коэффициент расширения FRI.
| таблица | вид | роль |
|---|---|---|
program | witness | Необработанные слова инструкций, декодируемые в схеме начиная с M3.4 и сворачиваемые cpu в hc |
cpu | witness | Одна строка на такт, плюс строки дайджеста, которые поглощают программу в hc, а посоленные входы — в H_IN |
memory | witness | Регистры и ОЗУ в одной таблице, отсортированной по (space, addr, ts); доступ меньше слова начиная с M2.5 |
alu | witness | Арифметика по байтовым лимбам, сдвиги, сравнения; умножение и деление RV32M начиная с M2.6 |
range | предвычисляемая · 256 строк | Проверки диапазона и поиск по степеням двойки |
nibble | предвычисляемая · 256 строк | 4-битные AND, OR, XOR; попадание само является проверкой диапазона для обоих операндов |
poseidon2 | witness | Одна строка на раунд перестановки в блоках по 32 строки; обслуживает шину POSEIDON2 и оба дайджеста |
input | witness · начиная с M4.1 | Одна строка на слово приватного входа; обслуживает INPUT_DIGEST и INPUT_READ, поэтому чтение не может выйти за пределы обязательства |
keccak | witness · опциональная | Keccak-f[1600] в блоках по 32 строки, присутствует только в доказательстве, где гостевая программа вызывала KECCAK (M4.2) |
С тех пор появились ещё три набора ограничений. Набор 6 добавил обязательную таблицу public для публичного входа программы, задаваемого при развёртывании и привязанного к несоленому дайджесту H_PUB, а также опциональную таблицу sha256 рядом с keccak. Набор 7 (chain 16) ослепляет каждый терминал LogUp на новой шине BLIND, устанавливает нижнюю границу 2⁷ строк для каждой объявленной таблицы и добавляет системный вызов POSEIDON2_LEN с привязкой к длине. Набор 8 (chain 18) добавляет столбец GAS в таблицу cpu и одно публичное значение — объявленный GAS_LIMIT.
Что раскрывает доказательство
Публично: хеш кода hc (восемь слов дайджеста в схеме), посоленное обязательство входа H_IN (восемь слов), уровень газа и восемь слов выхода. Начиная с набора ограничений 6 также H_PUB — дайджест публичного входа, а начиная с набора ограничений 8 — объявленный лимит газа. Заголовок доказательства объявляет высоты таблиц Keccak и SHA-256, поэтому он показывает, выполнялось ли хеширование и, выше нижней границы 2⁷, примерно в каком объёме.
Скрыто: приватные входы (H_IN посолен, поэтому он не только связывающий, но и скрывающий); каждое слово инструкции, потому что верификатор проверяет hc, а не программу; каждое значение регистров и памяти; каждая выбранная ветвь; точное число тактов и точный израсходованный газ; и то, какие системные вызовы выполнялись, помимо того, что показывают высоты двух хеш-таблиц.
Уровень публичен для каждого доказательства, потому что размер STARK и так раскрывает высоту его трассы; скрытие индекса ничего бы не дало. hc является связывающим, но не скрывающим: см. где он останавливается сегодня.
Измерено, на наборе ограничений 5
| FRI | 80 запросов · 20 бит PoW · коэффициент расширения 8 · арность 8 · ZK включён; 260 бит по гипотезе, около 86 доказанных. Перенастройка M2 на 27 запросов была отменена аудитом 2026-09-12 |
| Вызов | private_payment на уровне 10: около 7 с на доказательство, около 1,2 МБ доказательства при 80 запросах (435 КБ при 27), против 21,6 с и 892 КБ на M1 |
| Перевод | Гостевая программа пакета 2-в-2 цепочек вплоть до 13: 3 811 слов, около 9 160 тактов, уровень 14; около 100 с на доказательство, около 1,3 МБ доказательства. Гостевая программа chain 14 со скрытым активом 4-в-4 закреплена за тем же уровнем: около 100 с, около 1,42 МБ |
| Верификация | Около 16 мс с прогретым ключом; первая верификация по новому ключу (уровень, высоты) — около 230 мс |
| Блок | Бюджет 4 МиБ и предел доказательств 2 МиБ: около трёх экранированных переводов на блок при 80 запросах |
Ноутбук с Apple Silicon, релизная сборка. Время доказательства сдвинуло разделение байтовых таблиц в M2.3; размер доказательства вернул наверх профиль с 80 запросами. Ключ верификатора не зависит от содержимого программы: он определяется уровнем и объявленными в доказательстве высотами таблиц программы, входа и keccak, поэтому узел прогревает один ключ и использует его повторно.
Более поздние наборы изменили размеры. При наборе ограничений 7 доказательство яруса 10 занимает 1,367,688 байт в производственном профиле, а доказательство яруса 10 с Keccak — 3,283,898 (измерено 2026-09-28). Начиная с цепочки 17 перевод несёт два доказательства: доказательство пакета яруса 14, около 1.49 MB, и доказательство авторизации яруса 10, около 1.37 MB, на построение которого уходит около 7 с. Генезис цепочки 20 задаёт блок в 20 MiB и предел доказательства в 4 MiB, а вызов не может превышать ярус 14.
Три цели, одна схема
Нативно исполняется только RISC-V. Программы на Solidity и Solana либо работают на гостевом интерпретаторе внутри того же отношения, а их байткод подаётся на вход, либо транслируются вне цепочки в программы RISC-V, выходы которых слово в слово совпадают с выходами интерпретатора. Дорогие опкоды требуют выделенных таблиц сопроцессоров, а не побитовой симуляции.
| цель | путь | сопроцессоры |
|---|---|---|
| RISC-V | Нативно. RV32IM, либо собранный вручную через asm.rs, либо скомпилированный no_std Rust для riscv32im-unknown-none-elf, загружаемый как плоский бинарный файл начиная с M4.1, либо собранный из Rust или C инструментом rand-guest в контейнер образа (Развёртывание программы на Rust) | Poseidon2 (и POSEIDON2_LEN начиная с набора 7); Keccak-f[1600] начиная с M4.2; SHA-256 начиная с набора 6 |
| Solidity | solc --bin-runtime в байткод EVM, затем либо гостевой интерпретатор evm.bin (байткод на входе), либо evm2rv, который транслирует байткод в C, а rand-guest собирает его в образ RV32IM с теми же выходами (Транспилятор Ethereum) | Keccak-256 (таблица поставляется), 256-битная модульная арифметика, ECRECOVER, syscall-вызовы свидетельств Меркла для хранилища |
| Solana / SVM | sBPF ELF, исполняемый гостевым интерпретатором sbpf.bin или транслируемый sbpf2rv в образ RV32IM с теми же выходами (Транспилятор Solana) | SHA-256, проверка Ed25519, 64-битное умножение |
Вехи
Веха 1 доказала машину общего назначения. Веха 3 превратила её в экранированный пул: перевод с проверкой принадлежности внутри схемы доказывается в рамках R_exec, а верификатор проверяет hc, ни разу не увидев ни одного слова программы. Веха 4 — это совместимость: её загрузчик, обязательство на вход и таблица Keccak поставлены как наборы ограничений 4 и 5, а таблица SHA-256 — с набором 6. Гостевые интерпретаторы EVM и sBPF, инструментарий rand-guest и два транслятора построены. Перевод ERC-20 доказан на машине со 128 GB; доказательство SPL Token на ярусе 20 — нет. Веха 5 — это рекурсивная ВМ, на которой строится агрегация блоков; она построена и отключена во всех цепочках. Наборы ограничений 7 и 8 последовали за сентябрьскими ревью и моделью газа.
| id | объём | критерий завершения | статус |
|---|---|---|---|
| M1 | Пять таблиц, базовая ISA RV32I, HALT/WRITE_OUTPUT/READ_INPUT, ZK включён, выравнивание до яруса, ассемблер, эмулятор | fib, memcpy, bubble_sort, alu_mix и balance_check доказываются и проверяются; каждый тест на обман отклоняется | выполнено. 44 теста; последующее ревью закрыло пять пробелов корректности одной волной |
| M1.5 | Ключи просмотра: гостевая программа экранированного перевода «один вход — один выход», конверты нот на ML-KEM-768 и ChaCha20-Poly1305, раскрытие в области стороны и в области транзакции, имитируемый реестр | Перевод доказывается на ярусе 12, и реестр его принимает; каждая область раскрытия открывает ровно свои строки; ключ просмотра не может тратить | выполнено. В узел не включено |
| M2 | Кэш ключей верификатора, FRI, перенастроенный на консервативную цель в 100 бит, таблица байтов, разделённая на диапазонную и полубайтовую, загрузки и сохранения подслов, расширение RV32M | Поставлено уже, чем планировалось: загрузчик плоского бинарного файла и более жёсткая привязка READ_INPUT перенесены в M4.1 | выполнено. fib на ярусе 10: доказательство с 892 KB до 268 KB, построение с 21.6 s до 3.1 s, первая проверка с 2.17 s до 16 ms. Набор ограничений 3, хард-форк |
| M3 | Чип и syscall Poseidon2; NOTE_COMMIT, NULLIFY и MERKLE_VERIFY как гостевые подпрограммы поверх него; потраченное обязательство убрано из публичного выхода; таблица программы как свидетельство с hc, вычисляемым в схеме | Отношение перевода доказывается в рамках R_exec с проверкой принадлежности внутри схемы, а verify(hc, proof) не видит ни одного слова программы | выполнено. Гостевая программа перевода: 4,554 инструкции, 4,903 цикла, ярус 14. Обход Меркла теперь представляет собой счётный цикл, поэтому размер программы больше не зависит от глубины дерева |
| CUDA | GPU-бэкенд доказателя: NTT и меркловские обязательства Poseidon2 как ядра CUDA за трейтами Dft и Mmcs Plonky3; rand send, call и deploy принимают --cuda | Каждая гостевая программа доказывается и проверяется через чисто-Rust эталонный двойник и имитирующий драйвер; верификатор на CPU не отличает бэкенды | выполнено; первый запуск на оборудовании 2026-09-28. На NVIDIA H100 ядра собираются в PTX для sm_80 и sm_90 и совпадают с эталонами CPU и Plonky3. Производственное повторное измерение на GPU-узле парка ещё предстоит. Вызов через CUDA не может запечатать конверт входа, потому что соль никогда не покидает доказателя |
| M4.1 | Загрузчик плоского бинарного файла и первые скомпилированные гостевые программы no_std Rust для riscv32im-unknown-none-elf; соленое обязательство на вход H_IN с собственной таблицей входа, так что READ_INPUT — это поиск по зафиксированному вектору | Программа, собранная стандартным инструментарием, загружается, доказывается и проверяется; два чтения одного индекса входа согласуются, а входы привязаны к H_IN | выполнено. Внесено 2026-09-11 как набор ограничений 4: 26 публичных значений, восемь таблиц, хард-форк |
| M4.2 | Написанная вручную таблица сопроцессора Keccak-f[1600] и syscall KECCAK, присутствующие в доказательстве, только если их использовала гостевая программа; высота памяти, объявляемая доказательством; ключ верификатора, индексируемый четырьмя компонентами; FRI обратно на 80 запросов после аудита 2026-09-12 | keccak256 доказывается как скомпилированная гостевая программа, а доказательство без этой таблицы по форме байт в байт совпадает с доказательством из M4.1 | выполнено. Внесено 2026-09-12 как набор ограничений 5, хард-форк. Доказательство с Keccak больше примерно на 1.9 MB и превышает предел по умолчанию в 2 MiB. Цепочка, генезис которой поднимает предел, его принимает: цепочка 13 (8 MiB) приняла вызов с Keccak на 3.41 MB 2026-09-19, а предел цепочки 20 — 4 MiB |
| M4.3 · M4.4 | Гостевые интерпретаторы EVM и sBPF, скомпилированные в RV32IM, с чужим байткодом на входе; таблица сопроцессора SHA-256 рядом с Keccak; затем инструментарий rand-guest и трансляторы evm2rv и sbpf2rv (2026-09-18) | Перевод ERC-20 и SPL Transfer каждый доказывается в рамках R_exec | построено; сделано одно итоговое доказательство. evm.bin (18,009 слов) и sbpf.bin (8,317) прогоняют векторы ERC-20 и SPL Token, а транслированные образы совпадают с ними слово в слово. transfer ERC-20 доказан на ярусе 18 на дроплете со 128 GB 2026-09-19 (пик 85.0 GB, 53.8 мин); доказательство SPL Token на ярусе 20 экстраполируется примерно в 330 GB и не сделано (память доказательства). Ни то, ни другое нельзя вызвать в цепочке: вызов ограничен ярусом 14 |
| M5 | Рекурсивная ВМ (rVM): 24-инструкционная машина, нативная для Goldilocks, чьи программы проверяют доказательства Rand zkVM, по одной N-обобщённой агрегирующей программе на каждую форму внутреннего доказательства, разделение бэкендов CPU и CUDA и самоверификатор (M5.1–M5.4, 2026-09-13 – 2026-09-16) | 50 реальных производственных доказательств пакетов приняты, а 50 подделанных отклонены на указанном шаге; доказательство rVM программы-верификатора над одним реальным доказательством пакета проверяется нативно (тестовый профиль) | построено; для производственных доказательств нужна крупная машина. Включено как crates/randprotocol-rvm. Агрегация на стороне цепочки влита и отключена во всех цепочках (ниже) |
| set 7 | Каждый терминал LogUp ослеплён; каждая объявленная таблица ограничена снизу 2⁷ строк; 32-битные проверки диапазона для слов входа, публичных слов и соли; syscall POSEIDON2_LEN; исправление JALR; ключи верификатора, солёные из key_derivation_v2 | Исправления по ревью zkVM от 2026-09-27 и 28, которые сдвигают ключ верификатора, внесённые одним срезом | выполнено. Fullnode v0.6.1, цепочка 16 (2026-09-28), хард-форк |
| set 8 | Счётчик газа: столбец GAS в таблице cpu и публичный GAS_LIMIT, причём GAS ≤ GAS_LIMIT доказывается в схеме; точный расход газа в запуске остаётся приватным | Вызов платит за лимит, который сам объявляет, а каждое доказательство пакета объявляет один и тот же зафиксированный лимит | выполнено. Fullnode v0.6.7-rc1, цепочка 18 (2026-09-29), хард-форк. bundle_gas_limit равен 20,479 |
Фазы экранированного пула
Реестр fullnode был внесён в три фазы, каждая — хард-форк (docs/shielded.md §7). S1 заменил реестр счетов пулом нот; S3 вернул мост в виде нот и был внесён первым; S2 поставил поверх него стейкинг. Все три в main и в текущей цепочке.
Строки ниже S2 — это работа v0.5. Каждая строка является хард-форком. Их взяли вместе как одну новую цепочку, chain 14, выпущенную 2026-09-20 из сборки b3c594c и помеченную тегом v0.5 в тот же день, после живого круга zUSD через развёрнутые конечные точки источника. Chain 15, работающая с 2026-09-26 на v0.5.8 и позднее, несла всё это с включёнными по genesis исправлениями аудитов v4 и v5: кран из белого списка с бюджетом на эпоху, отложенная активация залога, ограничение веса стейка, регистрации, привязанные к genesis, consensus_domain 1, правила моста v2, а также лимит реестра токенов, сжигаемая плата за регистрацию и граница 2⁶³ для нот. Chain 20, работающая с 2026-10-01 06:17 UTC на v0.6.8 (c9c9bd3c), хард-форк chain 19, сохраняет всё это и добавляет работу релизов v0.6, перечисленную ниже.
| id | охват | критерий завершения | статус |
|---|---|---|---|
| S1 | Сам пул: ноты, доказанные пакеты 2-in-2-out, дерево обязательств Poseidon2 глубиной 32 и множество нуллификаторов, кошелёк rand с локальным доказывающим, урезанный RPC | Защищённый перевод между кошельками, гонка двойной траты между двумя валидаторами и развёртывание с вызовом, оплаченные пакетами, проходят в наборе тестов кластера | готово. Работает в публичном флоте с chain 6 (2026-09-12) |
| S3 | Мост как ноты: переброшенный актив несёт индекс актива из реестра, аттестация вносит одну ноту, которую цепочка вычисляет сама, BridgeBurn — единственная транзакция из двух пакетов; запечатанные конверты для входных данных вызова, которые может открыть вызывающий, ключ на вызов или назначенный аудитор | Переброшенный актив чеканится, тратится и сжигается как нота; вызывающий может раскрыть, на чём работала программа, не публикуя это, а rand open-call сверяет раскрытие с H_IN | готово. Вошло первым. Chains 9–13 оставили раздел моста вне своего genesis; каждая цепочка с chain 14 его содержит. С chain 14 сжигание — это один пакет, а не два |
| S2 | Стейкинг в защищённой цепочке: публичный реестр валидаторов, Bond из сжигания пакета, Unbond за две эпохи, Withdraw в ноту на адрес выплаты, эпохи по 1 000 блоков, пересчитывающие набор, и аудит предложения по реестру и пулу | Пятый валидатор регистрируется, вносит залог и предлагает блоки со следующей эпохи; один выходит из набора через unbond и выводит средства в ноту, которую тратит его кошелёк выплат; оба сценария проходят в наборе тестов кластера | готово. Локальное дерево обязательств кошелька последовало 2026-09-21: кошелёк сам вычисляет свои свидетельства и больше не сообщает своему узлу, какой лист он тратит |
| RPL | Стандарт токенов (docs/tokens.md): токен — это запись реестра в реестре цепочки с 62-символьным идентификатором bech32m вида rpl1…; создание не требует разрешения и стоит регистрационную плату в RAND; право чеканки фиксируется при регистрации как отсутствующее, ключ или мост; символы не уникальны; rand token create, mint, set-authority, burn, info, list, а также rand_getTokens, rand_getToken, rand_getTokenSupply | Токен регистрируется, чеканится, отправляется командой rand send --asset и сжигается как ноты в том же пуле | работает с chain 14 (v0.5). На chain 20 регистрационная плата составляет 1 RAND, сжигаемый, реестр вмещает не более 4 096 токенов, а genesis содержит zUSD под индексом 1 |
| RPL-2 | Состояние программ (docs/program-state.md): ячейки на каждую программу (ключ из 8 слов к значению из 8 слов, входящие в корень состояния), публичное хранилище на каждый актив, токен, чеканимый только своей программой, и действие Invoke (Action 33) — вызов, который объявляет ячейки, которые он читает и записывает, и ноты, которые выплачивает; rand program invoke, state, vault, а также rand_getProgramCell, rand_getProgramCells, rand_getProgramVault | Реестр применяет переход, только если каждое объявленное чтение по-прежнему верно, а хранилище покрывает каждую выплату; устаревшее чтение отклоняется и доказывается заново | работает с chain 20 (v0.6.8). cell_fee 0,01 RAND за созданную ячейку; не более 8 чтений, 8 записей и 4 выплат на один invoke. См. Программы |
| пакет со скрытым активом | Каждая транзакция несёт ровно один пакет 4-in-4-out вместо пакета 2-in-2-out: слоты 0–1 содержат приватный актив (фиктивные при переводе только RAND), слоты 2–3 всегда RAND и оплачивают комиссию. Перевод токена из двух пакетов и сжигание моста из двух пакетов упразднены | Перевод RAND и перевод любого токена RPL публикуют одинаковую форму, поэтому актив, который переместился, скрыт | работает с chain 14 (v0.5). Tier 14, около 100 с на доказательство, около 1,42 МБ доказательства на chains 14 и 15; hc_bundle 83d3a370… там же. Chains 18–20 закрепляют guest пакета v3, hc_bundle 60af094a…, около 1,49 МБ |
| привязка транзакции | Каждое доказательство пакета строится над H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked) и проверяется относительно него; значение передаётся в сегменте публичных входов | Скопированное, неизменённое доказательство, повторно отправленное с изменённым получателем, валидатором или memo, отклоняется | работает с chain 14 (v0.5). С chain 20 (binding_domain 1) прообраз имеет вид H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …), и каждое подписанное сообщение действия тоже несёт хэш genesis, поэтому ничто, доказанное или подписанное для одной цепочки, не проходит проверку в другой |
| B1–B4 | Укрепление моста (docs/bridge.md §§14–20). B1: суточный лимит чеканки на каждое обеспечение и ключ паузы, который может только приостанавливать (для снятия паузы нужен кворум PQ). B2: временная метка блока, превышающая метку родителя более чем на 60 с, недействительна, а валидатор не голосует за блок, опережающий его часы более чем на 15 с, поэтому валидаторам нужен NTP. B3: кворум сопроводительных подписей Dilithium2 на каждую чеканку. B4: листинг переброшенного токена или обеспечения после genesis под кворумом PQ-стражей, без смены цепочки | zUSD, один токен с семью обеспечениями (USDT и USDC на Ethereum, Binance Smart Chain, Tron и Solana), регистрируется транзакцией, а равенство total_supply == Σ backings.locked выполняется по построению. Локальный девятифазный шлюз (zusd_e2e.rs: четыре валидатора, настоящие доказательства, кран, регистрация, внесение, перевод, сжигание, аудит) пройден 9 из 9 | работает с chain 14 (v0.5). На chain 20: лимит чеканки 100 000 zUSD в сутки на обеспечение плюс общий 4 000 zUSD за скользящие 24 часа (правила моста v2), набор стражей 1 из восьми PQ-стражей, комиссия 10 б.п. в zUSD на каждую чеканку и каждое сжигание (bridge.fees), а ротации стражей требуют владения и ждут 86 400 с (bridge.rotation). zUSD внесён в genesis chain 20 с его семью обеспечениями и 99 zUSD, заблокированными на момент разреза |
| аудит v3 | Исправления третьего внутреннего раунда аудита под руководством сооснователя (2026-09-19; независимый аудит не проводился). POOL-1: Mint крана несёт раскрытие своей ноты (pk, time, r), при допуске обязательство пересчитывается, а чеканящий подписывает rand-mint-2; ноты аллокации genesis тоже несут раскрытие. RPC-1: rand_getWitness(es) выполняет не более двух перестроений дерева одновременно и отвечает -32000 busy через 10 с. OPS-1: все восемнадцать ключей валидаторов ротированы, созданы вне репозитория, и ни один ключ не отслеживается в репозитории | Чеканка, обязательство которой раскрывается на сумму больше её суммы, отклоняется; ни один ключ chain 14 никогда не находился в репозитории | работает с chain 14 (v0.5). PRIV-1, запрос свидетельства, называющий лист, закрыт 2026-09-21 собственным деревом кошелька |
Релизы после v0.5
Каждый релиз — это git-тег с записью в CHANGELOG.md полного узла. Релиз, который меняет консенсус, формат передачи или ключ верификатора, выходит с новой цепочкой; остальные накатываются на живую цепочку по одному узлу за раз.
| релиз | что вошло | цепочка |
|---|---|---|
| v0.5 – v0.5.8 | Токены RPL, zUSD и усиленный мост (выше); исправления по итогам аудита; прунинг истории; усиление консенсуса и синхронизации | 14, 15 |
| v0.5.9 | Исправления повторного сканирования: фаucet чеканит только от валидаторов генезиса, back-off синхронизации, предварительные проверки gossip | 15 |
| v0.5.10 | Обмен адресами: отпечатки, ссылки randpay: и QR-коды; зашифрованное memo, впервые включённое в цепочке 18 | 15 |
| v0.5.11 | Генезисный вестинг с тайм-локом для аллокаций команды, инвесторов и партнёров. Включается только в генезисе и не активен ни в одной цепочке | нет |
| v0.6 | Исправления zkVM, rVM и агрегации по итогам сентябрьских ревью | 15 |
| v0.6.1 | Набор ограничений 7: LogUp-блайндинг, нижняя граница таблицы 2⁷, 32-битные проверки диапазона, POSEIDON2_LEN, исправление JALR. Цепочка 16 была выпущена с hardening_v6 и bundle guest v2 | 16 |
| v0.6.2 | Делегированное доказательство, фаза 1: бинарный файл rand-prover и флаг кошелька --prover. Доказывающий фазы 1 получает ключ траты | 16 |
| v0.6.3, v0.6.4 | Делегированное доказательство, фаза 2: разделённая авторизация. Доказательство bundle больше не принимает ключ траты, его принимает auth-доказательство уровня 10, а домен идентификатора транзакции становится rand-txid-3 | 17 |
| v0.6.6, v0.6.7-rc1 | Gas: набор ограничений 8, объявляемый лимит gas на доказательство, динамические цены gas и байтов; включено memo. v0.6.6 так и не был выпущен с тегом | 18 |
| v0.6.7 | Исправления в цепочке 18, не меняющие правил консенсуса: прунинг запечатанных доказательств (неактивен), фиксация формата конверта, гигиена ключей просмотра, аллокатор rVM, алиасинг в GPU-ядрах, покрытие тестами ALU. Помечен тегом до завершения полного набора тестов workspace | 18, 19 |
| v0.6.8 | RPL-2: ячейки программ, хранилища программ и действие Invoke. Комиссии моста zUSD в обе стороны. Последние исправления audit-v6: отсутствие автоматического снятия блокировки (CON-4) и пейсмейкер на сертификатах тайм-аута (CH-1); listener --public-rpc, лимиты чтения, зарезервированные пиры валидаторов, бюджеты синхронизации и gossip, ограничение пула по байтам, предел на объявленную степень в заголовке доказательства (ZKV-4); а также правила, включаемые в генезисе, которые цепочка 20 активирует: привязка к хешу генезиса, testnet, окно доказательств в 1 024 блока, потолки цены gas и оплачиваемая байтовая нагрузка, допуск по голосованию, ограничение входа в стейк как доля, владение и задержка для ротаций моста. Для отправки в цепочке 20 кошелькам нужна эта сборка | 20 |
Границы на сегодня
Отступления от whitepaper изложены прямо, без сглаживания. Каждое отслеживается в собственной документации крейта вместе с вехой, которая его закрывает.
hcявляется связывающим, но не скрывающим: в нём нет соли, поэтому угаданную программу можно подтвердить, а два развёртывания одной и той же программы можно связать между собой. М3.4 устранил другое: то, что верификатор держит всю программу в открытом виде.- Кошелёк, собранный до 2026-09-21, запрашивает у своего узла свидетелей (witness), а запрос свидетеля называет лист, который будет потрачен. Текущий
randхранит собственную копию дерева и никогда не спрашивает; узел по-прежнему отдаётrand_getWitnessдля старых кошельков. - Депозиты публичны на границе: минт из фаucet, нота генезиса и депозит через мост несут сумму в открытом виде (начиная с цепочки 14 минт и нота генезиса несут также своё раскрытие, так что ключ владельца тоже публичен); это та же видимость в один переход, что и у депозита из прозрачного пула в экранированный где бы то ни было.
- Нулевое разглашение статистическое, а не идеальное. Именно это свойство на деле обеспечивает скрывающий FRI в Plonky3 0.7, и крейт говорит об этом прямо.
- Хеш транскрипта — Poseidon2 с девелоперскими круглыми константами, а не SHA3-384 / BLAKE3-384 из статей. Это замена конфигурации, а не переписывание.
- При 80 запросах FRI доказательство bundle занимало около 1,42 MB в цепочках 14 и 15 (около 1,3 MB до цепочки 13). Начиная с цепочки 17 перевод несёт около 2,85 MB доказательств: доказательство bundle, около 1,49 MB, и auth-доказательство, около 1,37 MB. В цепочке по умолчанию, с блоками 4 MiB и лимитом доказательства 2 MiB, доказательство с Keccak сразу превышает этот лимит; генезис цепочки 20 задаёт блоки 20 MiB и лимит доказательства 4 MiB (цепочки 13–16 задавали 8 MiB).
- Заголовок доказательства вызова не скрыт. Он объявляет уровень и высоты таблиц Keccak и SHA-256, так что видно, использовался ли хеш в вызове. Вызовы, зафиксированные в цепочке 15 до нижней границы prover v0.6, раскрывали больше: приватную таблицу менее 2⁷ строк можно было прочитать из доказательства. Нижняя граница prover v0.6 закрыла это для новых вызовов, а набор ограничений 7 с
hardening_v6сделал это правилом цепочки начиная с цепочки 16. - Вызов ограничен уровнем 14, не более чем 2¹² строк Keccak (128 перестановок) и 2¹³ строк SHA-256 (128 сжатий), а при
hardening_v6программу длиннее 8 180 слов развернуть нельзя. Гостевые интерпретаторы EVM и sBPF, а также переведённые образы ERC-20 и SPL Token все выше этого предела. - Тот, кто владеет свидетелем, видит всё. ZK защищает обзор верификатора, а не доказывающего. Начиная с цепочки 17 кошелёк может передать доказательство bundle спаренному
rand-prover, не передавая ключ траты, но этот доказывающий по-прежнему держит ключ просмотра и видит ноты. Бэкенд CUDA впервые запущен на оборудовании 2026-09-28 и пока не имеет производственных измерений.
Структура репозитория
Cargo workspace полного узла в том виде, как он описан в его README и каталоге crates/.
| путь | что содержит |
|---|---|
crates/randprotocol-core/ | Чистая логика без I/O: криптография, ноты и дерево обязательств, правила реестра, gas, генезис, конечный автомат HotStuff |
crates/randprotocol-zkvm/ | Rand zkVM, вендорена из zkp-circuits/research на наборе ограничений 8 (схемы aeacf31; пересинхронизация через deploy/sync-zkvm.sh), а также верификатор доказательств на стороне цепочки и его кэш ключей верификатора |
crates/randprotocol-rvm/ | Рекурсивная VM, вендорена из zkp-circuits/recursion: машина, нативная для поля, чьи программы верифицируют доказательства Rand zkVM |
crates/bridge-codec/ | Формат передачи и правило кворума моста хранителей (guardian), байт в байт общие с контрактами Solidity и программой Solana |
crates/randprotocol-node/ | Хранилище RocksDB, сеть libp2p, мемпул, синхронизация блоков, сервер JSON-RPC и бинарный файл rand-node |
crates/randprotocol-client/ | Бинарный файл кошелька rand и библиотека RpcClient, без зависимостей от RocksDB и libp2p |
crates/randprotocol-prover/ | Бинарный файл rand-prover: делегированный доказывающий, который строит доказательства bundle для спаренных кошельков |
deploy/ | Генезис-файлы testnet, nodes.env, скрипты запуска, облачное развёртывание, скрипты переключения и пересборки. Со времени подготовки цепочки 14 здесь не отслеживается ни один ключ |
docs/ | Справочная документация и проектная спецификация |
scripts/ | Локальный testnet из двух валидаторов |
Описано, но ещё не выпущено
Эти компоненты описаны в статьях или в документации полного узла, но не работают: они либо отсутствуют в репозиториях, либо построены и не включены ни в одной цепочке. Они перечислены, чтобы разрыв между спецификацией и кодом был виден, а не угадывался.
| компонент | статус |
|---|---|
| bridge · guardian | Демоны guardian и relayer, которые исполняют формат аттестации от начала до конца; контракты, кодек и принимающая половина полного узла поставляются, демоны — нет |
| fullnode · aggregation | Агрегация блоков с помощью рекурсивной VM: запечатывание, прунинг и синхронизация в запечатанной форме. Построена и выключена во всех цепочках; rand-node отвергает генезис с разделом aggregation. Ей всё ещё нужна сквозная проверка с подделанным агрегатом, и она убирает только доказательство bundle, но не auth-доказательство. Производственным доказательствам rVM нужна большая машина: при наборе ограничений 7 агрегат из двух занял 133 GB, из трёх — 221 GB, а доказательство выхода — более 256 GB (измерено 2026-09-28 и 29; при наборе ограничений 8 не переизмерялось) |
| fullnode · vesting | Генезисные аллокации с тайм-локом для команды, инвесторов и партнёров (v0.5.11, docs/vesting.md). Включаются только в генезисе: без раздела vesting четыре действия вестинга отвергаются, и ни в одной цепочке его нет. Аудит предложения цепочки 20 показывает все счётчики вестинга равными нулю. Начиная с v0.6.8 отзываемая запись отзывается порогом её отзывающих и только в казначейство, названное в её генезисной записи |
| fullnode · slashing | Слэшинг и джейлинг за эквивокацию лидера построены в v0.6.8 за staking.slashing и выключены в цепочке 20 (в её генезисе его нет, а все 26 ключей валидаторов принадлежат одному оператору). Награды за блоки, маяк лидера на основе hash-sortition, аккумулятор нуллификаторов и межпрограммные вызовы не построены. Постоянное состояние отдельных программ выпущено как RPL-2 (выше) |
prover/ | GPU-демон доказательства: забирает пакеты из очереди, соревнуется при отправке. Ядра CUDA находятся в zkp-circuits и впервые запущены на NVIDIA H100 2026-09-28; рыночного демона не существует. rand-prover, который поставляется, доказывает для спаренных с ним кошельков и рынком не является |
| zkp-circuits · M4.4 exit proof | Доказательство перевода SPL Token (уровень 20), экстраполированное примерно в 330 GB. Перевод ERC-20 (уровень 18) был доказан на машине со 128 GB 2026-09-19. Ни один из них нельзя вызвать в цепочке 20, которая ограничивает вызов уровнем 14 |
Сборка и тестирование
Стандартный рабочий процесс Rust в каждом репозитории. Fullnode — это один рабочий пакет Cargo (workspace) с закреплённой версией toolchain и набором кластерных тестов, который запускает реальные узлы по TCP. Для его сборки репозиторий circuits должен быть извлечён рядом, в каталог с именем circuits, на том коммите, с которого были синхронизированы вендорные крейты (aeacf31 для v0.6.7 и v0.6.8). zkVM — это самостоятельный крейт в zkp-circuits со своим закреплением toolchain и демонстрацией, которая показывает, что конфиденциальный вызов раскрывает, а что нет.
Fullnode:
git clone https://github.com/randprotocol/fullnode.git
git clone https://github.com/randprotocol/zkp-circuits.git circuits # the sibling directory must be named circuits
git -C circuits checkout "$(sed -n 's/^circuits: //p' fullnode/crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"
cd fullnode
# Rust 1.98.1 is pinned by rust-toolchain.toml; first build pulls RocksDB and Plonky3, 10 to 20 minutes
cargo build --release # target/release/rand-node, target/release/rand, target/release/rand-prover
# All crates; release because STARK proving is slow in debug. One to two hours, mostly proving
cargo test --release
# One machine, two validators
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
Исследовательская zkVM, в zkp-circuits/research:
# Toolchain is pinned by rust-toolchain.toml; the first build pulls Plonky3
cargo build --release
# Narrated demo: thirteen proofs, one at production FRI parameters (~6-7 min)
cargo run --release
# Emulator, per-table constraints, cheating provers, ZK, end-to-end, viewing keys, compiled guests (395 tests, ~17 min)
cargo test
Набор тестов fullnode по замерам на v0.6.1 на машине с 16 vCPU: core — 521 тест, node — 373, client — 117, набор для проверки злонамеренного доказывающего (cheating-prover) — 116, проверки злонамеренного поведения со скрытым пакетом — 21 (75 мин), сценарий кошелька — 6 (53 мин), кластер — 26 (44 мин) и сквозной тест zUSD — 2 (51 мин). Производственные доказательства рекурсивной VM в него не входят, и для них нужен объём памяти, указанный выше.
Running a node описывает, как присоединиться к публичному testnet с этой сборкой; генезис testnet, начальные пиры и скрипты запуска поставляются в каталоге deploy/ репозитория fullnode, а краткая версия есть на странице загрузки.
Участие в разработке
Fullnode распространяется по лицензии GNU General Public License v3.0 (GPL-3.0-only); ранее это была Apache-2.0. Сообщайте об ошибках и предложениях по дизайну через issues в репозитории, которого касается изменение. Pull request’ы приветствуются: перед отправкой запустите cargo fmt && cargo clippy и держите изменения узкими по объёму. Начать стоит со страницы fullnode issues.
Архитектура, схема приватности, доказательство токена комиссии и компромисс в отношении постквантовой стойкости описаны в whitepaper на странице papers. Собственный каталог docs/ в репозитории fullnode — это источник, с которым сверяется каждая страница этой документации.