Используйте эту страницу, чтобы увидеть, кто что делает, когда перевод проходит через Rand. Доказательство стоит дорого, а проверка дёшева, поэтому работа разделена именно по этой линии. Доказательства строит сторона отправителя. Валидаторы только проверяют их, упорядочивают и голосуют. Агрегатор, если его включить, сворачивал бы множество доказательств в одно. На схеме показан путь одного перевода от кошелька до финального блока; следующие разделы разбирают каждую роль по очереди.
Путь одного перевода
- Кошелёк строит перевод. Он выбирает входные ноты, получает их свидетельства Меркла, строит четыре выхода и запечатывает каждый в конверт ML-KEM-768. Затем он вычисляет привязку транзакции (binding) — хеш всего, кроме доказательств (Transactions).
- Кошелёк сам доказывает авторизацию. Это доказательство уровня 10 над ключом траты и свежей солью, занимающее несколько секунд. Это единственное доказательство, которое затрагивает ключ траты, и оно всегда строится на собственной машине кошелька.
- Доказательство пакета строится там, где хватает памяти. Это доказательство уровня 14 подтверждает владение, членство, нуллификаторы и баланс; пиковое потребление — около 6 ГБ. Настольное приложение и телефон с примерно 8 ГБ строят его сами. Всё, что меньше, передаёт задачу связанному с ним провеверу: либо вашему собственному, либо пулу валидаторов по адресу
prover.randprotocol.org. В любой из них отправляются ключ просмотра и соль, но никогда не ключ траты (Proofs). - Проверяет RPC-узел. Любой узел, к которому обращается кошелёк, пересчитывает дайджест пакета, проверяет оба доказательства относительно привязки, проверяет комиссию и только после этого рассылает транзакцию своим пирам (Proofs, Mempool).
- Валидаторы упорядочивают и финализируют её. Лидер вида (view) берёт транзакции, которые всё ещё применимы, начиная с лучшей комиссии за КиБ, и предлагает блок. Каждый валидатор заново проверяет каждое доказательство в нём и голосует. Блок фиксируется, когда на нём в последовательных видах выстраиваются три кворумных сертификата; для этого нужны 18 из 26 валидаторов chain 20, находящихся онлайн (Consensus).
- Блок финален, и любой может это проверить. Транзакция финальна, когда
rand_getTransactionвозвращает блок. Узел, синхронизирующийся позже, заново проверяет каждый сертификат и каждое доказательство, а не доверяет подписям.
Роли
| роль | что делает | доказывает? | что видит | что запускает |
|---|---|---|---|---|
| кошелёк | строит, авторизует и отправляет переводы и вызовы; сканирует цепочку своими ключами | доказательство авторизации — всегда; доказательство пакета — если у устройства хватает памяти | всё о своих нотах | приложения со страницы Clients или rand; на chain 20 — Rand Wallet или rand v0.6.8 и новее |
| делегированный провер | строит доказательство пакета для связанного с ним кошелька; кошелёк проверяет каждый ответ, прежде чем что-либо отправить | только доказательства пакетов | ключ просмотра связанного кошелька: всю его историю, прошлую и будущую; потратить средства не может | rand-prover run или rand-node run --prover |
| пул проверов валидаторов | делегированный провер, который держат четыре хоста — два валидатора и две машины, занятые только доказательством, — под одним именем и одним ключом, для кошельков без собственного провера; без комиссии | только доказательства пакетов | то же, что и любой делегированный провер, — для каждого кошелька, который с ним связан | prover.randprotocol.org, отпечаток RGTF-7HKJ-XZFV-GQ1J |
| RPC-узел (наблюдатель) | синхронизируется, заново проверяет каждое доказательство, обслуживает JSON-RPC, рассылает проверенные транзакции; не голосует | нет | только публичные поля: обязательства, нуллификаторы, запечатанные конверты, доказательства | rand-node run |
| валидатор | всё, что делает наблюдатель, плюс предложение блоков в своих видах и голосование в HotStuff | нет | только публичные поля | rand-node run --validator |
| агрегатор | строит одно рекурсивное доказательство над окном финализированных доказательств пакетов и отправляет его для запечатывающего блока | да, самые крупные доказательства в сети | только публичные поля и доказательства | rand-node aggregate --watch, в цепочке с разделом aggregation |
Доказательство и валидация — отдельные задачи, и валидатору не нужно оборудование для доказательства. Два из четырёх участников пула — валидаторы, которые дополнительно запускают провер как сервис; остальные два — выделенные машины для доказательства, не имеющие ключа валидатора. Запуск пула не входит в валидацию. Требования для каждой роли и измеренная память доказательства по уровням приведены на странице Validator and aggregator hardware.
Что может узнать каждая роль
Приватность перевода зависит от того, у кого какие ключи, а не от доверия к сети:
- Валидаторы, RPC-узлы и обозреватель видят то, что видит каждый узел: обязательства, нуллификаторы, запечатанные конверты, комиссию и доказательства. Не сумму, не актив, не отправителя и не получателя.
- Делегированный провер, включая пул, получает ключ просмотра. С его помощью он может прочитать всю историю связанного кошелька. Потратить средства он не может никогда, потому что доказательство авторизации над ключом траты строится на машине кошелька. Связать кошелёк с пулом — значит решить показать эту историю его операторам. Если вам нужна приватность, стройте доказательства на своём устройстве или запустите собственный провер.
- Делегированный провер не может обмануть кошелёк. Кошелёк считывает дайджест с каждого полученного доказательства, проверяет размер и верифицирует его локально, так что неверное доказательство никогда не доходит до узла.
Агрегация: реализована, но не включена
Сегодня каждый блок несёт каждое сырое доказательство — около 2,85 МБ на перевод, так что блок в 20 MiB вмещает около семи переводов. Агрегация блоков — ответ fullnode на это. Агрегатор берёт доказательства пакетов из окна финализированных блоков (rand_getUnsealed), строит одно рекурсивное доказательство, проверяющее их все, и отправляет его. Блок, который его включает, запечатывает окно. После этого валидаторы проверяют один агрегат вместо N доказательств, а узлы могут отбросить покрытые сырые доказательства. Агрегаторы вносят залог и работают без разрешений, запускаются на машинах класса GPU, и им платят долю за доказательство покрытых пакетов плюс субсидию блока в новых RAND.
Она реализована и влита, но не активна. Для неё нужен раздел aggregation в genesis, а в chain 20 его нет, поэтому rand_status показывает все счётчики агрегации нулевыми. Прежде чем её можно будет включить, форму её пакета нужно заново измерить при текущем наборе ограничений, а против рекурсивного верификатора нужно провести проверку на поддельный агрегат. В цепочке с раздельной авторизацией она запечатывала бы также только доказательства пакетов, а не доказательства авторизации (Proofs).