Консенсус — это достижение согласия по некоторому вопросу. Консенсус может складываться стихийно, и тогда он просто констатируется («в обществе сложился консенсус»), но чаще для достижения консенсуса нужна какая-то процедура, например голосование, и в случае разногласия по какому-то вопросу для достижения консенсуса все принимают сторону большинства. Между тем в [1] дан пример традиционного описания консенсусов, явно вызыващий недоумение: «Proof-of-Work и Proof-of-Stake — два наиболее известных алгоритма консенсуса в криптовалютах. Они предлагают отличающиеся по своей структуре механизмы доказательства проделанной работы… PoW — алгоритм защиты распределенных систем от злоупотреблений (DoS-атаки, спам-рассылки и т. д.)… PoS — использование “доли” (stake) в качестве ресурса, который определяет, какой именно узел получает право добычи следующего блока». Если PoW и PoS определяются как алгоритмы консенсуса, то почему первый тут же описывается как «алгоритм защиты распределенных систем», а второй — как принцип выбора узла, имеющего права создавать очередной блок? Все это может стать источником разного рода недоразумений и мифов.
Когда речь идет о консенсусе в пиринговых (одноранговых) сетях, то обычно имеется в виду принятие решения о синхронизации состояний их узлов — в отсутствие единого центра управления все узлы сети должны поддерживать согласованное состояние с помощью некоторого алгоритма консенсуса. В случае блокчейн-сети (здесь рассматриваются стандартные блокчейны типа биткойна без учета новых графовых сетей) узлы должны прийти к консенсусу относительно допустимости транзакций в блоке и затем добавить этот блок каждый к своей цепочке. Фактически речь идет о гарантии того, что каждый узел сети поддерживает одну и ту же валидную цепочку блоков. Но при чем тут Proof-of-Work или Proof-of-Stake? Какое отношение к валидности транзакции, и особенно к согласию между узлами о поддержке одной цепочки блоков, имеет решение сложной криптографической задачи (поиск хеша с определенным числом лидирующих нулей) или «доля» пользователя сети, определяемая количеством монет в его кошельке?
Изначально принцип «доказательства работы» был предложен для защиты от почтового спама. Логика была предельно проста: если отправитель письма потратит несколько секунд своего процессорного времени на некую работу (скажем, на поиск хеша заголовка сообщения с несколькими нулями впереди), то от него не убудет. При этом получатель проверит правильность этого хеша вообще практически мгновенно. А вот спамер при отправке миллиона писем уже столкнется с проблемами: рассылка станет явно нерентабельной, поскольку потребует больших ресурсов. Автор биткойна предложил использовать схему «доказательства работы» для предотвращения фальсификации данных в блокчейне. Исходно был предложен простой алгоритм записи данных: разбить данные на блоки и в каждый последующий блок вставлять хеш предыдущего. В этом случае для изменения некоторого значения в начальных блоках злоумышленнику придется пересчитывать хеши всех последующих блоков. Чтобы предельно затруднить этот пересчет, применяется PoW — к цепи присоединяются только блоки, хеши которых начинаются с заданного количества нулей. Правильный хеш ищется перебором, что требует значительных ресурсов.
Использование принципа «доказательства работы» также дало ответ и на вопрос: чей блок будет следующим в цепи? Того, кто первым найдет нужный хеш. Попутно была решена и проблема поддержания фиксированного промежутка времени между появлением в сети новых блоков — с ростом мощности оборудования для формирования блоков (майнинга) автоматически увеличивается число искомых нулей.
Это все, что можно сказать про «доказательство работы». В случае «доказательства доли» (Proof-of-Stake) меняется лишь ответ на вопросы: «Кто имеет право?» и «Чья очередь генерировать новый блок?». Это делают обладатели достаточной суммы токенов. Но это снова не про консенсус и не про голосование за правильные транзакции!
Да, безусловно, каждый узел при создании блока проверяет валидность всех входящих в него транзакций. И все другие узлы, прежде чем присоединить блок к цепочке, проверяют его на соответствие хешу предыдущего блока и допустимость включенных в него транзакций. Но, во -первых, понятно, что эти проверки не имеют никакого отношения именно к Proof-of-Work и Proof-of-Stake, — они обязательны для всех блокчейнов, независимо от используемых в них вариаций «Proof-of». Во-вторых, мнение каждого отдельного узла о валидности транзакций — это только повод для разговора о консенсусе, но еще не сам консенсус.
Про консенсус же совсем другая история, которую при описании сути Proof-of-Work или Proof-of-Stake порой забывают, — это история под названием «голосование длиной цепочки форка» (ответвляющейся цепочки). Именно это «мнение большинства» и было указано автором биткойна как способ достижения консенсуса [2]: «Участники всегда считают истинной самую длинную версию цепочки и работают над ее удлинением. Если два узла одновременно опубликуют разные версии очередного блока, то кто-то из остальных пиров получит раньше одну версию, а кто-то — другую. В таком случае каждый начнет работать над своей версией цепочки, сохранив другую на случай, если она окажется продолжена раньше. Двойственность исчезнет, как только будет получен новый блок, который продолжит любую из ветвей, и те узлы, что работали над конкурирующей версией, переключатся на нее».
Итак, очевидно, что в Proof-of-Work блокчейн-сети имеется вероятность одновременного распространения сразу нескольких блоков с правильными хешами. Также понятно, что в сети могут появиться цепочки с блоками, содержащими невалидные транзакции, которые и пытаются строить злоумышленники для проведения двойной траты. В результате возникают две или более альтернативные цепочки блокчейна. А где есть альтернатива, там и голосование: часть узлов может посчитать валидными блоки одной цепочки, а некоторые — другой. Выигрывает большинство — наиболее длинная цепочка, в которой больше узлов, мощности процессоров, доли токенов и которая растет быстрее. В конечном итоге те, кто голосовал «против» (если это не злонамеренные узлы), всегда вынуждены будут отступить к основанию вилки и принять мнение большинства — накатить блоки победившей цепи. Вот он и консенсус — установка единого мнения по поводу истинной версии блокчейна.
Получается, что сами по себе механизмы Proof-of-Work, Proof-of-Stake не имеют непосредственного отношения к консенсусу, как и не являются алгоритмами консенсуса, хотя и играют важную роль в обеспечении работоспособности и безопасности сети. Во-первых, они задают права узлов на формирование блока. Во-вторых, определяют то, чем «голосуют» узлы за ту или иную цепочку: мощность процессоров, токены, авторитет. В-третьих, что наиболее важно, эти механизмы устанавливают экономическую заинтересованность генерирующих узлов честно выполнять свою функцию. Предполагается, что человек, купивший дорогое оборудование для майнинга или вложивший большую сумму в криптовалюте за право создавать блоки, едва ли решится нанести вред сети, начав умышленно искажать данные. То есть можно констатировать, что, хотя сами механизмы Proof-of-Work, Proof-of-Stake и не являются алгоритмам консенсуса, они играют важную роль в его конкретных реализациях.
Здесь необходимо отметить, что среди традиционного списка консенсусов, приводимых в обзорах (всяких «Proof-of»), есть действительно настоящие — это консенсусы, к которым, в частности, относятся консенсусы из серии BFT (Byzantine Fault Tolerance — «византийская отказоустойчивость»). Отличительной особенностью алгоритмов BFT по сравнению с консенсусом, реализуемым голосованием длиной цепочек, является достижение согласия узлов о валидности транзакций до помещения их в блокчейн. Сначала узлы (или их часть) «играют в византийских генералов» — обмениваются между собой сообщениями по поводу валидности транзакции или блока транзакций, и данные попадают в цепь только в случае, если им удается достигнуть консенсуса. В сетях с BFT-консенсусом транзакция подтверждается до запечатывания в блок, и никаких форков там быть не может.
Итак, если быть предельно точными, то на вопрос «А каков механизм консенсуса в данной блокчейн-сети?» следует отвечать: либо «голосование длиной цепочки форка», либо «некий вариант BFT». Если же консенсус предполагает мериться длиной цепочек, то дополнительно следует уточнить детали алгоритма: как выбираются узлы, имеющие право генерировать новые блоки; чем узлы голосуют за ту или иную цепочку — мощностями процессоров, долями, авторитетом и проч.; какова форма экономической стимуляции узлов принимать участие в формировании блоков. Proof-of-Work, Proof-of-Stake и другие варианты консенсуса типа «голосование длиной цепочки форка» отличаются друг от друга именно ответами на эти три вопроса.
***
Скорее всего, всевозможные разновидности «Proof-of» будут в блокчейн-сообществе и дальше называть «консенсусом», однако для избежания разного рода недоразумений всегда полезно глубокое знание деталей алгоритма выбора единой для сети цепочки блоков.
1. Forklog, Карточки: Что такое Proof-of-Work и Proof-of-Stake? URL: https://forklog.com/chto-takoe-proof-of-work-i-proof-of-stake (дата обращения: 24.05.2019).
2. Сатоши Накамото. Биткойн: система цифровой пиринговой наличности. URL: bitcoin.org/files/bitcoin-paper/bitcoin_ru.pdf (дата обращения: 24.05.2019).
Александр Болдачев (boldachev@gmail.com) — системный аналитик блокчейн-платформы Apla (Санкт-Петербург).