---
# System prepended metadata

title: 'JIP-2: Node RPC'
tags: [on-going, Network, JIP]

---

# JIP-2: Node RPC 筆記整理

JAM Node 提供 JSON-RPC 接口，供外部工具（如清錢包、block explorer、service 測試套件）查詢鏈上狀態或提交資料。JIP-2 定義了這些 RPC 的型別、命名與行為。

## 🧠 JAM RPC 是什麼？與 Light Client 有什麼關係？

### 📡 RPC 的角色

RPC（Remote Procedure Call）是外部工具與 JAM 節點（Full Node）溝通的橋樑，使用 JSON-RPC 協定，常見用途包括：

- 查詢區塊、狀態、service 的值
- 提交 work package 或 preimage
- 訂閱 finalized block 更新

---

### 👥 誰跟誰溝通？

- **Client（例如錢包、前端工具）** → 發送 RPC 請求  
- **Full Node** → 接收請求並回傳資料

```text
[Wallet or dApp] → JSON-RPC → [Full Node] → 回傳區塊 / 狀態
```

### 🔍 Full Node vs Light Client 簡易比較

| 類型         | 是否驗證資料 | 是否同步整條鏈 | 啟動速度 | 適合用途         |
|--------------|---------------|----------------|-----------|------------------|
| Full Node    | ✅ 是          | ✅ 是           | ❌ 較慢    | 節點、驗證者、基礎設施 |
| Light Client | ✅ 是（用 proof）| ❌ 否         | ✅ 快速    | 錢包、前端工具       |

> 例如：Cardano 的 Daedalus（Full Node） vs Yoroi（Light Client）


---

## 📌 為什麼需要 RPC？

- JAM 尚未有 light client 實作
- 全節點資源消耗高，不適合內嵌在前端工具中
- 工具暫時只能透過可信任的 full node 提供資訊
- 一旦有 light client，應逐步棄用 RPC（去中心化原則）

---

## 📡 JIP-2 Node RPC methods

## 🧭 協議說明

- 通訊協定：`JSON-RPC`
- 傳輸協定：`WebSocket`
- 端口：預設為 `19800`
- 方法參數格式：array-style（`params: []`）
- 支援訂閱（subscribe）與資料提交（submit）

---

### 📦 類型定義（Types）

所有參數、回傳值與通知訊息皆透過 **JSON 陣列** 傳遞，部分結果允許為 `null`（會特別標示）。

| 類型        | 說明 |
|-------------|------|
| `Hash`      | array size 32，數字介於 0–255（byte） |
| `Slot`      | 單一整數值，範圍為 `0` 到 `2³² - 1`（slot 編號） |
| `Blob`      | 任意長度的 byte array，每個元素 0–255（原始資料 blob） |
| `ServiceId` | 單一整數值，範圍為 `0` 到 `2³² - 1`（服務 ID） |
| `Parameters`| 目前運作的 Serice 參數設定 |

---
### 🔔 訂閱與通知（subscribe）

- 所有 `subscribeXXX` 類型的 RPC 都可搭配 `unsubscribeXXX` 終止
- 採用標準 JSON-RPC 訂閱方式（細節略）

## 🧾 鏈狀態與參數相關RPC

### `parameters`
- 📌 回傳鏈的設定參數
- Type: `Method`
- Args: 無
- Result: `Parameters` 物件（含 epoch 長度、驗證者數量等）

---

### `bestBlock`
- 📌 查詢當前「最佳鏈頭」的區塊
- Type: `Method`
- Result:
  - `Hash`: header hash
  - `Slot`: slot 編號

---

### `subscribeBestBlock`
- 📌 訂閱 bestBlock 更新
- Type: `Subscription`
- 回傳內容：
  - `Hash`: 最新 header hash
  - `Slot`: slot

---

### `finalizedBlock`
- 📌 查詢當前 finalized 區塊
- Type: `Method`
- Result:
  - `Hash`, `Slot`

---

### `subscribeFinalizedBlock`
- 📌 訂閱 finalized block 更新
- Type: `Subscription`

---

### `statistics`
- 📌 查詢鏈上統計數據（如出塊速率）
- Type: `Method`
- Result: 統計欄位（依實作）

---

### `subscribeStatistics`
- 📌 訂閱統計數據更新
- Type: `Subscription`

---

## 🧠 區塊相關RPC

### `parent`
- 📌 查某個區塊的 parent hash
- Type: `Method`
- Args: `Hash`
- Result: `Hash`（parent）

---

### `stateRoot`
- 📌 查某區塊的 posterior state root
- Type: `Method`
- Args: `Hash`
- Result: `Hash`

---

## 🧬 Service 資料查詢RPC

