zoukankan      html  css  js  c++  java
  • 区块链:POA区块生成机制

    目录

    1 名词介绍

    2 POA区块数据结构

    3 新区块生成周期

    4 新区块生成优先级

    1 名词介绍

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

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

    委员会:所有矿工的集合

    2 POA区块数据结构

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

      序号 字段 POW POA
      1 Coinbase 挖矿奖励地址 被提名为矿工的节点地址 |
      2 Nonce 随机数 提名分类,添加或者删除 |
      3 Extra 其他数据 在Epoch时间点,存储当前委员会集合Singners |
      4 Difficulty 挖矿难度 优先级,1或者2,同一个Number的区块,只有一个矿工是2 |

    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

  • 相关阅读:
    Django-4
    Django-3
    博客中涉及的源码下载
    源码阅读系列:EventBus
    使用DFA做文本编辑器的自动提示
    计算机网络-IP类型判断
    感兴趣的文章搜集
    The Engine Document of JustWeEngine
    [译文]选择使用正确的 Markdown Parser
    Android源码阅读-Filter过滤器
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313405.html
Copyright © 2011-2022 走看看