Вики ZooBC
Основы ZooBC

Генезис-блок

Каждая цепочка 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.

См. также