# 发送前先模拟：用 eth_simulateV1 预演交易

> 原文地址: https://docs.blockvectra.com/zh/guides/simulate-transactions/

在向区块链网络发送真实交易前，预演交易能够提前检验执行结果、确认合约状态变化与事件日志，避免因执行失败（revert）浪费链上 Gas 费用。

以太坊执行层提供了多种评估交易执行的方法：

* `eth_call`：执行单次只读合约调用，不产生跨调用的状态累积。
* `eth_estimateGas`：估算交易执行所需的 Gas 上限，但不提供跨区块或多笔交易的连续状态演进与事件日志详情。
* `eth_simulateV1`：以太坊执行层标准规范中定义的模拟方法，允许按顺序预演多笔交易，模拟跨交易状态累积，并支持覆盖区块参数与账户状态。

## 支持情况与方法策略

BlockVectra 的各网络能力通过公开端点 `GET /v1/chains` 动态发布。在 Robinhood Chain 上，方法策略（`methods.allow`）开放了 `eth_simulateV1`（链标识符为 `robinhood_mainnet`，EIP-155 链 ID 为 4663）。

未在 `methods.allow` 中开放该方法的链，调用时将返回 JSON-RPC 错误码 `-32601`（`method not available`，不计费）。只读调用 `eth_call` 与 Gas 估算 `eth_estimateGas` 则在当前四条网络上均已开放。

以下为依据 `GET /v1/chains` 策略整理的方法支持情况：

| JSON-RPC 方法       | 允许该方法的链 (`chain`)                                                                 | 链名称                                                              | EIP-155 链 ID                 | 说明             |
| ----------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------- | -------------- |
| `eth_simulateV1`  | `robinhood_mainnet`                                                               | Robinhood Chain                                                  | 4663                         | 多交易连续执行与状态覆盖预演 |
| `eth_call`        | `robinhood_mainnet`<br />`eth_mainnet`<br />`bsc_mainnet`<br />`hyperevm_mainnet` | Robinhood Chain<br />Ethereum<br />BNB Smart Chain<br />HyperEVM | 4663<br />1<br />56<br />999 | 单次只读消息调用       |
| `eth_estimateGas` | `robinhood_mainnet`<br />`eth_mainnet`<br />`bsc_mainnet`<br />`hyperevm_mainnet` | Robinhood Chain<br />Ethereum<br />BNB Smart Chain<br />HyperEVM | 4663<br />1<br />56<br />999 | 估算交易所需 Gas 上限  |

### 节点状态守卫

依据平台公开规范，`eth_simulateV1` 属于状态查询方法，受以下节点守卫约束：

* **节点同步门（`-32010`）**：当目标链的节点处于同步状态未就绪时，返回 `-32010`（`node is syncing`），调用不转发且不计费。
* **历史状态窗口（`-32011`）**：在 Robinhood Chain 上，状态窗口为 900 个区块（`state_window_blocks: 900`）。若目标区块早于保留窗口，或使用 `safe`、`finalized`、`earliest` 标签，返回 `-32011`，不计费。目标区块标签缺省时默认为 `latest`。

## 请求结构与基础示例

依据以太坊执行层规范（[Ethereum Execution APIs eth\_simulateV1 定义](https://ethereum.github.io/execution-apis/api/methods/eth_simulateV1)），`eth_simulateV1` 的入参包含两个位置参数：

1. **Payload 对象**：
   * `blockStateCalls`（必填数组）：模拟区块列表。每个区块包含待执行的交易调用数组 `calls`，以及可选的区块参数覆盖 `blockOverrides` 与账户状态覆盖 `stateOverrides`。
   * `validation`（可选布尔值，默认 `false`）：为 `false` 时基础费为零且跳过严格账户余额校验；为 `true` 时执行完整 EVM 校验（如 nonce 与余额检查）。
   * `traceTransfers`（可选布尔值）：为 `true` 时生成原生代币转账事件日志。
2. **Block tag**（可选字符串，默认 `'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}`),
});

// 通过 viem 的 request 方法发起 eth_simulateV1 调用
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);
```


### 响应结构说明

依据以太坊执行层规范，响应体中的 `result` 为区块级预演结果数组，按规范字段定义如下：

#### 区块级字段

* `number`：模拟生成的区块高度（十六进制字符串）。
* `hash`：模拟区块哈希（32 字节十六进制字符串）。
* `parentHash`：父区块哈希。
* `timestamp`：区块时间戳（十六进制字符串）。
* `gasLimit`：区块 Gas 上限。
* `gasUsed`：该模拟区块内所有调用消耗的总 Gas。
* `baseFeePerGas`：该区块的基础费率。
* `feeRecipient`：出块费用接收地址。
* `calls`：该区块内各笔调用的执行结果数组。

#### 调用级字段（`calls` 数组项）

* `status`：调用状态，十六进制字符串。`0x1` 表示执行成功，`0x0` 表示执行失败或发生 revert。
* `gasUsed`：该笔调用实际消耗的 Gas 数量（十六进制字符串）。
* `maxUsedGas`（可选）：执行过程中在退款前的 Gas 消耗峰值。
* `returnData`：合约返回的十六进制字节串。转账成功时包含标准 ERC-20 返回的布尔值数据；发生 revert 时包含错误信息或自定义错误选择器。
* `logs`：执行成功时生成的事件日志数组。每个日志对象包含：
  * `address`：触发事件的合约地址。
  * `topics`：主题哈希数组（`topics[0]` 为事件签名哈希，如 `Transfer` 事件签名）。
  * `data`：非索引事件数据（十六进制字节串）。
  * `blockNumber`、`blockHash`、`transactionHash`、`transactionIndex`、`logIndex`、`removed`。
* `error`（调用失败时返回）：包含 `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/zh/pricing/)。

因节点未就绪返回 `-32010`、超出状态窗口返回 `-32011` 或调用未开放方法返回 `-32601` 等被前置拦截的请求，均不计费。详细判定规则请参阅[哪些请求不计费：错误码与计费规则](https://docs.blockvectra.com/zh/guides/billing-rules/)。

## 在 AI Agent 与 MCP 中使用

自主 AI Agent 可通过 BlockVectra 官方 Model Context Protocol（MCP）服务直接调用 `eth_simulateV1`。

在 MCP 工具集中，带鉴权的 `rpc_call` 工具支持执行受支持链的 JSON-RPC 方法。API key 通过 MCP 客户端 HTTP 请求头（`x-api-key: {api_key}` 或 `Authorization: Bearer {api_key}`）安全注入，严禁在工具参数或提示词中明文传入 key。

在 Robinhood Chain 上通过 `rpc_call` 发起 `eth_simulateV1` 的入参示例如下：

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

Agent 在发起资产转账、合约交互前可先调用此工具，根据返回中的 `status` 是否为 `0x1` 验证交易合法性与 Gas 消耗。完整的 MCP 接入流程与鉴权与使用说明，请参阅 [AI Agent 集成指南](https://docs.blockvectra.com/zh/guides/ai-agents/)。

## 下一步

* [浏览数据集目录](https://blockvectra.com/zh/data/)，查看 BlockVectra 索引的全部数据集。
* [查看免费额度与定价](https://blockvectra.com/zh/pricing/#free)，确认账户可用的方案。
* [登录控制台](https://console.blockvectra.com/zh/login/?next=%2Fzh%2Fkeys%2F)创建 API key。
