# Отложенное выполнение

Построение консенсусного выполнения в конвейере

Одним из новаторских аспектов блокчейна Monad является отделение выполнения от консенсуса.

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

В консенсусе Monad узлы приходят к согласию относительно официального порядка транзакций, но ни лидер, ни узлы-валидаторы еще не выполнили эти транзакции.

То есть лидер предлагает порядок, не зная еще результирующего корня состояния, и узлы-валидаторы голосуют за допустимость блока, не зная (например), выполняются ли все транзакции в блоке без отката.

Как это возможно? И зачем Monad делает это?

Ответ является основой дизайна Monad, и это позволяет Monad разблокировать значительные ускорения, позволяющие масштабировать однофрагментный блокчейн до миллионов пользователей.

## Использование одновременного выполнения транзакций и процесса консенсуса не оптимально

В Ethereum выполнение является предпосылкой для консенсуса, поэтому когда узлы приходят к согласию относительно блока, они соглашаются и на (1) список транзакций в блоке, и на (2) корень Меркла, подводящий итог всему состоянию после выполнения этого списка транзакций. В результате лидер должен выполнить все транзакции в предложенном блоке, прежде чем поделиться предложением, а проверяющие узлы должны выполнить эти транзакции, прежде чем ответить голосованием.

В данной парадигме бюджет времени на выполнение задачи крайне ограничен, поскольку она должна выполняться дважды и оставлять достаточно времени для нескольких раундов международной коммуникации для достижения консенсуса. Кроме того, так как выполнение задачи заблокирует процесс формирования консенсуса, лимит газа должен быть выбран крайне консервативно, чтобы гарантировать завершение вычислений на всех узлах в рамках бюджета даже в самом неблагоприятном сценарии.

## Определенный порядок подразумевает детерминизм состояния (Установленный порядок означает определенность состояния.)

Здесь кроется очевидный, но крайне важный момент: при официальном упорядочивании транзакций истинное состояние полностью определено. Для раскрытия истины требуется исполнение, но истина уже определена.

Monad использует этот принцип, убирая требование предварительного выполнения узлами до достижения консенсуса. Согласование между узлами касается исключительно официального порядка; каждый узел выполняет транзакции в блоке `N` независимо друг от друга, начиная согласование по блоку `N+1`.

Это позволяет использовать бюджет газа, соответствующий полному времени блока, поскольку выполнение должно лишь не отставать от консенсуса. Кроме того, такой подход более устойчив к изменениям в точном времени вычислений, поскольку выполнение должно лишь в среднем держаться за консенсусом.

## Задержанные корни Merkle по-прежнему гарантируют воспроизведение состояния системы

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

Что произойдет, если один из узлов злонамеренный и не выполняет точно те же транзакции, которые указаны в согласии? (Например, он может пропустить определенные транзакции или установить переменную состояния в произвольное значение.)

Что произойдет, если один из узлов допустит ошибку во время выполнения?

Для решения этих проблем в Monad предложения блоков включают отложенный корень Merkle на `D` блоков, где `D` является системным параметром (в настоящее время предполагается, что это 10). В результате этого отложенного корня Merkle:

1. После того как сеть достигает консенсуса (2/3 большинство голосов) по блоку `N`, это означает, что сеть согласовала, что официальным следствием блока `N-D` является состояние, основанное на корне Merkle M. Легкие клиенты могут затем запрашивать у полных узлов доказательства Merkle значений переменных состояния на блоке `N-D`.
2. Любой узел с ошибкой выполнения на блоке `N-D` выйдет из консенсуса, начиная с блока `N`. Это приведет к откату на этом узле к конечному состоянию блока `N-D-1`, за которым последует повторное выполнение транзакций в блоке `N-D` (что, надеюсь, приведет к совпадению корней Merkle), за которым последует повторное выполнение транзакций в блоках `N-D+1`, `N-D+2` и так далее.

Подход Ethereum использует консенсус для обеспечения репликации конечного автомата очень строгим способом: после того, как узлы достигли консенсуса, мы знаем, что супер-большинство согласно с официальным порядком и состоянием, полученным из этого порядка. Однако эта строгость имеет свою цену - крайне ограниченную пропускную способность. Monad немного ослабляет эту строгость, что дает отличный эффект.

## О завершении сделок

В MonadBFT время окончательного закрепления (finality) составляет один блок (1 секунда), и результат выполнения обычно отстает менее чем на 1 секунду для пользователей полных узлов. Давайте разберем это подробнее.

**В Monad окончательное закрепление (finality) наступает после одного блока (1 секунда)**. Когда вы отправляете транзакцию, вы видите официальный порядок ее исполнения (среди всех других транзакций) уже после одного блока. Не существует возможности для переупорядочивания, за исключением злонамеренных действий супер-большинства сети. Это делает окончательное закрепление в Monad значительно быстрее, чем в Ethereum (где это занимает 2 эпохи, то есть около 12.8 минут).

Результат выполнения транзакции (успешно ли она выполнена? каковы балансы после этого?) обычно становится известным не позднее, чем через 1 секунду после момента окончательного закрепления для пользователей полных узлов. Любой, кто хочет быстро узнать результат транзакции (например, высокочастотный трейдер, желающий узнать статус транзакции), может использовать полный узел. Monad спроектирован таким образом, чтобы минимизировать затраты на использование полных узлов; подробнее об этом можно узнать из требований к оборудованию.

## О завершении сделок

В MonadBFT время окончательного закрепления (finality) составляет один блок (1 секунда), и результат выполнения обычно отстает менее чем на 1 секунду для пользователей полных узлов. Давайте разберем это подробнее.

В Monad окончательное закрепление (finality) наступает после одного блока (1 секунда). Когда вы отправляете транзакцию, вы видите официальный порядок ее исполнения (среди всех других транзакций) уже после одного блока. Не существует возможности для переупорядочивания, за исключением злонамеренных действий супербольшинства сети. Это делает окончательное закрепление в Monad значительно быстрее, чем в Ethereum (где это занимает 2 эпохи, то есть около 12.8 минут).

Результат выполнения транзакции (успешно ли она выполнена? каковы балансы после этого?) обычно становится известным не позднее, чем через 1 секунду после момента окончательного закрепления для пользователей полных узлов. Любой, кто хочет быстро узнать результат транзакции (например, высокочастотный трейдер, желающий узнать статус заказа), может использовать полный узел. Monad спроектирован таким образом, чтобы минимизировать затраты на использование полных узлов; подробнее об этом можно узнать из требований к оборудованию.

Те, кто хочет безопасно узнать результат транзакции без необходимости использовать полный узел, могут воспользоваться легким клиентом и запрашивать балансы у полного узла с помощью доказательств Merkle. В этом случае запросы будут выполняться с задержкой, равной задержке корня Merkle (D=10 блоков, то есть около 10 секунд). Следует отметить, что большинство пользователей в настоящее время просматривают состояние блокчейна с помощью программных кошельков (веб-кошельков) или через блок-эксплорер. Ни один из этих сценариев использования не требует легкого клиента.

Некоторые читатели могут ошибочно смешивать задержку корня Merkle (D=10 блоков) с окончательным закреплением и ошибочно предполагать, что процесс окончательного закрепления занимает 10 блоков. Это неверно. Официальный порядок транзакций определяется уже после одного блока, после чего не происходит реорганизации блокчейна без византийского поведения супер-большинства.
