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


目錄:

● 名詞介紹

● 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

 

原文鏈接:http://wangxiaoming.com/blog/2017/12/16/HPB-37-ETH-POA2/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM