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

Что можно узнать из вызова
| Данные | Что показывают |
|---|---|
| Адрес отправителя | Кто инициировал вызов: пользователь, другой контракт или владелец |
| Имя функции | Что именно делалось: обмен, одобрение, изменение параметра |
| Параметры | Суммы, адреса получателей, сроки, новые значения настроек |
| Внутренние вызовы | Какие другие контракты были задействованы в цепочке |
Проверка собственной операции
После взаимодействия с новым протоколом полезно открыть свою транзакцию и посмотреть, что она сделала в действительности, при этом интерфейс сайта показывает намерение, а блокчейн — результат. Расхождение между ними встречается и говорит либо об ошибке фронтенда, либо о злом умысле.
Особое внимание уделите разрешениям. Если вместо обмена вы видите функцию одобрения с безлимитной суммой, стоит немедленно её отозвать.
Как читать адреса в параметрах
Адреса в декодированных данных обозреватель обычно подписывает известными именами: название биржи, протокола или метка контракта, и безымянный адрес означает, что он не связан ни с чем известным сервису, и это отдельный повод открыть его в новой вкладке.
Смотрите на возраст адреса и число операций. Получатель разрешения, созданный накануне и не имеющий истории, почти всегда указывает на подготовленную атаку, а не на новый протокол.
Отслеживание действий владельца
Вызовы административных функций видны так же хорошо, как обычные операции, причём фильтруя транзакции контракта по адресу владельца, вы увидите все изменения параметров: когда менялась комиссия, включалась пауза, добавлялись адреса в списки ограничений. Эта история никуда не исчезает и позволяет восстановить картину задним числом.
Где чаще всего путаются
- Чтение адреса контракта вместо адреса инициатора вызова
- Игнорирование внутренних вызовов, где происходит основное действие
- Попытка расшифровать данные у контракта без подтверждённого исходника
- Путаница между суммой в поле значения и суммой в параметрах функции
Ко мне обращался читатель, у которого после обмена на новом сайте исчезли токены, тогда как разбор транзакции показал, что вызывалась не функция обмена, а одобрение с безлимитной суммой на адрес, созданный днём ранее. Интерфейс при этом отображал обычную форму обмена, и списание произошло отдельной операцией через сутки, уже без участия пользователя.
Расход ресурсов как подсказка
Количество вычислительных ресурсов, израсходованных транзакцией, косвенно говорит о её сложности, и простой перевод токена тратит немного, а операция с длинной цепочкой внутренних вызовов заметно больше.
Резкое расхождение с ожиданиями стоит проверить. Если простое, на ваш взгляд, действие израсходовало кратно больше обычного, скорее всего за ним скрывалась цепочка операций, о которой интерфейс не сообщил.
Внутренние вызовы
Одна транзакция часто задействует несколько контрактов: агрегатор вызывает биржу, та обращается к токену, а обозреватель показывает эту цепочку отдельным списком, и именно там видно, куда в итоге ушли средства. Для сложных операций внешние данные вызова говорят меньше, чем внутренняя цепочка.
Разбор чужих операций
Тот же механизм работает для любых транзакций, а не только ваших, а изучая операции крупных участников протокола, можно понять реальные сценарии использования: какие функции вызываются чаще, какие параметры считаются типичными, где сосредоточен объём.
Когда расшифровка недоступна
Без подтверждённого исходного кода обозреватель показывает только сырые данные, при этом первые байты такой строки соответствуют идентификатору функции, и по базам известных сигнатур его иногда удаётся сопоставить с именем. Но параметры без описания структуры остаются нечитаемыми, и это сам по себе аргумент против взаимодействия с таким контрактом.
Смежные темы разобраны у нас. Вот основные. Общий раздел — транзакции и сети. Шире — статьи про криптокошельки. Чтение данных контракта разбирает материал как читать данные смарт-контракта в обозревателе, а контроль разрешений — статья разрешения токенов: как их проверять и отзывать.
Вопросы и ответы
Можно ли узнать личность вызывающего?
Нет, блокчейн показывает адрес, а не человека, причём связать адрес с личностью можно лишь через внешние данные: верификацию на бирже, публичные заявления владельца или анализ связей с известными адресами. Сам по себе обозреватель такой информации не содержит.
Почему параметры выглядят как длинные числа?
Суммы хранятся в минимальных единицах без разделителя, а число знаков после запятой задаётся самим токеном, и обозреватель обычно приводит значение к читаемому виду рядом с сырым, но при ручном чтении нужно делить на соответствующую степень десяти.
Видно ли отменённые транзакции?
Да, неудачные вызовы тоже записываются в блокчейн вместе с причиной отказа, а это полезно при разборе проблем: сообщение об ошибке от контракта часто прямо объясняет, почему операция не прошла, будь то недостаток разрешения или нарушение условия.
Вердикт
Интерфейс показывает намерение, блокчейн — результат, и расхождение между ними стоит проверять после каждой операции с новым протоколом, при этом смотрите декодированные данные вызова и внутреннюю цепочку: основное действие часто происходит именно там. Нерасшифровываемые параметры у контракта без подтверждённого исходника — достаточный повод не взаимодействовать с ним вовсе.
Транзакции разбирайте напрямую. Блокчейн-обозреватель Etherscan и сервис проверки и отзыва разрешений Revoke.cash позволяют прочитать вызов и закрыть лишние доступы.
Обсуждение
Добавить комментарий