以太坊源碼之POA區塊生成機制區塊鏈
本文是關于名詞介紹;POA區塊數據結構;新區塊生成周期;新區塊生成優先級。
1、名詞介紹
2、POA區塊數據結構
3、新區塊生成周期
4、新區塊生成優先級
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
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。