复制证明PoReps

2019-09-20 10:52:13

我们首先定义复制证明(PoRep)的语法。PoRep对任意数据D∈{0,1}* 对于给定的安全系数λ,复杂度不会超过O(poly(λ))的大小。

  我们首先定义复制证明(PoRep)的语法。PoRep对任意数据D∈{0,1}* 对于给定的安全系数λ,复杂度不会超过O(poly(λ))的大小。 假设所有算法在RAM计算模型中操作(特别是读取一个比特的输入,被认定为O(1)的操作)。并行算法在PRAM模型中运行。


  1、PoRep.Setup(λ, T) → pp,这是一次性设置,其接收安全参数λ,时间参数T,并输出公共参数pp.T确定挑战 - 响应时段。


  2、PoRep.Preproc(sk, D) → D˜, τD是预处理算法,其可以将秘密密钥sk与数据输入D一起,输出预处理数据D˜以及数据标签τD,其至少包括大小N = | D |。的数据。当sk =⊥时,预处理器以无键模式运行。


  3、PoRep.Replicate(id, τD, D˜) → R,aux获取副本标识符id和预处理数据D˜以及其标记τD。它输出副本R和(紧凑)辅助信息aux,它将作为证明和验证程序的输入。 (例如,aux可以包含有关复制输出或承诺的证明)。


  4、PoRep.Extract(pp, id, τD, R) → D˜,对输入副本R和标记符id和数据标记τD,输出数据D˜(并验证其与τD的一致性)。


  5、PoRep.Prove(R, aux, id, r) → π ,在输入副本R,辅助信息aux,副本标记符id和挑战r上,输出证明πid。


  6、PoRep.Poll(aux) → r, s,这方法将辅助副本信息aux作为输入,并输出公共挑战r以及用于产生该挑战的任何私有随机性s。对于公共代币结构s=⊥。


  7、PoRep.Verify(id, τD, r, s, aux, π) → {0, 1},对输入副本标识符id,数据标记τD, 公共挑战r,私有随机性s(用于产生r),辅助复制信息aux和证明π,输出接受(1)或拒绝(0)证明的决定。

 

  image.png

  该图说明了PoRep协议中证明者和验证者之间的交互。设置和数据预处理在外部运行,产生pp←PoRep.Setup(λ,T)和D~,τD←PoRep.Preproc(sk,D)。挑战-响应协议是定时的,并且验证者拒绝在发送挑战之后超过T个时间步骤接收的任何响应。这是通过要求PoRep.Prove在最多T的并行时间运行而正式捕获的。与T相比,Prover和Verifier之间的通信通道上的传播延迟被假定为标称值。


  PoRep interactive protocol 如上图所示,这些算法用于交互协议中。设置(无论是确定性的,可信的还是透明的公共设置,例如涉及公共随机源的设置)都在外部运行,并且pp作为输入提供给所有各方。对于每个文件D,预处理器(在无密钥操作时的特殊方或证明方,但不是验证方)运行(D˜,τD) ← PoRep.Preproc(sk, D)。输出D˜,τD是证明方的输入和验证方的τD。


  Transparency, public coin, and public verifiability

  PoRep方案可能涉及可信的一次性设置,在这种情况下,PoRep.Setup由可信方运行,输出pp发布供所有各方查看。透明PoRep方案是其中设置不涉及任何私人信息的方案。该可信设置是独立的一次性过程,并且运行该设置的可信方应该不再参与交互协议。另一方面,数据预处理器可以使用密钥,但它不受信任。特别是,验证者不知道预处理器是否与server进行合谋。我们将在下面讨论,秘密钥匙预处理只对数据可检索性有影响,但对于可公开验证的数据复制的安全性(或者proof of space)是没有影响的。这与系统Mirror中提出的数据复制证明概念有重要区别。如果PoRep.Poll的私有输入r非空,则PoRep方案可以是private coin,如果r=s,则RoRep方案是public coin。A public coin PoRep就有额外的理想特性,PoRep。Poll输出的挑战可以被来自不可预测的公共随机信标的挑战所取代。

   image.png

  PoRep协议的时空图。在证明者生成新副本的长度为tinit的阶段之后,验证者反复询问证明者以在挑战时间段长度T内产生PoRep,以便验证证明者仍然存储原始数据的唯一副本。为了使这个证明系统健全,有必要使用tinit>>T。


  Data preprocessing and data retrievability 当使用密钥对数据输入进行预处理时,得到的PoRep是public-coin PoR(在满足关于复制和空间证明的其他属性之间,我们将在下面的PoRep安全模型部分中进一步讨论)。在这种情况下,我们可以想象预处理器是一个想要在server上存储(和复制)数据的客户端,并生成数据标记τD以及外包该验证工作。当预处理以无密钥模式运行时,得到的PoRep是关于输出τD的PoRC(Section A.4),其包括对数据D的承诺。在给定开头承诺的情况下,任何(有状态的)verifier可以使用该标签来验证PoReps作为标准PoRs。这对于多个客户端将其文件汇集在一起并希望为整个数据集接收单个PoRep的设置特别有用,但它们彼此不相互信任以共享私钥。它也适用于动态设置,使新客户端知道存储在服务器上的数据,并希望在不信任原始客户端的私钥预处理的情况下验证可检索性。


  以这种方式将数据预处理作为单独的“堆栈层”处理允许在不同设置中适当的更多种结构,而不会影响底层PoRep协议本身的效率。事实上,一个PoRep协议(没有预处理)满足(δ, C)-PoRC(例如,用于C将数据划分成恒定大小的块),利用任何数量的先前技术,能立马被解析成公钥PoR或PoRC。我们将重视两种场景:


  1、D˜, τD ←PoRep.Preproc(sk, D) ,客户端具有数据文件D,使用随机生成的密钥sk,用来产生D˜, τD。其将速率δ对抗性擦除应用于D(即,在D˜中的blocks中,对任意敌对删除比例最高达到δ的可弹性恢复)。标签τD是对D˜的承诺。对抗性擦除代码可能涉及使用sk的秘密转换,并且还需要sk以从这些错误中恢复。私钥设置允许使用仅允许随机删除的更有效的纠删码,因为它们可以与数据的秘密伪随机置换组合,使得攻击者仅在具有可忽略的概率的目标删除中成功。然后客户端使用τD在PoRep协议中进行验证,我们假设它已经是相对于τD的 (δ, C)-PoRC。任何验证者V可以公开地验证所提交的D的δ分数是可检索的(并且实际上存在用于D中的块的δ分数的公共提取算法),这足以使私人客户端使用sk来恢复D。


  2、无密钥预处理器将数据文件D变换为确定性速率δ最佳擦除代码(例如Reed-Solomon)的单个代码字,其符号大小等于C中的块大小。它输出τD作为对D的确定性承诺。这也是D的确定性承诺。由于擦除码的弹性(D可以从 D˜中符号的任何δ比例中恢复),D˜的PoRep(δ, C)-PoRC 变为D的PoRC。


  Efficiency 所有的算法必须在时间复杂度O(poly(λ))内运行,最多只能在时间复杂度O(poly(λ))下并行运行。我们不直接在PoRep定义中强加进一步的效率要求,但隐含地,PoRep方案不能同时正确和安全,除非在 O(poly(λ))处理器上,PoRep.Poll和PoRep.Prove具有比PoRep.Replicate更低的并行时间复杂度。否则,为了保持挑战-响应时间的正确性将足够长,以便对抗性证明者从头开始重新运行副本生成。此外,出于实际目的,非常希望PoRep.Prove和PoRep.Verify以常数或O(polylog(|D|))时间运行,其中|D|是数据文件的长度。除此之外,还可以实现批量证明和验证相同(或不同)文件的多个副本,这些副本在副本/文件的数量上进行线性缩放。副本生成PoRep.Replicate运行时间大于max(T,|D|),但是这个运行时希望在T·| D |中是次线性的随着文件大小的增加。


  Correctness 在正确的PoRep结构中,运行PoRep.Replicate和PoRep.Prove的证明者必须诚实地通过验证1.为了通过验证,算法PoRep.Prove必须在最多T的并行时间运行,否则验证者将不会收到挑战 - 响应期内的输出。此外,PoRep.Extract必须正确提取使用PoRep.Replicate生成的副本中的原始数据。


  Definition 1 (PoRep correctness)。PoRep结构是正确的,如果对于任何安全系数λ,任何id和数据输入D,存在Tλ,是的对于所有T≥Tλ,pp←PoRep.Setup(λ,T)和(R,τ)←PoRep.Replicate(pp, id, D) :


   image.png    


image.png


最新推荐