# 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 章