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

Chạy thử nhiều giao dịch và kiểm tra thay đổi trạng thái trước khi gửi on-chain bằng eth_simulateV1. Tìm hiểu chính sách phương thức theo chuỗi, payload yêu cầu theo đặc tả thực thi, trọng số CU và tích hợp MCP cho AI Agent.

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), 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:

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

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ứcCU mỗi lệnh gọi
eth_simulateV120
eth_call15
eth_estimateGas20

Để biết công thức quy đổi đơn vị và chi tiết nạp tiền, xem trang bảng giá.

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í để 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:

{
  "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.

Các bước tiếp theo

Cập nhật lần cuối:

Trên trang này