博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊源码(03):POA委员会选举机制
阅读量:5229 次
发布时间:2019-06-14

本文共 1868 字,大约阅读时间需要 6 分钟。

目录

1       名词介绍

2       矿工投票方法

3       委员会确定投票流程

3.1        关键概念描述

3.1.1       Epoch & checkpointInterval

3.1.2       Snapshot

3.2        投票方法

 

1.名词介绍

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

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

委员会:所有矿工的集合

 

2.矿工投票方法 

  • 用户通过RPC接口,调用Propose(address common.Address, auth bool)方法(consensus/clique/api.go),进行投票,address表示要投票的节点的地址,auth表示要从将该地址加入委员会,还是从委员会中删除。

     

  • Propose方法将address和auth两个输入参数写入到clique.proposals集合中。

     

  • 任何一个委员会的委员,可以在任意时刻进行投票,投票包括两种,即加入委员会和从委员会中删除。

 

3.委员会确定投票流程

3.1     关键概念描述

3.1.1   Epoch & checkpointInterval

  • CheckpointInterval:为常量1024(consensus/clique/clique.go中定义),即每当区块链的高度为1024的整数倍时,到达checkpointInterval时间点。

  • Epoch:默认为30000(cmd/puppet/wizard_genesis.go中makeGenesis方法中定义),即每当区块链的高度为30000的整数倍时,到达Epoch时间点。

     

 

3.1.2   Snapshot

Snapshot是一个快照,矿工程序在区块链高度为CheckpointInterval的整数倍时,会对当前相关数据和状态形成快照,并存储到数据库中。

snapshot结构体(consensus/clique/snapshot.go)关键成员:

  • Number:生成快照时的区块链高度

  • Signers:生成快照时的委员会地址

  • Votes:生成快照时所有的投票集合

  • Tally:被投票的节点集合,其中的Tally是该节点被投票的次数

 

3.2投票方法

所有投票都是在委员生成新区块的过程中完成,具体流程如下:

 

1)委员生成新区块时,先为该区块初始化一个header。prepare方法,consensus/clique/clique.go

 

 

2)从proposals中随机获取一个投票,将被投票的节点地址写入header.coinbase,将提名是添加还是删除写入header.Nonce(添加:0xffffffffffffffff 删除:0),若该委员生成的这个区块最终被写入区块链,则header中的投票也被写入区块链。prepare方法,consensus/clique/clique.go

 

3)委员在生成新区块时,会创建新的snapshot,新的snapshot是由上一checkponitinterval时间点存储到数据库中的快照加入当前时间点和checkpointinterval时间点之间所有的headers数据组成。添加header过程中,若该header的number是Epoch时间点,则会将snap中的Votes和Tally两个集合清零。

(apply方法,consensus/clique/snapshot.go

 

4)新的snapshot添加header过程中,会检查每一个header中存储的投票,若该投票snap.Votes中已经存在,则将snap.Votes和snap.Tally两个集合的该投票删除。

(apply方法,consensus/clique/snapshot.)

 

将每一个header中有效的提名写入新snapshot的snap.Votes和snap.Tally集合。apply方法,consensus/clique/snapshot.go

 

5)判断snap.Tally集合中某个被提名的节点,提名的次数是否大于snap.Signers的1/2,即是否有超过一半的委员对该节点进行投票,若超过,则投票成功,该节点会被添加到委员会或者从委员会中删除。

apply方法,consensus/clique/snapshot.go

 

 

注释:snapshot快照中的记录的委员会,即Signers集合,初始化时来源于创世块header中的Extra

转载于:https://www.cnblogs.com/blockchain/p/8037165.html

你可能感兴趣的文章
神经网络与机器学习 第一讲(5)——三种机器学习类型
查看>>
Mysql中like查询中存在反斜杠的解决方法
查看>>
[转载]for update的用法
查看>>
线性结构
查看>>
外部排序(基数排序)
查看>>
面试题---删除串中的指定子串
查看>>
Object properties in JavaScript
查看>>
Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决
查看>>
C++第二周学习小结
查看>>
java读书笔记
查看>>
md5sum命令详解
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
使用 Swoole 来加速你的 Laravel 应用
查看>>
TextWatcher原因activity内存泄漏问题
查看>>
Merge into的使用具体解释-你Merge了没有
查看>>
Linux安装程序Anaconda分析
查看>>
如何在chrome上打开SSL3.0
查看>>
应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用...
查看>>
从网易与淘宝的font-size思考前端设计稿与工作流
查看>>
Struts2 拦截器过滤方法
查看>>