Блокчейн: принцип «все или ничего» для безпечних транзакцій

блокчейн тех

Атомарність — це принцип «все або нічого» в межах однієї транзакції. Поки віртуальна машина 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 скасовуються зміни контрактів і балансів, але сама транзакція залишається в історії, її порядковий номер використано, а обчислення оплачено. У міжмережевій операції частина попередніх дій може бути вже остаточною.

No votes yet.
Please wait...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *