Вики ZooBC
Работа узла

Реестр узлов и его места

Реестр узлов — это хранящийся в цепочке список узлов, которым разрешено создавать блоки ZooBC. Каждая запись в нём — место. В Proof of Participation то, кто создаёт блоки, определяют места, а не монеты или оборудование: шанс оператора создать следующий блок равен его доле мест. Каждое изменение реестра — это транзакция, которую проверяет каждый узел, и прочитать его может любой.

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

Что записано о месте

Для каждого узла реестр хранит:

  • идентификатор узла — число, выведенное из ключа узла: его первые 8 байт, прочитанные как целое число в порядке little-endian, со сброшенным старшим битом;
  • ключ узла — 32-байтовый публичный ключ Ed25519, которым подписывается работа узла (см. Ключи узла);
  • аккаунт владельца — обычный аккаунт, который зарегистрировал узел и управляет им;
  • высоту регистрации — блок, в котором узел зарегистрировался;
  • заблокированный стейк — ZBC, которые владелец заблокировал в качестве залога;
  • статус: зарегистрирован (активен), в очереди или удалён.

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

Почему места

В Proof of Work долю производства блоков можно купить так быстро, как покупается оборудование; в Proof of Stake — так быстро, как покупаются монеты. В ZooBC это доля мест, а места допускаются по одному, в темпе, который задаёт протокол (темп допуска). Поэтому большинство в производстве блоков нельзя быстро купить. Статья Proof of Participation в сравнении с PoW и PoS сопоставляет эти три схемы.

Жеребьёвка производителей равномерна по зарегистрированным местам, которые не приостановлены (жеребьёвка). Любое место выбирается с одинаковой вероятностью, сколько бы ни заблокировал его владелец. Оператор, которому принадлежат 3 из 30 мест, создаёт примерно один блок из десяти, блокирует ли каждое из его мест 100 ZBC или 10 000 ZBC.

Колесо с одинаковым сектором на каждое место независимо от стейка; стейк вместо этого упорядочивает очередь
Колесо с одинаковым сектором на каждое место независимо от стейка; стейк вместо этого упорядочивает очередь

Зачем нужен стейк

Если стейк не покупает блоков, для чего он?

  • Он упорядочивает очередь узлов, ожидающих входа, по стейку, умноженному на время ожидания (очередь).
  • Он делает так, что каждое место чего-то стоит: новичок должен заблокировать не меньше минимума для входа (регистрация узла).
  • Это залог. Его десятая часть теряется, если узел исключается или уходит, будучи отсутствующим или приостановленным; эта десятая часть уходит в пул долголетия, который платит работающим узлам (выход из реестра).

Сам по себе стейк ничего не приносит. Вознаграждения его тоже не учитывают: лотерея coinbase взвешивается по оценке участия, которую повышает только реальная работа (зрелость и доходы).

Генезис-места и новички

Каждая цепочка начинается с 11 генезис-мест, принадлежащих ZooBC Foundation. Они записаны в реестр на высоте 0 без заблокированного стейка, с оценкой по умолчанию 20 % и рабочим балансом 10 ZBC на собственном аккаунте каждого узла. Все остальные входят через очередь: никто не выбирает претендентов, и этапа одобрения нет. Нет и фиксированного календаря: время между двумя допусками зависит от числа учтённых мест. Регистрация не истекает.

Как место меняет статус

ИзВПричина
(нет)зарегистрировангенезис, на высоте 0
(нет) или удалёнв очередирегистрация
в очередизарегистрировандопуск
зарегистрированудалёнисключение, удаление владельцем или заявка
в очередиудалёнудаление, заявка или исключение из очереди за пропуск явки

Приостановка — не статус. Приостановленный узел остаётся «зарегистрированным», но не участвует в жеребьёвке производителей, пока не вернётся (пропущенные ходы, приостановка и исключение).

Как прочитать реестр

Реестр публичен, и для его чтения ключ не нужен:

  • GET /api/v1/nodes?status=all перечисляет все места с владельцами и высотами регистрации; у генезис-мест высота остаётся 0.
  • GET /api/v1/nodes?status=queued перечисляет очередь со стейком и высотой регистрации каждого узла.
  • GET /api/v1/blockchain/rules перечисляет действующие правила.

Это не список кошельков: обычному аккаунту не нужна регистрация, чтобы хранить или отправлять ZBC.

См. также