Skip to content

Latest commit

 

History

History
197 lines (156 loc) · 12.8 KB

PubYuCHe.md

File metadata and controls

197 lines (156 loc) · 12.8 KB
timezone
Asia/Taipei

PubYuCHe

  1. 自我介绍: Hello,大家好,第一次參加以太坊協議殘酷共學,之前做過私有鏈。期待對以太坊底層協議有更深刻的理解。
  2. 你认为你会完成本次残酷学习吗?會的

Notes

2025.02.06

EPF #1 week 協定的基本原則 該協定會隨著時間而改變,每次網路升級都會帶來新的改進。儘管架構不斷變化,但它的演變反映了一些基本原則。具體可總結如下: 簡單性、通用性、模組化、無歧視性、敏捷性 實施的方式 執行層(EL)或共識層(CL)的實作稱為客戶端。運行此客戶端並連接到網路的電腦稱為節點。因此,一個節點是一對積極參與網路的 EL 和 CL客戶端 開發週期 新功能或變更的傳統開發週期是Idea - Research - Development - Testing - Adoption。然而,在這個循環的任何時候都可能出現問題,導致需要從頭開始再次迭代。

改進方式 使用EIP 流程來協調來自社區的想法和提議的變更.

2025.02.07

觀看EL 的設計概念 狀態轉換函數(STF)

  • 所需參數:
  • parent block(需要驗證從父區塊到目前區塊的轉換邏輯)
  • current block
  • StateDB(最後已知的有效狀態,儲存與父區塊相關的所有狀態資料)
  • 回傳結果:
  • 更新 stateDB(包括當前區塊的資訊)
  • 錯誤(如果函數失敗且沒有更新 StateDB)
  • 步驟 1:驗證標題
  • 如果發生以下情況,則可能發生錯誤
  • gas 限制變化超過前一個區塊的 1/1024
  • 區塊編號不是連續的
  • EIP-1559 基本費用未正確更新
  • ETC。
  • 步驟 2:如果標題正確,則套用 Tx
  • 遍歷區塊交易,透過虛擬機器執行每個交易,如果交易正確則更新狀態
  • 如果發生以下情況,則可能發生錯誤
  • 存在無效交易,則整個區塊無效,狀態不會更新

2025.02.11

區塊建立函數

  1. 參數部分
  • 環境 (Environment): 這部分提供了區塊生成過程所必需的基本背景信息,例如當前時間、區塊鏈中的位置(區塊編號)、前一個區塊的資訊以及區塊費用的基準值。這些數據對確保區塊的正確生成和區塊鏈的連續性非常重要。
  • 交易池 (Tx pool): 這是一個臨時儲存待執行交易的集合。系統會根據交易的價值(例如支付的手續費)來排序,確保高價值交易能夠優先被執行,從而最大化收益。
  • 狀態資料庫 (StateDB): 此資料庫保存著所有與賬戶、合約狀態等相關的信息,任何交易執行後都可能對這些狀態做出改變,故需在區塊生成後更新。
  1. 返回結果
  • 區塊 (Block): 生成的新區塊,包含了一系列已執行的交易及相關區塊資訊。
  • 更新後的狀態資料庫 (Updated StateDB): 反映了所有交易執行後的最新狀態,這是整個區塊鏈運行過程中的核心數據。
  • 錯誤 (Error): 在區塊生成或交易執行過程中可能出現錯誤,這一部分用來返回和記錄相關錯誤信息。 步驟詳解 步驟 1:追蹤 gas 使用量並存儲交易
  • 在這一階段,系統不斷從交易池中選取交易,並將它們加入到待生成的區塊中,同時監控累積的 gas 消耗。當達到預定的 gas 限制時,就不再添加新的交易,確保區塊不會因為交易數量過多而超出計算或存儲的限制。 這裡提到的「gas」是 Ethereum 用來衡量計算工作量的單位,每個區塊都有一個最大 gas 限制(例如 3000 萬),以防止過多計算影響網絡穩定性。 步驟 2:從交易池中取得並執行最佳交易
  • 使用 Pop() 方法從排序好的交易池中取出最有價值的交易。這裡的「最佳」交易通常是指那些支付較高手續費的交易,因為礦工(或驗證者)傾向於優先處理這些交易以獲取更多收益。 交易通過 Ethereum 的虛擬機(VM)進行執行,執行結果會更新狀態資料庫,並將成功執行的交易記錄到區塊中。 如果在執行過程中某筆交易被發現無效(例如簽名錯誤或執行失敗),系統會記錄錯誤,但仍會繼續處理後續交易,直到沒有足夠的 gas 或交易池被清空。 步驟 3:使用 Finalize 函數組裝區塊
  • 最後,Finalize 函數會根據已執行的交易列表以及區塊相關的資訊(如區塊頭資料)生成一個完整且可驗證的區塊。這個區塊會被添加到區塊鏈上,成為區塊鏈歷史的一部分。

