選擇 Webhook、WebSocket 或 RPC 輪詢
依鏈支援、復原、接收端需求與計費,比較地址通知、socket 訂閱與有界輪詢。
使用地址 Webhook 送達至 HTTPS 接收端,使用 WebSocket 處理支援的即時訂閱,並在工作流需要自有游標與復原時使用有界輪詢。
為開發者與 AI Agent 打造鏈上事件監聽器,需要讓應用程式架構與網路能力、送達保證、接收端限制及營運成本相符。
決策矩陣
下表從支援的網路能力、基礎架構需求、復原策略與計費模式,對照這三種整合機制:
| 面向 | 地址 Webhook | WebSocket 訂閱 | 有界 RPC 輪詢 |
|---|---|---|---|
| 主要機制 | 透過 HTTPS POST 推送通知至公開端點 | 透過持久 TLS 連線(wss://)的拉取串流訂閱 | 由用戶端發起的 HTTP JSON-RPC 批次或排程查詢 |
| 鏈可用性 | GET /v1/push/chains 中宣告的全部支援網路 | 在 Robinhood Chain(robinhood_mainnet 與 robinhood_testnet)上支援;未提供服務的網路 ws: false 並回傳 HTTP 404 | 透過免 key 公共 RPC 或認證 JSON-RPC 使用 GET /v1/chains 中的全部支援網路 |
| 接收端需求 | 可公開存取的 HTTPS URL、有效 TLS 憑證、在逾時內回傳 2xx、原始主體 HMAC SHA-256 簽章驗證 | 對外 TCP/TLS 用戶端連線(wss://);處理 ping/pong 心跳與重新連線退避 | 無狀態 HTTP 用戶端或排程 worker;儲存本機區塊游標 |
| 送達與排序 | 至少一次送達,搭配指數退避重試;接收端必須按事件 id 去重,或跨訂閱按 ref + type 去重 | 單一作用中 socket 上嚴格排序的訊框;斷線期間的通知會捨棄 | 對已確認區塊高度提供確定性的拉取回應;由用戶端控制執行節奏 |
| 鏈重組 | 針對 chain.reorg 發出控制通知;接收端先捨棄被替換的事件,再套用規範鏈重放 | 日誌通知對重組的日誌帶有 "removed": true;newHeads 需要檢查父雜湊 | 用戶端跨輪詢週期追蹤 parentHash 的鏈結連續性以偵測重組 |
| 失敗復原 | 伺服器保留視窗允許透過 POST /v1/push/subscriptions/{id}/replay 重放;啟用區塊之前的缺口需要 eth_getLogs 回填 | 沒有伺服器端佇列;用戶端重新連線並透過 eth_getLogs 回填遺漏的範圍,按 (blockHash, transactionHash, logIndex) 去重 | 從儲存的 last_synced_block 繼續查詢;依GET /v1/chains 中網路的 max_logs_block_range切分批次 |
| 計費模式 | 按群組的每日地址費,依 UTC 日線上期間的最大地址數計算,另加已送達資料事件的 CU;見 Webhook 計費 | 握手與心跳不計費;eth_subscribe / eth_unsubscribe 與已排出的 socket 通知單位按 CU 計費 | 按請求以計算單位計量:eth_blockNumber、eth_call、eth_getLogs;方法權重與每 $1 的 CU 來自 GET /v1/plans,如下所示 |
| 最適合 | 使用者充值監控、熱錢包地址追蹤、商戶結帳、非同步事件 Webhook | 支援網路上的即時 newHeads 與篩選後 logs、反應式機器人、互動式 UI | 批次對帳、cron 工作、ETL 管線、不支援 WebSocket 的鏈(例如 HyperEVM) |
目前換算基準參數
1 USD = 10,000 計費單位,1 計費單位 = 1,000 CU(即 1 USD = 10,000,000 CU)。
換算公式:單次呼叫 CU 權重 × 1,000,000 ÷ (10,000 × 1,000) 美元。
| 方法 | 單次呼叫 CU | 每百萬次呼叫價格(USD) |
|---|---|---|
eth_blockNumber | 1 | $0.10 |
eth_call | 15 | $1.50 |
eth_getLogs | 30 | $3.00 |
debug_traceTransaction | 100 | $10.00 |
data.block | 5 | $0.50 |
何時選擇地址 Webhook
當你的後端以標準 Web 服務執行,且能接收傳入的 HTTPS 請求時,請選擇區塊鏈 Webhook API:
- 大量地址清單:監控數千個客戶地址的充值或提領,無需為每個錢包維護持久 socket。
- 無伺服器或容器化接收端:無伺服器函式(AWS Lambda、Cloudflare Workers)會在收到 Webhook 時啟動,不需要讓連線持續保持。
- 自動重試與重放:短暫的接收端中斷可透過自動重試退避緩解。在伺服器保留視窗內,遺漏的送達可用 replay 端點重新送達。
- 啟用邊界注意事項:只有在訂閱變更套用後(
applied_from_block)才會開始比對。地址新增前或訂閱處於offline期間發生的事件,必須透過歷史 RPC 日誌查詢。
在暴露正式環境的 Webhook 接收端之前,請先檢閱簽章驗證與重放工作流。
何時選擇 WebSocket 訂閱
當需要低延遲,且你的程序能維持長時間的對外 socket 時,請選擇 WebSocket 訂閱:
- 即時區塊標頭:在每個區塊附加到鏈頭時串流
newHeads。 - 合約事件篩選:串流符合某個地址或特定
topic0的即時合約logs。 - 私有環境:適用於本機腳本、CLI Agent,或位於 NAT 或防火牆後、無法暴露對內公開 HTTPS 埠的後端服務。
- 網路可用性檢查:WebSocket 在 Robinhood Chain(網路代稱
robinhood_mainnet、Chain ID 4663 與robinhood_testnet)上支援。HyperEVM 目前不支援 WebSocket(ws: false);嘗試對未提供服務的鏈建立 WebSocket 連線會回傳 HTTP 404(unknown_chain)。 - 斷線紀律:WebSocket 通知不會在伺服器端跨斷線保留。當 socket 中斷時,用戶端必須以隨機化指數退避重新連線,並透過
eth_getLogs回填遺漏的區塊。
關於篩選限制、連線上限(每把 key 20 個、每個帳戶 50 個)與 viem 連線範例,請檢閱 WebSocket 訂閱指南。
何時選擇有界 RPC 輪詢
當執行排程 worker、資料管線,或在 WebSocket 不可用的網路上操作時,請選擇有界 JSON-RPC 輪詢:
- 沒有 WebSocket 的網路:HyperEVM(
hyperevm_mainnet)目前提供 JSON-RPC HTTP 存取,但沒有 WebSocket(ws: false)。在支援的區塊範圍內輪詢eth_blockNumber並查詢eth_getLogs,即可支援 HyperEVM 事件處理。 - 可控的查詢節奏:輪詢讓開發者與 AI Agent 能控管請求頻率、依每把 key 的速率限制管理計算單位消耗,並避免長時間執行工作期間的 socket 中斷。每把 key 的限額——預設 400 CU/s、突發 1,600 CU。
- 區塊範圍限制:認證的
eth_getLogs查詢受GET /v1/chains 中網路的max_logs_block_range限制。超過此限制會回傳錯誤碼-32602(logs_range_too_large)。將較寬的區間切分為不超過目標網路max_logs_block_range的連續批次。
| 鏈 | 鏈識別碼 | max_logs_block_range(區塊數) |
|---|---|---|
| Arbitrum One | arb_mainnet | 1,000 |
| Base | base_mainnet | 1,000 |
| BNB Smart Chain | bsc_mainnet | 1,000 |
| Ethereum | eth_mainnet | 1,000 |
| Ethereum Sepolia | eth_sepolia | 1,000 |
| HyperEVM | hyperevm_mainnet | 1,000 |
| Polygon | polygon_mainnet | 1,000 |
| Robinhood Chain | robinhood_mainnet | 1,000 |
| Robinhood Chain Testnet | robinhood_testnet | 1,000 |
關於切分演算法,請參閱 HyperEVM 日誌回填指南 與 eth_getLogs 區塊範圍指南。
如需完整的工作負載檢查清單與自我測試,請從如何選擇 RPC 供應商開始。
為低流量輪詢選擇供應商時,請比較標準 RPC 計費與涵蓋範圍的供應商。比較用量計費與試用及訂閱成本;通知與回填成本使用與 RPC 讀取不同的計量單位。
實作指南
在 Robinhood Chain 上使用 WebSocket
若要在 Robinhood Chain 上取得即時 newHeads 或篩選後的 logs,請依照 WebSocket 訂閱指南 進行認證與訂閱請求。斷線後,以退避重新連線、重新訂閱,並用 eth_getLogs 從儲存的游標回填遺漏的區塊;按 (blockHash, transactionHash, logIndex) 去重日誌。
在 HyperEVM 上使用有界輪詢
若使用 HyperEVM(hyperevm_mainnet),請依照 HyperEVM 日誌回填指南 進行有界輪詢與復原。從儲存的游標出發,在 max_logs_block_range 內分批查詢;成功處理後將事件與進度一起持久化,並重試未完成的範圍。檢查鏈結連續性並掃描重疊範圍以處理重組。
下一步
最後更新: