> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 eth_simulateV1 模拟区块

> 使用标准 eth_simulateV1 JSON-RPC 方法模拟一系列区块，支持批量调用、状态覆盖和区块覆盖。

`eth_simulateV1` 是来自 [Ethereum execution APIs](https://github.com/ethereum/execution-apis) 规范的标准多区块模拟方法。它在给定的基础区块之上模拟一系列区块，每个区块包含一批调用，而不会向链上发送任何内容。区块内的调用按顺序执行并共享状态，且每个模拟区块都构建在前一个区块之上。

该方法运行于 [Node RPC](/node-rpc/overview) 和 [Virtual Environments](/virtual-environments/overview) 之上；参见完整的 [JSON-RPC 参考](/node-rpc/rpc-reference) 以了解所有方法和网络。少数网络不支持该方法；参见[网络可用性](#网络可用性)。

当您需要可移植、符合规范标准且返回区块形态结果的模拟时，请使用 `eth_simulateV1`。如需已解码日志、调用跟踪以及资产和余额变化，单笔交易请使用 [`tenderly_simulateTransaction`](/node-rpc/guides/simulate-json-rpc)，交易序列请使用 [`tenderly_simulateBundle`](/node-rpc/guides/simulate-bundle-json-rpc)。

### `eth_simulateV1`

在给定的基础区块之上模拟一系列区块。每个区块包含一批调用：第 N 个调用能看到第 N-1 个调用的状态变化，且第一个区块之后的每个区块都构建在前一个区块之上。

**参数**

1. **Simulation payload** 模拟负载 `OBJECT`
   * **blockStateCalls** `ARRAY`，元素为区块状态调用 `OBJECT`：要模拟的区块序列，按顺序排列
     * **blockOverrides**（*可选*）`OBJECT`：此区块中要覆盖的头字段集
       * **number**（*可选*）`STRING`：hex，覆盖区块号
       * **difficulty**（*可选*）`STRING`：hex，覆盖区块难度
       * **time**（*可选*）`STRING`：hex，覆盖区块时间戳
       * **gasLimit**（*可选*）`STRING`：hex，覆盖 gas 限制
       * **coinbase**（*可选*）`STRING`：hex，覆盖区块矿工
       * **random**（*可选*）`STRING`：hex，覆盖输入到 PREVRANDAO 操作码的值
       * **baseFee**（*可选*）`STRING`：hex，覆盖区块基础费
       * **excessBlobGas**（*可选*）`STRING`：hex，覆盖超额 blob gas
       * **blobGasUsed**（*可选*）`STRING`：hex，覆盖已使用的 blob gas
     * **stateOverrides**（*可选*）`MAP`：从账户（地址）到覆盖规范的映射。请在**第一个**区块条目上设置状态覆盖；参见 [Tenderly 特有行为](#tenderly-特有行为)
       * **key** `STRING`：此覆盖适用的账户
       * **value** `OBJECT`：覆盖规范
         * **balance**（*可选*）`STRING`：账户的十六进制编码余额覆盖，单位为 wei
         * **nonce**（*可选*）`STRING`：账户的十六进制编码 nonce 覆盖
         * **code**（*可选*）`STRING`：账户代码覆盖的数据
         * **stateDiff**（*可选*）`MAP`：存储键到存储值覆盖的映射
           * **key** `STRING`：存储键
           * **value** `STRING`：给定存储键的值覆盖
     * **calls** `ARRAY`，元素为交易调用 `OBJECT`：按顺序执行；每个调用都能观察到在它之前的调用的状态变化
       * **from**（*可选*）`STRING`：十六进制编码地址；默认为零地址
       * **to**（*可选*）`STRING`：十六进制编码地址
       * **gas**（*可选*）`STRING`：该调用的十六进制编码 gas 限制
       * **gasPrice**（*可选*）`STRING`：hex，发送方愿意支付的 gas 价格，单位为 wei
       * **maxFeePerGas**（*可选*）`STRING`：hex，发送方愿意为每单位 gas 支付的最大总费用（包含网络/基础费用和矿工/优先费），单位为 wei
       * **maxPriorityFeePerGas**（*可选*）`STRING`：hex，发送方愿意支付给矿工的每单位 gas 最大费用，单位为 wei
       * **value**（*可选*）`STRING`：十六进制编码的 value，单位为 wei；默认为 `0x0`
       * **input**（*可选*）`STRING`：十六进制编码的调用数据；`data` 作为已弃用的别名仍被接受，两者同时设置时 `input` 优先
       * **nonce**（*可选*）`STRING`：十六进制编码的 nonce
       * **type**（*可选*）`STRING`：十六进制编码的交易类型
       * **accessList**（*可选*）`ARRAY`，元素为访问列表条目 `OBJECT`
         * **address** `STRING`：十六进制编码地址
         * **storageKeys** `ARRAY`，元素为 32 字节十六进制编码存储键的 `STRING` 表示
       * **maxFeePerBlobGas**（*可选*）`STRING`：hex，每单位 blob gas 的最大费用，单位为 wei
       * **blobVersionedHashes**（*可选*）`ARRAY`，元素为 `STRING`：32 字节十六进制编码的 blob 版本化哈希
       * **authorizationList**（*可选*）`ARRAY`：EIP-7702 授权元组
   * **returnFullTransactions**（*可选*）`BOOLEAN`：为 `true` 时，结果区块包含完整的交易对象而非交易哈希
2. **Base block number**（*可选*）模拟所基于的区块。默认为 `latest`。可为：
   * `STRING` 区块号
   * `ENUM` 区块标签 `earliest|finalized|safe|latest|pending`

**示例**

该请求模拟两个区块。第一个区块通过状态覆盖为发送方注资，然后发送 ETH 并将 1 ETH 包装为 WETH；第二个区块设置自定义时间戳并转移在第一个区块中铸造的 WETH。

<Tabs>
  <Tab title="Request">
    ```json title="example.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "method": "eth_simulateV1",
      "params": [
        {
          "blockStateCalls": [
            {
              "stateOverrides": {
                "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
                  "balance": "0x3635c9adc5dea00000"
                }
              },
              "calls": [
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0x1111111111111111111111111111111111111111",
                  "value": "0x1bc16d674ec80000"
                },
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "value": "0xde0b6b3a7640000",
                  "input": "0xd0e30db0"
                }
              ]
            },
            {
              "blockOverrides": { "time": "0x6ae00000" },
              "calls": [
                {
                  "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                  "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
                }
              ]
            }
          ]
        },
        "latest"
      ]
    }
    ```
  </Tab>

  <Tab title="Shell">
    ```bash title="example" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    curl https://mainnet.gateway.tenderly.co/$TENDERLY_NODE_ACCESS_KEY \
    -X POST \
    -H "Content-Type: application/json" \
    -d \
    '{
    "id": 0,
    "jsonrpc": "2.0",
    "method": "eth_simulateV1",
    "params": [
    {
    "blockStateCalls": [
      {
        "stateOverrides": {
          "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
            "balance": "0x3635c9adc5dea00000"
          }
        },
        "calls": [
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0x1111111111111111111111111111111111111111",
            "value": "0x1bc16d674ec80000"
          },
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
            "value": "0xde0b6b3a7640000",
            "input": "0xd0e30db0"
          }
        ]
      },
      {
        "blockOverrides": { "time": "0x6ae00000" },
        "calls": [
          {
            "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
            "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
            "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
          }
        ]
      }
    ]
    },
    "latest"
    ]
    }'
    ```
  </Tab>

  <Tab title="JavaScript">
    ```javascript title="example.js" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    // Installation Instructions: https://docs.ethers.io/v5/getting-started/#installing
    const { ethers } = require('ethers');

    async function runSimulateV1() {
    // Initialize an ethers instance
    const provider = new ethers.providers.JsonRpcProvider(
    'https://mainnet.gateway.tenderly.co/$TENDERLY_NODE_ACCESS_KEY',
    );

    // Execute method
    const result = await provider.send('eth_simulateV1', [
    {
    blockStateCalls: [
      {
        stateOverrides: {
          '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2': {
            balance: '0x3635c9adc5dea00000',
          },
        },
        calls: [
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0x1111111111111111111111111111111111111111',
            value: '0x1bc16d674ec80000',
          },
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
            value: '0xde0b6b3a7640000',
            input: '0xd0e30db0',
          },
        ],
      },
      {
        blockOverrides: { time: '0x6ae00000' },
        calls: [
          {
            from: '0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2',
            to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
            input: '0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000',
          },
        ],
      },
    ],
    },
    'latest',
    ]);

    // Print the output to console
    console.log(result);
    }

    (async () => {
    runSimulateV1();
    })();
    ```
  </Tab>

  <Tab title="Response">
    ```json title="response.json" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
    {
      "id": 0,
      "jsonrpc": "2.0",
      "result": [
        {
          "number": "0x184b35b",
          "hash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
          "parentHash": "0x1fe7faf7d5b3a57fe52192bcf634b62bda8cfd39a5509d5541a2fb30d5438463",
          "nonce": "0x88425305eb52b6f7",
          "mixHash": "0x5bf018c82ca9e0e3805b00475afe61be2b1077eff79abb6cb4617af8548aa514",
          "sha3Uncles": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
          "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "miner": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97",
          "difficulty": "0x0",
          "extraData": "0x546974616e2028746974616e6275696c6465722e78797a29",
          "size": "0x0",
          "gasLimit": "0x3938700",
          "gasUsed": "0x3938700",
          "timestamp": "0x6a4bb197",
          "transactionsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "receiptsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "baseFeePerGas": "0x18d7ee41",
          "blobGasUsed": "0x60000",
          "excessBlobGas": "0xba42085",
          "uncles": [],
          "transactions": [
            "0xbb42f5dcbfa507c52b64642c9b9e2a95fc4e2542cbd06b180239367d45f35e30",
            "0xcb06f645c2962f5dfff047efb2a000d05d0a58a619c63c97ec3e12cf48d02033"
          ],
          "calls": [
            {
              "returnData": "0x",
              "logs": [],
              "gasUsed": "0x5208",
              "status": "0x1"
            },
            {
              "returnData": "0x",
              "logs": [
                {
                  "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "topics": [
                    "0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c",
                    "0x000000000000000000000000e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2"
                  ],
                  "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
                  "blockNumber": "0x184b35b",
                  "transactionHash": "0xcb06f645c2962f5dfff047efb2a000d05d0a58a619c63c97ec3e12cf48d02033",
                  "transactionIndex": "0x1",
                  "blockHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
                  "logIndex": "0x0",
                  "removed": false
                }
              ],
              "gasUsed": "0xafee",
              "status": "0x1"
            }
          ]
        },
        {
          "number": "0x184b35c",
          "hash": "0xddb8a8a01c753b30acea4c8a12e36f3157dfa854ad0134b1dbb1e6227a9838cd",
          "parentHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
          "nonce": "0x0000000000000000",
          "mixHash": "0x5bf018c82ca9e0e3805b00475afe61be2b1077eff79abb6cb4617af8548aa514",
          "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
          "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
          "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "miner": "0x0000000000000000000000000000000000000000",
          "difficulty": "0x0",
          "extraData": "0x546974616e2028746974616e6275696c6465722e78797a29",
          "size": "0x18e",
          "gasLimit": "0x3938700",
          "gasUsed": "0x0",
          "timestamp": "0x6ae00000",
          "transactionsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
          "baseFeePerGas": "0x1bf2ec09",
          "excessBlobGas": "0xba62085",
          "uncles": [],
          "transactions": [
            "0x21ac69b18844a9f1345c2b29292852477672178b0d338092f20dcb850d261604"
          ],
          "calls": [
            {
              "returnData": "0x0000000000000000000000000000000000000000000000000000000000000001",
              "logs": [
                {
                  "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
                  "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x000000000000000000000000e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
                    "0x0000000000000000000000001111111111111111111111111111111111111111"
                  ],
                  "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
                  "blockNumber": "0x184b35b",
                  "transactionHash": "0x21ac69b18844a9f1345c2b29292852477672178b0d338092f20dcb850d261604",
                  "transactionIndex": "0x0",
                  "blockHash": "0x2b33857d4b0380d7b92a258c77d9357c9515701f914684789e959ae84d73347a",
                  "logIndex": "0x1",
                  "removed": false
                }
              ],
              "gasUsed": "0x73fe",
              "status": "0x1"
            }
          ]
        }
      ]
    }
    ```
  </Tab>
</Tabs>

**结果**

`ARRAY`，元素为区块结果 `OBJECT`，每个 `blockStateCalls` 条目对应一个，按顺序排列。每个区块结果携带 `eth_getBlockByNumber` 返回的标准区块头字段（`number`、`hash`、`parentHash`、`timestamp`、`gasLimit`、`gasUsed`、`baseFeePerGas`、`logsBloom`、`miner` 等），另加：

* **transactions** `ARRAY`：模拟调用的交易哈希；当 `returnFullTransactions` 为 `true` 时为完整的交易对象
* **calls** `ARRAY`，元素为调用结果 `OBJECT`，每个调用对应一个，按顺序排列：
  * **returnData** `STRING`：该调用的十六进制编码返回数据
  * **logs** `ARRAY`，元素为日志 `OBJECT`：该调用发出的事件（`address`、`topics`、`data`、`blockNumber`、`transactionHash`、`transactionIndex`、`blockHash`、`logIndex`、`removed`）；调用回滚时为空
  * **gasUsed** `STRING`：该调用消耗的 gas 数量，十六进制编码
  * **status** `STRING`：`0x1` 表示成功，`0x0` 表示失败
  * **error** `OBJECT`：仅在调用失败时存在
    * **code** `NUMBER`：错误码
    * **message** `STRING`：错误信息，在可用时包含回滚原因

### Tenderly 特有行为

Tenderly 的实现与参考的 [execution-apis](https://github.com/ethereum/execution-apis) 规范在以下方面存在差异：

* **不支持 `validation`。** 设置 `validation: true` 会返回错误 `validation flag is not supported`。模拟始终以非验证模式运行：不对调用强制执行 nonce、余额和费用要求。
* **不支持 `traceTransfers`。** 设置 `traceTransfers: true` 会返回错误 `traceTransfers flag is not supported`。不会产生合成的 ETH 转账日志。
* **不支持 `state` 覆盖。** 状态覆盖中的 `state` 字段（完全替换存储）会返回 `not supported` 错误。请使用 `stateDiff` 覆盖单个存储槽。
* **状态覆盖从第一个区块起生效。** 请在第一个 `blockStateCalls` 条目上设置 `stateOverrides`；后续条目上的 `stateOverrides` 不会被应用。
* **单个调用的 `gas` 会被钳制。** 超过区块 gas 限制加 600,000,000 的 `gas` 值会被钳制到该上限，而不是被拒绝。
* **没有区块数或调用数限制。** 对 `blockStateCalls` 条目数量或每个区块的调用数量没有强制上限。
* **交易哈希是合成的。** 结果区块中的哈希用于标识模拟调用，但并非已签名交易的哈希。
* **区块递进。** 第一个区块之后的每个模拟区块都会获得 `number = 前一区块号 + 1` 以及链接到前一个结果的 `parentHash`，同时重新计算基础费和 gas 限制。自动生成的时间戳是节点的系统时钟时间，因此当时间戳有影响时请显式设置 `blockOverrides.time`。被覆盖的区块号和时间戳会按原样应用，不会验证其单调性。当第一个区块条目提供了 `blockOverrides` 但未指定 `number` 时，区块号默认为基础区块号加 1。

### 网络可用性

`eth_simulateV1` 在 Node RPC 网络和 Virtual Environments 上可用，但以下网络除外，其底层网络节点不支持该方法：

* ApeChain
* Avalanche C-Chain
* Avalanche C-Chain Fuji
* Blast
* Curtis
* Flare
* Immutable
* Immutable Testnet
* Lens
* Lens Testnet
* Metis Andromeda
* Metis Sepolia
* Monad
* Monad Testnet
* Moonbase Alpha
* Moonbeam
* Moonriver
* Scroll Mainnet
* Scroll Sepolia
* Sonic
* Sonic Testnet
* Stable
* Stable Testnet
* ZKsync
* ZKsync Sepolia
