共识投票机制

BFChain区块锻造者是根据受托人的得票数以及在线率等参数按照底层的共识规则推选出来的(详见区块锻造者竞选)。

受托人的得票数是通过全网持有主链权益的地址账户对已开启接收投票的受托人进行投票而获得的。

链上所有持有主链权益的地址账户,均可以在已支持的各类Dapp(如BFChain APP)或者BCF节点程序中对受托人进行投票。受托人获得越多的得票,其成为锻造者的概率将越大。

本章将分五个部分介绍BFChain的投票规则:

  • 获得选票
  • 自动投票
  • 手动投票
  • 投票激励分配
  • 轮末计算

获得选票

选票是链上的地址账户用于投给受托人的票据。地址账户只有获得选票,才能给受托人投票。

链上地址账户要想获得选票,需要保证:

  • 地址账户持有主链权益
  • 开启投票治理且连续在线满6个小时(即连续三个轮次均在线)

地址账户在每一轮能够获得的选票数量(用于下一轮投票)的共识公式为:

地址账户每一轮可获得的选票数 = balance balanceWeight + numberOfTransaction numberOfTransactionWeight * Rate

其中:

  • balance:截止上一轮,地址账户拥有的主链权益;
  • balanceWeight :主链权益比重,常量,创世共识默认为:5000;
  • numberOfTransaction:地址账户在上一轮中已被确认的事件数量;
  • numberOfTransactionWeight:事件量比重,常量,创世共识默认为:1;
  • Rate:max(上一轮每个参与投票的地址账户主链权益)/max(上一轮每个参与投票的地址账户已被确认事件数量)。

BFChain将于每一轮轮末块时计算每个账户下一轮拥有的选票数。

自动投票

自动投票,是指BFChain底层提供推荐算法,节点自主配置算法参数值。当节点开启自动投票后,底层会根据算法和配置参数值自动对满足条件的受托人进行投票。

自动投票推荐算法

BFChainPC.Config.AutoVoteModel 中详细列出了底层推荐算法涉及的配置参数,几个配置参数释义如下:

参数名 释义
enable 是否为节点开启自动投票 true:开启
false:关闭
useConfigFee 是否使用默认配置的自动投票上链费 true:自动投票上链费使用参数‘fee’里设置的值
false:不使用参数‘fee’里设置的值
fee 自动投票上链费
priorRecommendedNumber 是否优先保证候选人个数 true:则按照推荐算法优先选出参数‘maxNumberofRecommended’里设置的候选人个数
false:不使用
maxNumberofRecommended 本节点选出的候选人数量上限
numberofRounds 选取的区块范围,以下推荐算法中的几个参数值的统计从哪个区块范围开始计算(从最近的100轮)
productivityPercent 在线率占比
forgedBlocksPercent 锻造的区块数量占比
applyTxPercent 打包交易数量占比
votePercent 上一轮得票率
newDelegatePercent 新受托人占比
minBeSelectProductivity 最小可被推荐账户在线率

举例:

参数 释义 设置值
enable 是否为节点开启自动投票 true
priorRecommendedNumber 是否优先保证推荐人个数
maxNumberofRecommended 本节点选出的候选人数量上限 57
productivityPercent 在线率占比 30%
forgedBlocksPercent 锻造的区块数量占比 30%
applyTxPercent 打包交易数量占比 20%
votePercent 上一轮得票率 10%
newDelegatePercent 新受托人占比 10%

上表的设置,表示本节点通过自动投票最大需要选出57个候选受托人,这57个候选受托人的组成为:

在选定的区块范围内在线率最高的17(57*0.3)个开启接收投票的受托人;

在选定的区块范围内锻造的区块数量最多的17(57*0.3)个开启接收投票的受托人

在选定的区块范围内打包交易数量最多的11(57*0.2)个开启接收投票的受托人

上一轮得票率最高的6(57*0.1)个开启接收投票的受托人

在选定的区块范围内新注册受托人中的6个开启接收投票的受托人,选的规则为:得票数 > 主权益数 > 公钥

自动投票接口

BFChain生物链林提供如下接口,用于节点自动投票:

手动投票

手动投票,是指节点可对链上已开启接收投票的任一受托人进行投票,且所投的票数由节点自己把控,只要不超过本节点当前拥有的选票数的最大值即可。

手动投票接口

BFChain生物链林提供如下事件接口,用于节点手动投票:

  • 手动投票

投票激励分配

当锻造者锻造好一个区块后,底层将直接计算上一轮中所有给该锻造者投票的地址账户应获得的投票激励,激励权益将直接发放到各投票地址账户。

激励公式

锻造该区块所获得的投票总激励totalRewardOfVote : {rewardPerBlock + sum(eachtransactionfeeOftheBlock)} * votePercent

  • rewardPerBlock:即区块激励,由底层共识决定,不同的区块高度锻造时,给予的区块锻造激励会不同。当前高度,底层共识默认为15BFT;
  • sum(eachtransactionfeeOftheBlock):链上每笔事件的生成都需要支付一定的上链费,这个上链费可以是账户在发起事件时设置,也可以采用底层共识算法推荐的最佳上链费。其中 eachtransactionfeeFortheBlock 为打包进此区块的每笔事件的上链费; sum(eachtransactionfeeOftheBlock) 即为对打包进此区块的每笔事件的上链费求和。
  • votePercent:即投票激励比重,此为常量,由底层共识决定,当前默认为0.6

上一轮中每个给这个锻造者投票的地址账户应获得的投票激励 = totalRewardOfVote  * (该地址账户上一轮投给该锻造者的票数 / 该锻造者在上一轮获得的总票数)

有关BFChain生态的共识激励机制,请参考 共识激励机制一章,本小节不做详细说明。

轮末计算

以下数据将于每一轮轮末块时计算:

  • 统计开启接收投票的受托人账户在本轮累计的得票数
  • 统计并保存已开启投票治理的地址账户应获得的下一轮的选票数
  • 更新已开启投票治理的每个地址账户在轮末时的账户主权益和本轮已确认的事件数量
  • 更新Rate值(Rate = max(上一轮每个参与投票的地址账户主链权益)/max(上一轮每个参与投票的地址账户已被确认事件数量))