Substrate EVM-Unterstützung

... 2022-8-10 Ungefähr 3 min

# Substrate EVM-Unterstützung

Wir bieten einen benutzerdefinierten Datenquellenprozessor für die EVM von Moonbeam und Moonriver. Dies bietet eine einfache Möglichkeit, sowohl EVM- als auch Substrat-Aktivitäten in Moonbeam-Netzwerken innerhalb eines einzigen SubQuery-Projekts zu filtern und zu indizieren.

Unterstützte Netzwerke:

Netzwerkname Websocket-Endpoint Wörterbuch-Endpoint
Moonbeam wss://moonbeam.api.onfinality.io/public-ws https://api.subquery.network/sq/subquery/moonbeam-dictionary
Moonriver wss://moonriver.api.onfinality.io/public-ws https://api.subquery.network/sq/subquery/moonriver-dictionary
Moonbase Alpha wss://moonbeam-alpha.api.onfinality.io/public-ws https://api.subquery.network/sq/subquery/moonbase-alpha-dictionary

Sie können auch auf das einfache Moonriver EVM-Beispielprojekt (opens new window) mit einem Ereignis- und Aufrufhandler verweisen. Dieses Projekt wird auch hier (opens new window) live im SubQuery Explorer gehostet .

# Erste Schritte

  1. Fügen Sie die benutzerdefinierte Datenquelle als Abhängigkeit hinzu yarn add @subql/contract-processors
  2. Fügen Sie eine benutzerdefinierte Datenquelle wie unten beschrieben hinzu
  3. Fügen Sie Ihrem Code Handler für die benutzerdefinierte Datenquelle hinzu

# Data Source Spec

Bereich Typ Erforderlich Beschreibung
processor.file './node_modules/@subql/contract-processors/dist/moonbeam.js' Ja Dateiverweis auf den Datenprozessorcode
processor.options ProcessorOptions Nein Spezielle Optionen für den Moonbeam-Prozessor
Vermögenswerte { [key: String]: { file: String }} Nein Ein Objekt externer Asset-Dateien

# Prozessoroptionen

Bereich Typ Erforderlich Beschreibung
abi String Nein Die ABI, die vom Prozessor zum Analysieren von Argumenten verwendet wird. MUSS ein Schlüssel von Assets sein
Adresse String oder null Nein Eine Vertragsadresse, von der aus das Ereignis stattfindet oder an die der Anruf erfolgt. null erfasst Anrufe zur Vertragserstellung

# MoonbeamCall

Funktioniert auf dieselbe Weise wie substrat/CallHandler, außer mit einem anderen Handler-Argument und kleineren Filteränderungen.

Bereich Typ Erforderlich Beschreibung
kind 'substrate/MoonbeamCall' Ja Gibt an, dass dies ein Call-Typ-Handler ist
Filter Call Filter Nein Filtern Sie die auszuführende Datenquelle

# Call Filters

Bereich Typ Beispiele Beschreibung
Funktion String 0x095ea7b3, approve(address to,uint256 value) Entweder Function Signature (opens new window)-Strings oder die Funktion sighash, um die im Vertrag aufgerufene Funktion zu filtern
von String 0x6bd193ee6d2104f14f94e2ca6efefae561a4334b Eine Ethereum-Adresse, die die Transaktion gesendet hat

# Handlers

Im Gegensatz zu einem normalen Handler erhalten Sie als Parameter keinen SubstrateExtrinsic, sondern einen MoonbeamCall, der auf dem Ethers-Typ TransactionResponse (opens new window) basiert.

Änderungen vom Typ TransactionResponse:

  • Es hat keine Eigenschaften Warten und Bestätigungen
  • Eine success-Eigenschaft wird hinzugefügt, um zu wissen, ob die Transaktion erfolgreich war
  • args wird hinzugefügt, wenn das Feld abi bereitgestellt wird und die Argumente erfolgreich geparst werden können

# MoonbeamEvent

Funktioniert genauso wie substrate/EventHandler, außer mit einem anderen Handler-Argument und kleineren Filteränderungen.

Bereich Typ Erforderlich Beschreibung
kind 'substrate/MoonbeamEvent' Ja Gibt an, dass dies ein Ereignistyp-Handler ist
Filter Event Filter Nein Filtern Sie die auszuführende Datenquelle

# Event Filter

Bereich Typ Beispiele Beschreibung
Themen String Array Transfer(Addresse indexed von,Addresse indexed zu,uint256 value) Der Themenfilter folgt den Ethereum JSON-PRC-Protokollfiltern, weitere Dokumentation finden Sie hier (opens new window).

Hinweis zu Themen: Es gibt einige Verbesserungen der grundlegenden Protokollfilter:

# Handlers

Im Gegensatz zu einem normalen Handler erhalten Sie als Parameter kein SubstrateEvent, sondern ein MoonbeamEvent, das auf dem Ethers-Typ Log (opens new window) basiert.

Änderungen vom Typ Log:

  • args wird hinzugefügt, wenn das Feld abi bereitgestellt wird und die Argumente erfolgreich geparst werden können

# Data Source Beispiele

Dies ist ein Auszug aus der Manifestdatei 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'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# Bekannte Einschränkungen

  • Es gibt derzeit keine Möglichkeit, den EVM-Status innerhalb eines Handlers abzufragen
  • Es gibt keine Möglichkeit, die Transaktionsquittungen mit Call-Handlern zu erhalten
  • blockHash-Eigenschaften sind derzeit nicht definiert, stattdessen kann die blockNumber-Eigenschaft verwendet werden
Zuletzt geändert: August 10, 2022 00:49