Раунды, время и окна
ZooBC стремится к одному блоку каждые 15 секунд. После каждого блока время делится на 15-секундные раунды, и жеребьёвка называет по одному производителю на раунд. Метка времени блока помещает его в раунд, и создать его может только узел, выбранный на этот раунд или на предыдущий. Это правило задаёт цепочке ровный ритм и гарантирует, что отсутствующий производитель задерживает следующий блок на 15 секунд, но никогда больше.
Раунды и целевое время
Пусть P — метка времени предыдущего блока. Целевое время раунда r — P + 15 × r: раунд 1 — через 15 секунд после предыдущего блока, раунд 2 — через 30 секунд, раунд 3 — через 45 секунд и так далее. Производитель раунда 1 стремится поставить на свой блок метку своего целевого времени. Если он молчит, блок создаёт производитель раунда 2, целясь в 30 секунд; и так далее по списку.
Высоты никогда не пропускаются. Когда производитель отсутствует, следующий блок просто приходит на 15 секунд позже, на той же высоте, от следующего производителя в очереди. Каждый узел, выбранный раньше фактического производителя, получает пропущенный ход (см. Пропущенные ходы, приостановка и исключение).
Два раунда для каждого производителя
Производитель, выбранный в раунде i, может создать блок раунда i или раунда i + 1. Так что опоздавший узел раунда 1 ещё может выпустить блок во время раунда 2, при этом право имеет и узел раунда 2. В любой момент право создать блок есть у двух выбранных узлов, и цепочка никогда не ждёт одного-единственного узла. Не ждёт она и чьей-либо приостановки: для приостановки нужны четыре пропущенных хода подряд, и она лишь исключает узел из будущих жеребьёвок.
В какой раунд попадает метка времени
Раунд блока с меткой времени T равен:
round(T) = 1 + floor((T − P − 15 + 7) / 15) (and never less than 1)
У каждого раунда также есть окно приёма длиной 14 секунд — от 7 секунд до его целевого времени до чуть меньше 7 секунд после него. В целых секундах:
| Раунд | Целевое время | Секунды, которые засчитывает формула | Окно приёма (целевое время ± 7 с) |
|---|---|---|---|
| 1 | P + 15 | до P + 22 | от P + 8 до P + 21 |
| 2 | P + 30 | от P + 23 до P + 37 | от P + 23 до P + 36 |
| 3 | P + 45 | от P + 38 до P + 52 | от P + 38 до P + 51 |
| 4 | P + 60 | от P + 53 до P + 67 | от P + 53 до P + 66 |
Последняя секунда, которую формула отдаёт каждому раунду (P + 22, P + 37, P + 52, ...), лежит на одну секунду за окном этого раунда. Валидаторы проверяют метку времени блока по окну его раунда с допуском в 2 секунды, поэтому эти секунды на стыках тоже принимаются.
Раунд важен дважды. Он определяет, кто может создать блок, и ограничивает вес блока при выборе ветви: блок никогда не оценивается выше, чем раунд, в который попадает его метка, поэтому производитель, выбранный в раунде 2 и поставивший метку в раунде 3, весит не больше блока раунда 3.
Правила часов, которые применяет каждый узел
- Блок с меткой менее чем через 13 секунд после родителя отклоняется как созданный слишком быстро (15-секундный интервал минус 2 секунды допуска). Поэтому поставить метку на блок сразу, как только замечен пропуск, невозможно.
- Блок с меткой более чем на 7 200 секунд (2 часа) впереди собственных часов узла этот узел отклоняет, пока его часы не догонят.
- После остановки более чем на час (предел восстановления 3 600 секунд) блок всё равно принимается, если он исходит от производителя, которого ожидает жеребьёвка, поэтому остановившаяся цепочка может запуститься снова.
Здесь действуют два окна. Производитель, выбранный в раунде i, должен поставить метку на свой блок в пределах окна создания этого раунда — от 7 секунд до целевого времени раунда до 27 секунд после него, что заходит в следующий раунд. Валидаторы, кроме того, требуют, чтобы метка лежала в окне приёма того раунда, в который она попадает, с допуском в 2 секунды.
Локальная политика времени
Две временные настройки — собственная политика каждого узла, а не правила консенсуса. Производитель, выбранный первым, отправляет свой блок в P + 15; остальные отправляют свои в конце окна своего раунда минус 5 секунд (и никогда не раньше P + 15). И примерно раз в секунду каждый узел применяет из имеющихся у него блоков-кандидатов тот, у которого наименьшая позиция и открыто окно.
Для сравнения, Bitcoin стремится к одному блоку каждые десять минут. 15-секундный ритм ZooBC одинаков во всех цепочках ZooBC: сутки — это 5 760 блоков (см. Блоки и время).