Polkadot网络本质上是一个异构多链的区块链网络,未来网络中会有非常多不同共识,不同结构的平行链。每条平行链都有自己特有的数据、P2P网络架构,并通过链接到Polkadot中继链来一起共享安全性。
平行链到中继链上的数据消息传输、中转和验证确认等非常重要的工作职能,都是需要中继链上的验证者来完成的。每个验证者本身不会包含太多的数据,不需要占用网络的太多带宽和资源,以此来保证波卡网络可以不断拓展。
波卡、Cosmos 和 ETH 2.0 的验证人数量比较
当我们来讨论Polkadot网络应该有多少数量的验证人这个话题时,我们可以比较一下其他多链网络的验证人数量和架构情况。
Polkadot的测试网络最初会设置大约250个验证人,然后一直拓展到至少1000个。我们的目标设想是,每个平行链分配10个验证人。Polkadot测试网络刚启动时,并不会有太多的平行链,可能大约只有10条平行链。然而我们会努力拓展开发到100条左右的平行链,每条平行链10个验证人的话,100条平行链就是1000个验证人。
相比较而言,Cosmos网络中的每条链会自己选择100个验证人,有一些验证人可能在多条链中都担任验证人的角色。
而以太坊2.0的架构,则是有1024个分片,每个分片拥有300-1000个验证人,因而这是非常多数量的验证人的需求。以太坊2.0获得这么多的验证人资源,他们的机制是每32个节点产生一个验证人,因此如果我们需要过1000个节点,就需要通过30个验证节点。
为什么要控制验证人数量
我们从通讯和网络限制的角度来分析下,为什么说验证人是稀缺资源,要控制其数量。
我们要了解到区块链网络中的一台机器上可以运行多少个验证人;一台机器可以接入多少个P2P分布式网络;网络拥有多少个连接点和带宽。因此,一个区块链生态中并没有那么多人可以参与来做验证人,本质上验证人是一个稀缺的资源。因此我们才需要在架构设计上去控制验证人的数量。
从Polkadot网络中当个平行链的视角来看,每个平行链中的收集人会来产生平行链的区块,之后数据会提交给验证人来验证,当绝大多数的验证人验证并签名了这个区块的区块头,此平行链的签名验证过的区块头就会进入到中继链的区块。
因此在每个平行链10个验证人这样的分配机制下,我们仅需要5-7个验证人来验证和签署平行链中新产生的区块。
波卡如何向平行链提供安全
然而,因为有很多平行链在不断产生新区块,会有某一些验证人串通作恶,让无效和作恶区块被验证确认写入到Polkadot中继链网络的情况发生。
从Polkadot到白皮书中有介绍,面对这样的潜在作恶的情况,Polkadot是依靠钓鱼人的决策去挖掘和指出那些无效区块来保证Polkadot的网络安全的。
当钓鱼人发现某一个区块是无效的,他们需要质押一些DOT代币并提出这个区块是无效的指令,因而这个区块会需要被再次验证和审核,如果最终此区块被证实是无效的,那么验证人质押的DOT代币会被没收,让钓鱼人获得奖励,反之则钓鱼人质押的DOT代币会被没收。
我们通过这样的机制设计,来确保验证人没有经济动力去验证通过一个无效的区块,也确保钓鱼人有这个经济激励去审查是否有无效区块产生,指出问题,一同来确保Polkadot的网络安全。
问题:数据可用性
然而在这种主链侧链结构的区块出块和验证的机制设计中,会有一个区块数据是否可以被获得的问题(Data Availability Problem)。
比如在比特币网络中,当一个节点挖出了一个区块,其他人并不会发现这个新出的区块的价值,直到他们看到这个区块出现在最长的那条链上面,因而没人会提前对此区块做验证和工作。尽管会有少部分自私挖矿的行为,但不论如何,节点都需要把这个区块传播到最长链上面才可以完成验证。
然而在分片和多链的架构中,当中继链区块中含有这个区块的区块头,即便全节点并没有收到这个区块数据,平行链中产出的一个区块都会被规范化纳入到中继链中。但钓鱼人并没有办法去验证一个他们都从没有见过的区块,验证人那边无法知道平行链的全节点是否已经拥有这个区块数据。
当这种比较尴尬的情况出现时,验证人和钓鱼人谁犯错,如何去判定谁的DOT代币会被没收就会变得很主观,无法推进。这个数据无法获得的问题的源头在于,只有少部分验证人有平行链新产生区块的所有数据,然而从拓展性方面去考察,也只能少量验证人拥有平行链的区块全数据即可推进验证。
解决方案:纠删码
解决这个问题的方案叫做纠删码(Erasure Coding):平行链上的验证人将区块数据通过Erasure Code的方式将数据编码和片段拆分,并将数据片段发送给其他每个验证人。当三分之一的验证人获得了区块编码了的数据片段时,即可重新构建出这个平行链的区块。
这样的设计是为了让区块数据片段可以接入到Polkadot的Grandpa共识。
Grandpa共识机制是一种拜占庭容错的共识算法,也就是说仅在大于三分之二的验证人投票验证通过了之后,才完成最终区块的最终确认。
如果验证人仅对拥有了的Erasure Coding数据片段的平行链区块进行投票,并打入中继链区块中,那么我们可以确认,我们可以获得三分之二的有Erasure Coding数据片段,并足以通过他们来重构平行链产出的区块并进行最终确认,即便另外三分之一的区块是作恶或者数据消失了的。
有效性检查协议
当然在这些区块被重新利用之前,我们需要让这些通过数据片重新构建出来的区块及时被验证。但网络中的很多钓鱼人并没有办法要求所有的验证人提供他们拥有的数据片段,因为这些验证人并没有互相连接,没有权限接入到整个网络。
总结来说,Polkadot的区块有效性检查协议,用钓鱼人来报告区块是否无效,收集人来报告区块数据是否不可用。当有报告产生的时候,额外的验证人会需要取得这个区块,或者通过数据片段来重组出这个区块并再次检查。
这个额外验证人,会通过 VRF (可验证随机函数) 的方式来选出,来确保这个额外验证人跟这个有问题区块的验证人和收集人没有私下关系,通过增加这个额外的随机性来确保再次验证的公正和安全。
如果有任何的验证人认为某个区块是无效的,所有的验证人都需要下载并检查此区块的情况,并没收出了无效区块的验证人的DOT代币。这种情况并不会经常发生,因此这个机制并不会太影响Polkadot网络的拓展性。
后续的研究方向
基于上面介绍的有效性检查协议,后续需要拓展研究的问题就是网络传输这块。如果需要将Erasure Coded的数据片段全部传播(Gossip)到整个区块链网络中,则会消耗大量的网络流量,影响整个网络的可拓展性。我们需要让验证者和验证者之间的数据信息传输足够地有效率,把这个数量拓展上去。
因此,之后需要进一步研究和探索的问题就是:是否可以采用直接连接的方式让验证者之间两两互联?是否可以在平均距离直径为2的网络架构一个验证人Hub来拓展架构?是否可以间接地架构在一个P2P分布式传输网络中?
结论
通过上面介绍的有效性验证协议,只要网络中有足够多的诚实不作恶的钓鱼人和收集人,Polkadot网络就可以确保无效的或者没有数据的区块不会被最终确认验证,并且可以让外部来攻击Polkadot平行链的区块变得很昂贵,贵到比购买一个平行链上的三分之二的权益还要高。
从结果来说,这样的机制设计和协议也可以让Polkadot网络相比其他的多链网络需要更少数量的验证人来达到良好的可拓展性。
如果你希望了解更多的技术和研究资料,可以通过下面web3基金会研究院的链接来获得。
评论
查看更多