BFT-Store: Storage Partition for Permissioned Blockchain via Erasure Coding
说明:只需要保证编码encoding阶段的BFT过程,保证n-2f诚实节点确定存储了对应区块即可。解码和恢复根据区块的正确性正常操作即可。
Abstract
在拜占庭节点存在情况下,使用纠删码对许可区块链进行存储分区。整合BFT共识和EC,对区块进行编码,实现存储的可扩展性。
另外,需要一种在线重新编码协议来支持存储扩展(更多节点加入),实现了混合副本方案来提高读取性能。
一个显著的好处就是:将每个区块的存储复杂度降低为O(1)常数级别,节点的存储扩展性提高(存储更多区块)
针对BFT(以PBFT n=3f+1为例)环境下编码的挑战:
- 设计(2f+1,f)-RS编码,怎么保证2f+1个诚实节点保留了正确的子块;因为对于一个区块达成一致性:是节点收到了2f+1个提交确认;这只能保证保证至少f+1个诚实节点会提交对应的区块(f个恶意节点的存在)
- 解决:放低编码要求,设计(f+1, 2f)或者(n-2f, 2f)-RS编码
-
怎样支持新加入节点的灵活扩展;需要重新分布现有的数据,历史区块需要在所有的节点之间重新编码。(因为n-f的关系已经改变了)。需要保证诚实节点在敌对环境中完成重新编码。
-
提高读取性能,相对于全副本方案,分区编码的读取性能会大幅降低由于节点解码的数据交换
贡献
- 设计了BFT-Store,降低区块的存储复杂度从O(n)—>O(1)
- 两点关键性设计:
- 扩展性:4阶段重新编码协议(基于PBFT),保证所有区块的可用性
- 加速读取性能:多副本方案保证区块的高效访问
- 嵌入BFT-Store到Tendermint实验,存储扩展性,区块的可用性,有效性
可用性:每个区块对于所有的诚实节点都是可用的,不会丢失
扩展性:每个区块的存储复杂度是常数(EC后使用c个副本),系统的存储能力随着节点数量n增加而增加
有效性:对比全副本方式,读取性能降低应该尽可能小
设计和思路
设计(n-2f, 2f)-RS编码
整个对一次编码/操作,达成共识,只能保证至少n-2f个诚实节点提交了block
问题:
- 每个节点是分开独立编码吗?感觉开销会很大
- 每个节点可以完成不同的过程,例如存储不同的区块,但是可以验证是正确的-hash(PBFT中)
- 如果出现故障的节点怎么去恢复其块呢?根据解码原理来处理吗—需要保证系统的可持续运行,区块可用就一定可以在故障解决后的节点上进行存储
编码和读取
每个编码轮次R中,每个节点独立编码n-2f个区块成n个区块(2f个校验块);每个节点只会保留其中一个区块。
这样每个节点只会保留一个编码轮次中一的一个编码块,如果其中出现恶意节点,就需要重新解码?开销大,其概率为 \(1-P_r(B)=f/n \approx 1/r\)
因此,使用多副本策略来降低该概率,使用c副本,每个编码块放置到不同的c个节点上,不可达的概率(直接获取得到):
并且每个区块的存储开销是常数复杂度。假设区块大小为T,为 \(\frac{cnT}{n-2f} \approx \frac{crT}{r-2}\) ,其中1/r是恶意节点的比例。
注意的是:在不可信的环境下,每个节点是独立编码的,每个节点需要独立地计算出自己需要存储的c个区块/编码块(n*c/n=c)。并且需要达成全局的一致可验证性
- 使用节点的公钥排序,作为全局的同一节点顺序
- 每个节点i使用编码块哈希值作为seed生成c个0~n-1个随机值A(每个节点相同),根据自己节点序号来生成不同的需要存储的c个区块序号 \(A+ i = \{ a_j+ i\ \mod \ n : 1 ≤ j ≤ c \}\)
每个节点存储的chunks/编码块集合都是可以被其他节点验证的;这种方法保证了不同诚实节点存储的c个编码块集合不同,保证至少的n-2f个节点足够恢复出所有的区块。(有不同的n-2f个区块),如下:
读取
- 及时在Nt(Bt)获取到了区块,直接返回
- 不能及时获取,启动解码过程,选择任意n-f节点(保证至少有n-2f个正确区块),节点返回在该编码轮次中的对应存储的区块集合(一个好像就可以)
问题:
- 怎么保证读取的块是正确的?(签名—多数)
- 发送的请求块消息〈 BLOCK, h, e, s 〉中元数据是怎么得到的?模式s和轮次e(每个节点都会存储)
块迁移和重新编码
主要考虑新加入节点导致的编码模式的改变,需要将历史区块重新编码和分布到所有的节点。分为4个阶段:
可以不迁移旧区块吗?
r不变时,新加入节点导入n’和f’变化,以及需要利用新节点存储空间,需要重新编码和分布
-
leader发送解码信息,请求旧的数据块
-
备份节点发送chunk-set消息,给leader节点
-
leader发送重新编码消息〈 RE_ENCODE, B, V, s + 1, e 〉。先恢复all original blocks B,然后发送重新编码消息
-
备份节点发送编码完成消息给leader。根据数据块完成编码后存储chunk set后发送〈 CODE_FINISH, e, s + 1 〉消息
注意:
- 前一轮次的重新编码完成后(n’-f’)开始下一轮次的编码
Papers
- BFT-Store: Storage Partition for Permissioned Blockchain via Erasure Coding

浙公网安备 33010602011771号