Вики ZooBC
Proof of Participation

Сид блока (VRF)

Каждый блок ZooBC несёт 64-байтовый сид — источник случайности цепочки. Он определяет, кто может создать следующий блок, кто выигрывает лотерею coinbase, какие квитанции показывает производитель и как пиры назначаются друг другу. Начиная с версии 0.5.8 сид — это выход проверяемой случайной функции (VRF): для данного производителя и данного предыдущего сида существует ровно одно допустимое значение, а короткое доказательство в заголовке блока позволяет каждому узлу его проверить.

Почему сид нельзя выбирать

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

VRF закрывает эту лазейку. Она работает как подпись, у которой только один допустимый результат: владелец ключа может вычислить выход и доказательство, любой обладатель публичного ключа может проверить доказательство, и каждое действительное доказательство для одного и того же ключа и входа даёт один и тот же выход.

Слева: у сида-подписи много допустимых выходов, и производитель выбирает один. Справа: у сида VRF ровно одно значение плюс 80-байтовое доказательство, которое проверяет каждый валидатор.
Слева: у сида-подписи много допустимых выходов, и производитель выбирает один. Справа: у сида VRF ровно одно значение плюс 80-байтовое доказательство, которое проверяет каждый валидатор.

Как создаётся сид

  1. Вход, называемый alpha, — это хеш SHA3-256 от 64-байтового сида предыдущего блока (32 байта).
  2. Производитель выполняет ECVRF над Ed25519, в варианте ZooBC, со своим ключом узла (см. Ключи узла).
  3. Выход — новый 64-байтовый сид. Доказательство занимает 80 байт: 32-байтовая точка кривой, 16-байтовый вызов и 32-байтовый скаляр.
  4. Доказательство помещается в заголовок блока, который охватывает подпись блока: подписываются 284 байта заголовка (204 байта других полей плюс 80-байтовое доказательство), а хешируются 348 байт.

Валидаторы требуют доказательство, проверяют его по ключу производителя над alpha и отклоняют блок, сид которого не является выходом доказательства.

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

Предыдущий сид хешируется в alpha; alpha и ключ узла производителя поступают в ECVRF, который выдаёт 64-байтовый сид и 80-байтовое доказательство, оба помещаются в заголовок. Транзакции и метка времени во вход не входят.
Предыдущий сид хешируется в alpha; alpha и ключ узла производителя поступают в ECVRF, который выдаёт 64-байтовый сид и 80-байтовое доказательство, оба помещаются в заголовок. Транзакции и метка времени во вход не входят.

Вариант ZooBC

ECVRF в ZooBC — вариант ECVRF-EDWARDS25519-SHA512-TAI. Хеширование на кривую принимает только точки-кандидаты простого порядка и использует их без кофактора, а проверка дополнительно отклоняет доказательство, у которого вызов или скаляр равен нулю. Поэтому стандартная библиотека RFC 9381 даёт другие выходы; каждый, кто пишет узел или верификатор, должен реализовать именно этот вариант.

Примерно для одной пары ключа и входа из 15 миллионов (вероятность (15/16)^256, около 6,7 × 10^-8) действительного доказательства не существует. Тогда выбранный производитель не может создать этот блок, и ход переходит к производителю следующего раунда.

Единственный оставшийся рычаг — воздержаться

У выбранного производителя, которому не нравится сид, который понёс бы его блок, есть только один вариант: не выпускать блок. Тогда ход через 15 секунд переходит к следующему выбранному узлу, который создаёт блок со своим собственным сидом, столь же непредсказуемым. Воздержание один раз перебрасывает кости, но никогда не выбирает результат.

К тому же у него есть цена. Пропустивший производитель получает пропущенный ход и считается «отсутствующим» до своего следующего собственного блока, ничего не зарабатывая и теряя оценку участия (см. Пропущенные ходы, приостановка и исключение). Более поздний блок весит меньше при выборе ветви. Анализ дизайна Proof of Participation оценивает шанс, что противник, владеющий долей a мест, сможет предсказать сид на n блоков вперёд, примерно как a в степени n: при трети мест — около 1 из 27 на три блока.

Ещё два правила закрывают обходные пути:

  • Смена ключа узла вступает в силу только через 120 блоков (30 минут) после блока, который её включает, поэтому производитель не может повлиять на следующий сид партнёра заранее подписанной сменой ключа.
  • Производитель предыдущего блока понижается в следующей жеребьёвке, поэтому ни один узел не держит одновременно содержимое блока и сид, который определяет его исход, пока другой узел может ответить (см. Приоритетные раунды, пустые блоки и предыдущий производитель).

Что определяет сид

Сиды публичны: любой может прочитать их из цепочки и повторить каждый из этих розыгрышей.

См. также