POC共识机制详解

POC共识机制详解

什么是POC共识

首先什么是区块链中的共识机制?能够确保分布式节点维护数据一致性的机制就是共识机制。比较成熟的共识机制有POW、POS、DPOS、PBFT等等。
POC是NULS独创的一种整合了DPOS和POS优点并加入了信用机制的一种新的共识机制,他的全称是Proof Of Credit,信用共识机制。和DPOS相比,POC的节点选举机制更灵活,去中心化成度更高,和POS相比效率更高,算法更简单清晰。
NULS希望创造一种高效的、去中心化的、全民参与的、公平的、全民收益的共识机制,POC就是这样诞生的。下面就从两个方面详细介绍一下POC的运行方式。

共识节点选举

如何创建节点

POC中参与区块打包和验证的节点,叫做共识节点。为了避免共识节点被大户完全控制,POC设计了一个更开放的节点选举方式。
首先,任何人都可以创建节点,因为POC节点的门槛足够低,只要锁定20000NULS以上的保证金,就可以创建一个节点,为了避免节点数量太少,POC限制了节点保证金的区间,只接受2w-20w的保证金,超出或者小于这个区间的保证金不能创建节点,交易一旦确认保证金将被锁死,不能再参与交易,直至停止节点后解锁。
每个节点都不需要堆外暴露自己的服务器位置,网络中人知道有这样一个节点,但并不能把节点和ip地址关联起来,这极大的降低了节点被针对性攻击的可能性,保证了节点的安全。
创建节点需要设置几个参数,如下:

1
2
3
4
5
6
创建地址:拥有停止节点的权限,需要妥善保管账户私钥。
打包地址:POC共识中每个区块都需要出块人签名,打包地址就是用来签名的地址,必须存在运行的节点中。
奖励地址:用于接收节点参与共识的奖励,不填时默认是创建地址相同。
节点名称:节点名称不允许直接设置,而是会自动选择创建地址的别名来作为节点名称。当创建地址没有别名时,会截取节点id的最后8个字符作为节点名称。节点名称可以用于搜索。
保证金金额:需要创建节点中存在足够的NULS来做保证金,最少2w最多20w个NULS。保证金和委托金额一样有共识收益。
佣金比例:节点可以接受任何账户的委托,节点会从委托人收益中抽取一部分佣金,比如佣金比例设置为10%,则会从委托人收益中收取10%作为节点的奖励

节点如何参与共识

创建好的节点的状态是“待共识”,就是字面等待的意思。如果2w保证金创建的节点就可以参与共识,那么这个网络最多可以达到5000个节点,这是一个非常庞大的数字,如此多的分布式节点来维护网络,效率会非常低下,而且2w的门槛很难叫做全面参与的共识。
POC的设计中,创建节点的门槛很低,但是参与共识的门槛在某些程度上很高,就是节点创建后需要得到至少20wNULS的委托才可以参与共识会议,同时每个节点接受委托设置了上限,目前是50wNULS,这是为了一定程度上减少节点数量,又保证一定的去中心化特性,同时也能提高网络性能。

委托

任何人都可以去参与委托,POC目前设置的门槛是2000个NULS起步,这是一个基本运行参数,可以通过社区治理方式进行修改,委托之后委托人就可以参与共识奖励的分配,获得相应的收益。委托的金额在交易生效一刻锁死,不能进行任何交易,直至节点停止解锁或者主动撤销委托退出共识,撤销后将停止收益的分配(有轮次延迟)。委托者随时可以通过退出共识操作,撤回自己委托的NULS。

如何停止节点

节点的创建账户有权利随时终止节点的运行,当节点停止时,所有委托在该节点上的金额都会解锁到委托人的账户中,节点的保证金

##节点运行

轮次

这里引入一个“轮次”的概念,POC的区块提交方式是以轮次的方式进行的,从创世块开始,按照共识节点格式来计算轮次,比如节点又a,b,c三个,出块间隔是10s,创世块时间是1970-00-00 00:00:00,则第一轮的时间就是1970-00-00 00:00:10至1970-00-00 00:00:40,依次类推。

出块顺序

每一轮的出块顺序使用伪随机的方式动态计算的,具体算法是把所有的节点的打包地址,解析为字节码,在字节码之前拼接本轮次的开始时间的时间戳,然后对拼接后的结果进行Hash256的摘要计算,最后对摘要进行排序,得到本轮所有节点的出块顺序。之后按照计算的结果每隔10s轮流出块。

红黄牌机制

