Перейти к содержанию

Производство блоков (объяснение)

Для наглядности введём обозначения:

  • r = producer_repetitions = 12 (жёстко задано)
  • m = max_block_cpu_usage (консенсус в цепочке)
  • u = max_block_net_usage (консенсус в цепочке)
  • t = block-time
  • e = 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 - a
  • p = окно выпуска блока = w - a (доступное время стеновых часов на один блок)
  • c = billed_cpu_in_block = minimum(m, w - a)
  • n = задержка сети TCP/IP
  • h = время проверки заголовка блока, мс

Валидация на пирах при схожем железе/версии/конфиге занимает ≤ 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 время валидации сокращается.