当前位置:首页区块链波尔卡多级数(三)——如何实现共享安全

波尔卡多级数(三)——如何实现共享安全

本文作者

周荣、江哲

来自有趣链技术数据网格实验室bitxhub团队,主要负责区块链账本互操作技术的研究。

导读:本文是Polkadot系列文第三篇。

说到Polkadot,估计Polkadot最大的优势是为并行链提供共享安全,保证了不会因为区块链网络的碎片化而降低安全性。那么共享安全是如何工作的呢?

本文主要从Polkadot为并行链提供有效性和可用性两个保证,帮助您了解共享安全性。

文章结尾的福利:波卡系列的概述

回顾

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

验证器

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

收藏家

它是并行链的整个节点,负责收集和执行并行链中的事务并生成候选块,将块和证书提交给验证器,并通过收集事务来获得手续费。收藏者与pow共识区块链中的矿工相似。

提名人

Polkadot中数字货币点的持有者将选择其信任的验证器来质押点,然后分享验证器的收益。

渔民

它也是并行链的整个节点,用于监视验证器的非法行为。如果验证者做了坏事(比如批准无效的并行链块),仿冒者可以向其他验证者报告并得到相应的报告。

验证

有效性验证是指通过区块链系统对账簿状态变化进行有效性验证,实现全网一致。

一个普通的区块链,比如以太坊,会将每个区块广播到整个网络的以太坊节点。这些节点将验证和执行块中的事务,以确保生成的状态根和其他信息与块头中的信息一致。在Polkadot中,并行链的块一致性需要在以下三个级别进行验证:

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

以一定的时间区间(具体区间由babe一致性算法确定),通过随机分组将验证池中的验证器分配到不同的并行链上,每个并行链分配给多个验证器。

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

第二级有效性验证由钓鱼者保证,防止平行链验证者作恶,防止平行链见证者和收集者共同作恶。

钓鱼者通常是一条平行链的所有节点。它首先需要在中继链上放置存款,然后从收集器节点连续收集块并验证其有效性。如果块包含无效事务,仿冒者将提交报告。如果它的判断是正确的,它将得到丰厚的回报,但如果它判断错误,它将失去自己的存款。

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

这些验证器选择过程是非公开的,验证器的数量取决于钓鱼者给出的无效报告和收集器给出的不可用报告的数量。如果检测到一个无效的平行链滑车,签署该链的验证者将受到处罚,并将部分或全部扣除其押金。

在以上三个层次的有效性验证中,钓鱼者的有效性验证更容易理解,因为它是并行链的整个节点,并且拥有并行链的所有状态数据。只有重新执行接收到的块事务,才能得到新的状态数据和状态根来验证块的有效性。

然而,验证器是中继链的整个节点。它如何验证平行链的块?它是否维护所有并行链的状态数据?这显然是不可能的。

下面重点介绍一下

Polkadot验证器如何验证并行链块

当并行链路连接到Polkadot时,需要向中继链注册名为stvf(状态转换验证函数)的web汇编代码。验证程序将使用stvf来验证并行链路的有效性。

假设在并行链PC上已确认的块是b0,当前要释放的块是b1。最后一个块被中继链确认后,b0的相关信息记录在中继链上的块r0b上,如并行链执行b0后的状态根r0。然后,并行链收集器C对B1块进行打包,得到该块到其他并行链的跨链消息M,生成有效性证明π和一些元数据(PC.id,H(B 0),H(R 0 B),R输入,R输出…)这里,R in是执行块b1之前的并行链的状态根,R out是执行后的状态根,H(b0)是并行链块b0的散列,H(r0b)是中继链块r0b的散列。
有效性证明生成过程的实质是在块中执行事务,记录执行过程中的读写状态数据,并在执行前、后结合两个状态根生成证明。
如果可以用Xb的根证明来表示Xb*的有效性,则可以用Xb的根证明来表示:
πB=U{*R inx | B读取x}{*R outx | B写入x}
举个例子,假设平行链提交的区块B中包含两笔交易:
1.A给B转账50
2.C给D转账10
执行过程中需要读写A、B、C、D四个账户的状态。假设区块执行之前该平行链中这四个账户的余额都是100,那么有效性证明包含的便是下面两张图中标有颜色的这些数据,其中黄色部分是哈希值。
波尔卡多级数(三)——如何实现共享安全
波尔卡多级数(三)——如何实现共享安全1
可以看到,不管平行链本身的状态数据有多少,由于区块的有效性证明数据都是由该区块的交易涉及的状态读写集的SPV组成,因此它的大小是有限的。
之后收集人C将区块B
1、交易的有效性证明π、该平行链的出队列中的消息集合M以及元数据一起发给其中一个验证人,验证人再将这些信息分发给这条平行链的其他验证人。每个验证人加载该平行链的STVF对收到的平行链区块进行有效性验证。
STVF的核心也是执行平行链区块中的交易,过程中需要读取证明数据中的读集合,同时会产生写集合,并最后生成的写集合和证明数据中的内容进行比对;此外还可以通过收到的元数据中的信息进行一些其他的验证,如根据H(R
0
B)查找到该区块中保存的B
0的状态根R
0,将R
0和收到的R
in进行比较。若这些信息都符合,则该区块通过验证。
最初收到平行链区块的那个验证人将生成一个Candidate Receipt,里面会记录该平行链区块B
1相关的信息,如平行链PC的id、收集人C的id、区块B
1的哈希、区块B
1执行前后的状态根等,签名并广播给中继链所有节点(可以认为这是中继链的交易)。当这个Candidate Receipt最终被中继链出块确认以后,平行链PC的区块B也被最终确认了。
这种有效性验证方法可以保证平行链单个区块的状态转换是有效。如果平行链从第一个区块开始,都由中继链进行有效性验证并确认区块,那么可以保证平行链整条链的有效性。

可用性保证

可用性保障指的是区块链系统在部分节点作恶的情况下,依然可以对业务系统提供可用服务保障。
在Polkadot中,假设这么一种场景:平行链收集人打包了区块B并提交给了验证人,验证人收到了该区块,通过了有效性验证,并且区块最终被中继链确认了。
但是该收集人节点作恶,没有把区块广播给平行链的其他节点,那么该平行链的其他节点无法得到该区块,无法更新本地的状态数据,该平行链也就无法出块了。
为了防止这种情况发生,通过验证以后,验证人会将平行链区块PC和有效性证明通过纠删码技术分成n个片段(n的数量是全网验证人的数量),并将这些片段广播给全网的所有验证人,每个验证人获得一个片段并会保存一段时间。
之后只需要得到n/3的片段,便可以恢复出原始数据。这种情况下,即使收集人节点作恶,平行链其他节点依然可以从中继链的验证人中获得上个区块的纠删码片段并恢复出区块。
波尔卡多级数(三)——如何实现共享安全2

总结

通过上面对Polkadot有效性和可用性的介绍可以看到,中继链提供了种种措施来保障平行链的安全:随机分配的平行链验证人进行区块的验证、钓鱼人的监督、非平行链验证人的再次验证、中继链对平行链区块数据的备份……。
这种设计方式在保障整个区块链系统横向扩容分片的过程中不会降低某单一分片的安全性。对平行链来说,它享受了中继链提供的安全性,仅需安心关注自己的区块链业务即可,极大便利了区块链业务的开发,降低了单一平行链对安全的额外投入。
参考文献:

[1]Availability and Validity,
https://research.web3.foundation/en/latest/polkadot/Availability_and_Validity.html
[2] The Path of a Parachain Block,
https://polkadot.network/the-path-of-a-parachain-block/
[3] J. Burdges, A. Cevallos, P. Czaban, R. Habermeier, S. Hosseini, F. Lama, H. K. Alper, X. Luo, F. Shirazi, A. Stewart, and G. Wood. Overview of polkadot and its design considerations. arXiv preprint arXiv:2005.13456, 2020.

温馨提示:

文章标题:波尔卡多级数(三)——如何实现共享安全

文章链接:https://www.btchangqing.cn/102593.html

更新时间:2020年09月13日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

波尔卡多级数(三)——如何实现共享安全3
区块链

专家警告称,在央行的数字货币竞争中,日本“落后中国6年”

2020-9-13 0:42:32

DEFI区块链

中国制造的特鲁菲,孙雨晨看起来是一款成功的defi游戏

2020-9-13 0:58:34

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索