Polkadot系列——如何实现共享安全性

2020-09-12 17:33 栏目:经验之谈 来源:网络整理 查看()

简介:本文是Polkadot系列的第三篇。

说到波尔卡多,估计波尔卡多最大的优势就是它给并行链提供的共享安全,共享安全保证了安全性不会因为区块链网络的碎片化而降低。那么共享安全是如何实现的呢?

在本文中,我们主要从Polkadot为并行链提供的有效性和可用性两个保证来帮助您深入理解共享的安全性。

回顾

首先,我们先来回顾一下上面提到的波尔卡多的四个角色:

验证器(验证器)

它是中继链的整个节点,中继链会通过验证器池中的随机分组将验证器分配给不同的并行链。验证者将接受来自收集器的打包块并验证其有效性,然后结合一致性算法确认收集器提交的块。

收集器(整理器)

它是并行链的整个节点,负责收集和执行并行链的事务,生成候选块,向验证者提交块和证书,通过收集事务获取手续费。收藏家和区块链战俘共识中的矿工相似。

提名者(提名者)

Polkadot中数字现金dot的持有者会选择自己信任的验证者来质押DOT,然后分享验证者的收益。

渔民(渔民)

它也是并行链的整个节点,监控验证者的非法行为。如果验证者做了恶(比如批准无效的平行链块),钓鱼者可以向其他验证者报告,得到相应的报告。

有效性验证

有效性验证是指区块链系统对账簿状态变化的有效性验证,以实现全网的共识。

对于一个普通的区块链,比如以太网,每个块都会广播到整个网络的以太网节点,这些节点会验证并执行块中的事务,以确保最后生成的状态根等信息与块头中的信息一致。在波尔卡多,平行链的块一致性需要在以下三个级别进行验证:

一级有效性验证由并行链验证器实现,可以防止收集器作恶。

每隔一段时间(具体间隔由BABE共识算法确定),中继链会通过随机分组将验证者池中的验证者分配给不同的并行链,每个并行链会分配给多个验证者。

并行链块上的收集器收集事务,生成块B,然后将块B、有效性证书和一些相关数据发送给当前并行链的验证者。收到块和数据后,这些并行链的校验器对块进行校验,如果块无效,则忽略该块;如果块有效,则将接收到的内容分成若干部分,构造一个默克尔树,然后将每个内容、默克尔证书和块信息合并,签名后分发给其他验证者进行验证。

二级有效性验证由渔夫保证,可以防止并行链验证者作恶,并行链验证者和收集器共同作恶。

钓鱼人一般都是平行链的节点。首先,它需要在中继链上放置一个存款,然后从收集器节点连续收集块,并验证有效性。如果该区块包含无效交易,钓鱼者将提交一份报告。如果证明其判断正确,将获得丰厚的回报,但如果判断错误,将失去自己的存款。

第三级有效性检查由非并行链验证器执行。

这些验证器的选择过程是私有的,验证器的数量由渔民给出的无效报告和收集者给出的不可用报告的数量决定。如果检测到一个无效的并行链块,签名的验证者将受到惩罚,其押金将被部分或全部扣除。

在以上三个级别的有效性验证中,钓鱼者的有效性验证很好理解,因为它是并行链的整个节点,拥有并行链的所有状态数据。只有通过重新执行接收到的块事务,才能获得新的状态数据和状态根,以验证块的有效性。

但是验证者是中继链的整个节点。怎么能验证平行链的区块?它维护所有并行链的状态数据吗?这显然是不可能的。

下面我们来重点介绍一下

波尔卡多验证器如何验证并行链的块

进入Polkadot的并行链接需要向中继链注册一个名为STVF(状态转移验证函数)的web汇编代码,验证者将使用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.从a转移到b 50

2.c向D 10转账

在执行过程中,需要读写账户A、B、C、d的状态,假设并行链中四个账户的余额在块执行前都是100,那么有效性证书中就包含了下面两个图中用颜色标注的这些数据,其中黄色部分是哈希值。

Polkadot系列——如何实现共享安全性

可以看出,不管并行链本身的状态数据量有多少,块的有效性证明数据都是由块的事务所涉及的状态读写集的SPV组成的,因此其大小是有限的。

之后,收集器C将块B1、事务的有效性证书、并行链的输出队列中的消息集M和元数据发送给其中一个验证器,然后验证器将信息分发给并行链的其他验证器。每个验证器加载并行链的STVF,以验证接收到的并行链块的有效性。

STVF的核心也是在并行链块中执行事务。在这个过程中,需要读取证明数据中的读取集,同时会生成一个写入集,最后将生成的写入集与证明数据中的内容进行比较;此外,还可以通过接收到的元数据中的信息进行其他一些验证,如根据H(R0B)找到存储在块中的B0的状态根R0,并将R0与接收到的rin进行比较。如果所有信息一致,则验证该块。

最初接收并行链块的验证者将生成一个候选回执,该回执将记录与并行链块B1相关的信息,如并行链PC的id、收集器C的id、块B1的散列、块B1执行前后的状态根等。并签名广播给中继链的所有节点(可以认为是中继链事务)。当候选收据最终被中继链确认时,并行链PC的块B最终被确认。

这种有效性验证方法可以保证并行链中单个块的状态转移是有效的。如果并行链从第一个块开始,并且中继链验证有效性并确认该块,则可以保证整个并行链的有效性。

可用性保证

可用性保证是指即使某些节点作恶,区块链系统仍然可以为业务系统提供可用的服务保证。

在Polkadot中,假设这样一个场景:并行链收集器封装块B并提交给验证者,验证者接收块,通过有效性验证,最后由中继链确认块。

但是收集器节点作恶,没有将块广播给并行链的其他节点,所以并行链的其他节点无法获取块并更新本地状态数据,并行链也无法进行块操作。

为了防止这种情况发生,验证者在通过验证后,会利用纠删码技术将并行链块PC和有效性证书分成N段(N的个数为全网的验证者个数),并将这些段广播给全网的所有验证者,每个验证者会得到一段并保留一段时间。

之后恢复原始数据只需要n/3个片段。在这种情况下,即使收集器节点作恶,并行链中的其他节点仍然可以从中继链的验证者那里获得最后一个块的擦除代码片段,并恢复该块。

Polkadot系列——如何实现共享安全性

摘要

通过对Polkadot的有效性和可用性的介绍,我们可以看到,中继链提供了各种措施来保证并行链的安全性:随机分配的并行链验证器验证块,渔民监督,非并行链验证器重新验证,中继链备份并行链块数据。

这种设计在保证整个区块链系统横向扩展和碎片化的过程中,不会降低单个碎片的安全性。对于平行链,享受接力链提供的安全性,只需要安心关注自己的区块链业务,极大的方便了区块链业务的发展,减少了单个平行链在安全性上的额外投入。

参考文献:

[1]可用性和有效性,

https://research . web 3 . foundation/en/latest/polkadot/Availability _ and _ validation . html

[2]副链块的路径,

https://polkadot . network/the-path-of-a-parachain-block/

[3] J. Burdges,A .P. Czaban,R. Habermeier,S. Hosseini,F. Lama,H. K. Alper,X. Luo,F .A. Stewart和G. Wood。波尔卡多及其设计考虑概述。arXiv预印本arXiv:2005.13456,2020。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发