Все формы транзакций имеют квитанции. Письменное подтверждение того, что платеж или доставка были произведены. Транзакции в 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