# Параллельное выполнение

Monad выполняет транзакции параллельно. На первый взгляд может показаться, что это предполагает другую семантику выполнения, чем в Ethereum, но на самом деле это не так. Блоки Monad идентичны блокам Ethereum - это линейно упорядоченный набор транзакций. Результат выполнения транзакций в блоке одинаков для Monad и Ethereum.

## Оптимистичное выполнение

&#x20;На базовом уровне Monad использует оптимистичное выполнение. Это означает, что Monad начнет выполнение транзакций до того, как более ранние транзакции в блоке завершатся. Иногда (но не всегда) это приводит к неправильному выполнению.

Рассмотрим две транзакции (в данном порядке в блоке):

* Транзакция 1 считывает и обновляет баланс счета A (например, получает перевод от счета B).
* Транзакция 2 также считывает и обновляет баланс счета A (например, делает перевод на счет C).

Если эти транзакции выполняются параллельно и транзакция 2 начинает выполняться до того, как транзакция 1 завершится, то баланс, который она считывает для счета A, может быть другим, чем если бы они выполнялись последовательно. Это может привести к неправильному выполнению.

Оптимистичное выполнение решает эту проблему путем отслеживания используемых входных данных во время выполнения транзакции 2 и сравнения их с выходами транзакции 1. Если они отличаются, мы обнаружили, что транзакция 2 использовала неправильные данные во время выполнения, и ее нужно выполнить снова с правильными данными.

Хотя Monad выполняет транзакции параллельно, обновленное состояние для каждой транзакции «сливается» последовательно, чтобы проверить условие, упомянутое выше.

Связанные с темой компьютерных наук темы - это [оптимистическое управление](https://prufiox.gitbook.io/monad-dlya-razrabotchikov/tekhnicheskoe-obsuzhdenie) параллелизмом (OCC) и [программная транзакционная память](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%B0%D1%8F_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C) (STM).

## Последствия оптимистичного выполнения

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

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

Более того, при выполнении транзакции снова из-за неудачи слияния, часто учетная запись (или учетные записи) и хранилище, к которому обращаются, не изменятся. Это состояние все еще кэшируется в памяти, поэтому эта дорогостоящая работа не должна повторяться.

## Планирование&#x20;

Наивная реализация оптимистичного выполнения будет пытаться начать выполнение следующей транзакции, когда процессор будет иметь доступные ресурсы. Могут существовать длинные "цепочки" транзакций, которые зависят друг от друга в блоке. Выполнение этих транзакций параллельно приведет к значительному количеству неудач.

Определение зависимостей между транзакциями заранее позволяет Monad избежать этого зря потраченного усилия, планируя выполнение транзакций только после завершения предварительных транзакций. У Monad есть статический анализатор кода, который пытается делать такие прогнозы. В хорошем случае Monad может предсказать множество зависимостей заранее; в худшем случае Monad возвращается к наивной реализации.

## Дальнейшая работа&#x20;

Существуют другие возможности избежать повторного выполнения транзакций, которые все еще изучаются.<br>
