Filecoin的核心:复制证明和时空证明是什么?
众所周知,Filecoin的存储证明体系是Filecoin网络的精髓,也是Filecoin研究团队投入最多的部分,其中主要包括复制证明(PoRep)和时空证明(PoSt)最为关键。
1、存储中遇到的挑战
理想状态下,客户和存储矿工之间可以通过订单匹配达成交易,假设客户A有一个数据C要在系统中存储3份,那么存储矿工就会通过竞争,获得存储机会,3个矿工B1,B2,B3各自在自己的物理服务器上存储该文件的副本C1,C2,C3,当客户需要取回数据时,检索矿工帮他取回,这样就完成了整个交易流程。
那非理想状态下
会出现哪些挑战呢?
1、假如B1,B2,B3是同一家公司的矿工,那3个矿工就很可能出现只存一个副本C1的情况——女巫攻击;
2、假如B1存储了副本,B2没有存储,当客户A向B2索取数据时,B2从B1获取,然后再交给A——外包攻击;
3、还有一种情况,A和B1是一起的,A的数据C由很短的C’生成,这样他只需要存储很小的D’即可——生成攻击。
2、举个例子
某老师定期检查学生的笔记,那么在检查的过程中,可能会出现下面三种状况:
每次老师检查我的笔记时,我就拿同学的笔记来假装是我的——外包攻击;
虽然声称每个人都有笔记,但其实全班只有一份笔记,老师检查谁的笔记时,这份笔记就用作谁的——女巫攻击;
老师每次说检查笔记时,我都会通宵写一份;
问:上面这三种不诚实的状况会带来哪些影响呢?
答:客户冗余备份数据期望得不到保障,不确定存储矿工真实的数据存储量,从而无法形成公正的共识机制。
那应该如何防止
这些不诚实矿工的行为呢?
3、如何预防
联系上面的例子,如果老师认得每个人的笔迹,每份笔迹只属于一个同学,还有检查笔记前一个小时才通知大家,这样同学们就没有时间去现写一份了。
在Filecoin系统中,复制证明要求矿工在存储数据时必须绑定专属的矿工号,另一方面在存储数据时有一个比较耗时的打包过程,这两点就足以保障矿工真实存储了用户的数据,同时也极大限制了矿工做出不规范行为的可能性。
复制证明
Filecoin复制证明是什么?复制证明到底证明了什么?
简单地说,Filecoin的复制证明就是矿工证明自己真的存储了用户的数据。
详细一点讲,那就可以直接采用复制证明研究专家、证明算法的发明者Ben Fisch的话:复制证明(PoRep)是一个交互式证明系统。在这个系统中,存储的提供者需要提供可公开验证的证明,来表明其为一个数据文件副本分配了独有的空间资源,而且所存储的数据是可检索的。也就是说,复制证明是一个把可检索证明(PoR)嵌入进容量证明(PoC)中的一种证明机制。
进一步说,复制证明(PoRep)使证明者能够证明他们正在使用不低于需要的最小空间来存储信息(这一点等同于空间证明PoS),并实际使用该空间来存储有用的信息(这与大多数空间证明不同)。同时,复制证明(PoRep)可以有效地提取存储的任何数据(如可检索性证明)。
在一个带激励的网络中,存储节点以证明者的身份参与并存储数据文件,因为这样做可以使他们获得网络奖励。
复制证明(PoRep)的一项重要特性是,证明者如果不能证明他们像约定的那样,存储数据文件的复制副本,那么他们将不能获得奖励。这是通过系统设计来实现的,在一个合理的系统设计中,即使是那些重复的数据文件,也需要分别证明其每一个复制都需要根据协议被单独证明。
我们知道,PoC:Proof of Capacity - 容量证明,证明自己有足够的容量。PoS:Proof of Storage - 存储证明,注意,这里没有包括检索部分(与PoC类似)。PoR:Proof of Retrievability - 检索证明,证明数据可被读取。
综上所述,我们知道:复制证明(PoRep)= PoS + PoR
当复制证明用于区块链系统,这里就涉及到一个重要的问题,这种证明是否可伪造?答案是肯定的。因为证明不过就是一些运算,也可以看成一个函数,当所有输入都知道的情况下,函数值也就可计算了。在区块链系统中,一切链上的信息都是透明的,即使不透明,对于需要发起证明的存储服务方而言,证明所需要的所有信息也是已知的。
然而,复制证明要求必须在存储的时候发起,同时,要一直保持承诺。也就是说,必须:
1)按照规定的时间内完成证明;
2)证明完成后,不能删除数据。
上面的第 1)点,可以通过交易和上链信息来进行验证,而第 2)点,就需要通过时空证明来保证。为了这个安全性,一个简单的设计原理就是,让时空证明必须在很短的时间内完成,否则无效;而复制证明如果不能在很短的时间内完成的话,就不能做假。
那么,当这两个时间的差距越大,安全性就越高。
在复制证明中,存储矿工证明他们存储的是数据的物理唯一拷贝或副本。复制证明只会在第一次存储数据时发生一次。
填充扇区并生成 CommD
当存储矿工接收到每条客户端数据时,他们会将其放入一个扇区。扇区是 Filecoin 中的基本存储单位,可以包含来自多个交易和客户的片段。
一旦扇区已满,就会生成 CommD (数据承诺,又名UnsealedSectorCID),表示该扇区中包含的所有片段 CID 的根节点。
密封行业和生成 CommR
接下来,发生称为密封的过程。
在密封过程中,扇区数据(由CommD标识)通过一系列图和散列过程进行编码,以创建唯一的副本。结果副本的 Merkle 树的根哈希是 CommRLast。(在我们的分散数据结构教程中了解更多关于Merkle树的信息)。
然后,CommRLast 与 CommC(复制证明的另一个Merkle根输出)一起散列。这就产生了 CommR(复制承诺,又名SealedSectorCID),记录到公共区块链中。CommRLast 由矿工私下保存,以备将来在证明时空时使用,但不会保存到链中。
编码过程被设计为速度慢且计算量大,因此很难进行欺骗。(请注意,编码与加密不同。如果要存储私有数据,则必须在将其添加到Filecoin网络之前对其进行加密)。
CommR 提供了我们需要的证据,证明矿工正在存储客户端数据的物理唯一副本。如果您使用多个存储挖掘器存储相同的数据,或者使用单个矿工对同一数据进行多个存储交易,则每个交易将有不同的 CommR。
密封过程还使用 ZK-snarks 压缩复制证明,以使链更小,从而可以由Filecoin网络的所有成员存储以用于验证目的。
时空证明
时空证明的作用及惩罚规避
复制证明可以证明正确的数据集存储在矿工提供的存储空间中,但是要验证Filecoin网络上的数据存储,这还不够,您还需要证明在合同规定的时间内连续存储了该数据集。
如何做到?如何证明数据在一段时间内都一直被存储?
为了解决这个问题,Filecoin采用了时空证明(proof-of-spacetime,post)。
曾经运行一次的复制证明证明了矿工在密封该扇区时存储了数据的物理唯一副本,而时空证明(PoSt)则反复运行以证明他们在一段时间内将继续存储空间专用于该副本。
时空证明提出了证明链的数据结构,证明链由挑战(challenge)和证明(proof)链接起来形成,在证明链的基础上添加上时间段,这样就得到了一段时间内的矿工存储数据的证明,这就是时空证明(Proof of Spacetime,PoSt)。
时空证明(PoSt)建立在复制证明期间创建的几个元素的基础上:副本,私有保存的CommRLast和公共已知的CommR。
首先,PoSt随机选择编码副本的某些叶节点,并对它们运行Merkle包含证明,以表明矿工具有应在其中的特定字节。
然后,矿工使用私人存储的证明(不透露其价值) ,证明他们知道副本的根,这既与包含证明相符,又可用于推导公开知道的证明CommR。
PoSt的最后阶段将这些证明压缩为单个zk-SNARK。(我们将在后期学习zk-SNARK。)
当矿工同意为客户存储数据时,他们需要放下抵押品。如果他们在合同期间的任何时候都没有通过时空证明,那么将受到处罚。这是为了鼓励在Filecoin网络中所有参与者都有良好行为而采取的激励措施的关键部分。
任何未通过PoSt检查的存储矿工都将受到惩罚,并且每当惩罚时,该抵押品的一部分都会丢失。惩罚过多后,所有抵押品都将丢失,这时矿工将无法再次向客户提供存储。
Filecoin协议采用新颖的加密技术、共识机制和激励机制设计,提供了分散的存储网络和市场,客户和矿工可以放心使用,其核心是Filecoin独特的存储验证方法。
——————————————
Filecoin网络中的5种存储角色
起始点:存储证明-空间证明
条件增强:对于特定文件,进行PoRet和PDP
条件增强:对于特定备份,证明时间限制,进行PoRep
条件增强:连续时间持有,进行PoSt
角色一:挑战challenge
角色二:证明者prover
角色三:检验者verifier
角色四:数据data
角色五:证明proof