Жизненный цикл транзакции в Monad

Отправка транзакции

Жизненный цикл транзакции начинается с того, что пользователь подготавливает подписанную транзакцию и отправляет ее на узел RPC.

Транзакции обычно подготавливаются фронтендом приложения, затем представляются кошельку пользователя для подписи. Большинство кошельков делают вызов RPC eth_estimateGas для заполнения предела газа для этой транзакции, хотя пользователь также может переопределить это в своем кошельке. Обычно у пользователя также спрашивают, какую цену газа он хочет установить для транзакции, которая представляет собой количество нативных токенов за единицу газа.

После того как пользователь подтверждает подпись в своем кошельке, подписанная транзакция отправляется на узел RPC с использованием вызова API eth_sendTransaction или eth_sendRawTransaction.

Следует отметить, что в Monad лимит газа является суммой газа передачи и газа выполнения. Газ передачи является постоянным значением.

Передача памяти пула

Узел RPC пересылает ожидающую транзакцию другим узлам Monad, участвующим в согласовании. Набор ожидающих транзакций неофициально называется "памятью пула" (mempool). Дополнительные сведения о поведении памяти пула можно найти в документации по памяти пула.

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

Добавление в блок

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

Блоки распространяются по сети в соответствии с протоколом MonadBFT. Кворумный сертификат (QC) для данного блока распространяется на следующем раунде согласования (т.е. отправляется следующим лидерам). После получения QC узлы голосуют друг за друга; когда узел видит, что 2/3 стейк-веса голосует "за", он окончательно фиксирует этот блок.

После фиксации блока транзакция официально "происходит" в истории блокчейна. Поскольку ее порядок определен, ее истинное значение (т.е. успешно ли она выполнена или нет, и каков был результат сразу после этого выполнения) также определено.

Локальное выполнение

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

Запрос результата

Пользователь может запросить результат транзакции, вызвав методы eth_getTransactionByHash или eth_getTransactionReceipt на любом узле RPC. Узел RPC вернет результат, как только выполнение завершится локально на узле.

Last updated