# IV. Overview
## 定義
區塊鏈由 **初始狀態** \( $σ_{0}$ \) 和 **區塊級狀態轉換函數** \( $Υ$ \) 組成。
## 公式表示
$$
σ' ≡ \Upsilon(σ, B)
$$
- \( σ \):Prior State
- \( σ' \):Posterior State
- \( B \):有效區塊
- \( Υ \):STF 狀態轉換函數
## 核心元素
透過 Υ(STF function) 和 $σ_0$(initial state),即可定義區塊鏈。
# 4.1. The Block
### The following comes from Extrinsic.
區塊 **B** 可以被 restated 為 header **H** 與系統外部的一些輸入數據稱為 extrinsic, 𝐸
$$
B ≡ (H, E)
$$
Extrinsic 是來自鏈外、將被驗證並納入鏈上狀態的資料輸入(外部互動的操作描述與資料包),包含了許多不同的部分,每一部分都像是會議中的一個活動。外部資料 = Extrinsic,經過共識與統整後變成 Header。
$$
E ≡ (E_T, E_D, E_P, E_A, E_G)
$$
- **Tickets** (**E~T~**) 就像是出席票,管理者能夠參與發言或提出建議。
- **Disputes** (**E~D~**) 就像是會議中的投票或表決,用於解決參與者之間的爭議。
- **Preimages** (**E~P~**) 就像是會議中提前準備的資料,當需要時可以取用和參考。
- **Availability** (**E~A~**) 像是參與者的保證書,表明他們已經準備好並擁有所有所需的資料。
- **Reports** (**E~G~**) 是完成的工作或決策的報告,由參與者提交驗證其準確性。
:::info
### 優先順序:
Tickets, Reports > Availability > Preimage > Judgement(Disputes)
- according to the baby steps to M1
:::
# 4.2. The State
$(4.4)\ \ \sigma \equiv (\alpha, \beta, \gamma, \delta, \eta, \iota, \kappa, \lambda, \rho, \tau, \varphi, \chi, \psi, \pi, \vartheta, \xi)$
- $\sigma$ : 完整狀態 (complete state)
- $\delta$ : 與服務 (services) 相關的狀態
- 類似於 $YP$ 中的 $accounts$
- $\chi$ : 擁有特權的服務身份
- $\kappa$ : 目前的驗證者們 (validators) 「擁有出塊與報告權的活躍驗證者集合」
- $\lambda$ : 歷史上參與過的 validators
- $\iota$ : 等待進入隊列的驗證者們
- $\gamma$ : 管理 validator 機制的中繼器
- 根據時間 $\tau$、ticket $\mathbf{E}_T$、validator 狀態變動等更新
- 負責驗證者選舉、timeslot 排程邏輯
- $\eta$ : 鏈上 (on-chain) 熵池 (entropy pool) → 隨機數池
- $\alpha$ : 在核心上完成工作必須達到的授權標準
- $\varphi$ : 存放滿足 $\alpha$ 、準備報告 (report) 的工作
- $\rho$ : 當前每個核心生成的報告 (report)
- 工作包 (work-package) 必須經過絕大多數的驗證者確認
- $\beta$ : 最新的區塊詳細資訊
- $\tau$ : 最新的區塊時間區段索引 (timeslot index)
- $\vartheta$ : 準備累積 (accumulate) 的報告 (work-report)
- $\xi$ : 最近累積 (accumulate) 的工作包 (work-package)
- $\psi$ : 判決資訊
- $\pi$ : 驗證者的統計訊息 (statistics)
### State Transition Dependency Graph
$(4.5)\ \ \ \ \tau' \prec \mathbf{H}$
$(4.6)\ \ \ \ \beta^\dagger \prec (\mathbf{H}, \beta)$
$(4.7)\ \ \ \ \gamma' \prec (\mathbf{H}, \tau, \mathbf{E}_T, \gamma, \iota, \eta', \kappa', \psi')$
$(4.8)\ \ \ \ \eta' \prec (\mathbf{H}, \tau, \eta)$
$(4.9)\ \ \ \ \kappa' \prec (\mathbf{H}, \tau, \kappa, \gamma)$
$(4.10)\ \ \lambda' \prec (\mathbf{H}, \tau, \lambda, \kappa)$
$(4.11)\ \ \psi' \prec (\mathbf{E}_D, \psi)$
$(4.12)\ \ \rho^\dagger \prec (\mathbf{E}_D, \rho)$
$(4.13)\ \ \rho^\ddagger \prec (\mathbf{E}_A, \rho^\dagger)$
$(4.14)\ \ \rho' \prec (\mathbf{E}_G, \rho^\ddagger, \kappa, \tau')$
$(4.15)\ \ \mathbf{W}^* \prec (\mathbf{E}_A, \rho')$
$(4.16)\ \ (\vartheta', \xi', \delta^\ddagger, \chi', \iota', \varphi', \mathbf{C}) \prec (\mathbf{W}^*, \vartheta, \xi, \delta, \chi, \iota, \varphi, \tau, \tau')$
$(4.17)\ \ \beta' \prec (\mathbf{H}, \mathbf{E}_G, \beta^\dagger, \mathbf{C})$
$(4.18)\ \ \delta' \prec (\mathbf{E}_P, \delta^\ddagger, \tau')$
$(4.19)\ \ \alpha' \prec (\mathbf{H}, \mathbf{E}_G, \varphi', \alpha)$
$(4.20)\ \ \pi' \prec (\mathbf{E}_G, \mathbf{E}_P, \mathbf{E}_A, \mathbf{E}_T, \tau, \kappa', \pi, \mathbf{H})$
帶有 $\dagger$ (dagger) 符號代表同步耦合 (synchronous entanglements),即無法平行處理,必須按照順序來。後兩個 (4.19), (4.20) 代表合併 (merge) 和連接 (join) 關鍵,代表外部可用性 (extrinsic availability) 已經被充分處理 (processed) 並且在 preimage 查找之前 accumulation 已經發生。
# 4.3. Which History?
區塊鏈是一個區塊序列,每個加密引用前個區塊的區塊頭 hash。
- 第一個區塊頭 $\mathbf{H}_{0}$
- 初始狀態 $\sigma_{0}$
透過一個決定性函數 (deterministic function) 對前置狀態 (prior state) 與區塊組合,導出後置狀態 (posterior state)。該區塊具有最具權威 (canonical) 狀態 ⇒ 擁有最多祖先 (ancestors) 頭區塊 (head) 與其頭狀態 (head state)。
若是有兩個相同區塊有效 (valid) 並且具有相同的前置區塊 (prior block),稱為分叉 (fork) ⇒ 兩個不同的 head,持有各自的 state。
雖然尚未有完全避免的方法,但目前系統透過兩種共識算法 : **Safrole** 和 **Grandpa**,來盡力確保系統達成以下三點 :
1. 不太可能形成兩個頭區塊 (heads)
2. 當兩個頭區塊形成,會迅速被合併為一個頭區塊
3. 能夠找到一個離目前「最新區塊」不遠的區塊,該區塊是我們非常確定,他會永遠留在區塊鏈歷史中,不會被改寫或回滾的 (即被所有節點同意不再改動的) 區塊稱為 **finalized**。根據這個最終性 (finality) 性質,會一路往回延伸到它的所有祖先區塊 (ancestor blocks),也就是整條鏈的前段歷史被「確定」了
- Safrole 負責區塊鏈 (不一定是無分叉) 的擴張管理
- Safrole 限制區塊分叉,主要透過密碼學、經濟獎勵機制與共同時間認知 (common-time)
- 在特定情況下,可能會進行有意 (intentionally) 的分叉,比如當我們得知某個鏈擴展需要被撤銷時
- Grandpa 將特定擴展最終確定 (finalization) 為規範歷史 (canonical history)
- 任何包含被其他區塊狀態標記為無效數據的區塊擴張,視為非法擴展 (invalid)
- Grandpa 不會將此類區塊的任何擴展納入規範歷史
# 4.4. Time
假設存在一個預先達成共識的時間機制,該機制用於區塊的生成和接收。若是區塊的 timeslot 在未來發生,則該區塊被視為無效 (invalid)。
JAM Common Era 定義為 2025 年 1 月 1 日 12:00 UTC,使用 $\mathcal{T}$ 表示。
# 4.5. Best block
Grandpa 選擇
# 4.6. Econimics
代幣的價值 (value) 通常稱為 balance,屬於 balance 集合 $\mathbb{N}_B$ 的一員。
$(4.21)\ \ \mathbb{N}_B \equiv \mathbb{N}_{2^{64}}$
等價於 $2^{64}$ 自然數集合 ⇒ 64 位元無符號整數
- $10^9$ token ⇒ $JAM$ token 總數不會超過 $18 \times 10^9$
- $B_I$ : mapping 中單個項目隱含的額外最低 balance
- $B_L$ : mapping 中單個八位元組資料所隱含的最低 balance
- $B_S$ : 單個 service 所隱含的最低 balance
# 4.7. The Virtual Machine and Gas
- Polka Virtual Machine (PVM) 採用 RISC-V 處理器架構構建,版本 RV64EM
- 有助於 STF 中的無許可邏輯
- $PVM$ 更多內容在 Appendix A
- 基本調用函數 $\Psi$ 負責計算 $PVM$ 最終狀態
- $PVM$ 實例 (instance) 透過 13 個暫存器 $⟦\ \mathbb{N}_R\ ⟧_{13}$ 和 RAM $\mathbb{M}$ 初始化
- RISC-V 的暫存器是 16 個,但編譯器實際輸出使用的是 13 個,其中兩個提供操作系統使用,第三個固定為 0
- 並在執行時受到最大 gas 量 $\mathbb{N}_G$ 限制
- $\mathbb{N}_G$ 通常與執行的計算步驟所需時間成正比
$(4.22)\ \ \Psi : \left( \begin{array}{cc} \mathbb{Y},\ \mathbb{N}_R,\ \mathbb{N}_G, \\ ⟦ \mathbb{N}_R ⟧_{13},\ \mathbb{M} \end{array} \right) \to \left( \begin{array}{cc} \{∎, ↯, ∞ \}\ \cup\ \{ ╛,ℏ \} \times \mathbb{N}_R \\ \mathbb{N}_R,\ \ \mathbb{Z}_G,\ \ \ \ ⟦ \mathbb{N}_R ⟧_{13},\ \ \ \ \mathbb{M} \end{array} \right)$
- $∎$ : 正常程序終止
- $↯$ : 異常程序終止
- $∞$ : gas 耗盡
- $╛$: page fault,嘗試訪問 RAM 中不可訪問的地址 (包含錯誤頁面地址)
- $ℏ$ : 嘗試進行 host-call,允許在常規 PVM 之外,根據上下文依賴 (context-dependent) 的狀態機進行推進 (progression) 和集成 (integration)
- gas 是一個 64 位數值,通常使用 $\varrho \in \mathbb{N}_G$ 表示 gas
- $\mathbb{N}_G$ 是先驗參數
- $\mathbb{Z}_G$ 作為結果呈現,若結果為負則代表所操作的行為超出預設的 gas 限制
$(4.23)\ \ \mathbb{Z}_G = \mathbb{Z}_{-2^{63}...2^{63}},\ \ \mathbb{N}_G = \mathbb{N}_{2^{64}}, \ \ \mathbb{N}_R = \mathbb{N}_{2^{64}}$
- PVM 具有 13 個暫存器,每個暫存器 $\mathbb{N}_R$ 都是 64 位
- 通常用 $\omega \in ⟦ \mathbb{N}_R ⟧_{13}$ 表示 PVM 中的暫存器
$(4.24)\ \ \mathbb{M} \equiv (\mathbf{V} \in \mathbb{Y}_{2^{32}}, \mathbf{A} \in ⟦ \{ \mathsf{W}, \mathsf{R}, \varnothing \} ⟧_p), p = \frac{2^{32}}{\mathsf{Z}_P}$
- PVM 設計一個分頁式隨機存取存儲器 (RAM),地址為 32 位,能訂位到分布在各個頁面的字節
- $\mathbf{V}$ 是存儲數據的值
- $\mathbf{A}$ 控制訪問的權限
- 若執行索引操作時,未指明訪問則會默認訪問值 $\mathbf{V}$
- 通常使用 $\mu \in \mathbb{M}$ 表示當前 RAM 狀態
$(4.25)\ \ \mathsf{Z}_P = 2^{12}$
頁面的的標準大小為 $\mathsf{Z}_P = 4096$ 字節
$(4.26)\ \ \mathbb{V}_\mu \equiv \{ i\ \vert\ \mu_{\mathbf{A}} [\lfloor i / \mathsf{Z}_P \rfloor ] \ne \varnothing \}$
$\mathbb{V}_\mu$ 是可從中讀取的索引集合
$(4.27)\ \ \mathbb{V}^*_\mu \equiv \{ i\ \vert\ \mu_\mathbf{A} [ \lfloor i / \mathsf{Z}_P \rfloor ] = \mathbf{W} \}$
$\mathbb{V}^*_\mu$ 是可寫入其中的索引集合
# 4.8. Epochs and Slots
JAM 採用一種權威證明共識機制 (proof-of-authority consensus mechanism),被授權的驗證者通過一組公鑰進行身分識別,並且資格由特定質押 (staking) 流程決定。
- 每個周期 (epochs) $\mathsf{E} = 600$ timeslots
- 每個 timeslot $\mathsf{P} = 6$ seconds
- 一個 epoch period $\mathsf{E} \cdot \mathsf{P} = 3600$ seconds (1 hour)
Safrole 採用一個 6 秒的 timeslot 作為 JAM 區塊之間的最小單位。
根據 JAM Common Era 起計算,使用 32 位無符號整數的 6 秒 timeslot 數量 $\mathbb{N}_T$
$(4.28)\ \ \mathbb{N}_T \equiv \mathbb{N}_{2^{32}}$
# 4.9. The Core Model and Services
### In-core Consensus
- 核心共識 (in-core consensus) 並非由網路上的所有節點評估或驗證
- Guaranteeing → Assuring → Auditing → (optional) Judging
- 對計算無效性提供經濟懲罰
- 更多內容在 15, 16, 17 章
### On Services and Accounts
- 在 JAM 中,所有帳戶都是服務帳戶 (service accounts)
- 服務定義中包含多個 code entry-points,一個用於 refine、另一個用於 accumulation
- refine : 無狀態處理器,接收任務輸入數據,並將數據提煉為少量輸出數據
- accumulation : 具有狀態性,能對鏈上功能進行訪問 (e.g., 餘額轉移、調用服務)
- 所有外部數據都會輸入某個 (service) 的 refinement,在鏈下 in-core 環境執行
- JAM 使用 coretime 的概念,預先購買 coretime 並分配給授權代理
- 授權代理更多內容在第 8 章