Filecoin:一种去中心化的存储网络(续1)

知识库 shishi614
  • 时间:
  • 浏览:
原创 2018-03-16 科学实验室 Healthchain文章来源:Filecoin.io翻译&编辑:Renee.Hu三复制证明和空间证明在 Filecoin协议里面,存储供应商必须说服他们的客户,他们将他们所支付的数据储存起来; 在实践中,存储提供商将会生成一个存储证明(PoS),即区块链网络(或客户自己)验证。在本节中,我们将介绍在Filecoin中使用的复制验证(PoRep)和空间证明(PoSt)方案的实现。3.1 激励存储证明 (PoS) 方案例如可证明的数据占有(PDP) [2] 和可溯性证明 (PoR)方案允许用户(即验证者V)将数据D外包给服务器(即prover P),以反复检查服务器是否仍在存储D。用户可以以非常有效的方式验证外包给服务器的数据的完整性,比下载数据更有效。服务器通过对随机的块进行抽样,并在一个与用户的挑战/响应协议中传输少量的数据,从而生成拥有概率的证明。PDP 和 PoR 方案只有保证在质询/答复时,验证者拥有某些数据。 在Filecoin里, 我们需要更有力的保证来防止三种类型的攻击,恶意的矿工可以利用这些攻击来获得他们没有提供的存储的奖励: Sybil 攻击, Outsourcing攻击,Generation攻击女巫攻击: 恶意的矿商可以假装存储(并获得报酬)比通过创建多个Sybil身份存储的副本更多的副本,而实际只存储一次数据。外包攻击: 恶意的矿商可能会承诺存储更多的数据,而不是实体存储的数量,这依赖于从其他存储提供商快速获取数据。生成攻击: 恶意的矿商可以声称他们储存了大量的数据,而这些数据实际上是通过一个小程序产生的。如果程序比据称存储的数据要小,这就会使恶意的矿商有可能在Filecoin中获得块回报,这与目前使用的矿商的存储成正比。3.2 复制证明复制证明 (PoRep) 是一种新兴的存储证明,它允许服务器(即证明者 P)说服用户(即验证者V),一些数据D已经被复制到它自己独特的专用物理存储中。我们的方案是一个交互式协议,其中证明者P:(a)承诺存储一些数据D的不同副本(物理独立副本),然后(b)说服验证者V,即P确实通过一个挑战/响应协议存储每个副本。据我们所知,PoRep改进了PoR和PDP方案,防止了女巫攻击、外包攻击和生成攻击。请注意:对于一个正式定义,对其属性的描述,以及对复制验证的深入研究,我们推荐读者参考[5]定义3.1. (复制证明) 一个PoRep方案使一个有效的证明者P能够使验证者V相信P是在存储一个副本R, 一种物理独立拷贝的数据D,唯一的P。PoRep协议的特点是多项式时间算法:(设置、证明、验证) ➤PoRep.Setup (1λ, D) → R, SP , SV , SP和SV各计划具体设置变量P,V,λ是一个安全参数。PoRep.Setup用于生成一个副本R,并给P和V提供运行PoRep所需的信息。PoRep.Prove 和 PoRep.Verify .一些方案可能需要与第三方进行验证或与第三方交互来计算PoRep.Setup.➤PoRep.Prove(SP,R,c) → πc, c是由验证者V发出的随机挑战, πc是一个证明,证明了证明人可以访问特定的D副本。PoRep.Prove是一个证明一个证明者可以访问特定的D副本的证明。PoRep.Prove它是由P来生成π表示V。➤PoRep.Verify(SV , c, πc) → {0, 1},它可检查证明是否正确。PoRep.Verify由V来运行,并使V确信P是否存储了R。3.3 空间证明存储验证方案允许用户检查存储提供商是否在挑战时存储外包数据。我们如何使用PoS计划来证明某些数据在一段时间内被存储? 对这个问题的一个自然的回答是,要求用户反复(例如每分钟)向存储提供商发送挑战。但是,每个交互中需要的通信复杂性可能是系统中的瓶颈,例如,在Filecoin,存储提供商需要向区块链网络提交他们的证明。为了解决这个问题,我们介绍一个新的证明, 空间证明,在这里验证者可以检查一个验证者是否将她/他的外包数据存储了一段时间。直观地说是要求证明者(1)生成顺序的存储证明(在我们的例子中是复制验证),以确定时间(2)递归地组成执行来生成一个简短的证明。定义 3.2. (空间证明) PoSt 方案启用有效的证明者 P来说服验证者V,P在某个时刻储存了一些数据。PoSt的特征是一个多项式时间算法: (设置,证明,验证)➤PoSt.Set(1λ, D) →SP和SV是P和V的特定于方案的设置变量,λ是安全参数。PoSt.Set它用于给P和V提供运行PoSt所需的信息。一些方案可能需要与第三方的验证或交互来计算PoSt.Set。➤PoSt.Prove(SP , D, c, t) →πc,在这里c是由验证者V发出的随机挑战,而πc是一个证明,证明了一个证明者可以在某个时间t访问D。, PoSt.Prove是由P来为V生成R。➤PoSt.Verify(SV , c, t, πc) → {0, 1},检查证明是否正确。 PoSt.Verify由V运行,并使V是否在某段时间内存储了D。3.4 实用的PoRep 和 PoSt我们感兴趣的是实用的PoRep和PoSt结构,它们可以部署在现有的系统中,不依赖于受信任的组织或硬件。我们为PoRep提供了一个构造(参见基于Seal的验证复制),它需要在安装过程中执行一个非常慢的顺序计算密封,以生成一个副本。PoRep和PoSt的协议草图见图4和图3中说明的在PoSt中证明步骤的底层机制。3.4.1 加密的构建块抗冲突散列法。我们采用抗冲突哈希散列功能 CRH : {0,1}∗ → {0,1}O(λ)。我们还使用了一个抗碰撞散列函数MerkleCRH,它将一个字符串分成多个部分,构造一个二叉树,递归地应用CRH并输出根。zk-SNARKs。我们对PoRep和PoSt的实际实现依赖于零知识的简洁非交互式的知识论证(zk-SNARKs) [6, 7, 8]。因为zk-SNARKs是很简洁的,证明是很短且易于验证的。更正式地说,让L成为一个NP语言,而C是L的一个决策电路。受信任方进行一键式设置阶段产生两把公共钥匙:证明钥匙pk和验证钥匙vk。证明钥匙 pk允许任何(不可信)验证生成一个π证据证明她的x∈L为实例的选择。非交互式证明π既是零知识也是知识证明。任何人都能用验证钥匙vk来验证证明π;尤其是zk-SNARK证明是公开可验证的:任何人都能验证π,没有与验证者交互来生成π;证明π的大小恒定,可以验证在|x|的时间是线性的。一个用于电路可满足性的zk-SNARK是多项式时间算法的三倍(KeyGen, Prove, Verify)➤KeyGen(1λ,C) → (pk,vk)。输入安全电路参数λ和C,KeyGen 概率样本pk和vk。这两个密钥都作为公共参数发布,可以用来证明/验证LC中的成员身份。➤Prove(pk, x, w) → π。在输入pk和输入x和NP –声明 w的见证下,验证方为声明x∈LC输出一个非交互式证明π。➤Verify(vk, x,π) → {0,1}。输入vk,输入x和π证明。假如x ∈ LC ,验证器验证输入1。感兴趣的读者可参见对zk-SNARK 系统的正式介绍和实现的[6, 7, 8]。一般来说,这些系统需要由受信任方运行的KeyGen操作; 可伸缩计算完整性和隐私(SCIP)系统[9]的新工作显示了避免这一初始步骤的有希望的方向,因此上面的信任假设是这样的。3.4.2 密封操作密封操作的作用是(1)迫使副本在物理上是独立的,它要求证明者存储一种伪随机的D的排列,以使它们的公钥具有唯一性。这样做会将n个副本存储为n个独立副本的磁盘空间(因此n倍于副本的存储大小)和 (2) 为了在PoRepSet中强制生成副本。设置要比预期的时间长得多,以应对挑战。以上操作可以通过SealτAES−256和τ实现,SealτAES−256比真实的挑战-证明-验证序列要长10 -100x。注意,选择运行SealτBC的T很重要,因为它比随机访问R更昂贵。3.4.3 实用的 PoRep 建设本节描述PoRep协议的构造,并包括图4中简化的协议草图; 实现和优化细节省略了。创建一个副本。安装算法通过密封操作生成一个副本,并证明它是正确生成的。证明者生成副本并将输出(不包括R)发送到验证器。证明存储。证明算法生成了副本存储的证明。从验证者那里得到一个随机的挑战c,它通过根rt来确定R的Merkle树中的一个特定的叶Rc; 验证者生成了关于Rc及其Merkle路径的知识证明。验证证明。验证算法验证了存储的证明文件的有效性,给出了副本的Merkle根和原始数据的散列。证明是公开可验证的:分布式系统中的节点维护分布式账本和对特定数据感兴趣的客户可以验证这些证明。3.4.4 PoSt 建设的实用性本节描述了后协议的构建,并包含了图4中简化的协议草图;省略了实现和优化细节建立和验证算法等价于PoRep的构建,因此我们在这里描述的只是证明。证明空间和时间。证明算法生成了副本的空间验证时间。验证者从验证器接收一个随机的挑战,并在序列中生成复制的证明,并将证明的输出作为另一个的输入,作为指定数量的迭代t(参见图3)。图 3: 说明 PoSt的重要机制。显示了随时间推移存储的迭代证明。3.5 Filecoin的使用Filecoin协议采用时空证明来审核矿商提供的存储。为了在Filecoin使用PoSt, 由于没有指定的验证器,所以我们把方案修改为非交互式的,并且我们希望网络中的任何成员都能够验证。由于我们的验证者在公共币模型中运行,所以我们可以从区块链中提取随机性来发布挑战。图4: 复制证明和时空证明协议框架。 这里的 CRH是一个防碰撞哈希符号, ⃗x是被证明的NP-声明, 并且w⃗ 是见证者。未完待续