北京赛车pk10信誉老群:以太坊源码之POA区块生成机制

  

        

呆毛网小编推荐:

OKEx以太坊兑比特币下跌 区块链用于营销场景研究

2018eth以太坊矿机配置电脑主机配置推荐以及显卡算力表

以太坊挖矿显卡算力表显卡算力对照和挖矿收益计算器资源集合

2018显卡挖矿比特币以太坊算力排行

2018最新以太坊挖矿机显卡选择挖矿机配置价格

  截止目前,主流货币整体呈跌幅状态,尤其是以太坊(ETH),现报440美元。本文从技术角度出发,整理了相关以太坊源码之POA区块生成机制。

  


  内容将从以下几点展开:

  1. 名词介绍

  2. POA区块数据结构

  3. 新区块生成周期

  4. 新区块生成优先级

  一、名词介绍

  节点:普通的以太坊节点,没有区块生成的权利。

  矿工:具有区块生成权利的以太坊节点

  委员会:所有矿工的集合

  二、POA区块数据结构

  POA共识中,区块数据与POW有些区别,主要体现在header结构:

  


  三、新区块生成周期

  矿工在三中情况下开始生成区块:

  ● 程序启动时,执行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两个方法定义)

  四、新区块生成优先级

  POA共识算法中,委员会中的每一个矿工都会持续的生成新的区块,对于同一个Number的区块,不通的矿工生成该块时优先级不同。

  优先级计算方法:

  ● Number:要生成的区块的块号

  ● Signers:snapshot中记录的委员会集合,并根据矿工的地址进行了升序排列

  ● Offset:矿工在Signers集合中的位置

  ● 若:(number % uint64(len(signers))) == uint64(offset),则优先级最高,header. Difficulty =2;否则,header.Difficulty = 1


上一篇
下一篇