メインコンテンツへスキップ

Substrate の EVM サポート

SubQuery Team約2分

Substrate の EVM サポート

Moonbeam と Moonriver の EVM 用にカスタムデータソースプロセッサを提供しています。 これは、Moonbeam のネットワーク上の EVM と Substrate のアクティビティを 1 つの SubQuery プロジェクトでフィルタリングし、インデックスを作成するシンプルな方法です。

サポートされているネットワーク:

ネットワーク名Websocket エンドポイントディクショナリエンドポイント
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

**また、イベントと呼び出しハンドラを備えたbasic Moonriver EVM example projectopen in new windowを参照することもできます。**このプロジェクトは、SubQuery Exploreropen in new windowでもご覧いただけます。

はじめに

  1. 依存関係としてカスタムデータソースを追加する yarn add @subql/contract-processor
  2. 以下の説明に従ってカスタムデータソースを追加する
  3. カスタムデータソースのハンドラをコードに追加する

データソース仕様

フィールド必須説明
processor.file'./node_modules/@subql/contract-processors/dist/moonbeam.js'Yesデータプロセッサコードへのファイル参照
processor.optionsProcessorOptionsNoMoonbeam プロセッサ固有のオプション
assets{ [key: String]: { file: String }}No外部ファイルのオブジェクト

プロセッサオプション

フィールド必須説明
abiStringNo引数を解析するためにプロセッサが使用する ABI です。 assets のキーでなければなりません
addressString or nullNoイベントの発信元または発信先となるコントラクトアドレス。 null はコントラクトの作成呼び出しをキャプチャします

MoonbeamCall

ハンドラの引数が異なり、若干のフィルタリング変更以外は、substrate/CallHandlerと同じように動作する。

フィールド必須説明
kind'substrate/MoonbeamCall'Yes呼び出しハンドラであることを指定します。
filterCall FilterNo実行するデータソースをフィルタする

Call Filters

フィールド説明
functionString0x095ea7b3, approve(address to,uint256 value)Function Signatureopen in new window 文字列、またはコントラクトで呼び出された関数をフィルタする関数 sighash のいずれか。
fromString0x6bd193ee6d2104f14f94e2ca6efefae561a4334bトランザクションを送信したイーサリアムアドレス

ハンドラ

通常のハンドラーとは異なり、パラメータとしてSubstrateExtrinsicを得ることはできませんが、代わりにイーサリアムTransactionResponseopen in new window型に基づいたMoonbeamCallを得ることができます。

TransactionResponse 型からの変更:

  • waitconfirmations プロパティがありません
  • success プロパティが追加され、トランザクションが成功したかどうかが分かります
  • argsabi フィールドが指定され、引数が正常に解析される場合に追加されます。

MoonbeamEvent

ハンドラの引数が異なり、若干のフィルタリング変更以外は、substrate/EventHandlerと同じように動作する。

フィールド必須説明
kind'substrate/MoonbeamEvent'Yes呼び出しハンドラであることを指定します。
filterEvent FilterNo実行するデータソースをフィルタする

イベントフィルタ

フィールド説明
topicsString arrayTransfer(address indexed from,address indexed to,uint256 value)topics は、Ethereum JSON-PRC ログフィルタに従います。詳細なドキュメントはこちらopen in new windowです。

topics に関する注意: 基本的なログフィルタにはいくつかの改善点があります:

ハンドラ

通常のハンドラとは異なり、パラメータとしてSubstrateEventを得ることはなく、代わりにイーサリアムLogopen in new window型に基づいたMoonbeamEventを得ることになります。

ログ 型からの変更:

  • argsabi フィールドが指定され、引数が正常に解析される場合に追加されます。

データソースの例

これは 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 プロパティを使用できます。