ZOOBC / БЕЗОПАСНОСТЬ БЛОКЧЕЙНА
Безопасность блокчейна
Во что на самом деле обошёлся бы захват этого блокчейна. Жеребьёвка равномерна, влияние линейно, и атаковать имеет смысл только реестр, поэтому защитой служит очередь в него.
Для каждого блока жеребьёвкой выбирается один узел, который его соберёт. Жеребьёвка представляет собой равномерный случайный выбор из всего реестра, выведенный из сида предыдущего блока. Не самый богатый узел. Не самый дисциплинированный. Каждый зарегистрированный узел, на равных, каждый раз.
Поэтому влияние на блокчейн равно просто вашей доле в реестре, и оно линейно. Нет никаких 51%, при которых что-то ломается. Владейте десятой частью реестра, и вы соберёте десятую часть блоков; больше вы ничего не получите.
Из этого следует, что атаковать имеет смысл только реестр, а защитой служит очередь в него. Купить место нельзя. Вы входите по одному узлу за раз, вслед за всеми, кто тоже хочет войти, и цифры ниже показывают, во что это обходится.
01 / ЖЕРЕБЬЁВКА
Как выбирается сборщик блока
Из сида предыдущего блока каждый узел вычисляет одну и ту же бесконечную последовательность жеребьёвок. Раунд 1 называет узел; если тот не опубликует блок в своём 15-секундном окне, раунд 2 называет другой, и так далее. Блок собирает тот, кто опубликует его первым.
Сам сид равен sign(node_key, hash(previous seed)), и его проверяет каждый валидатор. Подписи Ed25519 детерминированы, поэтому для конкретного сборщика существует ровно один допустимый сид: сборщик не может перебирать сиды, пока не найдёт выгодный для себя. Единственная свобода атакующего: опубликовать блок или промолчать. Один бит, один раз, за каждый блок, на который выпал его узел.
Балл участия не влияет на выбор. Часто считают, что влияет, но это не так. Балл решает только одно: остаётесь ли вы в реестре вообще. Он падает, когда вы пропускаете свои ходы, а при нуле вас исключают и возвращают стейк. Идеальный балл не даёт больше шансов на следующий блок, чем у узла, присоединившегося вчера. Стейк тоже не влияет на выбор; он лишь покупает место в очереди на вход.
03 / ОТКАЗ В ОБСЛУЖИВАНИИ
Единственная реальная атака: заглушить жеребьёвку
Узел может включать транзакции, только если он выпал в первых 10 раундах (max_priority_blocksmiths). Выпав позже, он всё равно может собрать блок, но этот блок должен быть пустым. Именно это правило не даёт цепи остановиться, когда узлы офлайн: блок теряет содержимое, только если отсутствуют все узлы из этих первых жеребьёвок.
Это же и самое уязвимое место конструкции. Эти узлы известны за 15 секунд, с момента появления предыдущего блока. Атакующий, способный отключить их все в этом окне, вынуждает выпустить пустой блок и тем самым цензурирует всех, а не просто конкурирует. Это проблема отказа в обслуживании, а не консенсуса, и именно поэтому число установлено равным 10, а не меньшему и более аккуратному значению.
Сколько узлов заглушить
10
названы для каждого блока
Предупреждение за
15 с
до начала хода
Пустой блок случайно
при 20% узлов офлайн
Увеличить это число почти ничего не стоит: лишь несколько дополнительных узлов одновременно собирают блоки-кандидаты, а каждый добавленный узел означает ещё одну машину, которую атакующему нужно найти и отключить за те же 15 секунд.
04 / ЦЕНА В ГОДАХ
Цена покупки доли
- Формула
- задержка = clamp(база ÷ размер реестра, мин, макс)
- Допуск
- по одному, в порядке размера стейка
Доля слотов отражает соотношение стейков. Очередь упорядочена по заблокированному балансу, поэтому «выигрывает 100% слотов» означает не удачу, а допущение, что никто не перебьёт его ставку. Каждая цифра здесь соответствует лучшему для атакующего случаю.
Как только честный оператор застейкает больше на один узел, он встанет впереди. Выигрывайте лишь половину допусков, и ваша доля в реестре будет стремиться к половине и остановится: честные узлы, занимающие другую половину, наращивают реестр так же быстро, как вы наращиваете свою часть. Цель выше вашей доли слотов не просто медленно достижима, она недостижима вовсе, и таблица ниже показывает это как никогда.
Ожидание сейчас
на каждый допущенный узел
Узлов для ⅓
чтобы собирать треть блоков
Время для ⅓
непрерывного ожидания в очереди
Узлов для ½
чтобы собирать половину блоков
Время для ½
непрерывного ожидания в очереди
ZBC заблокировано
минимум, по 100 ZBC на узел
05 / РОСТ
Как меняется ожидание по мере роста сети
При разных размерах сети
| Реестр | Ожидание на узел | Узлов для ⅓ | Время | Узлов для ½ | Время |
|---|
06 / ЕДИНСТВЕННЫЙ КОМПРОМИСС
Почему решающее значение имеет реестр генезиса
Допуск идёт последовательно, поэтому время удвоения реестра равно просто registry size × wait per node. Это тождество, а не настройка, а значит, у маленького реестра не может быть одновременно короткого ожидания и медленного захвата. Это единственный компромисс во всей конструкции, который не обойти никакой формулой.
| Реестр при запуске | Ожидание 1 неделя | Ожидание 2 недели | Чтобы удвоение заняло 2 года, ожидание должно составлять |
|---|
Значит, рычаг находится в запуске, а не в кривой. Начните с дюжины узлов, и каждый честный оператор будет ждать месяцами, потому что только так двенадцать узлов становится трудно удвоить. Начните с сотни, и двухнедельное ожидание уже даёт почти четыре года, причём никто не остаётся за бортом. Больший реестр генезиса ценнее любой настройки задержки.
07 / ЧЕТЫРЕ СВОЙСТВА
Почему это работает
Допуск последовательный. Реестр принимает по одному узлу за раз в масштабах всей сети. Желание получить сотню узлов означает не одно ожидание, а сто ожиданий подряд. Один этот факт превращает профинансированную атаку в многолетний проект.
Нужная доля растёт вместе с сетью. Один узел из десяти даёт десятую часть влияния. Один из тысячи не даёт ничего. Ожидание на узел снижается с ростом реестра, но никогда не опускается ниже минимума, поэтому общее время всё равно растёт.
Место в очереди стоит денег. Позиция определяется заблокированным балансом, поэтому атакующий не просто ждёт: он каждый раз перебивает ставку каждого честного оператора, который тоже хочет войти. Каждый проигранный слот стоит ему времени ожидания и отдаёт узел честному оператору.
Пока атакующие пытаются, они финансируют сеть. Каждый узел блокирует ZBC. Атака длиной в десятилетие означает крупную, неликвидную и полностью публичную позицию в активе, который она пытается сломать. Слэшинга нет: уйдите сами или будьте исключены за пропажу из сети, и стейк вернётся полностью. Залог покупает место в очереди, а не заложника.
И ничего не накапливается. Каждый блок разыгрывается независимо. Узел, безупречно работавший год, имеет на следующий блок не больше прав, чем допущенный сегодня утром, а атакующий, удержавший последние десять ходов, имеет не больше шансов удержать одиннадцатый. Накопить позицию невозможно, и поэтому единственный долговечный способ получить здесь влияние состоит в том, чтобы быть более крупной честной частью сети.