Ethereum (Эфириум), придуманный в конце 2013 года Виталиком Бутериным и запущенный 30 июля 2015 года, стал первой децентрализованной блокчейн-платформой, позволившей разрабатывать и запускать dApps-приложения, такие как децентрализованные биржи (DEX) и блокчейн-игры.
Работу Ethereum обеспечивает Ethereum Virtual Machine (EVM — виртуальная машина Эфириума) — децентрализованная сеть взаимосвязанных вычислительных машин, виртуальная среда, в которой смарт-контракты запускаются и взаимодействую между собой.
Бесперебойную работу EVM обеспечивают валидаторы, которые занимаются обработкой смарт-контрактов и их исполнением.
Транзакции
Мало кто знает, но обычные транзакции перевода ETH с одного кошелька на другой (с адреса на адрес) — это тоже смарт-контракты, правда очень маленькие и неэнергозатратные. Никаких особых условий в них не содержится, кроме простой математики.
За проведение любой транзакции и/или действия в блокчейне Ethereum взимается комиссия, часть которой сжигается, а другая — отходит валидаторам сети, которые подтверждают транзакции и решают, какие из них войдут в новый блок сети, а какие нет. Комиссия за транзакцию зовется Газом (GAS), исчисляется в Gwei, а оплачивается Эфиром (ETH).
Газ — это топливо и "кровь" блокчейна Ethereum, которое используется для оплаты вычислительных мощностей, исполняющих смарт-контракты.
Gas — это единица исчисления, которая обозначает размер комиссии за определенное действие или транзакцию. Чем выше цена этого газа, которую отправитель готов заплатить, тем приоритетней его транзакция в сети Ethereum и тем охотней ее обрабатывают.
Для Газа предусмотрены два параметра: Лимит (Gas Limit) и Цена (Gas Price):
- Лимит газа (Gas Limit) — это максимальное количество газа, которое пользователь готов заплатить за выполнение определенного действия в сети (минимум — 21'000).
- Цена газа (Gas Price) — это количество Gwei, которое пользователь готов потратить на каждую единицу газа.
Как рассчитать комиссию за транзакцию
1 Gwei = 0,000'000'001 ETH,
X — актуальное в моменте значение Gas Price,
Y — комиссия для транзакции в пересчете на ETH.
для Эфира (ETH):
- 21'000 (min) Gas Limit * X Gwei ÷ 1'000'000'000 = Y ETH
для токенов ERC-20:
- 54'128 (min) Gas Limit * Х Gwei ÷ 1'000'000'000 = Y ETH
Токены ERC-20 — это более сложные смарт-контракты, содержащие в себе гораздо больше условий, поэтому за их обработку сеть требует примерно в 3,2 раза более высокую сетевую плату.
После выполнения транзакции весь неиспользованный газ возвращается на адрес отправителя. Как, например, на этом крине транзакции USD Coin, от выставленного пользователем значения Gas Limit в размере 99'226 потреблено только 65'613, т.е. 66,12%.
Тем не менее, если пользователем значение Gas Limit будет намеренно очень сильно занижено или пользователь попытается отправить столько, сколько не имеет на балансе кошелька, то транзакция не состоится и будет отклонена с ошибкой Out of Gas. Потраченный при этом на запуск смарт-контракта газ не вернется на адрес. Отправитель всегда платит комиссию, независимо от того, пройдет транзакция или нет.
NONCE
Важным параметром каждой исходящей транзакции является ее порядковый номер, в Ethereum именуемый NONCE.
Каждая исходящая транзакция с конкретного адреса кошелька нумеруется и исполняется в строгом порядке. Нумерация NONCE начинается с 0. Т.е. самая первая исходящая с кошелька транзакция будет иметь порядковый номер 0. По этим значениям вся система отслеживает и защищает блокчейн от фейковых, ошибочных или мошеннических транзакций.
Случайное исполнение транзакций (минуя порядок), как и повторное использование уже потраченного NONCE в Эфире недопустимо. EVM, призванная проверять каждый смарт-контракт на валидность и соответствие алгоритмам сети, не позволит отправить транзакцию с NONCE 1, пока не подтверждена транзакция с NONCE 0 и не позволит повторно отправить транзакцию с одинаковым NONCE (двойная трата).
При этом входящие транзакции могут иметь любой NONCE, т.к. отправляются разными пользователями с разным количеством отправок. Входящие транзакции заходят на кошелек независимо от того, есть зависшие исходящие транзакции или нет.
Зависшие транзакции
Иногда, когда эфира на кошельке не хватает на оплату актуальной в моменте сетевой комиссии, то транзакция получает статус Pending.
Такая транзакция может висеть очень долго (по опыту до 21 дня) и при различных условиях может либо успешно завершиться, если цена газа снизится до установленных в транзакции значений, либо будет отклонена с ошибкой Out of Gas или Reverted.
Тем не менее, существует метод, с помощью которого можно протолкнуть транзакцию, чтобы она обработалась быстрее.
Чтобы не ждать и не гадать про исход "эксперимента" с низкими комиссиями, переведите на свой кошелек то количество эфира, которого будет достаточно на актуальную сетевую комиссию (мониторить ее можно тут), а затем просто переотправьте Pending-транзакцию на нужный адрес, выставив актуальное значение Gas Limit и Gas price, но (!) с тем же самым NONCE, который указан в зависшей транзакции.
Если все будет сделано правильно, то вместо статуса Pending, транзакция получит сначала статус Duplicate Nonce,
а затем — Success.
Таким же методом можно развернуть зависшую транзакцию обратно на свой кошелек, если надобность в отправке отпала. Но при этом все равно придет заплатить сетевую комиссию.
Выставление NONCE вручную, также, бывает полезным и нужным, когда из-за каких-либо сбоев в сети сбиваются порядковые номера транзакций: иногда бывает так, что следующим NONCE, к примеру, должен быть 1, но ethereum-клиент ставит 2, пропуская 1. В этом случае нужно вручную заворачивать транзакцию с NONCE 2 на свой адрес, а затем создавать отправку с NONCE 1. В таком исполнении транзакция с NONCE 1 получает статус успеха, а транзакция с NONCE 2 отмечается ярлыком Self.
Если не развернуть транзакцию с перескочившим нонсом, то сразу, как обработается транзакция с нонсом 1, следом уйдет транзакция с нонсом 2, т.е. есть риск отправить дважды одну и ту же сумму получателю.
Причины неудачных транзакций
Когда транзакция помечена как Fail, средства, которые отправитель намеревался отправить, не вычитаются, а остаются в кошельке отправителя. Однако сетевая комиссия все равно будет списана.
Out of Gas
Когда транзакция не удалась из–за Out of Gas, это означает, что лимит газа, установленный во время транзакции, ниже требуемого газа, необходимого для выполнения транзакции. Средства, которые отправитель намеревался отправить, не вычитаются, а остаются в кошельке отправителя. Однако сетевая комиссия все равно будет списана. Вам нужно будет повторить транзакцию с соответствующим лимитом газа.
Reverted
Если транзакции помечена как Reverted, транзакция не выполнялась, и ничего с кошелька не тратилось. Сеть просто не приняла транзакцию и не стала ее выполнять.
Bad Jump Destination, Bad Instruction
Появление ошибки Bad Jump Destination или Bad Instruction связано с исполнением смарт-контракта. Это может быть общий сбой, вызванный условиями кода смарт-контракта. Вопрос нужно решать с создателем смарт-контракта.
Неудачные транзакции токенов ERC-20
Наиболее распространенными причинами неудачных транзакций токенов ERC-20 являются:
- Контракт токена заблокирован (Tether очень любит это делать),
- Выставлен неверный лимит газа,
- Кошелек отправителя не располагает достаточным балансом токенов, т.е. пытается отправить то, чего не имеет.
Зная все эти тонкости работы блокчейна Ethereum и следуя им, можно умело и без проблем управлять своими транзакциями и отправлять их чуть ли не вручную.