### `serviceData`
- 📌 查某 slot 中 service 的資料 blob
- Type: `Method`
- Args: `Slot`, `ServiceId`
- Result: `Blob`

---

### `serviceValue`
- 📌 查某 slot 中 service 某個 key 的值
- Type: `Method`
- Args: `Slot`, `ServiceId`, `Key`
- Result: `Blob`

---

### `servicePreimage`
- 📌 查某 preimage 的值
- Type: `Method`
- Args: `Hash`
- Result: `Blob`

---

### `serviceRequest`
- 📌 查某 preimage request 的資訊
- Type: `Method`
- Args: `Hash`
- Result: 詳細結構（message、service ID 等）

---

## 📬 交易資料提交類RPC

### `submitWorkPackage`
- 📌 提交一個包含 messages 的工作包（類似交易）
- Type: `Method`
- Args: `Blob`（encoded work package）

---

### `submitPreimage`
- 📌 提交一個 preimage blob
- Type: `Method`
- Args: `Blob`（preimage content）

---

## 🏷 Service 管理RPC

### `listServices`
- 📌 回傳目前可見的 service ID 清單
- Type: `Method`
- Result: `ServiceId[]`

---


## 🧮 Chain Parameters（`Parameters` Object）

`Parameters` 是描述 JAM Chain 的運作參數（非一定與 Gray Paper 完全一致），所有欄位皆為數值型別，供節點與 light client 使用。

---

### 📦 Fields 一覽

| 欄位名稱                  | 說明 |
|---------------------------|------|
| `deposit_per_account`     | 每個帳戶需要支付的基本押金（𝐵𝑆） |
| `deposit_per_item`        | 每個帳戶中每筆 preimage 或 storage 的額外押金（𝐵𝐼） |
| `deposit_per_byte`        | 每 byte 資料所需額外押金（包含 preimage / storage）（𝐵𝐿） |
| `min_turnaround_period`   | 從 Available → Zombie → 消失的最短時間間隔（𝐷） |
| `epoch_period`            | 每個 epoch 包含的 slot 數量（𝐸） |
| `max_accumulate_gas`      | 單次 Accumulate 可用的最大 gas（𝐺𝐴） |
| `max_is_authorized_gas`   | 單次 IsAuthorized 可用的最大 gas（𝐺𝐼） |
| `max_refine_gas`          | 單次 Refine 可用的最大 gas（𝐺𝑅） |
| `block_gas_limit`         | 每個區塊的最大 gas 限制（𝐺𝑇） |
| `recent_block_count`      | recent block cache 保留的區塊數（𝐻） |
| `max_work_items`          | 每個 Work Package 中最多的 Work Item 數（𝐼） |
| `max_dependencies`        | 最多的 dependency 數（𝐽） |
| `max_tickets_per_block`   | 每區塊允許的最大票據數量（𝐾） |
| `max_lookup_anchor_age`   | lookup anchor 可接受的最舊區塊年齡（𝐿） |
| `tickets_attempts_number` | 每位驗證者每個 epoch 可嘗試的票據數（𝑁） |
| `auth_window`             | 授權視窗的長度（𝑂） |
| `auth_queue_len`          | 每個 core 分配到的授權佇列長度（𝑄） |
| `rotation_period`         | Key rotation 的 slot 週期（𝑅） |
| `max_extrinsics`          | 每個 Work Package 中最多的 extrinsics 數（𝑇） |
| `availability_timeout`    | 可取代失效工作的最長等待時間（𝑈） |
| `val_count`               | 總驗證者數量（𝑉） |
| `max_input`               | Work Package + extrinsics + imported segments 的最大資料量（𝑊𝐵） |
| `max_refine_code_size`    | Refine/Accumulate 程式碼最大長度（𝑊𝐶） |
| `basic_piece_len`         | 每個 erasure-coded piece 的 byte 數（𝑊𝐸） |
| `max_imports`             | 每個 Work Package 中的最大 imports 數（𝑊𝑀） |

---

### 🔍 其他參數（Graypaper 未完全定義，但客戶端可用）

| 欄位名稱                        | 說明 |
|---------------------------------|------|
| `max_is_authorized_code_size`   | IsAuthorized 程式碼最大長度（𝑊𝐼） |
| `max_exports`                   | Work Package 中的最大 exports 數（𝑊𝑋） |
| `max_refine_memory`             | Refine/Accumulate 可使用的最大記憶體 |
| `max_is_authorized_memory`      | IsAuthorized 可使用的最大記憶體 |

---

### 🧠 固定邏輯與推導參數

- `C = V / 3`：每個 core 分配 3 位驗證者  
- `WG = 4,104`：每個重建 segment 的固定大小  
- `WP = WG / WE`：每個 segment 中的 erasure-coded pieces 數量（WP）

---