--- Extrinsic 先關住在跟 import 區塊(Header), 或是跟 STF 有關的地方 「**Extrinsic**」是用來描述來自區塊鏈外部的數據,通常包括交易(transaction)和其他可能由用戶或節點提供的信息 **一般 Extrinsic 的作用**: - **功能**:通常包括用戶提交的交易、智能合約的呼叫以及任何外部輸入數據。 - **作用**:這些數據會進入區塊的數據部分,成為共識機制處理的內容之一。 簡單來說 extrinsics就是後續要被追蹤和驗證的資料 在區塊鏈中,extrinsic data 包含了許多不同的部分,每一部分都像是會議中的一個活動: tickets:就像是出席票,管理著誰能夠參與並發言或提出建議。 judgments:就像是會議中的投票或表決,用於解決參與者之間的爭議。 preimages:就像是會議中提前準備的資料,當需要時可以取用和參考。 availability:像是參與者的保證書,表明他們已經準備好並擁有所有所需的資料。 reports:是完成的工作或決策的報告,由參與者提交並驗證其準確性。 --- [Extrinsic in Polkadot](https://spec.polkadot.network/id-extrinsics) [10.2. 課程影片](https://graypaper.com/lectures/?section=10.2-Extrinsic) # Extrinsic ## 4.1. [The Block](https://graypaper.fluffylabs.dev/#/364735a/088900088900) 區塊 $\mathbf{B}$ 可以被 restated 為 header $\mathbf{H}$ 與系統外部的一些輸入數據稱為 *extrinsic*, $\mathbf{E}$ $$ \mathbf{B}\equiv(\mathbf{H}, \mathbf{E}) $$ Extrinsic 就是後續要被追蹤和驗證的資料,包含了許多不同的部分,每一部分都像是會議中的一個活動。外部讀進來的資料 = Extrinsic,經過淬鍊與統整後變成 Header。Both 組成了 data structure of blockchain $$ \mathbf{E}\equiv(\mathbf{E}_{T}, \mathbf{E}_{D}, \mathbf{E}_{P}, \mathbf{E}_{A}, \mathbf{E}_{G}) $$ - [x] ==Tickets== $\mathbf{E}_{T}$ 就像是出席票,管理著誰能夠參與並發言或提出建議。 > [name=Yccinamoroll3741] by yuki 2024.11.29 報告 w/ QAQ 3.8 - [x] Disputes $\mathbf{E}_{D}$ 就像是會議中的投票或表決,用於解決參與者之間的爭議。 > [name=Yccinamoroll3741] by QAQ 2024.11.24 報告 - [x] Preimages $\mathbf{E}_{P}$ 就像是會議中提前準備的資料,當需要時可以取用和參考。 > [name=Yccinamoroll3741] by Euegen 2024.11.25 報告 - [x] ==Availability== $\mathbf{E}_{A}$ 像是參與者的保證書,表明他們已經準備好並擁有所有所需的資料。 > [name=Yccinamoroll3741] by k7 2024.11.26 報告 - [x] Reports $\mathbf{E}_{G}$ 是完成的工作或決策的報告,由參與者提交並驗證其準確性。 > [name=Yccinamoroll3741] by Ycc 2024.11.27 報告 :::info 優先順序 : Tickets, Reports = Availability = Preimage > Judgement - according to the baby steps to M1 ::: ## 6.7. The Extrinsic and Tickets 定義了 **extrinsic** $\mathbf{E}_{T}$,是由多個有效(valid) **tickets** 證明的序列。決定下一個 epoch 的每一個 slot 是由誰生產區塊。 用 ringVRF 的輸出當作 tickets 的辨識符(identifier) - 因為有不易預測(high entropy, unbias) 的特性 - 是 32-byte 的序列 - 也當作分數還有鏈上 VRF 的 input 在 epoch 快要結束時(剩下 $\mathsf{Y}$ 個 slots 時),就會停止蒐集 tickets。並固定下個 epoch 的 sealing key 序列 ![image](https://hackmd.io/_uploads/B1L8-BwXkx.png) ![v0.6.4 (6.29)](https://hackmd.io/_uploads/ByZS6Eryex.png) :::info tuple 序列 : 票券編號 + 有效證明 - $r$ : ticket entry index,是一個自然數 $\mathbb{N}_{\mathsf{N}}$ - 每一個 validator 都會有兩個 entry (==0 or 1 = 使用sealing or fallback mode==) - N = 2: The number of ticket entries per validator. - $p$ : ringVRF proof(應該是 hash) - $\bar{\mathbb{F}}$ : ringVRF function,使用 key $\gamma_{z}$ 對 message $[]$ 與 conext $\langle\cdot\rangle$ 做簽章 - $\mathsf{X}_{T}$ : $jam_ticket_seal,Bandersnatch Ringvrf Ticket generation and regular block seal - $\eta^{\prime}_{2}$ : entropy accumulator - 這邊沒有要對任何 message $m$ 做簽章,而是為了證明簽章的人在 $\gamma_{z}$ set(ring root) 裡面(但你不知道確切是誰) - 形式與 $\mathbf{H}_{s}$ 的 Seal 簽章完全一樣 - Entropy 也不一樣,因為驗證 tickets 這件事情會在 sealing 之前 ::: ![image](https://hackmd.io/_uploads/BJK3PBPXkx.png) :::info - ==$\mathsf{K}$ = 16==: 在單一區塊裡 $\mathbf{E}_{T}$ 中最多只能有 $\mathsf{K}$ 張 tickets 被提交 - $m^{\prime}<\mathsf{Y}$ : 在 lottery 之前才能提交 tickets - 當前 slot index $m^{\prime}$ 應該要小於 500(可提交 tickets 的 slot 總數 $\mathsf{Y}$) - 超過提交 tickets 的 slot 就不採記 -> 確保 $\gamma_{a}$ 不會被修改 - 在 $\mathsf{Y}$ 之後 $\gamma_{a}$ 就被鎖定了 ::: ![image](https://hackmd.io/_uploads/H1Z-Elu7yg.png) :::info Define 一個好用的變數,新的 tickets set $\mathbf{n}$,用來提取 extrinsic 裡面正確的資訊 - 跟 tickets $\mathbb{C}$ 的形式一樣 : (ID, entry) - $\mathcal{Y}$ : ringVRF 的 output -> 當成 tickets 的 ID(hash) ::: ![image](https://hackmd.io/_uploads/Hyb4ulu71g.png) :::info 確保 $n$ 根據 $\mathbf{y}$(ID) 被 re-order 成序列並刪除重複項 ::: ![image](https://hackmd.io/_uploads/S1WSdgd71g.png) :::info 確認這些新的 tickets ID 沒有在 tickets accumulator $\gamma_{\mathbf{a}}$ 裡面。 **比較兩邊 set 的 ID 有沒有重複** - 溫度計符號 : disjoint set ==<- 不清楚如何確保這個條件? A: $\gamma_a$ 是舊的,確保不會有人拿舊票亂搞== ::: ![image](https://hackmd.io/_uploads/Syf5Flu7kl.png) :::info 定義新的 tickets accumulator $\gamma^{\prime}_{\mathbf{a}}$,舊的 + 新的裡面取分數最高的 600 個 - $x$ : 新的 tickets set - 必須是新讀進來的 tickets $\mathbf{n}$ 與舊 tickets accumulator $\gamma_{\mathbf{a}}$ 的聯集 - 如果是新一輪 epoch $(e^{\prime}>e)$ : 就不用考慮 - 波浪號 : ordered by ID($\mathbf{y}$) - $\mathsf{E} = 600$ : The length of an epoch in timeslots. ::: ![image](https://hackmd.io/_uploads/ByW2FxdmJe.png) :::info 確保這些新的 tickets $\mathbf{n}$ 真的有進到 tickets accumulator $\gamma^{\prime}_{\mathbf{a}}$ 中,而不是做白工 - 做了會怎麼樣? 記錄下來嗎? - 高到低 ::: If $\mathbf{E}_{T}=[]$ 那 1. $m^{\prime}\ge \mathsf{Y}$ 2. 或是沒有新的 tickets 進來, i.e. $e^{\prime}=e, \text{than } \gamma^{\prime}_{\mathbf{a}}=\gamma_{\mathbf{a}}$ :::warning 請看 [Chatper 6 Header](/ek3wRMPERIudG41mFuirfA?stext=6951%3A20%3A1%3A1732045518%3ANfSGcp&both=) ::: # Chatper 10 Disputes, Verdicts, and Judgements 是 STF 的其中一小部分,主要解決**鏈上**的糾紛,並儲存在鏈上。並不會常常發生,因為如果有糾紛,代表有 validator 要被砍掉 (slashed) 了 :::info - Disputes : 起源於兩個 validators 對於 report validity 的 judgement 相歧 - verdict set $\mathbf{V}$ 為大部分 validator 群體對於此 report 的 judgement 共識 - Work reports : work package 計算後的結果 - Offenses : validators 做出不當的行為 (culprits or faults) - 為何要上鏈? - remove 那些無效的垃圾 reports - 如果對於 report 有爭議,也需要紀錄下來,以便之後追查 - ban 掉 culprits (移除其 key) 避免之後繼續提供 (高機率) 無效的 reports - 如果 verdict set $\mathbf{V}$ 的結果是 positive,那就不應該再拿出來說 report 是 invalid - 如果 verdict set $\mathbf{V}$ 的結果是 negative,那區塊鏈需要 1. 移除無效的 $r$ 2. 回滾到上一個安全的 state ::: ==...後面代補== ## 10.1. *Disputes* State ![image](https://hackmd.io/_uploads/SkCkk20zkl.png) 當 $\mathbf{V}$ 決定後 (有效、無效、不確定),就會把 report 放到相對應的 state 裡 :::info - $\psi^{\prime}$ : prime 代表被操作過(在此應該指 verdict )的 state - $\psi_{\mathbf{g}}$ : 有效報告 (good) - $\psi_{\mathbf{b}}$ : 無效報告 (bad) - $\psi_{\mathbf{w}}$ : 待定報告 (wonky) - $\psi_{\mathbf{o}}$ : 被發現做出錯誤 judgement validators 的公鑰 (offenders) - 確定是 valid 的 report 你說他是 invalid - 卻是是 invalid 的 report 你說他是 valid - 不用再被審查了 ::: ## (QAQ)10.2. [Extrinsic](https://graypaper.fluffylabs.dev/#/911af30/124900124900) Eq. 10.2~10.20 :::info 看起來這邊的 Extrinsic 是在提供裁決時的結論 + 證據,主要解決區塊鏈內部 (validators) 的糾紛 ::: ### 定義 The disputes extrinsics, $\mathbf{E}_{D}$ ![image](https://hackmd.io/_uploads/BkvqnahM1x.png) - **Verdicts(裁決)** $\mathrm{v}$ - 由 2/3 + 1 的 validator set 對 $c, f$ 的作為所達成的結論 - 誰有資格可以在 validator set 裡面? - $\kappa$ : 當前 active 的 vaidator set - $\lambda$ : 前一個 epoch active 的 validator set - 這些結論會被提交到鏈上,以確保一致性與透明性 - 提供 validator 的犯錯證據,以簽名的內容分成兩種 -> 為了追溯 validator 惡意或是錯誤的行為 - **Culprits(罪魁禍首)** $c$ : 發現工作報告無效的保證 (有效性) - 對無效的 work report 說他是有效的,這兩個擔保人會被帶到鏈上 - 你擔保的人審查出錯了 ! - **Faults** $f$ : 簽署了跟工作報告有效性相違背的訊息 (正確性) - 發出了無效的 judgement 的人 - 就是你審查(audit)出錯了 ! **有 validator 作亂 -> 哪一種形式( $c$ or $f$ ) -> 2/3 + 1 個 validators 就會來打擾對你做出裁決 $v$** ::: info 數學細節 **Double 中括號代表所有可能的排序** $\mathrm{v}$ : 工作報告的 hash | 由哪一個 validator set 簽章 | 序列化後 judgement 的簽章 - $\mathbb{H}$ : 對 work report 的 hash - $\lfloor \frac{\tau}{E} \rfloor - \mathbb{N}_{2}$ : 當前與上一個 epoch 的 set -> 決定使用 $\kappa$ or $\lambda$ - $\lfloor \frac{\tau}{E} \rfloor$ : current epoch - $\tau$ 是最近的區塊的 timeslot(時間槽, 生成時間) - $\mathbf{E}$ : constant, 當前 timeslots 中 epoch 的 length - current time $\tau$ 除以 epoch length $\mathbf{E}$ 會得到 current epoch - $\mathbb{N}_{2}$ : set of $\{0, 1\}$ - 序列化過的 judgement 簽章 set : 希望達到 2/3 + 1 validators 的簽章 - $\{T, F\}$ : Boolean,valdator 認為 work load 有沒有效 - $\mathbb{N}_{\mathrm{V}}$ : validator 的 set -> $\kappa$ or $\lambda$ - $\mathbb{E}$ : 對 judgement 的簽章 $c$ : 工作報告的 hash | 擔保人簽章的 hash | 擔保人的簽章 - $\mathbb{H}$ : 對 work report 的 hash - $\mathbb{H}_{E}$ : 公鑰的 set - $\mathbb{E}$ : Ed25519 簽章的 set $f$ : 工作報告的 hash | 對此報告的 judgement | judgement 簽章的 hash | judgement 的簽章 - $\mathbb{H}$ : 對 work report 的 hash - $\{T, F\}$ : Boolean,validator 認為 work load 有沒有效 - $\mathbb{H}_{E}$ : 公鑰的 set - $\mathbb{E}$ : Ed25519 簽章的 set ::: ### 如何確認 judgement 簽名的有效性 ![image](https://hackmd.io/_uploads/Bk3eSC2f1g.png) - judgement 需要由 validator set ($\kappa, \lambda$) 中的 key 簽署才有效 - 不在乎到底是誰簽的, 有簽就好 **簽名的細節: 哪一個 epoch 裡 validator set 的誰對 report 簽了有效 or 無效的簽章** :::info 對於所有 $(r, a, j)$ 屬於裁決 $v$ - $r$ : report 的 hash - $a$ : age, 決定是由當前 epoch 還是上一個 epoch 來簽章 - $j$ : validator 簽章的 set 對於所有 $(v, i, s)$ 屬於 judgement $j$ - $v$ : boolean, 裁決有效或是無效 - $i$ : validator key 的 index - $s$ : 簽章 - 簽章必須是 validator set($\kappa$ or $\lambda$) 裡面的第 $i$ 個所簽署 - 簽章包含 $X_{v}$ | report 的 hash $k$ : 由 age $a$ 來決定是由當前 epoch 還是上一個 epoch 的 key 來簽章 ::: ### 對於 Culprit and Fault 簽章的細節 ![image](https://hackmd.io/_uploads/BkEUjj6zJe.png) **確保對於 $c$ or $f$ 的簽章不會被已經被懲罰的 validators 簽署** :::info - $\mathbf{k}$ : 排除 $\psi_{\mathbf{o}}$ 後, 還屬於 $\kappa$ and $\lambda$ validator set 中的金鑰 - $k_{e}$ : $e$ = epoch 對於所有 $(r, k, s)$ 屬於罪魁禍首 $c$ - $r \in \psi^{\prime}_{\mathbf{b}}$ : (屬於被判定不正確) report 的 hash - $k$ : 金鑰 - $s$ : 簽章必須由金鑰 $k$ 簽署,包含 [guarantee 論述](https://graypaper.fluffylabs.dev/#/911af30/145e01145e01) `cat` $r$ 的訊息 對於所有 $(r, v, k, s)$ 屬於 fault $f$ - $r \in \psi^{\prime}_{\mathbf{b}} \Leftrightarrow r \notin \psi^{\prime}_{\mathbf{g}} \Leftrightarrow v$ - 如果"屬於無效報告" -> 就"不屬於有效報告" -> verdict 為 F - Vice versa: 如果 verdict 為 T -> 就"屬於有效報告" -> "不屬於無效報告" - $v$ : verdicts, boolean, 此報告有效 or 無效 - $k$ : 金鑰 - $s$ : 簽章必須由金鑰 $k$ 簽署,包含此 verdict 有效 or 無效 `cat` $r$ 的訊息 ::: ### 這些 tuple 必須 unique and ordered,讓實作好進行 ![image](https://hackmd.io/_uploads/rJHwt0TfJx.png) :::warning 待確認 如何針對 report hash 進行排序 (怎麼排序法)? 已經詢問官方 Jam Chat 用字典序 ::: :::info Eq. 10.7~8 - $symbol$ 波浪號 : 代表按 $symbol$ 的排序方式,有重複就會刪除 - Eq.10.7 代表 verdict $\mathrm{v}$ 按照 $r$ 做排列的 list - 唯一性 : $r$, $k$ 必須是唯一,不可以重複或是用過去的 - hash 函數有防撞性 - ==Ed25519 金鑰...有可能一樣嗎? 或是同一個人簽很多條?== Eq. 10.9 : 確保 $r$ 的唯一性 - 溫度計 : disjoint - $r$ 不能跟後面集合 (有效報告 $\psi_{\mathbf{g}}$, 無效報告 $\psi_{\mathbf{b}}$, 待定報告 $\psi_{\mathbf{w}}$) 重疊 - 因為後面集合已經被 judged 過了,不需要重複做一次 - 假設已經被 judged 的那些 report 都是有效的 ::: ![image](https://hackmd.io/_uploads/rkDkye0Gyg.png) :::info ordered by validator index $i$ ::: ### 定義 verdict $\mathbf{v}$ 的結果為 verdict set $\mathbf{V}$ ![image](https://hackmd.io/_uploads/rJssgeAf1l.png) :::info $\mathbf{V}$ 是一個序列 : report hash | {GOOD, BAD, WONKY} - report hash - 對於 report 的投票 : 有效, 無效, 不確定 - 因為會把 2/3 + 1 個 validators 的 verdict $v$ `cat` 起來,結果有可能是 : - 0 多數人都認為無效 (bad) -> $\psi_{\mathbf{b}}$ - 2/3 + 1 多數人都認為有效 (good) -> $\psi_{\mathbf{g}}$ - 1/3 有些人認為有效,有些人認為無效 (wonky) -> $\psi_{\mathbf{w}}$ - **基於 Polkadot 的安全性假設認為不會出現這種情形** ![image](https://hackmd.io/_uploads/HkN3H2RGkl.png) ::: #### 一些限制(constraints),定義了 culprit 與 fault 的行為 ![image](https://hackmd.io/_uploads/Hyd36eCzkl.png) :::info Eq. 10.13 : 如果此 $r$ 為有效 -> 必定存在至少一個 fault - 一定是有人錯,才需要審核 - all positive 就不會啟動審核機制,很耗資源 - 我們必須紀錄這些,大家認為有效的 $r$,你卻投了 invalid $(v=0)$ 的 validator Eq. 10.14 : 如果此 $r$ 為無效 -> 必定至少存在兩個以上的 culprits - 如果此 $r$ 無效,那誰丟上來的? 寫在小本本上 - ==為何 >2 ?? 因為要有爭議才會進到 Dispute 階段== - $c$ 是抓老鼠屎,代表你們串供,兩個人以上聯合做偽證(一人送錯誤文件,另一人以上為他做擔保) - 請看 Chapter 10 最前面: 因為 validator 對於 report 的 judgement 無法達到共識 or 有衝突,才會啟動這個機制 ::: ### Intermediate state 中間態 $\rho^{\dagger}$ : 暫存"待裁定 report "的地方 ![image](https://hackmd.io/_uploads/ryr2BbRGyg.png) work report -> 先送到 $\rho^{\dagger}$ -> time-out 或是確認 report 有效 -> 有效的話才上鏈 :::info 只要不被 $\mathbf{V}$ 裁定為有效的 report 從 $\rho^{\dagger}$ 中移除,因為不希望 intermediate state 堆積太多 report - $\forall c \in \mathbb{N}_{\mathbf{C}}$ : 對於所有 core 屬於 core set 中 - $\rho[c]_{w} \neq \varnothing$ : 代表 core $c$ 正在處理 work report 的集合 - $w$ : work report - $\mathcal{H}(\rho[c]_{w})$ : 想成特定 report 的 index (hash) - $t$ : 前面 $\mathbf{V}$ 的判斷條件 (GOOD, BAD, WONKY) - 這邊只要不是 GOOD 就不給過,全部清掉 - ==Consider: 為何條件不是 2/3V + 1== - Still unknown ::: ### State Transition 定義了 states 更新的條件 ![image](https://hackmd.io/_uploads/H1peHlJQkg.png) :::info - $\psi^{\prime}_{\mathbf{g}}$ : 添加被裁定為 GOOD 的 report - $\psi^{\prime}_{\mathbf{b}}$ : 添加被裁定為 BAD 的 report - $\psi^{\prime}_{\mathbf{w}}$ : 添加被裁定為 WONKY 的 report - 希望很少發生 -> 有很大的意見分歧 - 因為要 1/3 的 validator 認為 report 是有效,但是剩下的 validator 卻認為是無效 - $\psi^{\prime}_{\mathbf{o}}$ : 添加 culprits $c$ 與 faults $f$ 的 key ::: ## 10.3. Offenders Header ![image](https://hackmd.io/_uploads/rJZOseym1e.png) :::info 標示 Offenders,這邊是添加 culprits $c$ 與 faults $f$ 的 key 進到 header 裡面,紀錄不當行為的 validators 等待之後做懲罰或是其他處置。 - 儲存在 header 裡面可以讓從外面讀取的服務 (light client) 很簡單就知道哪些 validator 可能有問題。 - Light client 只讀取 header,而不讀取過去所有交易的資料,自己不驗證,而是依靠讀取 header(較輕便) 更新後 validator set 來確保此交易是否有效 ::: ## (認領)12.4. [Preimage Integration](https://graypaper.fluffylabs.dev/#/911af30/185600185600) Eq. 12.28~12.33