区块链的共识机制必须考虑恶意节点存在的情况,在POC的设计中,理论上,只要恶意节点少于50%,就不能影响网络的安全性,在这个基础上,POC总结了一些对非正常行为的惩罚措施,以惩戒恶意或者低能的节点,就是红黄牌机制。

黄牌

当一个节点应该出块,却最终没能成功在区块链上添加一个区块时,发放一张黄牌,用以警告。这种情况的可能性是节点宕机、高度未同步、硬件不稳定、节点本地分叉等等原因,这是节点维护者必须尽可能避免的情况。
如何让节点不得黄牌?提高服务器性能和网络性能,开放网络连接端口,让更多的节点可以连接到,及时更新钱包版本,使用工具监视服务器运行状态等等。

红牌

红牌是惩罚作恶节点的终极方式,节点收到红牌后,将退出共识会议(有轮次延迟),不再获取共识奖励,不再参与区块打包。节点的保证金将锁定60天,在这60天中保证金不能参与任何交易。节点的创建地址从收到红牌惩罚起,就被剥夺了创建节点的权利,永远不能作为创建地址来创建节点了。目前红牌惩罚主要惩罚两个恶意行为:

  1. 节点离线,当节点信用值降至-1时,节点将收到红牌惩罚,
  2. 尝试分叉,当一个节点在一个高度打包出两个不同的区块时,认为节点在尝试分叉,如果100轮内存在3次尝试分叉行为,节点将收到红牌惩罚。
    注:尝试分叉很多时候是因为节点维护人员将打包地址导入了两个不同的钱包中,两个钱包都认为自己是节点,进行出块导致的。

    信用值的计算逻辑

    NULS团队最初为POC共识设计了非常复杂的信用值计算方式,但在最终上线时,简化了信用值计算的逻辑,并表示当前的信用值计算并不是完美的,不能百分百的代表节点的能力,后续会继续深入研究优化。
    当前的信用值计算方式:CreateVal = (100轮内正确出块数量-100轮内黄牌惩罚次数)/100。目前的取值范围是1~-1之间。

    如何计算收益

    POC的共识收益分为两个部分,交易手续费和网络维护的通胀奖励,交易手续费的计算是根据交易大小进行计算,最小的单价是0.001NULS/KB,网络维护的通胀奖励是500w/年,约合每个区块158548960Na(1.58548960NULS)。
    那么是不是一个节点打包成功一个区块就有1.58548960NULS奖励了呢?并不是的。POC追求公平性,每个节点的保证金和委托金额都可能不一样,所以实际的计算中,奖励是以轮次为计算单元的。具体算法如下:
  • 首先计算本轮全部共识奖励之和
    1
    sum(reward) = 158548960Na * 本轮节点数量

每个节点根据节点权重来划分各自应得的比例,用节点自己的权重除以所有节点的权重之和,就是自己节点本轮所占节点的比例,计算方式如下:

1
2
weight(node) = (保证金+接受的委托总额)* CreateVal
reward(node) = sum(reward) * weight(node)/(weight(0)+…+weight(n))

谈一谈通胀

因为POC和通胀是息息相关的,所以这里简单介绍一下NULS的通胀机制(最近社区中在讨论减少通胀的提案,这里只谈之前的通胀方案)。
NULS每年最大通胀金额为定额的500wNULS,第一年不超过总量的5%,第二年不超过总量的4.761%,比例逐年递减。
上面有两个词“最大”和“不超过”,为什么不确定的说一个数字?因为当一个节点应该出块,却没有出块时,在计算收益时,其他节点会计算该节点的权重,并未该节点预留了份额,但因为节点没有出块,会导致这份通胀没有人领取,就是取消了,所以500w只是理论值,实际的通胀要更少。

信用值和收益的关系

首先完美的状态是每个节点的信用值为1,此时各个节点按照保证金和委托金额来分配本轮的共识奖励,一分付出一分回报,很公平。当有一个节点信用值低于1的时候,此节点的权重下降,但其他节点权重不变,导致此节点占比下降,所以收益下降。此时因为此节点的权重下降,其他节点的权重不变,所以占比上升,收益也会上升。所以节点的信用值,直接影响收益,需要谨慎对待。

如何选择节点进行委托?

选择共识中的信用值高的节点可以最快获得收益,如果知道哪些节点比较稳定也可以优先考虑。
钱包中节点列表的排序规则如下

  1. 共识中排在前面
  2. 信用高排在前面
  3. 可以委托金额高的排在前面
    4.已经不可再委托的排在最后

    如何操作?

    参考:操作指南
-------------The End-------------