以太坊源碼之POA區(qū)塊生成機(jī)制區(qū)塊鏈
本文是關(guān)于名詞介紹;POA區(qū)塊數(shù)據(jù)結(jié)構(gòu);新區(qū)塊生成周期;新區(qū)塊生成優(yōu)先級(jí)。
1、名詞介紹
2、POA區(qū)塊數(shù)據(jù)結(jié)構(gòu)
3、新區(qū)塊生成周期
4、新區(qū)塊生成優(yōu)先級(jí)
1、名詞介紹
節(jié)點(diǎn):普通的以太坊節(jié)點(diǎn),沒有區(qū)塊生成的權(quán)利。
礦工:具有區(qū)塊生成權(quán)利的以太坊節(jié)點(diǎn)
委員會(huì):所有礦工的集合
2、POA區(qū)塊數(shù)據(jù)結(jié)構(gòu)
POA共識(shí)中,區(qū)塊數(shù)據(jù)與POW有些區(qū)別,主要體現(xiàn)在header結(jié)構(gòu):
3、新區(qū)塊生成周期
礦工在三中情況下開始生成區(qū)塊:
程序啟動(dòng)時(shí),執(zhí)行newWorker方法初始化worker對(duì)象時(shí),調(diào)用commitNewWork方法,開始生成新的區(qū)塊。(miner/worker.go)
網(wǎng)絡(luò)接收到其他礦工廣播過來的新區(qū)塊,該區(qū)塊驗(yàn)證有效插入到區(qū)塊鏈后,會(huì)產(chǎn)生ChainHeadEvent日志,worker對(duì)象的update協(xié)程檢測到到該日志后,會(huì)調(diào)用commitNewWork方法,開始生成新的區(qū)塊。(miner/worker.go)
礦工自己生成新的區(qū)塊并入鏈后,會(huì)調(diào)用commitNewWork方法,開始生成新的區(qū)塊。
(wait協(xié)程,miner/worker.go)
生成新區(qū)塊時(shí),礦工會(huì)進(jìn)行一定的延時(shí),延時(shí)算法:
高優(yōu)先級(jí)礦工:
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**兩個(gè)方法定義)
其他礦工:
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兩個(gè)方法定義)
4、新區(qū)塊生成優(yōu)先級(jí)
POA共識(shí)算法中,委員會(huì)中的每一個(gè)礦工都會(huì)持續(xù)的生成新的區(qū)塊,對(duì)于同一個(gè)Number的區(qū)塊,不通的礦工生成該塊時(shí)優(yōu)先級(jí)不同。
優(yōu)先級(jí)計(jì)算方法:
Number:要生成的區(qū)塊的塊號(hào)
Signers:snapshot中記錄的委員會(huì)集合,并根據(jù)礦工的地址進(jìn)行了升序排列
Offset:礦工在Signers集合中的位置
若:(number % uint64(len(signers))) == uint64(offset),則優(yōu)先級(jí)最高,header. Difficulty =2;否則,header.Difficulty = 1
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。