前言
engine
是以太坊封定義的一個接口,它的功能可以分爲3類:
- 驗證區塊類,主要用在將區塊加入到區塊鏈前,對區塊進行共識驗證。
- 產生區塊類,主要用在挖礦時。
- 輔助類。
接下來我們看一下engine
具體定義了哪些功能,還有各功能的使用場景。
engine定義的具體功能
engine有3類功能,驗證區塊類、產生區塊類、輔助類。因爲產生區塊在前,驗證區塊在後,接下來採用產生區塊類、驗證區塊類、輔助類,分別介紹它們的功能和使用場景。
驗證區塊類
-
Prepare
:初始化區塊頭信息,不同的共識算法初始化不同。使用場景是,worker創建work的時候調用。 -
Finalize
:根據數據生成“基本定型”的區塊,但區塊頭中還缺少部分數據。使用場景是,1)模擬區塊鏈的時候,被GenerateChain
調用,用來生成區塊鏈。2)交易狀態管理時,被StateProcessor.Process
調用用來執行交易。3)worker創建work的時候調用。 -
Seal
:根據傳入的塊,進行的是挖礦工作,使用挖礦的結果,修改區塊頭,然後生成新的區塊。使用場景是,被agent.mine
調用。
驗證區塊類
-
VerifyHeader
:驗證區塊頭。使用在fetcher中,當fetcher要插入區塊的時候,需要先對區塊頭進行校驗。 -
VerifyHeaders
:驗證一批區塊頭。有2種使用場景,1)區塊鏈中,insertChain
當把一批區塊插入到區塊鏈這個鏈條的時候,需要進行檢查;2)LightChain中,把一批區塊頭插入到本地鏈。 -
VerifyUncles
:驗證區塊中的叔塊。insertChain
當區塊插入區塊鏈的時候,需要對叔塊進行驗證,調用在VerifyHeaders之後。 -
VerifySeal
:針對Seal函數做的功能進行驗證。驗證Seal()所修改的區塊頭中的數據。對外的使用場景是,把Work發送給遠端Agent的時候調用。對內的使用場景是,驗證區塊頭的時候會被調用。
輔助類
-
APIs
:生成以太坊共識相關的API。在以太坊啓動RPC服務時,生成API。 -
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中的實現略有不同,後續講解。