Атомарність у блокчейні: принцип «все або нічого»

Редакція не надає інвестиційних порад. Цей матеріал опубліковано виключно з ознайомчою метою. Пам’ятайте, що криптовалюти є волатильними активами та можуть призвести до фінансових збитків.
Принцип атомарності в блокчейні Ethereum означає виконання транзакції за правилом «все або нічого». Поки віртуальна машина Ethereum обробляє команди, зміни ще не вважаються остаточними. Команда `revert` (скасування) повертає стан до моменту перед початком операції, як зазначає РБК Крипто.
Уявіть, що смарт-контракт отримує USDC користувача, обмінює їх на ETH і відправляє ETH до іншого протоколу. Якщо останній крок завершується помилкою, всі попередні зміни автоматично скасовуються.
Таким чином, баланси токенів та записи контрактів відновлюються. Однак події – службові повідомлення, за якими додатки відстежують активність у мережі – не зберігаються. Якщо під час операції створювався новий контракт, він також не відображатиметься у фінальному стані.
Сама транзакція при цьому залишається в блокчейні. У її квитанції поле `status` матиме значення 0, що свідчить про неуспішне виконання (1 означає успіх).
Порядковий номер транзакції відправника також не відновлюється. Якщо невдала операція вже була включена до блоку, наступна транзакція повинна використовувати новий номер. Це запобігає можливості заміни вже включеної транзакції іншою з тим самим номером.
Газ (gas) в Ethereum – це одиниця вимірювання обчислювальної роботи. До виникнення помилки контракт міг виконати тисячі команд, прочитати дані та взаємодіяти з іншими контрактами. Вузли вже виконали цю роботу, тому вона оплачується незалежно від результату.
Механізм `revert` не витрачає автоматично весь встановлений ліміт газу. Користувач оплачує лише обчислення, виконані до моменту зупинки. Невикористана частина ліміту газу залишається у нього. Тому після невдалої транзакції токени можуть залишитися на місці, а баланс ETH – незначно зменшитися.
Контракт може викликати інший контракт, отримати повідомлення про помилку та продовжити виконання. Мова Solidity дозволяє явно обробляти такі збої. Низькорівневий виклик також може повернути інформацію про невдачу, не зупиняючи автоматично всю зовнішню операцію.
Саме так працює Universal Router від Uniswap – контракт, який об’єднує кілька обмінів та інших дій в одну транзакцію. Для окремої команди можна дозволити продовження виконання після збою. Інші кроки тоді будуть виконані.
Uniswap попереджає, що при частковому виконанні необхідно передбачити виведення коштів, які могли залишитися всередині роутера після невдалої команди. Необроблена помилка може анулювати всю транзакцію. Оброблене ж помилка впливає лише на той фрагмент, де вона сталася.
Децентралізовані фінансові сервіси (DeFi) часто об’єднують кілька дій: обмін, погашення боргу, зміну застави, інвестування отриманого активу. Усе це можна виконати в рамках однієї пакетної транзакції.
Флеш-кредити (flash loans) є одним із найяскравіших прикладів. У протоколі Aave V3 користувач може отримати актив без звичного попереднього заставлення, використати його всередині транзакції та повернути позику разом із комісією до її завершення.
Якщо коштів для повернення позики недостатньо, транзакція анулюється. Це дозволяє отримати ліквідність, провести арбітраж між різними платформами та повернути позику в одній операції. Якщо угода виявилася збитковою, непогашеного кредиту після завершення блоку не залишиться. Користувач втратить лише комісію за газ.
Одна транзакція в мережі Ethereum працює зі станом цієї ж мережі. Міжмережевий переказ, навпаки, складається з кількох самостійних дій.
Протокол CCTP (Cross-Chain Transfer Protocol) від компанії Circle переносить USDC шляхом спалювання та випуску. Монети спочатку знищуються в мережі відправлення. Потім Circle підписує підтвердження цієї події, після чого еквівалентний обсяг USDC може бути випущений у мережі призначення.
Підписане підтвердження називається атестацією. Для мережі призначення це є доказом того, що монети в мережі відправлення дійсно були знищені.
Якщо спалювання монет вже стало остаточним, помилка на наступному етапі не призведе до автоматичного повернення USDC до вихідної мережі. Переказ доведеться завершувати згідно з правилами CCTP. Не існує єдиної транзакції, яка могла б одночасно відкотити зміни в обох мережах.
Таким чином, невдала операція не завжди означає, що «нічого не сталося». В Ethereum при `status = 0` скасовуються зміни контрактів і балансів, але сама транзакція залишається в історії, її порядковий номер використано, а обчислення оплачені. У міжмережевих операціях частина попередніх дій може бути вже незворотною.
Оригінал статті: cryptocurrency.tech
