Сид блока (VRF)
Каждый блок ZooBC несёт 64-байтовый сид — источник случайности цепочки. Он определяет, кто может создать следующий блок, кто выигрывает лотерею coinbase, какие квитанции показывает производитель и как пиры назначаются друг другу. Начиная с версии 0.5.8 сид — это выход проверяемой случайной функции (VRF): для данного производителя и данного предыдущего сида существует ровно одно допустимое значение, а короткое доказательство в заголовке блока позволяет каждому узлу его проверить.
Почему сид нельзя выбирать
Если бы производитель мог выбирать сид своего блока из нескольких кандидатов, он мог бы склонить следующую жеребьёвку производителей в пользу себя или партнёра, сместить лотерею coinbase или решить исход ставки в приложении. Обычная цифровая подпись в качестве сида не годится: над одним и тем же сообщением может существовать больше одной действительной подписи, так что производитель мог бы перебрать несколько и оставить понравившуюся.
VRF закрывает эту лазейку. Она работает как подпись, у которой только один допустимый результат: владелец ключа может вычислить выход и доказательство, любой обладатель публичного ключа может проверить доказательство, и каждое действительное доказательство для одного и того же ключа и входа даёт один и тот же выход.
Как создаётся сид
- Вход, называемый alpha, — это хеш SHA3-256 от 64-байтового сида предыдущего блока (32 байта).
- Производитель выполняет ECVRF над Ed25519, в варианте ZooBC, со своим ключом узла (см. Ключи узла).
- Выход — новый 64-байтовый сид. Доказательство занимает 80 байт: 32-байтовая точка кривой, 16-байтовый вызов и 32-байтовый скаляр.
- Доказательство помещается в заголовок блока, который охватывает подпись блока: подписываются 284 байта заголовка (204 байта других полей плюс 80-байтовое доказательство), а хешируются 348 байт.
Валидаторы требуют доказательство, проверяют его по ключу производителя над alpha и отклоняют блок, сид которого не является выходом доказательства.
Ничто из нового блока во вход не попадает: ни его транзакции, ни его метка времени. Поэтому производитель не может повлиять на сид, переставляя содержимое блока, а цепочку сидов можно проверить от любого блока назад до генезис-блока, сид которого состоит из одних нулей. Случайное число с собственного компьютера производителя никто не смог бы проверить, поэтому такие числа не используются.
Вариант 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 минут) после блока, который её включает, поэтому производитель не может повлиять на следующий сид партнёра заранее подписанной сменой ключа.
- Производитель предыдущего блока понижается в следующей жеребьёвке, поэтому ни один узел не держит одновременно содержимое блока и сид, который определяет его исход, пока другой узел может ответить (см. Приоритетные раунды, пустые блоки и предыдущий производитель).
Что определяет сид
- жеребьёвку производителей следующего блока (см. Жеребьёвка);
- победителей лотереи coinbase;
- квитанции, которые должен показать производитель (см. Квитанции и топология сети);
- топологию пиров — по сиду первого блока каждого 40-блочного периода;
- случайные розыгрыши приложений.
Сиды публичны: любой может прочитать их из цепочки и повторить каждый из этих розыгрышей.