Перейти к основному содержанию

Поддержка Substrate EVM

SubQuery TeamОколо 2 мин

Поддержка Substrate EVM

Мы предоставляем пользовательский обработчик источников данных для EVM от Moonbeam и Moonrive Это предлагает простой способ фильтрации и индексации активности EVM и субстратов в сетях Moonbeam в рамках одного проекта SubQuery.

Поддерживаемые сети:

Название сетиКонечная точка WebsocketКонечная точка Dictionary
Moonbeamwss://moonbeam.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonbeam-dictionary
Moonriverwss://moonriver.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonriver-dictionary
Moonbase Alphawss://moonbeam-alpha.api.onfinality.io/public-wshttps://api.subquery.network/sq/subquery/moonbase-alpha-dictionary

Вы также можете обратиться к базовому примеру проекта Moonriver EVM с обработчиком событий и вызовов. Этот проект также размещен здесь в SubQuery Explorer.

Начало

  1. Добавьте пользовательский источник данных в качестве зависимости add @ subql / contract-processors
  2. Добавьте пользовательский источник данных, как описано ниже
  3. Добавьте обработчики для пользовательского источника данных в свой код

Спецификация Источника Данных

ОбластьТипНеобходимыйОписание
processor.file'./node_modules/@subql/contract-processors/dist/moonbeam.js'ДаСсылка на файл с кодом обработчика данных
processor.optionsProcessorOptionsНетОпции, характерные для процессора Moonbeam
ресурсы{ [key: String]: { file: String }}НетОбъект внешних файлов активов

Настройки процессора

ПолеТипНеобходимыйОписание
abiStringНетABI, который используется процессором для анализа аргументов. ДОЛЖЕН быть ключом assets
addressString or nullНетАдрес контракта, откуда происходит мероприятие или на который делается звонок. null будет фиксировать вызовы создания контракта

MoonbeamCall

Работает так же, как substrate/CallHandler, только с другим аргументом обработчика и незначительными изменениями фильтрации.

ПолеТипНеобходимыйОписание
вид'substrate/MoonbeamCall'ДаУказывает, что это обработчик типа вызова
фильтрCall FilterНетОтфильтровать источник данных для выполнения

Фильтры вызовов

ПолеТипПримерыОписание
ФункцииСтрока0x095ea7b3, подтвердить (адрес, значение uint256)Либо строки подписи функции, либо sighash функции для фильтрации функции, вызываемой в контракте.
откудаString0x6bd193ee6d2104f14f94e2ca6efefae561a4334bАдрес Ethereum, по которому была отправлена ​​транзакция.

Обработчики

В отличие от обычного обработчика, вы не получите SubstrateExtrinsic в качестве параметра, вместо этого вы получите MoonbeamCall, основанный на типе Ethers TransactionResponseopen in new window.

Отличия от типа TransactionResponse :

  • Нет свойств ожидания и подтверждения.
  • Добавляется свойство успех, чтобы узнать, была ли транзакция успешной.
  • args добавляется, если указано поле abi и аргументы могут быть успешно проанализированы

MoonbeamEvent

Работает так же, как substrate/EventHandler, только с другим аргументом обработчика и незначительными изменениями фильтрации.

ПолеТипНеобходимыйОписание
вид'substrate/MoonbeamEvent'ДаУказывает, что это обработчик типа события
фильтрEvent FilterНетОтфильтровать источник данных для выполнения

Фильтр событий

ПолеТипПримерыОписание
темыМассив строк.Передача (адрес проиндексирован, адрес проиндексирован, значение uint256)Фильтр тем соответствует фильтрам журнала Ethereum JSON-PRC, дополнительную документацию можно найти здесь.

Примечание по темам: Есть несколько улучшений по сравнению с базовыми фильтрами журналов:

  • Темы не должны быть заполнены на 0
  • Могут быть предоставлены строки фрагмента события

Обработчики

В отличие от обычного обработчика, вы не получите SubstrateEvent в качестве параметра, вместо этого вы получите MoonbeamEvent, основанный на типе Ethers Logopen in new window.

Изменяется по сравнению с типом Log:

  • args добавляется, если указано поле abi и аргументы могут быть успешно проанализированы

Пример источника данных

Это выдержка из файла манифеста project.yaml

dataSources:
  - kind: substrate/Moonbeam
    startBlock: 752073
    processor:
      file: "./node_modules/@subql/contract-processors/dist/moonbeam.js"
      options:
        # Must be a key of assets
        abi: erc20
        # Contract address (or recipient if transfer) to filter, if `null` should be for contract creation
        address: "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b"
    assets:
      erc20:
        file: "./erc20.abi.json"
    mapping:
      file: "./dist/index.js"
      handlers:
        - handler: handleMoonriverEvent
          kind: substrate/MoonbeamEvent
          filter:
            topics:
              - Transfer(address indexed from,address indexed to,uint256 value)
        - handler: handleMoonriverCall
          kind: substrate/MoonbeamCall
          filter:
            ## The function can either be the function fragment or signature
            # function: '0x095ea7b3'
            # function: '0x7ff36ab500000000000000000000000000000000000000000000000000000000'
            # function: approve(address,uint256)
            function: approve(address to,uint256 value)
            from: "0x6bd193ee6d2104f14f94e2ca6efefae561a4334b"

Известные ограничения

  • В настоящее время нет возможности запросить состояние EVM в обработчике
  • Нет возможности получить квитанции о транзакциях с помощью обработчиков вызовов.
  • blockHash в настоящее время не определен, вместо этого можно использовать свойство blockNumber