以太坊源碼之 POA區塊生成機制
作者: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區塊生成機制