Атомарность в блокчейне: принцип «все или ничего»
Редакция не дает инвестиционных советов, материал опубликован исключительно в ознакомительных целях. Криптовалюта — это волатильный актив, который может привести к финансовым убыткам.
Атомарность — принцип «все или ничего» в пределах одной транзакции. Пока виртуальная машина Ethereum выполняет ее команды, изменения не считаются окончательными. Необработанный «revert», то есть команда отмены, возвращает состояние к моменту перед началом операции, пишетРБК Крипто.
Что именно отменяетсяКонтракт может получить USDC пользователя, обменять их на ETH и отправить ETH в другой протокол. Если последний шаг завершается необработанной ошибкой, предыдущие изменения тоже исчезают.
Восстанавливаются балансы токенов и записи контрактов. Не сохраняются события — служебные сообщения, по которым приложения отслеживают действия в сети. Если внутри операции создавался новый контракт, его также не будет в итоговом состоянии.
Сама транзакция при этом остается в блокчейне. В квитанции — записи о результате выполнения — поле status будет равно 0. Значение 1 означает успех.
Не возвращается и порядковый номер транзакции отправителя. Если неудачная операция уже вошла в блок, следующая должна использовать новый номер. Это не позволяет заменить уже включенную транзакцию другой с тем же номером.
Почему комиссия все равно списываетсяГаз — единица измерения вычислительной работы в Ethereum. До ошибки контракт мог выполнить тысячи команд, прочитать данные и вызвать другие контракты. Узлы уже проделали эту работу, поэтому она оплачивается независимо от результата.
Revert не расходует автоматически весь установленный лимит газа. Пользователь платит за вычисления, выполненные до остановки. Неиспользованная часть лимита остается у него. Поэтому после неудачной транзакции токены могут остаться на месте, а баланс ETH немного уменьшиться.
Ошибка внутри вызова не всегда отменяет всеКонтракт может вызвать другой контракт, получить сообщение об ошибке и продолжить выполнение. Solidity позволяет явно обрабатывать такие сбои. Низкоуровневый вызов также может вернуть информацию о неудаче вместо автоматической остановки всей внешней операции.
Так работает Universal Router от Uniswap — контракт, который собирает несколько обменов и других действий в одну транзакцию. Для отдельной команды можно разрешить продолжение после сбоя. Остальные шаги тогда выполнятся.
Uniswap предупреждает, что при частичном выполнении нужно предусмотреть вывод средств, которые могли остаться внутри маршрутизатора после неудачной команды. Необработанная ошибка способна отменить всю транзакцию. Обработанная — только тот участок, где она произошла.
Как это используют финансовые приложенияДецентрализованные финансовые сервисы часто объединяют несколько действий: обмен, погашение долга, изменение залога, вложение полученного актива. Все это можно выполнить одним пакетом.
Флеш-кредиты — один из самых наглядных примеров. В Aave V3 пользователь может получить актив без обычного предварительного залога, использовать его внутри транзакции и до ее завершения вернуть заем вместе с комиссией.
Если денег для возврата не хватает, транзакция отменяется.Так можно взять ликвидность, провести арбитраж между площадками и вернуть заем в одной операции. Если сделка оказалась убыточной, непогашенного кредита после блока не останется. Пользователь потеряет только комиссию сети.
Между сетями единого отката нетОдна транзакция Ethereum работает с состоянием одной сети. Межсетевой перевод уже состоит из нескольких самостоятельных действий.
CCTP (Cross-Chain Transfer Protocol — протокол межсетевого переноса) компании Circle переносит USDC через сжигание и выпуск. Монеты сначала уничтожаются в исходной сети. Затем Circle подписывает подтверждение этого события, после чего такой же объем USDC можно выпустить в сети назначения.
Подписанное подтверждение называется аттестацией. Для второй сети это доказательство того, что монеты в первой действительно были уничтожены.
Если сжигание уже стало окончательным, ошибка на следующем этапе не вернет USDC в исходной сети автоматически. Перевод придется завершать по правилам CCTP. Одной транзакции, которая могла бы одновременно откатить обе сети, здесь нет.
Неудачная операция поэтому не всегда означает, что «ничего не произошло». В Ethereum при status = 0 отменяются изменения контрактов и балансов, но сама транзакция остается в истории, ее порядковый номер использован, а вычисления оплачены. В межсетевой операции часть предыдущих действий может быть уже окончательной.
Источник: https://cryptocurrency.tech/atomarnost-v-blokchejne-printsip-vse-ili-nichego/