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

> Source: https://docs.blockvectra.com/ja/guides/simulate-transactions/

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

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 の定義](https://ethereum.github.io/execution-apis/api/methods/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 に置き換えてください：

**cURL**

```bash
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"
    ]
  }'
```


  **TypeScript (viem)**

```ts
import { createPublicClient, http } from "viem";

const apiKey = process.env.BLOCKVECTRA_API_KEY!;
const client = createPublicClient({
  transport: http(`https://api.blockvectra.com/v1/robinhood_mainnet/${apiKey}`),
});

// Call eth_simulateV1 directly via viem's client.request
const simulationResult = await client.request({
  method: "eth_simulateV1" as any,
  params: [
    {
      blockStateCalls: [
        {
          calls: [
            {
              from: "0x1111111111111111111111111111111111111111",
              to: "0x2222222222222222222222222222222222222222",
              data: "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
              value: "0x0",
            },
          ],
        },
      ],
    },
    "latest",
  ],
});

console.log(simulationResult);
```


### レスポンス構造の検査

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_simulateV1` | 20 |
| `eth_call` | 15 |
| `eth_estimateGas` | 20 |

単位換算式やチャージの詳細については、[料金ページ](https://blockvectra.com/en/pricing/) をご覧ください。

ノード同期中（`-32010`）、状態ウィンドウ外（`-32011`）、メソッド利用不可（`-32601`）など、拒否されたリクエストは課金されません。完全な課金ルールについては、[課金されないリクエスト：エラーコードと課金ルール](https://docs.blockvectra.com/en/guides/billing-rules/) を参照してください。

## 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` ツール呼び出しペイロードの例：

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

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

## 次のステップ

* [無料プランと料金](https://blockvectra.com/en/pricing/#free) で、アカウントに含まれる内容を確認できます。
* [コンソールにログイン](https://console.blockvectra.com/login/?next=%2Fkeys%2F) して、API key を作成してください。
