送信前のシミュレーション:eth_simulateV1 によるトランザクションの事前実行

eth_simulateV1 を使用して、オンチェーンに送信する前に複数のトランザクションを事前実行し、状態変更を検査します。サポートされるチェーンのメソッドポリシー、実行仕様のリクエストペイロード、CU 課金重み付け、および AI エージェント MCP 統合について説明します。

ブロックチェーンネットワークにトランザクションをブロードキャストする前に事前実行(ドライラン)を行うことで、開発者は実行結果の検査、コントラクトの状態遷移の検証、イベントログの事前確認が可能になり、コントラクトのリバートによる不要なガス代の発生を防ぐことができます。

Ethereum の実行レイヤーは、送信前にトランザクションを評価するいくつかの方法を提供しています:

  • eth_call:連続した呼び出し間で状態を永続化することなく、単一の読み取り専用メッセージ呼び出しを実行します。
  • eth_estimateGas:実行に必要なガスリミットを計算しますが、複数トランザクションの順次状態遷移や完全なイベントログは提供しません。
  • eth_simulateV1:Ethereum Execution APIs 標準仕様で定義されているこのメソッドは、ブロックをまたぐ複数トランザクションの順次シミュレーションを可能にし、トランザクション間の状態変化を蓄積し、ブロックパラメータやアカウント状態のオーバーライドをサポートします。

サポートされているチェーンとメソッドポリシー

ネットワーク機能は GET /v1/chains を介して動的に公開されます。その応答の methods.allow を読み取り、どのチェーンが eth_simulateV1 を許可しているかを確認してください。リストに記載されていないチェーンは、JSON-RPC エラー -32601(method not available、課金なし)で呼び出しを拒否します。

ノードの状態条件

eth_simulateV1 は状態クエリメソッドです:

  • 同期ゲート(-32010):対象チェーンのノードが同期中であり、まだ準備が整っていない場合、呼び出しは -32010(node is syncing、課金なし)を返します。
  • 状態ウィンドウ(-32011):Robinhood Chain では、チェーンの state_window_blocks(GET /v1/chains)より古いブロックを対象とするリクエスト、または safe、finalized、earliest ブロックタグを指定するリクエストは -32011(課金なし)を返します。デフォルトのブロックタグは latest です。

リクエスト構造と基本的な例

実行レイヤー仕様(Ethereum Execution APIs eth_simulateV1 の定義)に従い、eth_simulateV1 は 2 つの位置パラメータを受け入れます:

  1. ペイロードオブジェクト:
    • blockStateCalls(必須配列):シミュレートされるブロックオブジェクトの配列。各オブジェクトには、トランザクション呼び出しの配列 calls、オプションのブロックヘッダーオーバーライド blockOverrides、およびオプションのアカウント状態オーバーライド stateOverrides が含まれます。
    • validation(オプションのブール値、デフォルトは false):false の場合、eth_call と同様に動作します。true の場合、署名チェックを除くすべての EVM 検証を実行します。
    • traceTransfers(オプションのブール値):true の場合、ネイティブトークン転送のイベントログを返します。
  2. ブロックタグ(オプションの文字列、デフォルトは 'latest'):ブロック番号、ブロックハッシュ、またはブロックタグ。

基本的な例:ERC-20 転送の事前実行

以下の例は、Robinhood Chain で ERC-20 の transfer(address,uint256) 呼び出しを事前実行します。$BLOCKVECTRA_API_KEY を実際の API key に置き換えてください:

export BLOCKVECTRA_API_KEY=rgw_your_api_key

curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_simulateV1",
    "params": [
      {
        "blockStateCalls": [
          {
            "calls": [
              {
                "from": "0x1111111111111111111111111111111111111111",
                "to": "0x2222222222222222222222222222222222222222",
                "data": "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
                "value": "0x0"
              }
            ]
          }
        ]
      },
      "latest"
    ]
  }'

レスポンス構造の検査

