作者
蒋哲周蓉
来自趣链科技数据网格实验室的BitXHub团队,主要负责区块链账本互通技术的相关研究工作。
简介:本文是Polkadot系列的第三篇。
说到Polkadot,估计你听到的关于它的最大好处就是它为并行链提供的共享安全性。共享安全保证了安全性不会因为区块链网络的碎片化而降低。那么共享安全是如何实现的呢?
本文主要从Polkadot为并行链提供的有效性和可用性两个保障来帮助你深入理解共享安全性。
文末:综合考察波尔卡多系列文章
首先,我们来回顾一下前面提到的Polkadot的四个角色:
验证器(验证器)
它是中继链的整个节点,中继链会通过在验证者池中随机分组的方式将验证者分配到不同的并行链上。验证者将接受来自收集者的打包块并验证其有效性,然后结合一致性算法确认收集者提交的块。
收集器(整理器)
它是并行链的整体节点,负责收集和执行并行链事务并生成候选块,向验证者提交块和证书,通过收集事务获取手续费。收集人类似于战俘共识区块链中的矿工。
提名者(提名者)
Polkadot中数字货币dot的持有者会选择自己信任的验证者来质押DOT,然后分享验证者的收益。
渔民(渔民)
它也是并行链的整个节点,监控验证者的非法行为。如果验证者作恶(比如批准无效的平行链块),钓鱼者可以向其他验证者举报,得到相应的举报。
验证验证验证验证是指区块链系统对账簿状态变更的验证,以达到全网一致。
一个普通的区块链,比如以太坊,把每个块广播给全网的以太坊节点。这些节点将验证并执行块中的事务,确保最终生成的状态根等信息与块头中的信息一致。在Polkadot中,平行链的嵌段一致性需要在以下三个级别进行验证:
第一级有效性验证由并行链的验证者实现,可以防止收集者作恶。
每隔一段时间(具体间隔由BABE consensus算法决定),中继链会通过随机分组的方式将验证者池中的验证者分配到不同的并行链中,每个并行链会被分配给多个验证者。
并行链块上的收集器收集事务,生成块B后,将块B、有效性证书和一些相关数据发送给当前并行链的验证者。这些并行链的验证者在收到块和数据后,对块进行验证,如果无效则忽略该块;如果分块有效,则将接收到的内容分成几个部分,构造一棵默克尔树,然后将每个内容、默克尔证书和分块信息组合起来,签名后分发给其他验证者进行验证。
第二级有效性验证由钓鱼者保证,可以防止并行链验证者作恶和并行链验证者与收集器联合作恶。
渔民一般都是一个平行链条的节点。它首先需要在中继链上放置一个存款,然后从收集器节点连续收集块并验证有效性。如果该块包含无效交易,钓鱼者将提交一份报告。如果事实证明它的判断是正确的,它会得到丰厚的奖励,如果判断错误,它会失去自己的存款。
第三级有效性检查由非并行链验证器执行。
这些验证者的选择过程是私有的,验证者的数量由钓鱼者给出的无效报告和收集者给出的不可用报告的数量决定。如果检测到无效的平行链块,签名的验证者将受到惩罚,其保证金将被部分或全部扣除。
在上述三个层次的有效性验证中,angler的有效性验证比较好理解,因为它是并行链的整个节点,拥有并行链的所有状态数据。只有重新执行接收到的block事务,才能获得新的状态数据和状态根来验证block的有效性。
然而,验证者是中继链的整个节点。它如何验证平行链的块?它维护所有并行链的状态数据吗?这显然是不可能的。
下面重点说一下。
Polkadot验证器如何验证并行链的块?
当并行链接到Polkadot时,需要向中继链注册一段web汇编代码,称为STVF(State Transition Verification Function,状态转移验证函数)。验证者将使用STVF验证并行链的有效性。
假设并行链PC上最后确认的块是B0,当前要释放的块是B1。最后一个块被中继链确认后,B0的相关信息被记录在中继链上的块R0B上,比如并行链执行B0后的状态根R0。之后,并行链收集器C封装块B1,获取该块到其他并行链的跨链消息M,生成有效性证明和一些元数据(PC.id,H(B0),H(R0B),Rin,Rout,).这里的Rin是块B1执行前的并行链的状态根,Rout是执行后的状态根,H(B0)表示并行链块B0的hash,H(R0B)表示中继链块R0B的hash。
生成有效性证书的过程本质是在块中执行事务,记录执行过程中读写的状态数据,结合块执行前后的两个状态根生成证书。
如果用*xz来表示梅克尔根X中叶子Z的SPV证明,那么块B的有效性证明数据可以表示如下:
B=U {*Rinx | B读取x }{ * Routx | B写入x }
例如,假设并行链提交的块B包含两个事务:
1.甲转账50给乙。
2.丙把钱转给了丁
在执行过程中,需要读写A、B、C、d四个账户的状态,假设并行链中四个账户的余额在块执行前都是100,那么有效性证书包含了下面两个图中用颜色标注的数据,其中黄色部分就是哈希值。
可以看出,无论并行链本身的状态数据有多少,一个块的有效性证明数据都是由该块的事务所涉及的状态读写集的SPV组成的,因此其大小是有限的。
之后,收集器C将块B1、事务的有效性证书、并行链的传出队列中的消息集M和元数据发送到验证者之一,然后验证者将这些信息分发给并行链的其他验证者。每个验证器加载并行链的STVF,以验证接收到的并行链块的有效性。
STVF的核心也是在并行链块中执行事务。在这个过程中,需要读取证明数据中的read集合,同时会生成write集合,最后生成的write集合会与证明数据中的内容进行比较。此外,还可以通过接收到的元数据中的信息进行一些其他的验证,比如根据H(R0B)找到这个块中存储的B0的状态根R0,将R0与接收到的Rin进行比较。如果所有这些信息都一致,则该块被验证。
最初接收到并行链块的验证者会生成一个候选回执,该回执会记录并行链块B1的相关信息,如并行链PC的id、收集者C的id、块B1的hash、块B1执行前后的状态根等。并签名广播给中继链的所有节点(可以认为是中继链的一个事务)。当该候选接收最终被干线链块确认时,并行链PC的块B最终被确认。
这种有效性验证方法可以保证并行链中单个块的状态转换是有效的。如果并联链从第一块开始,中继链验证有效性并确认块,那么并联链的整个链的有效性就可以得到保证。
可用性保证可用性保证是指即使某些节点作恶,区块链系统仍能为业务系统提供可用的服务保证。
在Polkadot中,假设这样一个场景:并行链收集器将block B打包提交给验证者,验证者收到block,通过有效性验证,block最终被中继链确认。
但是,如果收集器节点作恶,没有将块广播给并行链中的其他节点,那么并行链中的其他节点就无法获得块并更新本地状态数据,并行链就无法阻塞出去。
为了防止这种情况的发生,验证者在验证后会通过纠删码技术将并行链块PC和有效性证书分成N个段(N的个数为全网验证者的个数),并将这些段广播给全网所有的验证者。每个验证者将获得一个段,并保留一段时间。
之后,只需要n/3段就可以恢复原始数据。在这种情况下,即使收集器节点作恶,并行链中的其他节点仍然可以从中继链中的验证器获得最后一个块的纠删码片段,并恢复该块。
通过总结Polkadot的有效性和可用性的介绍,可以看出中继链提供了多种保证并行链安全的措施:随机分配并行链验证者验证块,钓鱼者监督,非并行链验证者重新验证,中继链备份并行链块数据。
这种设计方法在保证整个区块链系统横向扩展的过程中,不会降低单个网段的安全性。对于并行链来说,享受到了中继链提供的安全保障,只需要安心专注于自己的区块链业务,极大地方便了区块链业务的发展,减少了单个并行链对安全的额外投入。
参考资料:
[1]可用性和有效性,
https://research . web 3 . foundation/en/latest/polkadot/avail ability _ and _ validity . html
[2]副链块的路径,
https://polkadot . network/the-path-of-a-parachain-block/
[3]布尔吉斯、塞瓦洛斯、查班、哈贝迈尔、侯赛尼、拉马、阿尔珀、罗、什拉济、斯图尔特和伍德。polkadot概述及其设计考虑。arXiv预印本arXiv:2005.13456,2020。