Substrate EVM-Unterstützung

SubQuery TeamUngefähr 2 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:

NetzwerknameWebsocket-EndpointWörterbuch-Endpoint
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

Sie können auch auf das einfache Moonriver EVM-Beispielprojektopen in new window mit einem Ereignis- und Aufrufhandler verweisen. Dieses Projekt wird auch hieropen in 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

BereichTypErforderlichBeschreibung
processor.file'./node_modules/@subql/contract-processors/dist/moonbeam.js'JaDateiverweis auf den Datenprozessorcode
processor.optionsProcessorOptionsNeinSpezielle Optionen für den Moonbeam-Prozessor
Vermögenswerte{ [key: String]: { file: String }}NeinEin Objekt externer Asset-Dateien

Prozessoroptionen

BereichTypErforderlichBeschreibung
abiStringNeinDie ABI, die vom Prozessor zum Analysieren von Argumenten verwendet wird. MUSS ein Schlüssel von Assets sein
AdresseString oder nullNeinEine 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.

BereichTypErforderlichBeschreibung
kind'substrate/MoonbeamCall'JaGibt an, dass dies ein Call-Typ-Handler ist
FilterCall FilterNeinFiltern Sie die auszuführende Datenquelle

Call Filters

BereichTypBeispieleBeschreibung
FunktionString0x095ea7b3, approve(address to,uint256 value)Entweder Function Signatureopen in new window-Strings oder die Funktion sighash, um die im Vertrag aufgerufene Funktion zu filtern
vonString0x6bd193ee6d2104f14f94e2ca6efefae561a4334bEine 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 TransactionResponseopen in 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.

BereichTypErforderlichBeschreibung
kind'substrate/MoonbeamEvent'JaGibt an, dass dies ein Ereignistyp-Handler ist
FilterEvent FilterNeinFiltern Sie die auszuführende Datenquelle

Event Filter

BereichTypBeispieleBeschreibung
ThemenString ArrayTransfer(Addresse indexed von,Addresse indexed zu,uint256 value)Der Themenfilter folgt den Ethereum JSON-PRC-Protokollfiltern, weitere Dokumentation finden Sie hieropen in 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 Logopen in 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"

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