# 選擇 Webhook、WebSocket 或 RPC 輪詢

> Source: https://docs.blockvectra.com/zh-hant/guides/webhook-vs-websocket/

使用地址 Webhook 送達至 HTTPS 接收端，使用 WebSocket 處理支援的即時訂閱，並在工作流需要自有游標與復原時使用有界輪詢。

為開發者與 AI Agent 打造鏈上事件監聽器，需要讓應用程式架構與網路能力、送達保證、接收端限制及營運成本相符。

## 決策矩陣

下表從支援的網路能力、基礎架構需求、復原策略與計費模式，對照這三種整合機制：

| 面向        | 地址 Webhook                                                                                                    | WebSocket 訂閱                                                                                    | 有界 RPC 輪詢                                                                                                                                  |
| --------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **主要機制**  | 透過 HTTPS POST 推送通知至公開端點                                                                                       | 透過持久 TLS 連線（`wss://`）的拉取串流訂閱                                                                    | 由用戶端發起的 HTTP JSON-RPC 批次或排程查詢                                                                                                              |
| **鏈可用性**  | [GET /v1/push/chains](https://api.blockvectra.com/v1/push/chains) 中宣告的全部支援網路                                  | 在 Robinhood Chain（robinhood\_mainnet 與 robinhood\_testnet）上支援；未提供服務的網路 `ws: false` 並回傳 HTTP 404 | 透過免 key 公共 RPC 或認證 JSON-RPC 使用 [GET /v1/chains](https://api.blockvectra.com/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](https://api.blockvectra.com/v1/chains) 中網路的 `max_logs_block_range`切分批次                     |
| **計費模式**  | 按群組的每日地址費，依 UTC 日線上期間的最大地址數計算，另加已送達資料事件的 CU；見 [Webhook 計費](https://docs.blockvectra.com/zh-hant/guides/webhook-push/#billing-and-example) | 握手與心跳不計費；`eth_subscribe` / `eth_unsubscribe` 與已排出的 socket 通知單位按 CU 計費                           | 按請求以計算單位計量：`eth_blockNumber`、`eth_call`、`eth_getLogs`；方法權重與每 $1 的 CU 來自 [GET /v1/plans](https://console-api.blockvectra.com/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](https://docs.blockvectra.com/zh-hant/guides/webhook-push/)：

* **大量地址清單**：監控數千個客戶地址的充值或提領，無需為每個錢包維護持久 socket。
* **無伺服器或容器化接收端**：無伺服器函式（AWS Lambda、Cloudflare Workers）會在收到 Webhook 時啟動，不需要讓連線持續保持。
* **自動重試與重放**：短暫的接收端中斷可透過自動重試退避緩解。在伺服器保留視窗內，遺漏的送達可用 replay 端點重新送達。
* **啟用邊界注意事項**：只有在訂閱變更套用後（`applied_from_block`）才會開始比對。地址新增前或訂閱處於 `offline` 期間發生的事件，必須透過歷史 RPC 日誌查詢。

在暴露正式環境的 Webhook 接收端之前，請先檢閱[簽章驗證與重放工作流](https://docs.blockvectra.com/zh-hant/guides/webhook-push/#verify-signatures)。

## 何時選擇 WebSocket 訂閱

當需要低延遲，且你的程序能維持長時間的對外 socket 時，請選擇 [WebSocket 訂閱](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)：

* **即時區塊標頭**：在每個區塊附加到鏈頭時串流 `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`](https://docs.blockvectra.com/en/errors/#unknown_chain)）。
* **斷線紀律**：WebSocket 通知不會在伺服器端跨斷線保留。當 socket 中斷時，用戶端必須以隨機化指數退避重新連線，並透過 `eth_getLogs` 回填遺漏的區塊。

關於篩選限制、連線上限（每把 key 20 個、每個帳戶 50 個）與 viem 連線範例，請檢閱 [WebSocket 訂閱指南](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)。

## 何時選擇有界 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](https://api.blockvectra.com/v1/chains) 中網路的 `max_logs_block_range`限制。超過此限制會回傳錯誤碼 `-32602`（[`logs_range_too_large`](https://docs.blockvectra.com/en/errors/#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 日誌回填指南](https://docs.blockvectra.com/zh-hant/guides/hyperevm-backfill/) 與 [eth\_getLogs 區塊範圍指南](https://docs.blockvectra.com/zh-hant/guides/getlogs-block-range/)。

如需完整的工作負載檢查清單與自我測試，請從[如何選擇 RPC 供應商](https://docs.blockvectra.com/zh-hant/guides/choose-rpc-provider/)開始。

為低流量輪詢選擇供應商時，請[比較標準 RPC 計費與涵蓋範圍的供應商](https://docs.blockvectra.com/en/guides/quicknode-alternative/)。比較用量計費與試用及訂閱成本；通知與回填成本使用與 RPC 讀取不同的計量單位。

## 實作指南

### 在 Robinhood Chain 上使用 WebSocket

若要在 Robinhood Chain 上取得即時 `newHeads` 或篩選後的 `logs`，請依照 [WebSocket 訂閱指南](https://docs.blockvectra.com/en/guides/websocket-subscriptions/) 進行認證與訂閱請求。斷線後，以退避重新連線、重新訂閱，並用 `eth_getLogs` 從儲存的游標回填遺漏的區塊；按 `(blockHash, transactionHash, logIndex)` 去重日誌。

### 在 HyperEVM 上使用有界輪詢

若使用 HyperEVM（`hyperevm_mainnet`），請依照 [HyperEVM 日誌回填指南](https://docs.blockvectra.com/zh-hant/guides/hyperevm-backfill/) 進行有界輪詢與復原。從儲存的游標出發，在 `max_logs_block_range` 內分批查詢；成功處理後將事件與進度一起持久化，並重試未完成的範圍。檢查鏈結連續性並掃描重疊範圍以處理重組。

## 下一步

* [瀏覽資料集目錄](https://blockvectra.com/en/data/)，查看 BlockVectra 索引的全部資料集。
* [查看免費方案與定價](https://blockvectra.com/en/pricing/#free)，確認你的帳戶包含哪些內容。
* [登入控制台](https://console.blockvectra.com/login/?next=%2Fkeys%2F)以建立 API key。
