1. 程式人生 > >以太坊源碼之 POA區塊生成機制

以太坊源碼之 POA區塊生成機制

有效 mit num 檢測 pow comm 啟動 worker duration

作者:HPB芯鏈團隊

目錄:

● 名詞介紹

● POA區塊數據結構

● 新區塊生成周期

● 新區塊生成優先級

1 名詞介紹

節點:普通的以太坊節點,沒有區塊生成的權利。

礦工:具有區塊生成權利的以太坊節點

委員會:所有礦工的集合

2 POA區塊數據結構

POA共識中,區塊數據與POW有些區別,主要體現在header結構:

技術分享圖片

3 新區塊生成周期

礦工在三中情況下開始生成區塊:

● 程序啟動時,執行newWorker方法初始化worker對象時,調用commitNewWork方法,開始生成新的區塊。(miner/worker.go)

● 網絡接收到其他礦工廣播過來的新區塊,該區塊驗證有效插入到區塊鏈後,會產生ChainHeadEvent日誌,worker對象的update協程檢測到到該日誌後,會調用commitNewWork方法,開始生成新的區塊。(miner/worker.go)

● 礦工自己生成新的區塊並入鏈後,會調用commitNewWork方法,開始生成新的區塊。

(wait協程,miner/worker.go)

● 生成新區塊時,礦工會進行一定的延時,延時算法:

高優先級礦工:

header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(c.config.Period))

delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now())

(consensus/clique/clique.go中的prepare和seal**兩個方法定義)

其他礦工:

header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(c.config.Period))

delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now())

wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime

delay += time.Duration(rand.Int63n(int64(wiggle)))

(consensus/clique/clique.go中的prepare和seal兩個方法定義)

4 新區塊生成優先級

POA共識算法中,委員會中的每一個礦工都會持續的生成新的區塊,對於同一個Number的區塊,不通的礦工生成該塊時優先級不同。

優先級計算方法:

● Number:要生成的區塊的塊號

● Signers:snapshot中記錄的委員會集合,並根據礦工的地址進行了升序排列

● Offset:礦工在Signers集合中的位置

● 若:(number % uint64(len(signers))) == uint64(offset),則優先級最高,header. Difficulty =2;否則,header.Difficulty = 1

本篇文章由HPB芯鏈團隊整理。

HPB芯鏈官網:http://www.gxn.io

以太坊源碼之 POA區塊生成機制