简介
为了适应BOE技术的要求,同时尽可能的提升安全TPS, HPB共识算法采用了高效的双层选举机制,即外层选举和内层选举。
外层选举:由具有BOE板卡的所有用户中选取出。选取周期为3个月。选取方式为通过HPB钱包进行投票选举。
内层选举:采用节点贡献值评价指标,从众多候选节点中选出高贡献值节点成员。基于Hash队列记名投票机制,在每次区块生成时,计算高贡献值节点生成区块的优先级,优先级高的高贡献值节点享有优先生成区块的权利。
在整个共识算法设计中, HPB共识算法的轻量级消息交换机制使其在共识效率上远高于其他共识算法, 同时在安全性,隐私性等方面也做了较大幅度的提升。
外层选举
由于在申请BOE板卡时已经考虑了除用户持币量的其他因素,所以外层选举在钱包投票节点主要考虑持币量的因素,以及用户的认可度,用户认可度高,则用户会对他进行投票,反之则投票数量少。
注1:如果具有BOE的用户较多,会存在一定数量的用户在外层选举中落选。落选的用户仍然可以入网,但是不会作为候选节点或者高性能节点,并且也不会收到奖励。
内层选举
本文重点关注内层选举。将会详细描述内层选举的实现方式和关键因素。
选举包括2部分,首先是投票节点,然后是唱票阶段。
关键因素
内层选举阶段发生在网络运行中的特定阶段,每间隔一定数量的区块进行一次选举,并且根据关键因素进行排名,选择优秀的节点进行投票。
节点带宽:在节点运行期间,节点会定期测试与其他节点间的带宽数据,并保存在节点中,提供给共识使用,节点的带宽数据会记录在区块中。
用户持币量:用户在投票时的持币数量。
投票数量:外层选举过程中用户节点获得的投票数量。
投票规则
节点根据外层选举得出的节点数据为集合,根据关键因素的排名加权选择最优节点,进行投票。为了保证选举结果数量,在投票过程中进行了随机化操作,并不是在所有的外层选举集合内进行最有选择,而是随机选择出特定数量的集合,然后选择最优节点投票。这个目的是保证选举结果的数量达到稳定值,保证网络的稳定性,并且排除节点排名较靠后的节点。
唱票
已经有了投票的基础数据后,在特定阶段环节进行唱票工作,所有节点在唱票阶段通过读取区块进行唱票,将区块中所有的投票数据提取出来进行统计。在投票阶段会将投票的数据写入voteIndex。
唱票规则
将获得投票的所有节点作为一个集合,从中选出特定数量的节点,作为下一轮的高性能节点。因此需要对该结合中的节点进行排名操作,排名的依据是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"**
}
具体投票机制可能根据最新的需求会调整,请及时参考最新的代码。