Что такое Nonce и почему одна транзакция блокирует кошелек Ethereum

Одна зависшая транзакция в эфириуме может остановить все следующие операции с того же адреса. Причина — nonce, то есть порядковый номер каждого исходящего перевода
Что такое Nonce и почему одна транзакция блокирует кошелек Ethereum
Источник: РБК Крипто

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

Допустим, адрес уже провел 17 операций. Следующая транзакция получит nonce 17, затем пойдут 18 и 19. Пока сеть не обработает операцию 17, две следующие останутся в очереди — даже с более высокой комиссией.

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

Как работает nonce

Nonce — счетчик исходящих транзакций адреса. Он начинается с нуля и увеличивается после каждой подтвержденной операции. Один номер можно использовать только один раз. Благодаря этому сеть понимает, в каком порядке обрабатывать команды, и не допускает повторного выполнения одной подписанной транзакции.

Входящие переводы на nonce не влияют. В разных сетях счетчики также ведутся отдельно. Один адрес может иметь nonce 25 в Ethereum, и, скажем, 11 в Base и 4 в Arbitrum.

Почему транзакции зависают

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

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

Проблема возникает и при работе через несколько сервисов. Например, кошелек и торговый бот могут одновременно решить, что следующим должен быть nonce 30. Они создадут две разные транзакции с одним номером, но сеть обработает только одну.

Возможен и пропуск. Если приложение отправило операцию с nonce 31, хотя транзакции № 30 еще нет, сеть будет ждать недостающий номер.

Как найти заблокировавшую очередь операцию

Чтобы найти операцию, которая заблокировала работу, нужно обнаружить неподтвержденную транзакцию с самым маленьким nonce. Она удерживает все последующие. Если в очереди находятся операции с номерами 42, 43 и 44, начинать нужно с номера 42. Повышение комиссии у двух следующих ничего не изменит.

Адрес и список операций можно проверить в обозревателе блокчейна. При работе через собственные приложения используют метод eth_getTransactionCount. Запрос «latest» учитывает подтвержденные операции, а «pending» может включать транзакции из очереди конкретного узла.

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

Как ускорить транзакцию

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

Повышение должно быть достаточным по правилам узла. При слишком маленькой разнице появляется ошибка со следующим текстом — replacement transaction underpriced.

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

Как отменить транзакцию

Отдельной команды для отмены в Ethereum нет. Кошелек заменяет исходную операцию новым переводом с тем же nonce.

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

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

Что означают ошибки nonce

«Nonce too low» означает, что этот номер уже использован. Возможно, транзакция была подтверждена или заменена другой.

«Nonce too high» появляется, если сеть ждет более ранний номер. Например, кошелек отправляет транзакцию № 53, хотя еще не получил № 52.

«Replacement transaction underpriced» означает, что новая версия операции предлагает слишком маленькое повышение комиссии.

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

Как восстановить работу кошелька

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

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

Отменять каждую транзакцию обычно не требуется. В большинстве случаев достаточно исправить первую операцию в очереди.

Как избежать повторной блокировки

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

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

В автоматизированных системах номера транзакций должен распределять один сервис. Он должен учитывать подтвержденные, подписанные и уже отправленные операции.

Перед серией переводов стоит проверить, нет ли в очереди зависших транзакций. Если такая операция есть, сначала нужно обработать ее.

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

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