Ethereum の実行仕様に基づき、result フィールドには以下のスキーマを持つシミュレートされたブロック結果の配列が含まれます:

ブロックレベルのフィールド

  • number:シミュレートされたブロックのブロック番号(16 進文字列)。
  • hash:シミュレートされたブロックハッシュ(32 バイトの 16 進文字列)。
  • parentHash:親ブロックのハッシュ。
  • timestamp:ブロックのタイムスタンプ(16 進文字列)。
  • gasLimit:ブロックのガスリミット。
  • gasUsed:このブロック内のすべてのシミュレートされた呼び出しで消費された合計ガス量。
  • baseFeePerGas:ブロックの gas あたりの基本手数料。
  • miner:ブロック手数料を受け取る Coinbase アドレス。
  • calls:シミュレートされた各呼び出しの実行結果の配列。

呼び出しレベルのフィールド(calls 配列項目)

  • status:16 進文字列としての呼び出しステータス。0x1 は成功を示し、0x0 は失敗またはリバートを示します。
  • gasUsed:この呼び出しで実際に消費されたガス量(16 進文字列)。
  • maxUsedGas(オプション):払い戻し前に実行中に使用されたピークガス量。
  • returnData:16 進エンコードされた戻りデータ。成功した ERC-20 転送の場合、ブール値の true が含まれます。リバート時はエラーセレクターまたはリバートデータが含まれます。
  • logs:呼び出しによって発行されたイベントログの配列。成功した場合、Transfer などのイベントログが含まれます:
    • address:イベントを発行したコントラクトアドレス。
    • topics:32 バイトのトピックハッシュの配列(topics[0] は Transfer イベントシグネチャなどのイベントシグネチャハッシュ)。
    • data:16 進エンコードされたインデックスなしのイベントデータ。
    • blockNumber、blockHash、transactionHash、transactionIndex、logIndex、removed。
  • error(失敗時に存在):code(リバートの場合は 3、VM エラーの場合は -32015)および message(execution reverted など)を含むオブジェクト。

価格と CU 重み付け

BlockVectra は消費量を Compute Unit(CU)で計測します。各 JSON-RPC メソッドの重み付けは GET /v1/plans によって動的に公開されます:

呼び出しあたりの CU 重み付け

メソッド呼び出しあたりの CU
eth_simulateV120
eth_call15
eth_estimateGas20

単位換算式やチャージの詳細については、料金ページ をご覧ください。

ノード同期中(-32010)、状態ウィンドウ外(-32011)、メソッド利用不可(-32601)など、拒否されたリクエストは課金されません。完全な課金ルールについては、課金されないリクエスト:エラーコードと課金ルール を参照してください。

AI エージェントおよび MCP での使用

自律型 AI エージェントは、BlockVectra の Model Context Protocol(MCP)サーバーを介して eth_simulateV1 を直接呼び出すことができます。

キー付きの rpc_call ツールを使用すると、サポートされているチェーンで JSON-RPC メソッドを実行できます。API key は MCP クライアントの HTTP ヘッダー(x-api-key: {api_key} または Authorization: Bearer {api_key})で設定する必要があり、ツールのパラメータや会話プロンプトの中に渡してはなりません。

Robinhood Chain での rpc_call ツール呼び出しペイロードの例:

{
  "chain": "robinhood_mainnet",
  "method": "eth_simulateV1",
  "params": [
    {
      "blockStateCalls": [
        {
          "calls": [
            {
              "from": "0x1111111111111111111111111111111111111111",
              "to": "0x2222222222222222222222222222222222222222",
              "data": "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
              "value": "0x0"
            }
          ]
        }
      ]
    },
    "latest"
  ]
}

エージェントは、未加工のトランザクションを送信する前に status === "0x1" を確認してコントラクト操作の有効性を検証し、ガス消費量を評価できます。セットアップと使用方法の手順については、AI エージェント統合ガイド を参照してください。

次のステップ

最終更新:

このページの目次