Substrate の EVM サポート
約2分
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を参照することもできます。**このプロジェクトは、SubQuery Explorerでもご覧いただけます。
はじめに
- 依存関係としてカスタムデータソースを追加する
yarn add @subql/contract-processor
- 以下の説明に従ってカスタムデータソースを追加する
- カスタムデータソースのハンドラをコードに追加する
データソース仕様
フィールド | 型 | 必須 | 説明 |
---|---|---|---|
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 文字列、またはコントラクトで呼び出された関数をフィルタする関数 sighash のいずれか。 |
from | String | 0x6bd193ee6d2104f14f94e2ca6efefae561a4334b | トランザクションを送信したイーサリアムアドレス |
ハンドラ
通常のハンドラーとは異なり、パラメータとしてSubstrateExtrinsic
を得ることはできませんが、代わりにイーサリアムTransactionResponse型に基づいたMoonbeamCall
を得ることができます。
TransactionResponse
型からの変更:
wait
とconfirmations
プロパティがありませんsuccess
プロパティが追加され、トランザクションが成功したかどうかが分かりますargs
はabi
フィールドが指定され、引数が正常に解析される場合に追加されます。
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 ログフィルタに従います。詳細なドキュメントはこちらです。 |
topics に関する注意: 基本的なログフィルタにはいくつかの改善点があります:
- topics を 0 埋めする必要はありません。
- Event Fragment を提供し、その ID に自動的に変換できます
ハンドラ
通常のハンドラとは異なり、パラメータとしてSubstrateEvent
を得ることはなく、代わりにイーサリアムLog型に基づいたMoonbeamEvent
を得ることになります。
ログ
型からの変更:
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
プロパティを使用できます。