Archivers——Solana分布式账本存储

468 阅读5分钟

在这篇文章中,我们将探讨Archivers,Solana的分布式账本存储,用于PB级的区块链数据存储。2018年,Solana使用VDF构建了他们PoRep版本的Proof of Replication,并为批量验证进行了优化。

在满负荷状态下,Solana网络每年将产生1gb/s * 365天=4PB的数据。如果要求网络中的每个节点都存储所有这些数据,就会将网络成员限制在保持这种存储能力的少数集中式成员。我们的历史证明技术可以被用来缓解这个问题,它允许快速验证复制证明的实施,并使比特洪流式的账本分布在世界各地的数百万个复制者节点上。存档器不是共识的参与者,而且对硬件的要求很低。

在高层次上,Solana Replicator网络的功能如下。存档者必须向网络发出信号,他们有X字节的空间可用于存储数据。在某种频率上,网络将分类账历史分成几块,根据复制者身份的数量和存档者的总可用存储空间,达到某种复制率(目前我们期望的目标率是100倍左右)和容错率(用擦除编码实现)。一旦Archiver:数据分配完成,每个Archiver都会从共识验证器下载各自的数据。在某些频率上,Archivers将被挑战,以证明他们正在存储数据,这时他们必须完成复制证明(PoRep)。存档者会因为他们的努力而获得最多3%的收益。

更深入的复制证明(PoR)

复制证明的基本思想是使用CBC加密法用公共对称密钥对数据集进行加密,然后对加密后的数据集进行哈希。这种方法在Filecoin的复制证明技术报告中得到了详细解释。不幸的是,这种方法的问题是,它容易受到攻击。

例如,一个不诚实的存储节点可以流式加密,并在哈希的时候删除。简单的解决方案是强制在加密的反面进行哈希,或者用随机的顺序。这确保了所有的数据在证明的生成过程中都是存在的,而且它还要求验证器有全部的加密数据存在,以验证每一个身份的证明。验证所需的空间变成了(CBC密钥的数量)*(数据大小)。

我们对这种方法进行了改进,以比加密速度更快的速度对加密区块进行随机抽样,并将这些样本的哈希值记录到PoH账本中。因此,区块在每个PoRep中保持完全相同的顺序,验证可以流式数据,并在一个批次中验证所有的证明。这样,我们可以同时验证多个证明,每个证明都在自己的CUDA核心上。

使用当前一代的显卡,Solana网络可以支持每个GPU卡多达1500个复制身份或对称密钥。验证所需的总空间是(2个CBC块)*(CBC密钥数量),核心数量等于(CBC密钥数量)。一个CBC块的大小预计为1MB。

接下来,我们要在验证者和存档者之间构建一个博弈,确保存档者在生成证明,而验证者在实际验证PoReps。

为了开始产生账本的PoReps,Replicator客户端做了以下工作:

  1. 客户端在一个固定的时期签署一个PoH哈希值;
  2. 签名被用作随机性的来源,以挑选分类账的一个特定片断;
  3. 签名用于创建一个对称CBC密钥,客户端用该密钥对分类账的片断进行编码。

由于每个客户都签署相同的PoH哈希值,所以签名在所有客户之间随机分布。然后,客户端对加密后的样本进行连续采样:

  1. 客户端在一个固定的时期签署一个PoH哈希值;
  2. 签名作为随机性的来源,对每1MB的片断取样1个字节;
  3. 样本用SHA256进行哈希;

所有的客户都被迫使用相同的PoH哈希值作为签名。由于签名与PoH绑定,因此产生的样本哈希值对该时间点和该特定的复制来说是唯一的。

验证者反过来检查客户的证明:

  1. 验证器根据GPU核心的数量,声明它能验证多少PoReps;
  2. 定期验证者将签署一个PoH哈希值;
  3. 签名用于选择分类账的一个片断进行验证,并通过掩码来选择验证器容量以内的样本进行验证;
  4. 验证者上传验证失败的证明。

客户端可以通过捕捞懒惰的验证器来挑战验证器的失败证明。为了防止研磨攻击(grinding attacks),客户必须连续使用同一个密钥对身份。为了防止垃圾邮件,协议中的所有信息都会产生转发费。存档者根据成功提交的证明的数量来赚取奖励。验证者通过验证证明赚取质押加权奖励,而钓鱼者则通过在发布假证明时拿走验证者被罚没的代币来赚取收益。