Генезис-блок
Каждая цепочка ZooBC начинается с генезис-блока, блока 0. Это не сообщение, и транзакций он не несёт: он представляет всё начальное состояние цепочки, от пополненных аккаунтов до каждого параметра консенсуса. Всё это зафиксировано одним хешем, и этот хеш — идентичность цепочки. Измените хотя бы один баланс, и у вас получится другая цепочка.
Построен из конфигурации
Цепочка создаётся офлайн из файла конфигурации. Генезис-транзакции нет: конфигурация и есть состояние. Она задаёт:
- пополненные аккаунты и их балансы, включая казну приложений, если она есть, которая наполняет пул приложений;
- генезис-токены и их балансы: у каждой цепочки одни и те же 14 генезис-монет, например ZUSD и ZBTC (токены и рынки);
- вестинговые расписания;
- зарегистрированные узлы, или генезис-места: 11 в каждой цепочке, принадлежащих ZooBC Foundation, у каждого 10 ZBC рабочего баланса на собственном аккаунте узла;
- параметры консенсуса, от интервала между блоками до начальных цен, и высоту активации каждого правила;
- ключи с особой ролью, например орган выпуска релизов (релизы и обновления), и адреса хранения мостовых монет (мост и обёрнутые монеты).
Построитель генезиса складывает все зачисления и отказывается записывать генезис, сумма которого превысила бы потолок предложения в 33 333 333,33333333 ZBC. То, что он не раздаёт, становится пулом coinbase, который выпускается в течение 15 лет (предложение и эмиссия). На высотах 0 и 1 coinbase не выплачивается.
Один хеш на всё начало
Построитель сворачивает всё существенное в один хеш конфигурации. Затем хеш генезиса выводится из версии блока, высоты, метки времени, нулевого хеша предыдущего блока и этого хеша конфигурации. Сам генезис-блок несёт нулевые сид, ключ производителя, подпись и хеш предыдущего блока, а его хеш — это значение, выведенное из конфигурации, а не хеш его собственных байтов. Два значения считываются, но не фиксируются: total_supply и node_operating_balance.
Изменение любого зафиксированного значения даёт новый хеш генезиса, а значит, и другую цепочку.
Идентичность цепочки
Хеш генезиса — единственная идентичность цепочки: байта идентификатора сети нет.
- Узлы сравнивают хеши генезиса при подключении и отклоняют пира, у которого хеш другой.
- Его охватывает подпись каждой транзакции. Подписант подписывает SHA3-256("ZBC-TX" ‖ хеш генезиса ‖ байты неподписанной транзакции), поэтому транзакция, подписанная для одной цепочки, недействительна во всех остальных (подписи, привязанные к цепочке).
- Узел сообщает его как
genesis_hashпо адресу/api/v1/node/info, так что кошелёк может узнать, с какой цепочкой он работает. - Тестовая сеть, запущенная заново, получает новый хеш.
Именно поэтому у devnet, testnet и mainnet нет общих балансов и общих подписей (devnet, testnet и mainnet).
Узел никогда не строит генезис сам: блок 0 уже должен быть в его базе данных при запуске (работа узла).
Никакого мастер-ключа
В генезисе нет ключа, который мог бы позже переписать цепочку. Правила и параметры меняются только через новые релизы, которые несут высоты применения правил, и через ограниченные голосования мест реестра по ценам (голосования по ценам). Ни один ключ не меняет правило, параметр или баланс, подписав сообщение, а бинарный файл узла, не согласный с высотами правил, записанными для его цепочки, отказывается запускаться. Начиная с версии 0.5.8 все 121 правило консенсуса действуют с высоты 0.