# 节点选举机制

# 概述

TOP Network节点选举系统是在分布式和无许可的思想指导下开发的。

  • permissionless(无许可),不仅仅在于节点可以自由进出网络,还在于任何节点,不管stake大小,都有机会选为在职节点;

  • PoS*共识机制,对于需要参与共识的节点,stake越高,被选为在职工作节点的概率越大;

  • 共识节点随机产生且定期轮换,避免大户垄断网络;

  • stake越大共识越安全。

# 节点stake

在大多数PoS形式中,决定一个节点是否有资格加入网络的唯一因素是区块链token最低保证金。

TOP Network将这一概念扩展为我们所说的“综合stake(Comprehensive Stake)”,即hpPBFT-PoS*中的"*"。综合stake考虑多个因素,以确定一个节点被选举参与共识的可能性。

综合权益为:

保证金

节点保证金是您矿工账户质押到注册合约中的TOP token。

信誉分

节点的贡献历史是考察节点信用或声誉的一种形式。一个节点成功完成的任务越多,节点的信誉就越高,因此节点的综合权益也就越大。如果一个节点的带宽或计算能力与其他节点相比过低,它的信誉分就会下降。

validator节点和auditor节点都有自己的信誉分。因为高级矿工(advance)可同时兼任validator节点和auditor节点,所以高级矿工既可以拥有validator节点信誉分,也可以拥有auditor节点信誉分。

矿工注册后,节点信誉分默认为0.1。

validator节点和auditor节点的信誉分随着新区块的增加而增长,在正常工作的情况下,工作量排名前20%的节点,每24小时增加0.01分,最高分为1。节点信誉分达到最高分后,将不再上涨。

validator节点和auditor节点的信誉分从0.1分增加到1分,需要正常工作30天。

为了统计信誉分,table定期向Beacon系统报告每个validator节点和auditor节点产生的区块数,Beacon利用这些信息去更新节点的信誉分。Beacon系统更新节点信誉分需要同时满足以下两个条件:

  • 系统每隔1个时钟块(10s)会去调度一个table上报其签块数,单个table的签块数需达到16,才会向Beacon系统上报签块数。

  • 当前共有256个table,在1个惩罚周期内(24小时),256个table的总签块数需要达到138240,才会向Beacon系统上报签块数。

当一个节点的带宽或者计算能力远落后于其他节点,即节点的工作量排名在后10%,会对节点进行惩罚,节点信誉分最低将会下降到0.1,矿工惩罚请参见矿工惩罚机制

得票数

任何token持有者都可以使用其token兑换选票为高级矿工投票。

高级矿工得到的选票越多,当选的机会就越大。

高级矿工对于所得到的选票没有支配权,不可再用于为其他矿工投票。

注册成为高级矿工后,被选举为何种节点取决于矿工的选票:

  • 高级矿工被选举为auditor节点,矿工所获得的选票需要大于等于矿工实际质押的保证金(此处节点保证金以TOP计算,非uTOP)。

  • 如矿工继续增加保证金,若被选举为以上两种节点,需要增加相应的选票。

  • 当选票低于实际质押保证金时,高级矿工只能被选为validator节点。

# 节点stake算法

凡是需要参与共识的节点,都有节点stake,包括auditor、validator。不同节点stake算法不同。

# auditor stake

auditor stake与矿工保证金、矿工得票数、auditor信誉分相关,算法如下:

auditor stake=(矿工保证金+矿工得票总数/2)*auditor信誉分

# validator stake

validator stake与矿工保证金、矿工得票数相关,算法如下:

validator stake=sqrt[(矿工保证金+矿工得票总数/2)* validator信誉分]

validator stake最大值为5000(链上治理可调节)。

# 节点选举

在TOP Network,任何节点都有机会成为在职节点,只要满足相应要求。

矿工注册和节点分类排序是通过部署在Beacon上的智能合约以及VRF-FTS算法来处理的。

# VRF-FTS 随机分类排序和 leader 选举

节点分类排序过程利用了VRF-FTS算法。本质上,VRF根据一些输入数据产生一种可公开验证的随机种子,然后将其反馈给FTS算法。FTS算法通过一个节点的综合权益加权。Beacon上的一系列智能合约跟踪节点的工作负载贡献、总保证金、投票和任何不良行为。这些值都由另一个智能合约计算,构成综合权益,用于加权FTS算法。节点的综合权益越高,被随机分到分片或集群中的可能性就越高。

leader的选择也是通过VRF-FTS过程来确定的。

被选为hpBFT leader的机会也由一个节点的综合权益来衡量。

选举块使用时钟块表示,10s出一个时钟块。

# 共识 cluster 选举

一个共识cluster包括1个auditor group 和 2个validator group。不同cluster的选举彼此独立,不会同时进行;而某个cluster选举时会先进行auditor group选举然后进行validator group选举;同一个cluster下的两个validator group会进行同时选举。

选举频率与触发:每1小时轮换一次。

选举出块共识组:Beacon group。

选举流程:先确定auditor候选池节点列表 → 确定group中注销auditor数 → 确定auditor轮出与轮入节点数 →根据策略auditor轮换 → 确定validator候选池节点列表(上一步骤轮出的auditor会加入该候选池)→ 确定group中注销validator数 → 确定validator轮出与轮入节点数 → 根据策略对该cluster下多个validator group 同时轮换(上一group的节点不会轮入下一group中)。

# auditor group 选举

轮入节点的候选节点池:

Beacon上候选池合约中票数和保证金满足最低要求的高级节点中,所有未当选在职auditor,且没有在当前cluster担任在职validator的高级节点,且没有在其他cluster担任在职auditor的节点,创世节点也包括在内。

auditor有效stake:

节点注册合约中会保存每个节点的auditor stake。

当auditor stake=0(如创世节点),该节点不参与排序,直接赋值有效stake=1;

当auditor stake>0,对auditor stake进行排序,从大到小,以27个节点为一段(27为链上治理参数),同一段内的auditor有效stake 一致,下一段节点 有效stake比上一段要低10%向下取整(10%链上治理参数),首段有效stake值为1亿,有效stake最小值为1,即 An+1=max(An*90%向下取整,1)。具体如下:

A1: 100000000

A2: 90000000

A3: 81000000

A4: 79000000

……

An+1:max(An*90%向下取整,1)

轮出节点策略:

优先将不是auditor(包括票数不足、更改节点类型不再担任auditor)的节点和注销节点(包括节点主动注销,被系统惩罚注销)轮出,如果已经超出轮出节点数,那么采用随机算法确定哪些节点轮出;如果以上节点未超出本轮需轮出节点数,剩余节点从auditor group中按照 “(候选池最大有效auditor stake * 1亿 / 当前节点有效auditor stake)向下取整” 进行 FTS,即auditor_stake越高越小概率轮出。

轮入节点策略:

按照auditor stake从高到低排序,每27个节点一组,组内节点有效stake一致,按照有效stake进行 FTS,即auditor有效stake越高越大概率轮入。

轮换节点数:

候选池节点充足,auditor group没选满情况下,只轮入不轮出;候选节点不足,或者候选节点充足但auditor group已选满,此时轮入轮出节点数一致。

# validator group 选举

轮入节点的候选节点池:

Beacon上候选池合约中保证金满足最低要求的高级节点和验证节点中,所有未当选在职validator,且没有在当前cluster担任在职auditor的高级节点(包括本轮刚刚被选到auditor group中的节点),且没有在其他cluster担任在职validator的验证节点,注意也包括本轮刚刚被FTS算法轮换出auditor group的高级节点(注销、更改节点类型而轮出的高级节点不算),创世节点也包括在内。

轮出节点策略:

优先将不是validator(更改节点类型不担任validator)的节点和注销节点(包括节点主动注销,被系统惩罚注销)轮出,如果已经超出轮出节点数,那么采用随机算法确定哪些节点轮出;如果以上节点未超出本轮需轮出节点数,剩余节点从validator group中按照 “候选池最大validator stake * 1亿 / 当前节点validator stake” 进行 FTS,即validator_stake越高越小概率轮出。

轮入节点策略:

对validator候选池节点按照sqrt(validator_stake)进行 FTS,即validator_stake越高越大概率轮入。

轮换节点数:

候选池节点充足,auditor group没选满情况下,只轮入不轮出;候选节点不足,或者候选节点充足但auditor group已选满,此时轮入轮出节点数一致。

# edge 选举

选举频率:1小时

选举出块共识组:Beacon

选举对象:Beacon候选池合约中所有edge节点及创世节点。

轮入节点数:轮入所有的候选edge节点。

轮出节点数:注销、更换节点类型的edge节点,全部轮出。

# 共识 cluster leader 选举

第N轮leader从validator group中按照validator stake选,第N+1轮leader就从auditor group中按auditor stake选,交替选leader,每来一笔交易选一个leader。

leader选举的共识组为交易sender account所在的validator group和上级auditor group组成的共识group。

# 如何提高矿工综合stake?

矿工奖励制度中,说明了矿工奖励包括工作量奖励和选票奖励。

其中,高级矿工、验证矿工的工作量与其综合stake正相关,矿工的综合stake越高,被选中参与工作的几率就越高。

矿工综合stake与矿工保证金、所得选票、和信誉分正相关,您可以通过以下方法提高综合stake,从而提高矿工被选中参加工作的几率而获取更多工作奖励。

  • 增加矿工保证金

直接增加矿工保证金,提高综合stake。

  • 获取更多选票

获取社区用户更多投票,提高综合stake。

  • 提高信誉分

矿工正常工作,且工作量在网络中排名前20%,每24小时会获取0.01分的信誉分。

若矿工未能正常工作(未被选中或节点性能不足),不能获取信誉分,以致综合stake落后于其他矿工时,您可以通过提高保证金或者选票的方式代替信誉分来提高综合stake。