以太坊源碼分析:共識(2)接口

前言

engine是以太坊封定義的一個接口,它的功能可以分爲3類:

  1. 驗證區塊類,主要用在將區塊加入到區塊鏈前,對區塊進行共識驗證。
  2. 產生區塊類,主要用在挖礦時。
  3. 輔助類。

接下來我們看一下engine具體定義了哪些功能,還有各功能的使用場景。

engine定義的具體功能

engine有3類功能,驗證區塊類、產生區塊類、輔助類。因爲產生區塊在前,驗證區塊在後,接下來採用產生區塊類、驗證區塊類、輔助類,分別介紹它們的功能和使用場景。

engine接口調用圖

驗證區塊類

  1. Prepare:初始化區塊頭信息,不同的共識算法初始化不同。使用場景是,worker創建work的時候調用。
  2. Finalize:根據數據生成“基本定型”的區塊,但區塊頭中還缺少部分數據。使用場景是,1)模擬區塊鏈的時候,被GenerateChain調用,用來生成區塊鏈。2)交易狀態管理時,被StateProcessor.Process調用用來執行交易。3)worker創建work的時候調用。
  3. Seal:根據傳入的塊,進行的是挖礦工作,使用挖礦的結果,修改區塊頭,然後生成新的區塊。使用場景是,被agent.mine調用。

驗證區塊類

  1. VerifyHeader:驗證區塊頭。使用在fetcher中,當fetcher要插入區塊的時候,需要先對區塊頭進行校驗。
  2. VerifyHeaders:驗證一批區塊頭。有2種使用場景,1)區塊鏈中,insertChain當把一批區塊插入到區塊鏈這個鏈條的時候,需要進行檢查;2)LightChain中,把一批區塊頭插入到本地鏈。
  3. VerifyUncles:驗證區塊中的叔塊。insertChain當區塊插入區塊鏈的時候,需要對叔塊進行驗證,調用在VerifyHeaders之後。
  4. VerifySeal:針對Seal函數做的功能進行驗證。驗證Seal()所修改的區塊頭中的數據。對外的使用場景是,把Work發送給遠端Agent的時候調用。對內的使用場景是,驗證區塊頭的時候會被調用。

輔助類

  1. APIs:生成以太坊共識相關的API。在以太坊啓動RPC服務時,生成API。
  2. Author:讀取區塊頭中的coinbase。被ethstats使用,ethstats是以太坊狀態管理服務,當報告數據的時候,需要獲取區塊的Author信息。

最後關注一下藍色的線條,它們代表insertChain所調用的範圍,先關的有VerifyHeaders、VerifyUncles、Finalize,涉及到塊頭的驗證、叔塊的驗證,以及執行區塊中的交易,一個區塊加入到區塊鏈中,不僅要驗證,還要執行各種交易,改變各種狀態,所有節點執行確定性的行爲之後,達成一致性。

FAQ

  • Q:誰實現engine
    A:以太坊中的Ethash和Clique實現了engine,Ethash是基於PoW的共識,Clique是基於PoA的共識。
  • Q:爲什麼insertChain沒有調用VerifySeal
    A:因爲Seal()修改的是header中的部分數據,在驗證區塊頭的時候,會被調用。只是調用流程在Ethash和Clique中的實現略有不同,後續講解。
  1. 如果這篇文章對你有幫助,不妨關注下我的Github,有文章會收到通知。
  2. 本文作者:大彬
  3. 如果喜歡本文,隨意轉載,但請保留此原文鏈接:http://lessisbetter.site/2018/06/22/ethereum-code-consensus-2/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章