Filecoin白皮书(中文版)
Filecoin:一种去中心化的存储网络
协议实验室
2017年7月19日
摘要
当前互联网正处于一场革命中:集中式专有服务正在被去中心化开放服务所代替;信任式参与被可验证式计算所代替;脆弱的位置寻址被弹性的内容寻址所代替;低效率的整体式服务被点对点算法市场所代替;比特币、以太坊和其他的区块链网络已经证明了去中心化交易账本的有效性。这些公共账本处理复杂的智能合约应用程序和交易价值数百亿美金的加密资产。这些系统的参与者们形成去中心化的、没有中心管理机构或者可信任党派的网络提供了有用的支付服务,这是广泛互联网开放服务的第一个实例。IPFS通过分散的网页自身已经证明了内容寻址的有效性,它提供了全球点对点网络数十亿文件使用。它解放了孤岛数据,网络分区存活,离线工作,审查制度路线,产生了持久的数字信息。
Filecoin是一个去中心化存储网络,它让云存储变成一个算法市场。这个市场运行在有着本地协议令牌(也叫做Filecoin)的区块链。区块链中的矿工可以通过为客户提供存储来获取Filecoin,相反的,客户可以通过花费Filecoin来雇佣矿工来存储或分发数据。和比特币一样,Filecoin的矿工们为了巨大的奖励而竞争式挖区块,但Filecoin的挖矿效率是与存储活跃度成比例的,这直接为客户提供了有用的服务(不像比特币的挖矿仅是为了维护区块链的共识)。这种方式给矿工们创造了强大的激励,激励他们尽可能多的聚集存储器并且把它们出租给客户们。Filecoin协议将这些聚集的资源编织成世界上任何人都能依赖的自我修复的存储网络。该网络通过复制和分散内容实现鲁棒性,同时自动检测和修复副本失败。客户可以选择复制参数来防范不同的威胁模型。该协议的云存储网络还提供了安全性,因为内容是在客户端端对端加密的,而存储提供者不能访问到解密秘钥。Filecoin的成果作为可以为任何数据提供存储基础架构的IPFS最上面的激励层。它对去中心化数据,构建和运行分布式应用程序,以及实现智能合同都非常有用。
这些工作包括以下几部分内容:
介绍Filecoin网络,概述这个协议以及详细介绍几个组件。
形式化去中心化存储网络(DSN)的计划与内容,然后构建Filecoin作为一个DSN。
介绍一种叫“复制证明”的新型存储证明方案,它允许验证任何数据副本都存储在物理上独立的存储器中。
介绍一种新型的以基于顺序复制和存储作为激励度量的有用工作共识。
形成可验证市场,并构建两个市场,存储市场和检索市场,它们分别管理如何从Filecoin写入和读取数据。
讨论用例,如何连接其他系统以及如何使用这个协议。
注意:Filecoin是一项正在进行的工作。正在进行积极的研究,本文的新版本将会出现在https://filecoin.io。
如有意见和建议,请通过research@filecoin.io与我们联系。
1. 介绍
Filecoin是一种协议令牌,其区块链运行在一种叫“时空证明”的新型证明机制上,其区块被存储数据的矿工所挖。Filecoin协议通过不依赖于单个协调员的独立存储提供商组成的网络提供数据存储服务和数据检索服务。其中:
用户为数据存储和检索支付令牌
存储矿工通过提供存储空间赚取令牌
检索矿工通过提供数据服务赚取令牌
1.1 基本组件 Elementary Components
Filecoin协议由四个新型组件组成:
去中心化存储网络(Decentralized Storage Network)(DSN):我们提供一个由提供存储和检索服务的独立服务商网络的抽象(在第二节)。接着我们提出了Filecoin协议作为激励,可审计和可验证的DSN构建(在第4节)。
新型的存储证明:我们提出了两种新型存储证明方案(在第三节):(1)“复制证明”(Proof-of-Replication)允许存储提供商证明数据已经被复制到了他自己唯一专用的物理存储设备上了。执行唯一的物理副本使验证者能够检查证明者是否不存在将多个数据副本重复拷贝到同一存储空间。(2)“时空证明”(Proof-of-Spacetime)允许存储提供商证明在指定的时间内存储了某些数据。
可验证市场:我们将存储请求和检索需求作为两个由Filecoin网络操作的去中心化可验证市场的订单进行建模(在第五节)。验证市场确保了当一个服务被正确提供的时候能执行付款。我们介绍了客户和矿工可以分别提交存储和检索订单的存储市场和检索市场。
有效的工作量证明(Proof-of-Work):我们展示了如何基于“时空证明”来构建有效的工作量证明来应用于共识协议。矿工们不需要花费不必要的计算来挖矿,但相反的必须存储数据于网络中。
1.2 协议概述Protocol Overview
Filecoin协议是构建于区块链和带有原生令牌的去中心化存储网络。客户花费令牌来存储数据和检索数据,而矿工们通过提供存储和检索数据来赚取令牌。
Filecoin DSN 分别通过两个可验证市场来处理存储请求和检索请求:存储市场和检索市场。客户和矿工设定所要求服务的价格和提供服务的价格,并将其订单提交到市场。
市场由Filecoin网络来操作,该网络采用了“时空证明”和“复制证明”来确保矿工们正确存储他们承诺存储的数据。
最后,矿工们能参与到区块链新区块的锻造。矿工对下一个区块链的影响与他们在网络中当前存储使用量成正比。
图一是使用了术语定义之后的Filecoin协议草图,伴随着一个例子如图2所示。
图1:Filecoin 协议草图
图2:Filecoin 协议实例与用户矿机交互
2.1 故障容错
2.1.1 管理故障
2.1.2 存储故障
2.2 属性
2.2.2 可恢复性
该属性满足了以下要求:考虑到我们的Π的容错假设,如果有些数据已经成功存储在Π并且存储提供商继续遵循协议,那么客户最终能够检索到数据。
定义2.3 一个DSN方案(Π)提供了可恢复性:如果有任意成功的Put操作将数据d设置在键k下,且存在一个成功的客户Get操作通过对键K执行检索得到数据(这个定义并不保证每次Get操作都能成功,如果每次Get操作最终都能返回数据,那这个方案是公平的)。
2.3 其他属性
DSNs可以提供特定于其应用程序的其他属性。我们定义了Filecoin DSN所需要的三个关键属性:公开可验证性、可审查性和激励兼容性。
定义2.4
一个DSN方案(Π)是公开可验证的:对于每个成功的Put操作,存储网络的供应商可以生成数据当前正在被存储的证明。这个存储证明必须说服任何只知道键但并不能访问键所对应的数据的有效验证者。
定义2.5
一个DSN方案(Π)是可审查的:如果它产生了可验证的操作轨迹,并且在未来能被检查在正确的时间上数据确实被存储了。
定义2.6
一个DSN方案(Π)是激励可兼容的:如果存储提供商由于成功提供了存储数据和检索数据的服务而获得激励,或者因为作弊而得到惩罚。所有存储提供商的优势策略是存储数据。
3. 复制证明与时空证明
在Filecoin协议中,存储供应商必须让他们的客户相信,客户所付费的数据已经被他们存储。在实践中,存储供应商将生成“存储证明”(POS)给区块链网络(或客户自己)来验证。
在本节中,我们介绍和概述在Filecoin中所使用的“复制证明”n (PoRep)和“时空证明”(PoSt)实现方案。
3.1 动机
存储证明(POS)方案类似“数据持有性验证”(PDP)[2]和“可恢复性证明”(PoR)[3,4]方案。它允许一个将数据外包给服务器(既证明人P)的用户(既验证者V)可以反复检查服务器是否依然存储数据D。用户可以用比下载数据还高效的方式来验证他外包给服务器的数据的完整性。服务器通过对一组随机数据块进行采样和提交小量数据来生成拥有的概率证明作为给用户的响应协议。
PDP和PoR方案只保证了证明人在响应的时候拥有某些数据。在Filecoin中,我们需要更强大的保障能阻止作恶矿工利用不提供存储却获得奖励的三种类型攻击:女巫攻击(Sybil attack)、外包攻击(outsourcing attacks)、生成攻击(generation attacks)。
女巫攻击:作恶矿工可能通过创建多个女巫身份假装物理存储很多副本(从中获取奖励),但实际上只存储一次。
外包攻击:依赖于可以快速从其他存储提供商获取数据,作恶矿工可能承诺能存储比他们实际物理存储容量更大的数据。
生成攻击:作恶矿工可能宣称要存储大量的数据,相反的他们使用小程序有效地生成请求。如果这个小程序小于所宣称要存储的数据,则作恶矿工在Filecoin获取区块奖励的可能性增加了,因为这是和矿工当前使用量成正比的。
3.3 时空证明
存储证明方案允许用户请求检查存储提供商当时是否已经存储了外包数据。我们如何使用PoS方案来证明数据在一段时间内都已经被存储了?这个问题的一个自然的答案是要求用户重复(例如每分钟)对存储提供商发送请求。然而每次交互所需要的通信复杂度会成为类似Filecoin这样的系统的瓶颈,因为存储提供商被要求提交他们的证明到区块链网络。
为了回答这个问题,我们介绍了新的证明,“时空证明”,它可以让验证者检查存储提供商是否在一段时间内存储了他/她的外包数据。这对提供商的直接要求是:(1)生成顺序的存储证明(在我们的例子里是“复制证明”)来作为确定时间的一种方法。(2)组成递归执行来生成简单的证明。
3.4 PoRep和PoSt实际应用
我们感兴趣的是PoRep和PoSt的应用构建,可以应用于现存系统并且不依赖于可信任的第三方或者硬件。我们给出了PoRep的一个构建(请参见基于密封的复制证明[5]),它在Setup过程中需要一个非常慢的顺序计算密封的执行来生成副本。PoRep和PoSt的协议草图在图4给出,Post的底层机制的证明步骤在图3中。
3.4.1 构建加密区块
防碰撞散列。我们使用一个防碰撞的散列函数:CRH:{0, 1}* → {0, 1}O(λ)。我们还使用了一个防碰撞散列函数MerkleCRH,它将字符串分割成多个部分,构造出二叉树并递归应用CRH,然后输出树根。
我们建议感兴趣的读者参看[6,7,8]对zk-SNARK系统的正式介绍和实现。
通常而言这些系统要求KeyGen是由可信任参与方来运行。创新的可扩展计算完整性和隐私(SCIP)系统[9]展示了在假设信任的前提下,一个有希望的方向来避免这个初始化步骤。
3.4.3 PoRep构建实践
这节描述PoRep协议的构建并已在图4包括了一个简单协议草图。实现和优化的细节略过了。
3.4.4 PoSt构建实践
这节描述Post协议的构建并已在图4中包含了一个简单协议草图。实现和优化的细节略过了。
3.5 在Filecoin的应用
Filecoin协议采用“时空证明”来审核矿工提供的存储。为了在Filecoin中使用PoSt,因为没有指定的验证者,并且我们想要任何网络成员都能够验证,所以我们把方案改成了非交互式。因为我们的验证者是在public-coin模型中运行,所以我们可以从区块链中提取随机性来发出挑战。
4. Filecoin:DSN构建
Filecoin DSN是可升级,可公开验证和激励式设计的去中心化的存储网络。客户为了存储数据和检索数据向矿工网络付费。矿工提供磁盘空间和带宽来赚取费用。矿工只有在网络可以审计他们的服务是否正确提供的时候才会收到付款。
在本节中,我们介绍基于DSN的定义和”时空证明“的Filecoin DSN构建。
4.1 设定
4.1.1 参与者
任何用户都可以作为客户端、存储矿工和/或检索矿工来参与Filecoin网络。
4.2 数据结构
碎片:碎片是客户在DSN所存储数据的一部分。例如,数据是可以任意划分为许多片,并且每片都可以有不同集合的存储矿工来存储。
扇区:扇区是存储矿工向网络提供的一些磁盘空间。矿工将客户数据的碎片存储到扇区,并通过他们的服务来赚取令牌。为了存储碎片,矿工们必须向网络抵押他们的扇区。
抵押:抵押是像网络提供存储(特别是扇区)的承诺。存储矿工必须将抵押提交给账本,以便能在存储市场接受订单。抵押包括了抵押扇区的大小和存储矿工的存放的抵押品。
4.3 协议
在本节中,我们通过描述客户端、矿工和网络执行的操作来概述Filecoin DSN。我们在图7中介绍了Get和Pug协议的方法,和在图8中的管理协议。一个协议执行的示例如图6所示。图1是Filecoin协议概览。
2. Get:客户从Filecoin检索数据。
客户可以通过使用Filecoin 令牌向存储矿工付费来检索任何数据。Get协议在第5.3节有详细描述。客户端通过执行Get协议向检索市场订单簿提交投标订单。当找到匹配的矿工报价订单后,客户会收到来自矿工的碎片。当收到的时候,双方对交易订单进行签名提交到区块链来确认交易成功。
4.3.2 挖矿周期(对于存储矿工)
我们给出一个非正式的挖矿周期概述。
1. 抵押:存储矿工向网络抵押存储。
存储矿工通过在抵押交易中存放抵押品来保证向区块链提供存储。通过Manage.Pledge Sector,抵押品被抵押一段期限是为了提供服务,如果矿工为他们所承诺提交存储的数据生成存储证明,抵押品就回返还给他们。如果存储证明失败了,一定数量的抵押品就会损失。他们设定价格并向市场订单簿提交报价订单,一旦抵押交易在区块链中出现,矿工就能在存储市场中提供他们的存储。
Manage.PledgeSector • inputs:
– current allocation table allocTable
– pledge request pledge
• outputs: allocTable'
一定订单匹配,客户会讲他们的数据发给存储矿工。存储矿工接收到数据的时候,运行Put.ReceivePiece 。数据被接收完之后,矿工和客户签收订单并将其提交到区块链。
Put.ReceivePiece
• inputs: – signing key for Mj
– current orderbook OrderBook
– ask order Oask
– bid order Obid
– piece p
• outputs: deal order Odeal signed by Ci and Mj
– miner public/private key pair M
– sector index j
– challenge c
• outputs: a proof πPOS
4.3.3 挖矿周期(对于检索矿工)
我们给出一个非正式的挖矿周期概述。
2. 发送:检索矿工向客户发送数据碎片。
一旦订单匹配,检索矿工就将数据发送给客户(第5.3节有详细描述)。当数据被接收完成,矿工和客户就签署交易比ing提交到区块链。
Put.SendPieces
• inputs: – an ask order Oask
– a bid order Obid
– a piece p
• outputs: a deal order Odeal signed by Mi
4.3.4 网络周期
我们给出一个非正式的网络操作概述。
1.分配:网络将客户的碎片分配给存储矿工的扇区。
客户通过向存储市场提交报价订单来启动Put协议。当询价单和报价单匹配的时候,参与的各方共同承诺交易并向市场提交成交的订单。此时,网络将数据分配给矿工,并将其记录到分配表中。
Manage.AssignOrders
• inputs:
– deal orders O1deal..Ondeal
– allocation table allocTable
• outputs: updated allocation table allocTable'
2. 修复:网络发现故障并试图进行修复。
所有的存储分配对于网络中的每个参与者都是公开的。对于每个块,网络会检查每个需要的证明都存在,检查它们是否有效,因此采取行动:
Manage.RepairOrders
• inputs:
– current time t
– current ledger L
– table of storage allocations allocTable
• outputs: orders to repair O1deal..Ondeal, updated allocation table allocTable
4.4 担保和要求
以下是Filecoin DSN如何实现完整性、可检索性,公开可验证性和激励兼容性。
定义5.1
可验证市场是一个有两个阶段的协议:订单匹配和结算。订单是购买意图或者出售商品或服务安全性的表述,订单簿就是所有可用订单的列表。
5.2 存储市场
存储市场是可验证的市场,它允许客户(即买家)请求他们的存储数据和存储矿工(即卖家)提供他们的存储空间。
5.2.1 需求
我们根据以下需求来设计存储市场协议:
链式订单簿: 重要的是(1)存储空格的订单式公开的,所以最低价格的订单总是网络知名的,客户可以对订单做出明智的决定(2)客户订单必须始终提交给订单,即使他们接受接受最低的价格,这样市场就可以对新的报价做出反应。因此我们要求订单添加到Filecoin区块链,为的时能被加入订单簿。
(有效询价单) 从存储矿工发出的询价单Mi,Oask:= (hspace, pricei)Mi,如果满足下面的条件就是有效的:
Mi承诺为矿工,并且质押期不会在订单周期之前到期
空间必须小于Mi的可用存储。Mi在订单中减去承诺的存储(在询价订单和交易订单中)
如果作恶客户端从存储矿工出收到了签名的交易,但从来没有将其添加到订单簿,那么存储矿工就无法重新使用订单中提交的存储。这个字段ts就可以防止这种攻击,因为,在超过ts之后,订单变得无效,将无法在订单簿中提交。
5.2.3 存储市场协议
简而言之,存储市场协议分为两个阶段:订单匹配和结算。
订单匹配:客户端和存储矿工通过提交交易到区块链来将订单提交到订单簿(步骤1)。当订单匹配时,客户端发送数据碎片给存储矿工,双方签署交易并提交到订单簿(步骤2)。
结算:存储矿工密封扇区(步骤3a),生成扇区所包含的碎片的存储证明,并将其定期提交到区块链(步骤3b);同时,其余的网络必须验证矿工生成的证明并修复可能的故障(步骤3c)。
存储市场协议在图11中详细描述。
5.3.1 需求
我们根据以下的需求来设计检索市场协议:
链下订单簿:客户端必须能够找到提供所需要数据碎片的检索矿工,并且在定价之后直接交换。这意味着订单簿不能通过区块链来运行。因为这将成为快速检索请求的瓶颈。相反的,参与者只能看到订单簿的部分视图。我们要求双方传播自己的订单。
该协议在图12中详细解释。
6. 有用工作共识
Filecoin DSN协议可以在允许验证的任何共识协议之上实现Filecoin的证明。在本节中,我们将结算如何基于有用来引导共识协议。Filecoin矿工生成“时空证明”来参与共识,而不是浪费的POW。
有用。如果计算的输出对网络来说是有价值的,而不仅仅是为了保证区块链的安全。我们认为矿工在共识协议中所作的工作是有用的。
6.1 动机
确保区块链的安全是至关重要的。POW的证明方案往往要求不能重复使用的或者需要大量的浪费计算才能找到难题的解决方案。
6.2 Filecoin 共识
我们提出了一个有用工作共识协议,其中网络选择一个矿工创建一个新矿区的概率(我们称之为矿工的投票权)与他们当前网络中正在使用的储量成正比关系。我们设计 Filecoin 协议,能让矿工们投资存储,而非在算力上并行化采矿计算。矿工提供存储并重新使用计算来证明数据被存储以参与共识。
6.2.1 挖矿功率建模
在Filecoin中,功率有以下属性:
公开:网络中当前正在使用的存储总量是公开的。通过读取区块链,任何人都可以计算每个矿工的存储任务-因此任何人都可以计算出在任意时间点的每个矿工的功率和总功率。
可公开验证的:对于每个存储任务,矿工都需要生成”时空证明“,证明持续提供服务。通过读取区块链,任何人都可以验证矿工的功率声明是否是正确的。
变量:在任意时间点,矿工都可以通过增加新增扇区和扇区补充的抵押来增加新的存储。这样矿工就能变更他们能提供的功率。
可以通过对分配表的记录来对矿工Mi的功率进行计算和验证。这些可以通过两种方式来完成:
6.2.3 使用功率达成共识
我们预计通过扩展现在(和未来)的权益证明共识协议来实现Filecoin共识的多种策略,其中权益被替换为分配的存储。我们预计了权益证明协议的改进,我们提出了一个基于我们前期工作,称为预期共识的构建[14]。我们的策略是在每一轮选举一个(或多个)矿工,使得赢得选举的概率与每个矿工分配的存储成比例。
选举矿工。在每个周期,每个矿工检查他们是否被选为Leader,这类似于完成前面的协议:CoA[15],白皮书[16],和算法[17]。
译者注:下面的公式表达式请参考英文原版为佳
定义6.1。如果下面的条件是满足的,则在时刻t 矿工Mi 是Leader:
其中rand(t)是在时刻t,可以从区块链中提取出来的公开的随机变量,Pt>i是Mi的功率。考虑对于任意的m,L是H(m)的大小,H是一种安全的加密散列函数,其中(m)Mi是Mi对消息m的签名,使得:
7. 智能合约
7.1 Filecoin智能合约
智能合约使得Filecoin的用户可以编写有状态的程序,来花费令牌向市场请求存储J/检索数据和验证存储证明。用户可以通过将交易发送到账本触发合约中的功能函数来与智能合约交互。
我们扩展了智能合约系统来支持Filecoin的特定操作(如市场操作,证明验证)。
7.2 与其他系统的集成
8.1 正在进行的工作
8.2 开放式问题
作为一个整体,有一些公开的问题,其答案有可能可以大大改善网络。尽管事实上,在正式启动之前并不是必须必须解决的问题。
8.3 证明和正式的验证
致谢
这项工作是Protocol Labs团队中多个人的累积努力,如果没有实验室的合作者和顾问的帮助、评论和审查这是不可能完成的。Juan Benet在2014年写了原始的Filecoin白皮书,为这项工作奠定了基础。他和尼古拉·格雷科(Nicola Greco)开发了新的协议,并与提供了有用的贡献、评论、审查意见的团队其他人合作编写了这份白皮书。特别是大卫,“大卫”Dalrymple提出了订单范例和其他想法,Matt Zumwalt改进了在这篇论文中的结构,伊万·米亚佐诺(Evan Miyazono)创建了插图,并完成了这篇论文,在设计协议时,Jeromy Johnson提出了深刻的见解,Steven Allen提供了深刻的问题和清晰的说明。我们也感谢所有的合作者和顾问进行有用的对话;尤其是Andrew Miller和Eli Ben-Sasson。
白皮书原文地址:
https://filecoin.io/filecoin.pd