當前位置:
首頁 > 新聞 > 以太坊源碼之POA區塊生成機制

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

作者:HPB芯鏈團隊

名詞介紹

POA區塊數據結構

新區塊生成周期

新區塊生成優先順序

1 名詞介紹

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

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

委員會:所有礦工的集合

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

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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 巴比特資訊 的精彩文章:

菲律賓央行批准兩家新加密貨幣交易所提供法幣交易服務

TAG:巴比特資訊 |