狀態轉移函數

newPayload 函數:

起點與檢查: 此函數是從共識層(CL)觸發的,代表一個新的區塊提案進入流程。執行層(EL)在這個階段會檢查區塊的完整性,例如確認區塊數據的正確性與一致性。 流程延伸: 當初步檢查通過後,流程深入到 insertBlockWithoutSetHead,正式啟動區塊的鏈上添加操作。 insertBlockWithoutSetHead 函數:

執行與驗證: 這個函數負責將區塊中的交易執行,並對區塊內容進行各項驗證。驗證通過後,將區塊及其交易狀態寫入資料庫。 區別與後續: 與 insertChain 函數不同,此處不會立即更新正則鏈狀態,而是需要後續額外的 SetCanonical 操作來最終確定區塊在正則鏈中的地位。這種分步驟的設計有助於更細緻地控制區塊的驗證與最終確認過程。 insertChain 函數及其子流程:

verifyHeaders: 在正式執行區塊之前,首先必須對區塊頭進行嚴格檢查。這包括: EIP-1559 屬性: 確保區塊頭中的 gas 限制符合網絡規範。 其他檢查項目: 如 gas 限制、實際使用的 gas、區塊生成時間等,確保整體數據正確無誤。 驗證通過後,區塊才被認為是有效的,可進入下一步執行。 Process 函數: 參數與執行環境: 該函數需要區塊數據、狀態資料庫以及虛擬機配置。這些參數共同確保區塊在執行過程中能夠正確地影響狀態。 狀態轉移機制: Geth 使用 state_processor 來完成狀態轉移。這個過程將每筆交易依次執行,更新狀態資料庫,並計算出新的狀態。 後續更新: 當所有交易都處理完畢後,系統會更新其他關鍵指標,最終把區塊的最終狀態寫入區塊鏈,確保區塊成為鏈上歷史的一部分。

2025.02.13

Digital scarcity 區塊鏈創造了一種製造數位稀缺性的方法,這在以前是難以實現的。 因此,數位稀缺性的這個特性可以用於在數位領域模擬各種實體資產,例如:貨幣、代幣、產權等等。

製造數位稀缺性的方法:創建具有稀缺性的數位貨幣的示例 目標: 創建具有稀缺性的數位貨幣 單位: 代幣 (Coins) 稀缺性: 任何時候都只有 N 個代幣。並且用戶不能花費超過他們擁有的代幣。 需要移除單一信任營運商並最小化信任。 在任何時間點,即使有一些節點輸出錯誤,只要大多數節點對輸出狀態有相同的看法,協議就可以達成共識並繼續運行。

Byzantine fault tolerance 分散式網路處理拜占庭容錯(BFT)。 如果更多節點帶來更高的安全性,那麼我們會希望擁有更多的節點。然而,在開放和分散式的系統中,節點可能存在問題(例如:硬體故障、訊息遺失、錯誤、攻擊等),這會導致與共識不同的錯誤輸出。 拜占庭容錯(BFT)是一個系統的屬性,它能夠抵抗源自拜占庭將軍問題的故障類別。這意味著即使一些節點發生故障或惡意行為,BFT 系統也能夠繼續運行。 因此,我們需要有一定的容錯能力,使系統能夠持續運行。

Bitcoin 實BFT 比特幣被認為是第一個解決拜占庭將軍問題的方案。 該系統可以擴展到無限的節點數量。 開放和無需許可的參與。 使用 PoW 機制來達成共識(Bitcoin)

比特幣的狀態機複製 輸入: 交易 (Tx)(組織在區塊中),用於花費比特幣。 輸出: 比特幣賬本的當前狀態。 使用密碼學來減少可能的狀態空間 數位簽章: 使用密碼學來驗證交易的真實性。 父哈希: 每個新區塊都必須包含前一個區塊的哈希值。

以太坊從 PoW 轉向 PoS PoW -> PoS 的本質 從女巫攻擊保護的外生信號(工作量)轉變為系統內的內生信號(權益)。

