可用性和有效性(AnV)协议是波卡的一个协议,它允许网络在维持强大的安全保证的同时被高效地分片到平行链中。
AnV协议的阶段
AnV协议有五个阶段:
1.平行链阶段
2.中继链提交阶段
3.可用性和不可用性子协议
4.次要GRANDPA批准有效性检查
5.调用拜占庭容错最终确定性工具来巩固区块链
平行链阶段
AnV的平行链阶段是指,平行链的整理者向当前被分配到该平行链的验证者提出候选区块。
中继链提交阶段
AnV的中继链提交阶段是指,验证者将候选区块与该平行链注册代码所公开的验证函数进行检查。如果验证成功,那么验证者将把候选区块传递给传播网络(Gossip Network)中的其他验证者。但是,如果验证失败,验证者会立即将候选区块作为无效区块予以拒绝。
验证者需要确定每个平行链的分配,并分别对有效的候选者发出批准,对无效的候选者发出争议。由于不能期望每个验证者都验证每个平行链候选者,因此这种机制确保选择了足够多的诚实验证者来验证平行链候选者,以防止无效区块的最终确定。如果一个诚实的验证者检测到一个被一个或多个验证者批准的无效区块,诚实的验证者必须发出争议,这将导致升级,从而对所有恶意方造成后果。
当超过一半的平行链验证者同意一个特定的平行链区块候选者是一个有效的状态转换时,他们准备一个候选收据。候选收据是最终将被包含在中继链状态中的内容。它包括:
- 平行链ID
- 整理者的ID和签名
- 一个父块候选收据的哈希值
- 一个该块纠删码片段的Merkle根
- 一个任何传出消息的Merkle根
- 一个区块的哈希值
- 区块执行前的平行链状态根
- 区块执行后的平行链状态根
这些信息的大小是固定的,而平行链实际的PoV区块可以是可变长度的。对于获得完整的PoV区块的任何人来说,这些信息足够验证其中包含的状态转换。
可用性和不可用性子协议
在可用性和不可用性阶段,验证者会在传播网络中传递纠删码片段。至少有2/3 + 1个验证者必须报告他们拥有代码单词(code word)的一部分。一旦达到了这个验证者门槛,网络就可以认为平行链的PoV区块可用。
纠删码(Erasure Codes)
纠删编码将消息转换为一个更长的代码,允许从代码的子集中恢复原始消息,在某些代码缺失的情况下也能进行恢复。代码是原始消息加上一些额外数据的组合,这些额外数据使得在发生抹除时仍然能够重建代码。
波卡的可用性方案使用的纠删码类型是Reed-Solomon码,该码已经在区块链行业以外的技术领域中得到过实战应用。一个例子就是在光盘工业中发现。CD使用Reed-Solomon码来纠正由于碟面不一致性(如灰尘颗粒或划痕)而导致的任何丢失数据。
在波卡中,纠删码被用于使平行链状态对系统可用,而不需要所有验证者都跟踪所有平行链的状态。相反,验证者共享较小的数据片段,并可以在假定1/3 + 1的验证者可以提供他们的数据片段时后重建整个数据。
Reed-Solomon码详情请参见:
https://wiki.polkadot.network/docs/learn-availability
Fishermen: 弃用
Fishermen的想法是,它们是平行链的全节点,就像整理者一样,但在与波卡网络相关的角色方面扮演着不同的角色。Fishermen不像整理者那样打包状态转换和生成下一个平行链区块,而是观察这个过程,并确保不包含无效状态转换。
Fishermen在波卡或Kusama上不可用,并且没有计划进行正式实现,尽管先前在AnV协议中提出了建议。
为了解决Fishermen设计考虑背后的动机,目前的次要支持检查者在与波卡网络相关的角色方面也发挥了类似的作用。从安全角度来看,安全基于至少有一个诚实的验证者,无论是在平行链验证者还是次要检查者中。
更多资源:
《Path of a Parachain Block》:Parity分析师Joe Petrowski的文章,详细阐述了平行链区块必须通过的有效性检查,以使其进展到平行链中。详情请参见:
https://polkadot.network/blog/the-path-of-a-parachain-block
《Availability and Validity》:W3F研究团队的论文,详细说明了可用性和有效性协议。详情请参见:
https://github.com/w3f/research/tree/85cd4adfccb7d435f21cd9fd249cd1b7f5167537/docs/papers/AnV