Все формы транзакций имеют квитанции. Письменное подтверждение того, что платеж или доставка были произведены. Транзакции в Ethereum также имеют квитанции. Квитанции могут быть расшифрованы для идентификации событий, которые были выполнены.
В этом посте будет показано, как распознавать события Transfer, которые были выполнены в транзакциях, путем расшифровки квитанций и журналов.
✏️ Пример транзакции
Быстрый поиск в Etherscan приводит к случайному хешу транзакции 0x04fcd70cacda6f2a210ffb109044531c1d2abca75a1c2b04067d162e3acce897
Etherscan показывает, что это транзакция, которая перевела монеты на 80 долларов США.
Как они это расшифровали? Начнем с просмотра квитанции.
🧾 Квитанции
Квитанция генерируется после майнинга транзакции в блоке.
Он содержит детали транзакции. Например, его статус, использованный газ, номер блока, отправитель, получатель и журналы.
Вот вывод квитанции о транзакции.
В этом посте мы сосредоточимся на полях журнала.
📝 Журналы
Поля журнала генерируются всякий раз, когда смарт-контракт запускает событие. Он регистрирует события, которые произошли во время выполнения смарт-контракта.
Журналы состоят из тем и данных, которые соответствуют названию, параметрам и значению события.
На изображении ниже показано, как темы и данные преобразуются в события.
🔗 Как определить событие Transfer?
Первая тема – сигнатура события.
Это хэш keccak имени и типов входных аргументов. Имена аргументов игнорируются.
keccak('Transfer(address,address,uint256)') ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
События передачи ERC будут иметь одинаковую подпись. Этот хэш подписи можно сравнить, чтобы идентифицировать событие передачи.
Последующие темы являются параметрами события
В этом примере второй и третий элементы темы — это адрес отправителя и адресата передачи токена соответственно.
Это можно сделать, посмотрев на ABI события передачи. Параметры, для которых индексировано установлено значение true, являются частью тем журнала.
## ERC20 Transfer Event ABI { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }
💰Как получить сумму перевода?
Журнал содержит поле данных, соответствующее значению события передачи.
В этом примере поле данных равно 80000000 (преобразование в десятичное число из шестнадцатеричного). Это целое число без знака. Чтобы получить фактическую сумму, необходимо учитывать десятичные разряды.
Токен ERC-20 имеет десятичный метод, который используется для указания количества знаков после запятой в токене.
Десятичный метод можно запросить из смарт-контракта без каких-либо комиссий за транзакцию.
Пример кода показан здесь
Объединяем информацию
- поле данных из лога 80000000,
- десятичное значение для монеты доллара США равно 6
Отсюда сумма перевода 80 USD Coin
🖼️ А как насчет передачи токенов ERC721?
Событие передачи в приведенном выше примере предназначено для ERC-20. А как насчет ERC721?
Подход к идентификации событий передачи для ERC-721 аналогичен, за исключением одного отличия — ABI события передачи.
## ERC721 Transfer Event ABI { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": true, "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }
Событие передачи для ERC-721 имеет все проиндексированные параметры. Следовательно, у него будет тема из 4 элементов.
Темы переводятся в подпись события, от, до и идентификатор токена соответственно. Данных нет, так как в ABI нет неиндексированного параметра.
🧦 Визуализатор передачи токенов
Используя этот подход, я создал веб-приложение для визуализации всех передач токенов для каждого блока. Сюда входят токены эфира, ERC20 и ERC721.
Сайт находится по адресу https://ethsock.com