Производство блоков (объяснение)
Для наглядности введём обозначения:
r=producer_repetitions = 12(жёстко задано)m=max_block_cpu_usage(консенсус в цепочке)u=max_block_net_usage(консенсус в цепочке)t=block-timee=produce-block-offset-ms(конфигурация nodeos)w=block-time-interval = 500ms(жёстко задано)a=produce-block-early-amount = w - (w - (e / r)) = e / r ms(насколько раньше выпускается каждый блок раунда)l=produce block time = t - ap=окно выпуска блока = w - a(доступное время стеновых часов на один блок)c=billed_cpu_in_block = minimum(m, w - a)n=задержка сети TCP/IPh=время проверки заголовка блока, мс
Валидация на пирах при схожем железе/версии/конфиге занимает ≤ m
Пример: два BP и топология сети на схеме
+------+ +------+ +------+ +------+
-->| BP-A |---->| BP-A |------>| BP-B |---->| BP-B |
+------+ | Peer | | Peer | +------+
+------+ +------+
BP-A отправляет блок в момент l, а BP-B должен получить блок к моменту t, иначе блок отбрасывается.
Если BP-A выпускает 12 блоков в моменты b(lock) at t(ime) 1, bt 1.5, bt 2, …, bt 6.5, то BP-B должен получить bt 6.5 к моменту 6.5, чтобы осталось 0.5 на выпуск bt 7.
Время bt 7 минус 0.5 совпадает со временем bt 6.5, то есть t — время последнего блока BP-A, с которого BP-B должен начать свой первый блок.
Блок выпускается и отправляется, когда достигнут один из пределов: m, u или p.
Начиная с COOPOS 4.0, блоки распространяются после проверки заголовка. Вместо того чтобы пирам BP-A и BP-B тратить время порядка m на полную валидацию и пересылку, проверяется заголовок за миллисекунды и блок пересылается дальше.
Начиная с COOPOS 5.0, блоки в раунде стартуют сразу после завершения предыдущего. До 5.0 блоки всегда начинались с шагом w, и узел мог «спать» между блоками. В 5.0 паузы сдвинуты к концу раунда выпуска.
Пример 1: блок приходит на 110 мс раньше¶
- Нулевая сетевая задержка между всеми узлами.
- Блоки не упираются в
m, время выпуска каждого —w - a. - Время завершения блока и подписи — ноль.
- У
BP-A: e = 120, n = 0 мс, h = 5 мс, a = 10 мс BP-Aшлёт b1 вt1-10 мс⇒BP-A-Peerобрабатываетh=5 мс, шлёт вt-5 мс⇒BP-B-Peerобрабатываетh=5 мс, шлёт вt-0 мс⇒ приходит вBP-Bвt.BP-Aначинает b2 вt1-10 мс, шлёт b2 вt2-20 мс⇒ … приходит вBP-Bвt2-10 мс.BP-Aначинает b3 вt2-20 мс, …BP-Aначинает b12 вt11-110 мс, шлёт b12 вt12-120 мс⇒ … приходит вBP-Bвt12-110 мс
Пример 2: блок приходит на 80 мс раньше¶
- Нулевая задержка между
BP-AиBP-A Peerи междуBP-B PeerиBP-B. - 150 мс между
BP-A PeerиBP-B Peer. - Блоки не упираются в
m, время выпуска —w - a. - Время подписи — ноль.
- У
BP-A: e = 240, n = 0/150 мс, h = 5 мс, a = 20 мс BP-Aшлёт b1 вt1-20 мс⇒ … приходит вBP-Bвt+140 мс.BP-Aначинает b2 вt1-20 мс, шлёт b2 вt2-40 мс⇒ … приходит вBP-Bвt2+120 мс.- …
- b12 приходит в
BP-Bвt12-80 мс
Пример 3: блок опоздал на 16 мс и отброшен¶
- Нулевая задержка между
BP-AиBP-A Peerи междуBP-B PeerиBP-B. - 200 мс между
BP-A PeerиBP-B Peer. - Блоки не упираются в
m, время выпуска —w - a. - Время подписи — ноль.
- У
BP-A: e = 204, n = 0/200 мс, h = 10 мс, a = 17 мс - Цепочка задержек даёт приход b1 в
BP-Bвt+203 мс. - …
- b12 приходит в
BP-Bвt12+16 мс— слишком поздно, блок отбрасывается.
Пример 4: полные блоки выпускаются раньше¶
- Нулевая задержка между
BP-AиBP-A Peerи междуBP-B PeerиBP-B. - 200 мс между
BP-A PeerиBP-B Peer. - Все блоки полные: в очереди достаточно неприменённых транзакций.
- Блок с транзакциями на 200 мс CPU по времени исполнения собирается за 225 мс (с учётом накладных расходов на выпуск блока).
- У
BP-A: e = 120, m = 200 мс, n = 0/200 мс, h = 10 мс, a = 10 мс BP-Aшлёт b1 вt1-275 мс⇒BP-A-Peerобрабатываетh=10 мс, шлёт вt-265 мс=(200 мс)=>BP-B-Peerобрабатываетh=10 мс, шлёт вt-55 мс⇒ приходит вBP-Bвt-55 мс.BP-Aначинает b2 вt1-275 мс, шлёт b2 вt2-550 мс (t1-50 мс)⇒BP-A-Peerобрабатываетh=10 мс, шлёт вt2-540 мс=(200 мс)=>BP-B-Peerобрабатываетh=10 мс, шлёт вt2-330 мс⇒ приходит вBP-Bвt2-330 мс.BP-Aначинает b3 вt2-550 мс, …BP-Aначинает b12 вt11-3025 мс, шлёт b12 вt12-3300 мс⇒BP-A-Peerобрабатываетh=10 мс, шлёт вt12-3290 мс=(200 мс)=>BP-B-Peerобрабатываетh=10 мс, шлёт вt12-3080 мс⇒ приходит вBP-Bвt12-3080 мс
На ретрансляторе с wasm-runtime=eos-vm-jit и eos-vm-oc-enable время валидации сокращается.