以太坊源码之 POA区块生成机制

Posted blockchain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊源码之 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区块生成机制的主要内容,如果未能解决你的问题,请参考以下文章

如何在DAppNode中运行以太坊Kovan客户端?

以太坊C++源码解析(九)区块头

死磕以太坊源码分析之blockChain分析

第81篇 以太坊可信支付智能合约

区块链入门教程以太坊源码分析fast sync算法一

区块链教程以太坊源码分析core-state源码分析