Skip to main content

共识节点选举

Neo是一个开放透明的区块链网络,任何人都可以发起交易成为候选人,或者对候选人进行投票,根据投票情况,计算出共识节点和委员会成员。

note

委员会可以通过投票对Neo网络的一些参数进行修改,目前包括:交易每字节网络费,单位存储费用,计算费用费率,地址屏蔽/解除屏蔽,等等。

候选人本身并无职能,但根据候选人得票数量排序,排在最前面的一定数量的候选人将被选为委员会成员和共识节点。三者之间逻辑关系如下图所示。委员会和共识节点没有明确的大小关系,但默认的委员会数目(21)大于共识节点数(7)。

每个地址均有投票给另一个地址的权利,候选人票数为所有投票给它的地址的NEO余额之和。

Neo网络中的投票是一个动态持续的过程,若投票账户发生NEO资产变动,则被投票地址的票数将在每个区块随之更新。共识节点和委员会成员也会每21个区块变动。

note

创世块作为第一个块,其NextConsensus被设定为备用共识节点的2/3多方签名脚本hash值。

议员到议长#

按照上面的方法,得到了参与本轮共识节点的议员列表,以及议员编号(即列表序号)。根据共识算法,议长由公式p = (h - v) mod N决定,其中h是当前需要达成共识的块高度;v是视图编号,刚开始从0开始;N是共识节点总数。

议长在共识阶段,将发送PrepareRequest消息,并附带上决定下一个区块共识节点的NextConsensus。议长结合打包Block中的交易,与之前的投票情况,得出下一轮共识节点,再创建三分之二多方签名脚本的hash值作为block.NextConsensus,完成本轮交易对下一轮共识节点的锁定。