# Mô phỏng trước khi gửi: chạy thử giao dịch bằng eth_simulateV1

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

Trước khi phát giao dịch lên mạng blockchain, chạy thử giúp nhà phát triển kiểm tra kết quả thực thi, xác minh chuyển đổi trạng thái hợp đồng và quan sát log sự kiện, tránh phí gas không cần thiết do hợp đồng revert.

Lớp thực thi Ethereum cung cấp nhiều cách đánh giá giao dịch trước khi gửi:

* `eth_call`: Thực thi một lệnh gọi thông điệp chỉ đọc, không lưu trạng thái giữa các lệnh gọi liên tiếp.
* `eth_estimateGas`: Tính giới hạn gas cần cho thực thi, nhưng không cung cấp chuyển đổi trạng thái tuần tự giữa nhiều giao dịch hoặc log sự kiện đầy đủ.
* `eth_simulateV1`: Được định nghĩa trong đặc tả tiêu chuẩn Ethereum Execution APIs, phương thức này cho phép mô phỏng tuần tự nhiều giao dịch qua các khối, tích lũy thay đổi trạng thái giữa các giao dịch và hỗ trợ ghi đè tham số khối cùng trạng thái tài khoản.

## Chuỗi được hỗ trợ và chính sách phương thức

Khả năng mạng được công bố động qua `GET /v1/chains`. Đọc `methods.allow` trong phản hồi để xem chuỗi nào cho phép `eth_simulateV1`; chuỗi không liệt kê phương thức này từ chối lệnh gọi với lỗi JSON-RPC `-32601` (`method not available`, không tính phí).

### Điều kiện trạng thái node

`eth_simulateV1` là phương thức truy vấn trạng thái:

* **Kiểm tra đồng bộ (`-32010`)**: Khi node của chuỗi đích đang đồng bộ và chưa sẵn sàng, lệnh gọi trả `-32010` (`node is syncing`, không tính phí).
* **Cửa sổ trạng thái (`-32011`)**: Trên Robinhood Chain, yêu cầu nhắm đến khối cũ hơn `state_window_blocks` của chuỗi (`GET /v1/chains`), hoặc chỉ định block tag `safe`, `finalized` hay `earliest`, trả `-32011` (không tính phí). Block tag mặc định là `latest`.

## Cấu trúc yêu cầu và ví dụ cơ bản

