Сайт в разработке

Сайт в разработке: мы создаём его к запуску MainNet. Детали будут меняться.

Этот сайт ещё строится

ZooBC развивается открыто. Всё, что вы здесь видите, актуально и честно, но ещё не завершено: воспринимайте это как картину того, где мы находимся сегодня, а не как окончательное заявление.

До запуска MainNet многое изменится: формулировки, структура, изображения и цифры. Некоторые страницы пока содержат только заглушки.

Экосистема ZooBC появляется поэтапно. Кошелёк, обозреватель и каналы сообщества запускаются по мере приближения MainNet, и этот сайт растёт вместе с ними.

Если что-то написано неверно, выглядит сломанным или кажется вводящим в заблуждение, сообщите нам. Отзыв сейчас для нас ценнее, чем безупречный запуск потом.

ZOOBC / БЕЗОПАСНОСТЬ БЛОКЧЕЙНА

Безопасность блокчейна

Во что на самом деле обошёлся бы захват этого блокчейна. Жеребьёвка равномерна, влияние линейно, и атаковать имеет смысл только реестр, поэтому защитой служит очередь в него.

Для каждого блока жеребьёвкой выбирается один узел, который его соберёт. Жеребьёвка представляет собой равномерный случайный выбор из всего реестра, выведенный из сида предыдущего блока. Не самый богатый узел. Не самый дисциплинированный. Каждый зарегистрированный узел, на равных, каждый раз.

Поэтому влияние на блокчейн равно просто вашей доле в реестре, и оно линейно. Нет никаких 51%, при которых что-то ломается. Владейте десятой частью реестра, и вы соберёте десятую часть блоков; больше вы ничего не получите.

Из этого следует, что атаковать имеет смысл только реестр, а защитой служит очередь в него. Купить место нельзя. Вы входите по одному узлу за раз, вслед за всеми, кто тоже хочет войти, и цифры ниже показывают, во что это обходится.

01 / ЖЕРЕБЬЁВКА

Как выбирается сборщик блока

Из сида предыдущего блока каждый узел вычисляет одну и ту же бесконечную последовательность жеребьёвок. Раунд 1 называет узел; если тот не опубликует блок в своём 15-секундном окне, раунд 2 называет другой, и так далее. Блок собирает тот, кто опубликует его первым.

Сам сид равен sign(node_key, hash(previous seed)), и его проверяет каждый валидатор. Подписи Ed25519 детерминированы, поэтому для конкретного сборщика существует ровно один допустимый сид: сборщик не может перебирать сиды, пока не найдёт выгодный для себя. Единственная свобода атакующего: опубликовать блок или промолчать. Один бит, один раз, за каждый блок, на который выпал его узел.

Балл участия не влияет на выбор. Часто считают, что влияет, но это не так. Балл решает только одно: остаётесь ли вы в реестре вообще. Он падает, когда вы пропускаете свои ходы, а при нуле вас исключают и возвращают стейк. Идеальный балл не даёт больше шансов на следующий блок, чем у узла, присоединившегося вчера. Стейк тоже не влияет на выбор; он лишь покупает место в очереди на вход.

02 / ВЛИЯНИЕ ЛИНЕЙНО

Что на самом деле даёт доля в реестре

Доля атакующегоСколько блоков он собираетЕсть узел в окне содержимогоЦензура одной транзакции на 10 блоковСколько честных узлов заглушить, чтобы украсть ход

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

Цензура угасает, и угасает быстро. Чтобы не пустить транзакцию в блокчейн, нужно удерживать каждый ход подряд, пока она ждёт. При трети реестра шанс на это составляет 1 к 59 000 за десять блоков, то есть за две с половиной минуты. Ни при какой доле меньше полного контроля длительная цензура не работает.

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. Атака длиной в десятилетие означает крупную, неликвидную и полностью публичную позицию в активе, который она пытается сломать. Слэшинга нет: уйдите сами или будьте исключены за пропажу из сети, и стейк вернётся полностью. Залог покупает место в очереди, а не заложника.

И ничего не накапливается. Каждый блок разыгрывается независимо. Узел, безупречно работавший год, имеет на следующий блок не больше прав, чем допущенный сегодня утром, а атакующий, удержавший последние десять ходов, имеет не больше шансов удержать одиннадцатый. Накопить позицию невозможно, и поэтому единственный долговечный способ получить здесь влияние состоит в том, чтобы быть более крупной честной частью сети.