Темп допуска
ZooBC допускает новые узлы в реестр узлов по одному, по таймеру, который намеренно идёт медленно. Доля оператора в производстве блоков — это его доля мест, поэтому темп, в котором можно получить места, — это темп, в котором кто угодно может обрести власть над цепочкой. Протокол фиксирует этот темп, и наблюдать за ним может любой.
Почему медленно
В Proof of Work долю производства блоков можно купить так быстро, как покупается оборудование; в Proof of Stake — так быстро, как покупаются монеты. В ZooBC эту долю нужно получить через допуск — по одному узлу за цикл допуска, в темпе, который задаёт протокол. Поэтому внезапный захват, например ради отмены платежа, невозможен в принципе, а не просто дорог (от чего защищает Proof of Participation).
Медлительность никак не связана со скоростью цепочки. Новый узел может начать с недавнего снимка, а не со всей истории, никто не проводит собеседований с операторами, а цепочка создаёт один блок каждые 15 секунд, сколько бы в ней ни было узлов.
Формула
Задержка между двумя допусками равна:
delay = clamp(base ÷ counted seats, minimum, maximum)
В mainnet база — 600 дней, минимум — 7 дней, максимум — 90 дней. Testnet использует те же значения. Первый новичок может быть допущен через 7 дней после генезиса. Таймер читает метки времени блоков и допускает не более одного узла за цикл, причём никогда — в том же блоке, который поставил его в очередь. Какой узел он допускает, решает очередь.
Задержка до следующего допуска устанавливается в момент допуска новичка, по числу мест до него.
Какие места учитываются
- Генезис-места учитываются не более чем как 11 (это генезис-значение, 11 в каждой цепочке).
- Новички учитываются полностью.
- Приостановленные места не учитываются ни в одной из групп.
Ограничение не даёт большому генезису быстро открыть реестр. Без него цепочка, запущенная со 100 генезис-местами, получила бы 600 ÷ 100 = 6 дней, поднятые до минимума в 7 дней, и с самого начала допускала бы новичка каждую неделю. С ограничением подсчёт начинается с 11, и расписание такое же, как в цепочке из 11 мест. Неучёт приостановленных мест означает, что темп задают только работающие места.
Расписание
Если очередь никогда не пустеет и никто не уходит, новички приходят так:
| Новичок | Приходит примерно |
|---|---|
| 1-й | на 7-й день |
| 2-й | на 61,5-й день |
| 7-й | на 278-й день |
| 11-й | на 408-й день |
Это 9 новичков за первый год, 25 к концу второго года, 54 к третьему и около 155 к пятому. Начиная с 86 учтённых мест 600 ÷ 86 меньше 7 дней, поэтому в силу вступает минимум: допуски становятся еженедельными примерно с 77-го новичка, примерно через 3,5 года после генезиса. Претендент, который выиграл бы каждый допуск подряд, получил бы своё 12-е место, достаточное, чтобы превзойти числом 11 генезис-мест, лишь около 437-го дня.
Пока решает базовый член формулы, реестр растёт на фиксированную долю за единицу времени, потому что каждый допуск добавляет одно место, а задержка равна базе, делённой на число мест. Поэтому удвоение реестра занимает около base × ln 2, примерно 416 дней в mainnet, независимо от его размера.
Особые случаи
- Маленький реестр. Пока активных узлов меньше
min_registry_size(7 в mainnet), максимальная задержка ограничена 7 днями. - После долгой остановки таймер допускает один узел, а затем возвращается к обычному ритму.
- Devnet, цепочка для разработки, использует ту же формулу с базой 180 секунд, минимумом 60 секунд и максимумом 300 секунд, поэтому её допуски идут с интервалом в минуты.
Все входные данные находятся в цепочке, поэтому любой может пересчитать, когда наступит следующий допуск.