HPB60:HPB共识算法选举机制描述

1 简介

为了适应BOE技术的要求,同时尽量的提高安全TPS, HPB共识算法采用了高效的双层选举机制,即外层选举和内层选举。git

外层选举:由具备BOE板卡的全部用户中选取出。选取周期为3个月。选取方式为经过HPB钱包进行投票选举。github

内层选举:采用节点贡献值评价指标,从众多候选节点中选出高贡献值节点成员。基于Hash队列记名投票机制,在每次区块生成时,计算高贡献值节点生成区块的优先级,优先级高的高贡献值节点享有优先生成区块的权利。算法

在整个共识算法设计中, HPB共识算法的轻量级消息交换机制使其在共识效率上远高于其余共识算法, 同时在安全性,隐私性等方面也作了较大幅度的提高。segmentfault

2 外层选举

因为在申请BOE板卡时已经考虑了除用户持币量的其余因素,因此外层选举在钱包投票节点主要考虑持币量的因素,以及用户的承认度,用户承认度高,则用户会对他进行投票,反之则投票数量少。安全

注1:若是具备BOE的用户较多,会存在必定数量的用户在外层选举中落选。落选的用户仍然能够入网,可是不会做为候选节点或者高性能节点,而且也不会收到奖励。网络

2.1 内层选举

本文重点关注内层选举。将会详细描述内层选举的实现方式和关键因素。dom

选举包括2部分,首先是投票节点,而后是唱票阶段。性能

3 关键因素

内层选举阶段发生在网络运行中的特定阶段,每间隔必定数量的区块进行一次选举,而且根据关键因素进行排名,选择优秀的节点进行投票。测试

节点带宽:在节点运行期间,节点会按期测试与其余节点间的带宽数据,并保存在节点中,提供给共识使用,节点的带宽数据会记录在区块中。网站

用户持币量:用户在投票时的持币数量。

投票数量:外层选举过程当中用户节点得到的投票数量。

4 投票规则

节点根据外层选举得出的节点数据为集合,根据关键因素的排名加权选择最优节点,进行投票。为了保证选举结果数量,在投票过程当中进行了随机化操做,并非在全部的外层选举集合内进行最有选择,而是随机选择出特定数量的集合,而后选择最优节点投票。这个目的是保证选举结果的数量达到稳定值,保证网络的稳定性,而且排除节点排名较靠后的节点。

5 唱票

已经有了投票的基础数据后,在特定阶段环节进行唱票工做,全部节点在唱票阶段经过读取区块进行唱票,将区块中全部的投票数据提取出来进行统计。在投票阶段会将投票的数据写入voteIndex。

5.1 唱票规则

将得到投票的全部节点做为一个集合,从中选出特定数量的节点,做为下一轮的高性能节点。所以须要对该结合中的节点进行排名操做,排名的依据是voteIndex的均值。

最后

在注2中能够看到几个与次文关系较密切的字段,分别是candAddress,miner以及voteIndex。

miner:产生区块的节点。

candAddress:是由miner根据内层选举的3个关键因素肯定的。

voteIndex:是candAddress所对应的因素加权结果值。

从投票到唱票的全部环节,全部节点均存在校验机制,确保节点没法进行虚假投票和唱票,若是投票伪造,则该区块会被其余节点拒收;若是唱票伪造,则会被其余节点踢出网络。

注2:区块部份内容。

{
**candAddress: “0x4a8111ecec1f9150d366ae319d0585303085748f”**,
comdAddress: “0x4a8111ecec1f9150d366ae319d0585303085748f”,
difficulty: 2,
extraData: “0x00000000000…”,
gasLimit: 100000000,
gasUsed: 0,
hardwareRandom: “0x2bce19ff44fbf1b05edfb93fcb7c7d3ab04c50fd7dc947e2fce65d66493d0dff”,
hash: “0x1fceb9c0d5a822fdddaa72bb9378f5ce24cd168b0281082a83d8f3a00c62d79a”,
logsBloom: “0x00000000000…”,
**miner: “0x4a8111ecec1f9150d366ae319d0585303085748f”**,
mixHash: “0x0000000000000000000000000000000000000000000000000000000000000000”,
nonce: “0x0000000000000000”,
number: 100,
parentHash: “0xab7299002317fecbfdd835b28bacb470e24a7933b41102f75cb76491957baa98”,
receiptsRoot: “0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421”,
sha3Uncles: “0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347”,
size: 683,
stateRoot: “0xc46fc99654813b2f92e9be58f7e69957499fa2c9b1c0ac31d1da86679f3b9a62”,
timestamp: 1541416798,
totalDifficulty: 201,
transactions: [],
transactionsRoot: “0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421”,
uncles: [],
**voteIndex: "0x0"**
}

具体投票机制可能根据最新的需求会调整,请及时参考最新的代码。

咱们创立了HPB的技术讨论专栏,若有任何技术问题,请访问更多技术咨询。

做者:感谢HPB技术团队整理。

更多技术咨询

1.若是你想了解更多关于HPB-Wallet的技术文章,请访问:
HPB-Wallet

2.若是你想了解更多关于HPB的技术信息,请访问咱们的GitHub WiKi:
HPB WiKi of GitHub

3.若是你想得到更多HPB信息,请关注咱们的官方网站:
HPB Website

相关文章
相关标签/搜索