SubstrateのEVMサポート

... 2022-10-5 About 2 min

# SubstrateのEVMサポート

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

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

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

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

# はじめに

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

# データソース仕様

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

# プロセッサオプション

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

# MoonbeamCall

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

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

# Call Filters

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

# ハンドラ

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

TransactionResponse 型からの変更:

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

# MoonbeamEvent

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

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

# イベントフィルタ

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

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

# ハンドラ

通常のハンドラとは異なり、パラメータとしてSubstrateEventを得ることはなく、代わりにイーサリアムLog (opens 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'
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

# 既知の制限事項

  • ハンドラ内のEVM状態を問い合わせる方法は現在ありません。
  • 呼び出しハンドラで戻り値を取得する方法はありません。
  • blockHash プロパティは現在未定義のままです。代わりに blockNumber プロパティを使用できます。
Last update: October 5, 2022 01:44