# Robinhood Chain 整合指南：RPC 用戶端、部署與事件

> Source: https://docs.blockvectra.com/zh-hant/guides/robinhood-chain/

使用 Robinhood Chain RPC 進行公開連線檢查與認證讀取，或使用 Data API 查詢受支援的主網資料集。開發者與 AI Agent 使用相同的端點；請將主網與測試網請求分開。

## 這篇指南協助你完成的任務

* [探測 Robinhood Chain RPC](#connect-with-viem-or-ethers)：使用 viem 或 ethers 進行公開讀取，然後使用 key 呼叫認證方法。
* [檢查測試網 RPC 連線](#testnet)：在執行測試網操作前先讀取 `eth_chainId`。
* [查詢代幣化股票活動](#tokenized-stock-data)：在確認資料集支援後使用主網 Data API；這些指標描述鏈上活動，而非股票價格。

## RPC 與 WebSocket 存取

* **公開 RPC URL**：在 [Robinhood Chain 主網頁面](https://blockvectra.com/en/chains/robinhood_mainnet/)或[測試網頁面](https://blockvectra.com/en/chains/robinhood_testnet/)尋找免 key 端點、支援的公開方法與速率限制。
* **使用 API key 的 JSON-RPC**：使用下方的端點與 curl 範例。有關日誌，請參閱 [eth\_getLogs 方法參考](https://docs.blockvectra.com/en/api/json-rpc/methods/eth_getLogs/)與[區塊範圍限制指南](https://docs.blockvectra.com/en/guides/getlogs-block-range/)。
* **使用 API key 的 WebSocket**：使用下方的 WebSocket 端點，並參考 [WebSocket 訂閱指南](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)以取得 `newHeads` 與 `logs`。公開 RPC 存取採用 HTTP JSON-RPC；WebSocket 連線需要 key。

## 網路資訊與端點

向 Robinhood Chain 發送的每個請求均在 URL 路徑中使用識別代號 `robinhood_mainnet` 明確指定其目標網路。JSON-RPC 支援基於路徑的 key 驗證與請求標頭驗證（`x-api-key`），而 Data API 則在 `/v1/data/robinhood_mainnet/` 下提供 REST 端點。

下方的參數與端點反映目前生效的網路參數：

| 參數 / 端點 | 取值 / 範本 | 驗證方式 |
|---|---|---|
| Chain ID（EIP-155） | `4663` | — |
| JSON-RPC（路徑攜帶 Key） | `POST https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}` | URL 路徑中傳入 API key |
| JSON-RPC（請求標頭攜帶 Key） | `POST https://api.blockvectra.com/v1/robinhood_mainnet` | 傳入 x-api-key: {api_key} 請求標頭 |
| WebSocket（路徑攜帶 Key） | `wss://api.blockvectra.com/v1/robinhood_mainnet/{api_key}` | URL 路徑中傳入 API key |
| WebSocket（請求標頭攜帶 Key） | `wss://api.blockvectra.com/v1/robinhood_mainnet` | 傳入 x-api-key: {api_key} 或 Authorization: Bearer {api_key} 請求標頭 |
| WebSocket 訂閱類型 | `newHeads, logs` | — |
| Data API 基址 | `GET https://api.blockvectra.com/v1/data/robinhood_mainnet/…` | 傳入 x-api-key: {api_key} 請求標頭 |
| 公開狀態端點 | `GET https://api.blockvectra.com/v1/status` | 無需驗證（公開） |

## 使用 viem 或 ethers 連線

開發者與 AI Agent 可以使用相同的伺服器端設定。使用 Node.js 24 或更高版本、viem 2 或 ethers 6，並從公開讀取開始。在環境中安全設定 `BLOCKVECTRA_API_KEY` 以用於帶 key 的方法與 WebSocket。切勿將 key 以及包含 key 的 RPC URL 放入瀏覽器程式碼、日誌或版本控制中。

將此儲存為 `network.mjs`。先從測試網開始；設定 `BLOCKVECTRA_CHAIN=robinhood_mainnet` 以切換到主網。它從 [GET /v1/chains](https://api.blockvectra.com/v1/chains) 讀取 `chain_id` 與方法策略。對於免 key 讀取，使用目錄中的 `public.url`，且僅使用 `public.methods` 中列出的方法；公開 HTTP 可用性並不意味著支援 WebSocket 存取。

```js
const chainSlug = process.env.BLOCKVECTRA_CHAIN ?? 'robinhood_testnet';
const key = process.env.BLOCKVECTRA_API_KEY;
const catalogUrl = 'https://api.blockvectra.com/v1/chains';
const response = await fetch(catalogUrl, { signal: AbortSignal.timeout(15_000) });
if (!response.ok) throw new Error(`Chains HTTP ${response.status}`);
const catalog = await response.json();
export const chainInfo = catalog.chains.find(item => item.chain === chainSlug);
if (!chainInfo || !Number.isSafeInteger(chainInfo.chain_id) || chainInfo.chain_id <= 0) {
  throw new Error('Missing chain or chain_id');
}
export function allows(method) {
  const matches = pattern => pattern.endsWith('*')
    ? method.startsWith(pattern.slice(0, -1)) : pattern === method;
  if (!key) return (chainInfo.public?.methods ?? []).some(matches);
  return (chainInfo.methods?.allow ?? []).some(matches)
    && !(chainInfo.methods?.deny ?? []).some(matches);
}
if (!allows('eth_chainId')) throw new Error('eth_chainId is unavailable');
export const rpcUrl = key
  ? new URL(`./${chainSlug}/${encodeURIComponent(key)}`, catalogUrl).href
  : chainInfo.public?.url;
if (!rpcUrl) throw new Error('Public RPC is unavailable; set BLOCKVECTRA_API_KEY');
```

儲存為 `viem-client.mjs`，使用 `npm install viem@2` 安裝，然後執行 `node viem-client.mjs`。

```js
import { createPublicClient, defineChain, http } from 'viem';
import { chainInfo, rpcUrl } from './network.mjs';

export const chain = defineChain({
  id: chainInfo.chain_id,
  name: chainInfo.name,
  nativeCurrency: { name: 'ETH', symbol: 'ETH', decimals: 18 },
  rpcUrls: { default: { http: [rpcUrl] } },
});
export const client = createPublicClient({ chain, transport: http(rpcUrl) });
if (await client.getChainId() !== chain.id) throw new Error('RPC chain ID mismatch');
console.log(await client.getBlockNumber());
```

對於 ethers，儲存為 `ethers-client.mjs`，使用 `npm install ethers@6` 安裝，然後執行 `node ethers-client.mjs`。

```js
import { JsonRpcProvider } from 'ethers';
import { chainInfo, rpcUrl } from './network.mjs';

const provider = new JsonRpcProvider(rpcUrl, chainInfo.chain_id, { batchMaxCount: 1 });
const network = await provider.getNetwork();
if (network.chainId !== BigInt(chainInfo.chain_id)) throw new Error('RPC chain ID mismatch');
console.log(await provider.getBlockNumber());
provider.destroy();
```

## 使用 Foundry 或 Hardhat 部署

先透過[測試網水龍頭](https://docs.blockvectra.com/en/guides/robinhood-testnet-faucet/)為部署者提供測試 ETH；主網交易需要主網 ETH。[官方網路與部署指南](https://docs.robinhood.com/chain/deploy-smart-contracts/)列出了主網與測試網的 chain ID（存取日期：2026-10-07）。本頁面上的端點表使用 `/v1/chains`。

從 `network.mjs` 匯出所選的 URL 與 chain ID。在廣播之前，請對照 `methods.allow` 與 `methods.deny` 檢查 `eth_sendRawTransaction`。

```bash
export RPC_URL="$(node --input-type=module -e "import { rpcUrl, allows } from './network.mjs'; if (!allows('eth_sendRawTransaction')) throw new Error('Broadcast unavailable'); console.log(rpcUrl)")"
export CHAIN_ID="$(node --input-type=module -e "import { chainInfo } from './network.mjs'; console.log(chainInfo.chain_id)")"
```

接著參考共用的 [Foundry 或 Hardhat 部署教學](https://docs.blockvectra.com/en/guides/deploy-contract/)以了解 `Hello.sol`、工具設定、廣播與收據檢查。

## 透過 WebSocket 監聽合約事件

儲存為 `watch-logs.mjs` 並將 `LOG_ADDRESS` 設定為你關注的已部署合約或代幣合約。執行 `node watch-logs.mjs`。在訂閱 `logs` 之前，程式碼會檢查來自 `/v1/chains` 的 `ws` 與 `subscriptions`。

```js
import { createPublicClient, webSocket, isAddress } from 'viem';
import { chain } from './viem-client.mjs';
import { chainInfo, rpcUrl } from './network.mjs';

if (!process.env.BLOCKVECTRA_API_KEY) throw new Error('WebSocket requires BLOCKVECTRA_API_KEY');
const address = process.env.LOG_ADDRESS;
if (!chainInfo.ws || !chainInfo.subscriptions?.includes('logs')) {
  throw new Error('WebSocket logs are unavailable; use HTTP backfill or webhook push');
}
if (!address || !isAddress(address)) throw new Error('Set LOG_ADDRESS');
const wsUrl = new URL(rpcUrl);
wsUrl.protocol = 'wss:';
const client = createPublicClient({ chain, transport: webSocket(wsUrl.href) });
const unwatch = client.watchEvent({
  address, poll: false,
  onLogs: logs => console.log(logs),
  onError: error => console.error(error),
});
process.once('SIGINT', () => { unwatch(); process.exit(0); });
```

監聽器啟動後，使用相同的已匯出部署變數從另一個終端機發送 `ping()` 交易：

```bash
cast send "$CONTRACT_ADDRESS" "ping()" --rpc-url "$RPC_URL" \
  --private-key "$DEPLOYER_PRIVATE_KEY"
```

持久化最後處理的區塊並依 `(blockHash, transactionHash, logIndex)` 去重。重新連線後，使用有界 `eth_getLogs` 請求回填錯過的區塊；在發生重組時對標記為 `removed` 的日誌進行對帳。請參閱 [WebSocket 訂閱](https://docs.blockvectra.com/en/guides/websocket-subscriptions/)與[區塊範圍限制](https://docs.blockvectra.com/en/guides/getlogs-block-range/)。

對於發送到你的 HTTPS 接收端的地址事件，**GET /v1/push/chains 列出了支援的鏈**與確認數設定；請使用 `x-api-key` 標頭。請遵循 [Webhook 推送指南](https://docs.blockvectra.com/en/guides/webhook-push/)進行訂閱、簽章驗證、去重與重放。對於主網股票代幣活動查詢，請繼續參閱[股票指南](https://docs.blockvectra.com/en/guides/stocks/)。

## 直接 curl 範例

你可以立即使用標準 HTTP 用戶端發起 JSON-RPC 呼叫。將 `{api_key}` 替換為你的 BlockVectra API key：

**eth_chainId (標頭)**

使用 `x-api-key` 請求標頭查詢 EIP-155 chain ID：

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H "Content-Type: application/json" \
  -H "x-api-key: {api_key}" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
```


  **eth_blockNumber (路徑)**

透過在 URL 路徑中傳入 API key 來查詢最新區塊編號：

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
```


### 回應結構說明

回應遵循 JSON-RPC 2.0 規範：

* **成功**：回傳包含 `jsonrpc: "2.0"`、相同 `id` 以及十六進位編碼數量之 `result` 字串的回應結構（`eth_chainId` 回傳十六進位編碼的 chain ID；`eth_blockNumber` 回傳最新區塊高度）。
* **不允許的方法**：請求網路允許方法之外的方法會回傳 JSON-RPC 錯誤碼 `-32601`（`method not available`，不計費）。
* **超出保留範圍的查詢**：早於狀態保留範圍的歷史狀態請求會回傳 JSON-RPC 錯誤碼 `-32011`（不計費）。
* **無效參數**：格式錯誤或不允許的請求參數會回傳 JSON-RPC 錯誤碼 `-32602`（不計費）。

## 功能與方法策略

Robinhood Chain 上可用的 JSON-RPC 方法、日誌區塊範圍限制以及歷史狀態保留時間透過 `GET /v1/chains` 動態發布。執行追蹤（`debug_trace*`，包括 `debug_traceTransaction`）受該鏈的方法策略規範：

### 網路參數與呼叫限制

- **eth_getLogs 單次區塊跨度**: 單次最多 1000 個區塊
- **歷史狀態視窗**: 最近 900 個區塊（超出視窗回傳 -32011）
- **執行追蹤（debug_trace*）**: 已支援（含 debug_traceTransaction、debug_traceCall、debug_traceBlockByNumber、debug_traceBlockByHash）

各鏈允許的方法見 [支援的鏈](https://docs.blockvectra.com/zh/chains/)

## 測試網

若要取得用於交易的測試 ETH，請參閱 [Robinhood Chain 測試網水龍頭指南](https://docs.blockvectra.com/en/guides/robinhood-testnet-faucet/)。

Robinhood Chain 測試網（chain ID: 46630）在端點 `https://api.blockvectra.com/v1/robinhood_testnet` 上使用與主網相同的 API key，透過 `x-api-key` 請求標頭進行驗證。

測試網請求使用與主網相同的 CU 權重，並從相同的餘額與免費額度中扣除。Robinhood Chain 測試網上可用的 JSON-RPC 方法與歷史狀態保留時間透過 `GET /v1/chains` 動態發布。

有關無需 key 即可讀取測試網、透過 WebSocket 串流日誌然後將相同 key 切換至主網的可執行三步驟入門指南，請參閱 [Robinhood Chain 測試網入門指南](https://docs.blockvectra.com/en/guides/robinhood-testnet-starter/)。

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_testnet" \
  -H "Content-Type: application/json" \
  -H "x-api-key: {api_key}" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
```

預期回應：

```json
{"jsonrpc":"2.0","id":1,"result":"0xb626"}
```

| 參數 / 端點 | 取值 / 範本 | 驗證方式 |
|---|---|---|
| Chain ID（EIP-155） | `46630` | — |
| JSON-RPC（路徑攜帶 Key） | `POST https://api.blockvectra.com/v1/robinhood_testnet/{api_key}` | URL 路徑中傳入 API key |
| JSON-RPC（請求標頭攜帶 Key） | `POST https://api.blockvectra.com/v1/robinhood_testnet` | 傳入 x-api-key: {api_key} 請求標頭 |
| WebSocket（路徑攜帶 Key） | `wss://api.blockvectra.com/v1/robinhood_testnet/{api_key}` | URL 路徑中傳入 API key |
| WebSocket（請求標頭攜帶 Key） | `wss://api.blockvectra.com/v1/robinhood_testnet` | 傳入 x-api-key: {api_key} 或 Authorization: Bearer {api_key} 請求標頭 |
| WebSocket 訂閱類型 | `newHeads, logs` | — |
| Data API 基址 | `暫未開放` | — |
| 公開狀態端點 | `GET https://api.blockvectra.com/v1/status` | 無需驗證（公開） |

### 網路參數與呼叫限制

- **eth_getLogs 單次區塊跨度**: 單次最多 1000 個區塊
- **歷史狀態視窗**: 最近 1023 個區塊（超出視窗回傳 -32011）
- **執行追蹤（debug_trace*）**: 已支援（含 debug_traceTransaction、debug_traceCall、debug_traceBlockByNumber、debug_traceBlockByHash）

各鏈允許的方法見 [支援的鏈](https://docs.blockvectra.com/zh/chains/)

## 代幣化股票資料

在 Robinhood Chain 上，BlockVectra Data API 透過兩個端點提供代幣化股票的每日鏈上指標與中繼資料：

* **每日排行榜（`GET /v1/data/robinhood_mainnet/stocks`）**：指定 UTC 日期的代幣化股票每日活動排行榜，按轉帳活躍度降序排列。
* **取得單一代幣化股票（`GET /v1/data/robinhood_mainnet/stocks/{token}`）**：按代幣地址查詢代幣合約中繼資料以及最多 30 天的近期每日指標。

有關詳細的請求參數、回應結構（`StockDailyListEnvelope` 與 `StockTokenEnvelope`）、分頁說明與 CU 消耗估算，請參閱[代幣化股票指南](https://docs.blockvectra.com/en/guides/stocks/)。

完整入門範本：[blockvectra/robinhood-stock-tokens](https://github.com/blockvectra/robinhood-stock-tokens)

## 開始使用與 API Key

新帳戶註冊即得 30,000,000 CU，無需信用卡。

你可以先嘗試免 key 的公開端點 `https://api.blockvectra.com/v1/robinhood_mainnet/public`（僅限錢包 JSON-RPC 方法，Data API 需要 key；方法與限制以 `/v1/chains` 為準）；如果需要更高的速率限制，請註冊帳戶。

* **Web 控制台**：透過以太坊錢包簽名註冊，並在[控制台](https://console.blockvectra.com/login/?next=%2Fkeys%2F)中產生 API key。設定詳情請參閱[快速上手指南](https://docs.blockvectra.com/en/quickstart/)。
* **程式化註冊**：自主 AI Agent、自動化指令碼與 CI 管線可使用以太坊錢包簽名（EIP-191）免瀏覽器登入並佈建 API key。請參考[程式化註冊指南](https://docs.blockvectra.com/en/guides/programmatic-signup/)。
* **AI Agent**：自主 AI Agent 可使用官方 Model Context Protocol (MCP) 伺服器探索 Robinhood Chain 功能。請參閱[將 AI Agent 連線至 BlockVectra](https://docs.blockvectra.com/en/guides/ai-agents/)。
* **升級限制**：儲值後，帳戶整體的每秒呼叫次數限制將被移除；每個 key 仍受計算單位（CU）速率與突發限制約束。有關目前的費率與計費單位，請參閱[定價頁面](https://blockvectra.com/en/pricing/)。

## 下一步

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