Theo đặc tả lớp thực thi ([định nghĩa eth\_simulateV1 trong Ethereum Execution APIs](https://ethereum.github.io/execution-apis/api/methods/eth_simulateV1)), `eth_simulateV1` chấp nhận hai tham số theo vị trí:

1. **Đối tượng payload**:
   * `blockStateCalls` (mảng bắt buộc): Mảng đối tượng khối mô phỏng. Mỗi đối tượng chứa mảng lệnh gọi giao dịch `calls`, phần ghi đè header khối `blockOverrides` tùy chọn và phần ghi đè trạng thái tài khoản `stateOverrides` tùy chọn.
   * `validation` (boolean tùy chọn, mặc định `false`): Khi là `false`, hoạt động như `eth_call`; khi là `true`, chạy tất cả kiểm tra EVM trừ kiểm tra chữ ký.
   * `traceTransfers` (boolean tùy chọn): Khi là `true`, trả log sự kiện cho chuyển token gốc.
2. **Block tag** (chuỗi tùy chọn, mặc định `'latest'`): Số khối, hash khối hoặc block tag.

### Ví dụ cơ bản: chạy thử chuyển ERC-20

Ví dụ sau chạy thử lệnh gọi ERC-20 `transfer(address,uint256)` trên Robinhood Chain. Thay `$BLOCKVECTRA_API_KEY` bằng API key thực tế của bạn:

**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);
```


### Kiểm tra cấu trúc phản hồi

Theo đặc tả thực thi Ethereum, trường `result` chứa mảng kết quả khối mô phỏng với schema sau:

#### Trường cấp khối

* `number`: Số khối của khối mô phỏng (chuỗi thập lục phân).
* `hash`: Hash khối mô phỏng (chuỗi thập lục phân 32 byte).
* `parentHash`: Hash khối cha.
* `timestamp`: Dấu thời gian khối (chuỗi thập lục phân).
* `gasLimit`: Giới hạn gas của khối.
* `gasUsed`: Tổng gas tiêu thụ của tất cả lệnh gọi mô phỏng trong khối này.
* `baseFeePerGas`: Phí cơ sở mỗi gas của khối.
* `miner`: Địa chỉ coinbase nhận phí khối.
* `calls`: Mảng kết quả thực thi của từng lệnh gọi mô phỏng.

#### Trường cấp lệnh gọi (phần tử mảng `calls`)

* `status`: Trạng thái lệnh gọi dưới dạng chuỗi thập lục phân. `0x1` biểu thị thành công, còn `0x0` biểu thị thất bại hoặc revert.
* `gasUsed`: Gas thực tế lệnh gọi này tiêu thụ (chuỗi thập lục phân).
* `maxUsedGas` (tùy chọn): Mức gas sử dụng cao nhất trong quá trình thực thi trước khi hoàn lại.
* `returnData`: Dữ liệu trả về mã hóa thập lục phân. Khi chuyển ERC-20 thành công, chứa boolean `true`; khi revert, chứa selector lỗi hoặc dữ liệu revert.
* `logs`: Mảng log sự kiện lệnh gọi phát ra. Khi thành công, chứa log sự kiện như `Transfer`:
  * `address`: Địa chỉ hợp đồng phát sự kiện.
  * `topics`: Mảng hash topic 32 byte (`topics[0]` là hash chữ ký sự kiện, như chữ ký sự kiện `Transfer`).
  * `data`: Dữ liệu sự kiện không được lập chỉ mục, mã hóa thập lục phân.
  * `blockNumber`, `blockHash`, `transactionHash`, `transactionIndex`, `logIndex`, `removed`.
* `error` (có khi thất bại): Đối tượng chứa `code` (`3` cho revert, `-32015` cho lỗi VM) và `message` (như `execution reverted`).

## Bảng giá và trọng số CU

BlockVectra đo mức sử dụng bằng Compute Unit (CU). Trọng số của mỗi phương thức JSON-RPC được công bố động qua `GET /v1/plans`:

**Trọng số CU mỗi lệnh gọi**

| Phương thức | CU mỗi lệnh gọi |
| --- | --- |
| `eth_simulateV1` | 20 |
| `eth_call` | 15 |
| `eth_estimateGas` | 20 |

Để biết công thức quy đổi đơn vị và chi tiết nạp tiền, xem [trang bảng giá](https://blockvectra.com/vi/pricing/).

Yêu cầu bị từ chối — gồm node đang đồng bộ (`-32010`), ngoài cửa sổ trạng thái (`-32011`) hoặc phương thức không khả dụng (`-32601`) — không bị tính phí. Xem [Yêu cầu nào miễn phí](https://docs.blockvectra.com/en/guides/billing-rules/) để biết đầy đủ quy tắc tính phí.

## Sử dụng với AI Agent và MCP

AI Agent tự chủ có thể gọi `eth_simulateV1` trực tiếp qua máy chủ Model Context Protocol (MCP) của BlockVectra.

Công cụ `rpc_call` có xác thực bằng API key cho phép thực thi phương thức JSON-RPC trên các chuỗi được hỗ trợ. API key phải được cấu hình trong HTTP header của MCP client (`x-api-key: {api_key}` hoặc `Authorization: Bearer {api_key}`), không bao giờ truyền trong tham số công cụ hay nội dung cuộc trò chuyện.

Ví dụ payload gọi công cụ `rpc_call` trên Robinhood Chain:

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

Agent có thể kiểm tra `status === "0x1"` để xác minh tính hợp lệ của tương tác hợp đồng và đánh giá mức tiêu thụ gas trước khi gửi giao dịch thô. Xem hướng dẫn cấu hình và sử dụng trong [hướng dẫn tích hợp AI Agent](https://docs.blockvectra.com/vi/guides/ai-agents/).

## Các bước tiếp theo

* [Xem gói miễn phí và bảng giá](https://blockvectra.com/vi/pricing/#free) để kiểm tra những gì tài khoản của bạn bao gồm.
* [Đăng nhập bảng điều khiển](https://console.blockvectra.com/login/?next=%2Fkeys%2F) để tạo API key.