背後的考量

  1. 對 PoW 的能源使用擔憂。
  2. 對 PoW 的激勵擔憂:與 PoW 相比,PoS 的協議內信號允許懲罰和獎勵。 以太坊共識機制 驗證者 (Validators): 協議內共識參與者。
  • 成為共識驗證者
  • 用戶需要鎖定 32 個 ETH 並將其發送到 EVM 中的存款合約,這將在 CL 層(共識層)中被看到。 責任
  • 進行證明 (attestation): 即驗證者對鏈的狀態進行密碼學簽名。 不同類型的證明
  • LMD GHOST 投票: 驗證者證明信標鏈的頭部 (beacon chain head)。
  • Casper FFG 投票: 驗證者證明當前 epoch 中的檢查點 (checkpoint)。

關鍵概念

  1. Slot (槽位) 每 12 秒鐘會產生一個新的槽位,每個槽位都會有一個區塊。 在每個槽位內,它被分為 3 個階段,每個階段消耗 4 秒。而一個槽位中最關鍵的時刻是在 t=4 秒時的證明 (attestation) 截止時間。(Paradigm 博客)

  2. Epoch (時代/紀元) 每個時代 (epoch) 有 32 個槽位。創建時代背後的原因是為了降低共識處理的頻率,這樣就不需要在每個槽位都發生共識處理。 較重的處理通常在時代邊界完成,包括:罰沒 (slashing)、獎勵資訊等。 時代邊界區塊 (Epoch Boundary Blocks, EBB) 也可以被認為與檢查點 (checkpoints) 同義。(The Beacon Chain Ethereum 2.0 explainer)

  3. Committee (委員會) 網路內的驗證者將被隨機分配到不同的委員會中。 每個驗證者在每個時代 (epoch) 會進行一次證明 (attestation)。驗證者被分配到的確切槽位是由協議通過 RANDAO 決定的。

  4. Finality (最終性) 最終性意味著一筆交易 (tx) 是一個區塊的一部分,而這個區塊是不可更改的。 Justification (驗證/確認): 當一個時代 (epoch) 結束時,如果其檢查點 (checkpoint) 收集了 2/3 超過三分之二的多數投票,則該檢查點將被驗證 (justified)。 Finality (最終性): 當一個檢查點 (checkpoint) 被驗證 (justified) 時,前一個已經被驗證 (justified) 的檢查點就變成最終的 (finalized)。

2025.02.14

執行層測試

EVM 測試 主要目的: 驗證每個執行客戶端是否都遵守規範,否則可能會在鏈中引起潛在的正向分叉。 設定: 為每個客戶端提供相同的輸入,並期望在給定相同的環境、前狀態、硬分叉激活規則的情況下,從每個客戶端獲得相同的輸出。 測試的重要特徵: 前狀態 (Pre-state): 以太坊鏈的完整組成,由包含餘額、nonce 值、程式碼和儲存的帳戶組成。 環境 (Environment): 根據測試的類型,環境可以指定諸如時間戳、先前的 RANDAO、區塊號、先前的區塊哈希值、總 gas 限制、基礎費用和硬分叉激活時間等內容。 交易 (Transaction(s)): 發送到區塊鏈的消息,用於在區塊鏈上執行操作,其中包含發起和目標帳戶、以太幣價值、gas 限制和資料。 後狀態 (Post-state): 由修改或創建的帳戶組成的結果狀態。

EVM 測試 - 測試填充 測試填充的定義: 將測試原始碼編譯成一個「fixture」(測試夾具) 的過程,這個 fixture 可以被任何執行客戶端所使用。 測試填充 vs 客戶端單元測試: 對於測試填充來說,完全相同的測試可以在任何客戶端實作中執行。而對於客戶端單元測試來說,不同的客戶端團隊之間的測試可能會有所不同。

特點: 所有不同格式的測試夾具 (test fixtures) 都是單一的 JSON 檔案,可供每個客戶端使用。

  1. 狀態測試 使用狀態根 (state root) 進行驗證: 給定相同的前狀態 (pre-state) 和相同的交易 (transaction),不同的客戶端應該返回相同的狀態根 (state root)。 狀態根 (State root): 安全地提交狀態的所有內容的密碼學計算結果。

  2. 模糊差異狀態測試 (Fuzzy differential state testing) 在設計好的交易之上,將使用 FuzzyVM 工具添加模糊測試的智能合約程式碼。 仍然期望不同的客戶端返回相同的狀態根 (state root)。

  3. 區塊鏈測試 (Blockchain testing) 由於我們在執行客戶端上檢查的並非所有內容都是 EVM 執行的一部分,例如先前區塊的執行結果、1559 基礎費用等,因此也需要完整的區塊測試來驗證客戶端的執行。

  4. 區塊鏈負面測試 (Blockchain negative testing) 在某個時間點添加一個無效區塊,以檢查客戶端是否可以為了設計目的拒絕該無效區塊,返回到先前的有效區塊並聲稱它是鏈頭 (chain head)。

2025.02.15