Как устроена платформа

Алгоритм консенсуса CFT

При интенсивном обмене информацией в корпоративном блокчейне важна согласованность действий между элементами сети, формирующими единый блокчейн. И чем больше участников обмена – тем больше вероятность возникновения какой-либо ошибки: отказ оборудования одного из участников, проблемы с сетью, и так далее. Это может привести к возникновению форков основного блокчейна и, как следствие, откату блока, который, казалось бы, уже сформирован и включен в блокчейн. В такой ситуации откаченные блоки начинают майниться заново и на некоторое время становятся недоступны в блокчейне – а это, в свою очередь, может повлиять на использующие блокчейн бизнес-процессы. Алгоритм консенсуса CFT (Crash Fault Tolerance) исключает возникновение таких ситуаций.

Описание алгоритма

В основе реализации CFT лежит алгоритм консенсуса PoA с добавленной фазой голосования валидаторов раунда майнинга – участников сети, автоматически назначаемых алгоритмом консенсуса. Такой подход гарантирует следующее:

  • блок известен более чем половине участников сети и завалидирован ими;

  • блок не будет откачен и попадет в цепочку;

  • в блокчейне не произойдет образования параллельной цепочки.

Все это достигается посредством финализации выпущенного блока. Сама финализация блока опирается на консенсус большинства валидаторов раунда (50% + 1), в соответствии с которым и принимается решение о добавлении блока в сеть. В случае отсутствия такого большинства майнинг останавливается до восстановления связности сети.

Консенсус CFT, так же как и PoA, зависит от текущего времени, а время начала и окончания каждого раунда рассчитывается на основе временной метки genesis-блока. Основные параметры, на основе которых формируется алгоритм для определения майнера текущего блока, также идентичны параметрам алгоритма PoA (см. раздел Алгоритм консенсуса PoA). Для валидации блоков в блок consensus конфигурационного файла ноды были добавлены три новых параметра:

  • max-validators – лимит валидаторов, участвующих в голосовании в конкретном раунде.

  • finalization-timeout – время, в течение которого майнер ждет финализации последнего блока в цепочке. По прошествии этого времени майнер вернет транзакции обратно в UTX-пул и начнет майнить раунд заново.

  • full-vote-set-timeout – опциональный параметр, определяющий, сколько времени после окончания раунда (параметр конфигурационного файла ноды: round-duration) майнер ожидает полный набор голосов от всех валидаторов.

Для приведенного ниже описания функциональности CFT используются следующие обозначения:

  • t – длительность раунда в секундах (параметр конфигурационного файла ноды: round-duration).

  • tstart – время начала раунда.

  • tsync – время синхронизации блокчейна (tstart + t).

  • tend – время окончания раунда.

  • tfin – время ожидания финализации последнего блока майнером (параметр конфигурационного файла ноды: finalization-timeout).

  • Vmax – лимит валидаторов, участвующих в голосовании (параметр конфигурационного файла ноды: max-validators).

Голосование

Общая схема раунда при использовании CFT выглядит следующим образом:

CFT раунд

Голосование проводится каждый раунд, в нем могут участвовать ноды с ролью майнера. Голосование начинается при наступлении tsync и заканчивается при достижении tend + tfin . В рамках каждого временного интервала, выделенного для голосования, проводится голосование валидаторов и голосование майнера текущего раунда. Каждый валидатор раунда может отправить несколько голосов, в то время как майнер – единожды проголосовать за свой последний микроблок.

Для голосования используется сущность голоса, которая включает следующие параметры:

  • senderPublicKey – публичный ключ валидатора, который сформировал голос;

  • blockVotingHash – хэш жидкого блока с голосами, который подтвердил валидатор;

  • signature – подпись голоса, сформированная валидатором.

Определение валидаторов раунда и их голосование

Для определения валидаторов, которые могут голосовать в конкретный раунд, используется настраиваемый параметр ноды max-validators (Vmax ). Если число активных майнеров за вычетом майнера текущего раунда не превышает Vmax , то в голосовании может участвовать каждый из них. В противном случае для определения валидаторов применяется алгоритм псевдослучайного выбора, который позволяет исключить влияние конкретного майнера на выборку голосующих.

Голосование валидатора запускается при двух условиях:

  • очередная попытка голосования попадает во временной интервал, необходимый для голосования;

  • адрес текущей ноды является одним из определенных для голосования валидаторов раунда.

После окончания голосования валидаторов раунда запускается голосование майнера.

Голосование майнера текущего раунда

Голосование майнера запускается при двух условиях:

  • очередная попытка голосования попадает во временной интервал, необходимый для голосования;

  • адрес текущей ноды является майнером раунда.

Голос считается валидным в случае, если его выпустил адрес, который входит в число валидаторов текущего раунда и при этом имеет корректную подпись. Как только майнер набирает необходимое число голосов, выполняется проверка временного интервала голосования. Затем выпускается финализирующий микроблок с набранными голосами. Блок, имеющий голоса, считается финализированным.

Особенности майнинга

Основные правила майнинга в рамках консенсуса CFT идентичны правилам консенсуса PoA. При этом был введен дополнительный механизм, обеспечивающий отказоустойчивость консенсуса.

При использовании консенсуса CFT очередная попытка майнинга считается неудачной, если последний полученный блок не был финализирован – иными словами, к стейту не применен микроблок с набранными валидными голосами. При этом, если попытки майнинга выходят за временные рамки tstart + tfin , нода принимает решение вернуть все транзакции из последнего блока обратно в UTX-пул, после чего раунд начинает майниться заново.

Чтобы избежать возможного возврата транзакций в UTX-пул, рекомендуется работать не с последним (жидким) блоком блокчейна, а с финализированным – подтвержденным валидаторами сети.

Выбор канала для синхронизации

Для алгоритмов консенсуса PoS и PoA используется модуль, выбирающий для синхронизации наиболее сильную цепочку на основе сравнения данных задействованных нод. В CFT применяется иной механизм выбора, также увеличивающий отказоустойчивость системы: выбирается случайный канал из активных на момент синхронизации. Перечень активных каналов постоянно обновляется в ходе работы системы, а для равномерного распределения нагрузки на сеть время синхронизации с конкретным каналом ограничено.

Изменение параметров консенсуса

Как и в случае с алгоритмами консенсуса PoS и PoA, параметры консенсуса настраиваются на основе конфигурационного файла ноды. Ниже приведен пример конфигурации:

consensus {
  type: cft
  warnings-for-ban: 3
  ban-duration-blocks: 15
  max-bans-percentage: 33
  round-duration: 7s
  sync-duration: 2s
  max-validators: 7
  finalization-timeout: 4s
  full-vote-set-timeout: 4s
}

Рекомендации по конфигурации CFT см. в разделе Общая настройка платформы: настройка консенсуса.