其他分享
首页 > 其他分享> > 区块链:POA委员会选举机制

区块链:POA委员会选举机制

作者:互联网

目录

1 名词介绍

2 矿工投票方法

3 委员会确定投票流程

​ 3.1 关键概念描述

​ 3.1.1 Epoch & checkpointInterval

​ 3.1.2 Snapshot

​ 3.2 投票方法

1.名词介绍

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

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

委员会:所有矿工的集合

2.矿工投票方法

3.委员会确定投票流程

3.1 关键概念描述

3.1.1 Epoch & checkpointInterval

 

3.1.2 Snapshot

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

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

 

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.go)

将每一个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。

标签:选举,header,snapshot,投票,clique,go,区块,POA
来源: https://blog.csdn.net/shangsongwww/article/details/89063483