節點、挖礦與驗證者運維

JSON-RPC 介面

JSON-RPC 是應用程式與節點對話的標準化「服務櫃台」。節點是一支持有鏈與當前狀態的複雜程式,但應用、錢包與網站並不會說它的內部語言——它們以 JSON 格式向節點送出簡短的文字訊息,例如「告訴我這個地址的餘額」或「廣播這筆已簽名的交易」,節點再以 JSON 回覆。RPC 意指遠端程序呼叫:你像呼叫本地函數一樣去呼叫遠端機器上的函數。它是整個 dapp 生態系所插入的通用插座。

具體而言,一個請求是一個 JSON 物件,含有方法名稱、一個 params 陣列與一個 id,節點則回以 result 或 error。以太坊標準化了如 eth_getBalance、eth_call(不送交易即可讀取合約)、eth_sendRawTransaction(廣播已簽名交易)、eth_getLogs(取得事件)與 eth_blockNumber 等方法。讀取既免費又即時,因為只是查詢節點的本地狀態;唯一會改變鏈的操作是送出已簽名交易,節點會將其轉送進記憶池。比特幣核心也提供類似的 JSON-RPC API,方法如 getblock 與 sendrawtransaction。

多數使用者從不自行運行節點,因此他們透過託管的 RPC 端點連到節點——由 Infura、Alchemy、QuickNode 等供應商營運的公開網址,或社群端點。這非常方便,卻引入了一個悄然的信任假設:端點可能回傳過期資料、謊報餘額、或審查你的交易廣播,而沒有防備的用戶端不會察覺。自行運行節點、或交叉比對多個來源,可消除此信任;輕用戶端則試圖以驗證證明、而非全盤相信端點,來彌補這道缺口。

一個實務上的細節,是公開 JSON-RPC(以太坊通常為 8545 連接埠)與經身分驗證的引擎 API(8551 連接埠)之別。引擎 API 是一條獨立、受 JWT 保護的 JSON-RPC 通道,僅在以太坊轉向權益證明後用於執行用戶端與其共識用戶端之間;一般應用使用 8545,而 8551 承載驅動兩用戶端之間區塊生產與分叉選擇的 engine_newPayload 與 engine_forkchoiceUpdated 呼叫。

{ "jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0xAbC...123", "latest"], "id": 1 }
// reply: { "jsonrpc": "2.0", "id": 1, "result": "0x1bc16d674ec80000" }  // 2 ETH in wei (hex)

使用託管 RPC 端點很方便,但意味著要信任該供應商回傳誠實、即時的資料;這是一個實實在在的中心化途徑,正因如此,自行運行節點或驗證證明才如此重要。