在一个时间窗口内,一个节点会收到多个通过验证的块,在这些块中随机选取一个作为自己的下一个块。
在下一个时间窗口,节点如果没有收到块,同时发现网络整体的块高度已经高于自己,将丢弃掉上一个确认的块。
如果块高度相同,少数服从多数。
Proof of work 的思路是,在一个时间窗口内,只有一个正确答案,这样就保证了整个网络的一致。换个思路的话,为什么不能在同一个时间窗口内,产生多个正确答案呢?
由于网络中同时存在多个正确的块,那么就需要一种机制来从中选取一个,公平起见,就用完全随机的方式。
丢弃块的机制是为了给系统提供自我纠错的能力。Ethereum 的 DAO 攻击事件,需要开发者带领社区对区块链进行硬分叉,说明系统本身是没有纠错能力的,需要人为干预,似乎目前所有区块链系统都是这样。
在没有交易发生的情况下,有可能所有节点都处于等待的状态,此时因为块高度相同,没有节点愿意丢弃自己的块,整个网络是割裂的。这是一种博弈的状态,所以要按照少数服从多数的原则打破平衡。
为了避免富有的人越富有,有算力的节点更富有,有财产的节点更富有,公平地给予每个参与到网络中的节点,获取块奖励的机会。
每个节点各自随机,选取一个块。而不是使用类似 Varifiable random function 的方式,让每个节点都使用确认的结果。
完全随机。
完全随机是指,节点收到 100 个块,选中某个块的概率就是 1%。有限制的随机是指,例如,上一个块已经是某个节点提供的,下一个块就不再使用它的块。相应的,块奖励也不会给它。
如果是有限制的随机,已经产生过块的节点,和没有产生过块的节点,就有了不一样的权重,无论权重侧重于哪一边,都不是合理的方式。如果产生过块的节点更有权重,依然会存在富有的人越富有的问题。如果没有产生过块的节点更有权重,网络中的参与者就会疯狂创建新的账户,使用没有获得过块奖励的节点产出块。
一定会,但分叉是小范围的。如果网络效率很高,那么只有最新的一两个块会处于不确定的状态,等大多数节点确认下来,就成为主流的一条链了。
不会,因为分叉会被淘汰。新加入网络的节点,肯定要选择某一个节点同步数据。对于其他节点,随机选择是指从通过验证的块中选择,通过验证的含义是,历史数据和自己一样。那么当某一条分叉链没有交易产生,由于纠错机制的存在,分叉链会不断丢弃掉自己的块,直到和主网络一致。
如果新加入的节点不同步已有数据,而是另起炉灶,那么它需要拉拢超过整个网络大多数节点规模的追随者。比如有 1000 个节点,由于完全随机的机制,它需要另外 1000 个节点,自己的链才会变为网络中的主流。这种做法可以视为攻击网络的一种方式。难度似乎比 51% 攻击还要高。
由于块高度优先的方式加上少数服从多数的原则,可能会认为,攻击者甚至不需要 51%,只需要掌控块高度最高节点数的 51%,就可以形成攻击。
这里也许存在概念上的误区,攻击是指颠覆原有的数据而不是产生新的数据。51% 是不存在的。
对于用户来说,确实是不好的体验,可能上一分钟交易已经成功了,下一分钟节点丢弃了块,交易撤销了。
不过好在这种不确定是短暂的,可以认为确认一个块需要两个时间窗口或者更多个。因为即时网络中存在小范围的分叉,最终也会趋于大多数一致。
所以问题变成了客户端确认一笔交易的时机。
一个节点收到 10 个块,确认 1 个,其他的块就浪费掉了。包括反复的纠错,也属于资源的浪费。
PoW 浪费的是算力资源,这种随机确认块的方式,浪费的是网络传输的资源,因为如果一个节点想要自己的块被确认,它首先要让其他节点接收到它的块。那么假如网络中有 1000 个节点,就需要每一轮都把块广播给 1000 个节点。
好在网络传输资源的浪费是有上限的,区块链网络本身就需要把每一笔交易广播到网络中,与其相比,现在只是需要多广播一个块的内容,算不上太大的负担。而且由于是完全随机地选择块,节点试图通过更高的网络配置来多次广播块也是没有意义的。
如果节点获取到网络中块高度非常低,按照规则 2,是不是就会逐渐丢弃掉所有块?
不会。要区分清楚,从网络中获取到异常信息,和连接不到网络、无法从网络总获取信息,是两回事。假如一个节点的路由表中有 1000 个节点的连接记录,由于网络状况异常,只能连接到 10 个,此时就属于异常情况,节点不应该按照正常的共识流程丢弃块。
在这篇论文《Blockchain Consensus Algorithms: A Survey》的第 16-17 页,提到了随机选择出块节点的共识方式,以及基于 coin-age 的选择方式。这确实是一个随机的概念,但论文描述的是随机是指随机选择节点,而不是针对块,并且是在 PoS 的语境下讨论的,出块节点有被选定、被内定的意味。