Реестр узлов и его места
Реестр узлов — это хранящийся в цепочке список узлов, которым разрешено создавать блоки 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.