傳送前先模擬:使用 eth_simulateV1 預演交易
在交易廣播上鏈前用 eth_simulateV1 預演多筆交易與跨交易狀態累積:入參含區塊呼叫陣列與可選驗證欄位,回應中的 status 為 0x1 表示執行成功,超出狀態視窗會傳回 -32011 且不計費。
在將交易廣播到區塊鏈網路之前,預演交易可讓開發者事先檢視執行結果、驗證合約狀態轉換並觀察事件日誌,避免因合約回滾而造成不必要的 gas 費用。
以太坊執行層提供多種在傳送前評估交易的方式:
eth_call:執行單次唯讀訊息呼叫,連續呼叫之間不保留狀態。eth_estimateGas:計算執行所需的 gas 上限,但不提供多筆交易的連續狀態轉換或完整事件日誌。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 定義),eth_simulateV1 接受兩個位置參數:
- Payload 物件:
blockStateCalls(必填陣列):模擬區塊物件的陣列。每個物件包含交易呼叫陣列calls、選填的區塊標頭覆寫blockOverrides,以及選填的帳戶狀態覆寫stateOverrides。validation(選填布林值,預設false):為false時,行為如同eth_call;為true時,執行除了簽章檢查之外的所有 EVM 驗證。traceTransfers(選填布林值):為true時,回傳原生代幣轉帳的事件日誌。
- 區塊標籤(選填字串,預設
'latest'):區塊編號、區塊雜湊或區塊標籤。
基本範例:預演 ERC-20 轉帳
以下範例在 Robinhood Chain 上預演 ERC-20 transfer(address,uint256) 呼叫。請將 $BLOCKVECTRA_API_KEY 替換為你實際的 API key:
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"
]
}'檢視回應結構
根據以太坊執行規格,result 欄位包含模擬區塊結果的陣列,結構如下:
區塊層級欄位
number:模擬區塊的區塊編號(十六進位字串)。hash:模擬區塊雜湊(32 位元組十六進位字串)。parentHash:父區塊的雜湊。timestamp:區塊時間戳(十六進位字串)。gasLimit:區塊 gas 上限。gasUsed:此區塊中所有模擬呼叫消耗的 gas 總量。baseFeePerGas:該區塊每單位 gas 的基礎費用。miner:接收區塊費用的 coinbase 地址。calls:每個模擬呼叫的執行結果陣列。
呼叫層級欄位(calls 陣列項目)
status:呼叫狀態,十六進位字串。0x1表示成功,0x0表示失敗或回滾。gasUsed:此呼叫實際消耗的 gas(十六進位字串)。maxUsedGas(選填):執行期間在退還之前的 gas 用量峰值。returnData:十六進位編碼的回傳資料。ERC-20 轉帳成功時,其中包含布林值true;回滾時,其中包含錯誤選擇器或回滾資料。logs:呼叫發出的事件日誌陣列。成功時,包含如Transfer等事件日誌:address:發出事件的合約地址。topics:32 位元組主題雜湊的陣列(topics[0]是事件簽章雜湊,例如Transfer事件簽章)。data:十六進位編碼的非索引事件資料。blockNumber、blockHash、transactionHash、transactionIndex、logIndex、removed。
error(失敗時出現):包含code(3表示回滾,-32015表示 VM 錯誤)與message(例如execution reverted)的物件。
計價與 CU 權重
BlockVectra 以計算單位(CU)計量用量。每個 JSON-RPC 方法的權重由 GET /v1/plans 動態發布:
單次呼叫的 CU 權重
| 方法 | 單次呼叫 CU |
|---|---|
eth_simulateV1 | 20 |
eth_call | 15 |
eth_estimateGas | 20 |
單位換算公式與儲值詳情請參閱定價頁面。
被拒絕的請求——包括節點同步中(-32010)、超出狀態視窗(-32011)或方法無法使用(-32601)——不計費。完整計費規則請參閱哪些請求免費。
搭配 AI Agent 與 MCP 使用
自主 AI Agent 可以直接透過 BlockVectra 的 Model Context Protocol(MCP)伺服器叫用 eth_simulateV1。
需要 key 的 rpc_call 工具允許在支援的鏈上執行 JSON-RPC 方法。API key 必須設定在 MCP 用戶端的 HTTP 標頭中(x-api-key: {api_key} 或 Authorization: Bearer {api_key}),絕不可傳入工具參數或對話提示中。
在 Robinhood Chain 上叫用 rpc_call 工具的承載範例:
{
"chain": "robinhood_mainnet",
"method": "eth_simulateV1",
"params": [
{
"blockStateCalls": [
{
"calls": [
{
"from": "0x1111111111111111111111111111111111111111",
"to": "0x2222222222222222222222222222222222222222",
"data": "0xa9059cbb00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a7640000",
"value": "0x0"
}
]
}
]
},
"latest"
]
}Agent 可以檢查 status === "0x1",在提交原始交易前驗證合約互動是否有效並評估 gas 消耗。設定與使用說明請參閱 AI Agent 整合指南。
下一步
最後更新: