参考:
白皮书中文版 http://chainx.org/paper/index/index/id/13.html
白皮书英文版 https://filecoin.io/filecoin.pdf
---------------------------------------------------
5 Filecoin的存储和检索市场
Filecoin有两个市场:存储市场和检索市场。网络保证矿工在提供服务时可以得到客户的奖励。
5.1 验证市场(Verifiable Markets)
交易市场(Exchange Markets)是促进特定商品和服务交换的协议。它们使得买家和买家促成交易。对于我们而言,我们要求交易是可验证的:去中心化网络的参与者必须能够在买家和卖家间验证交易。
我们提出验证市场的概念。它没有单一的实体来管理交易,交易是透明的,任何人都可以匿名参与。可验证市场协议使得服务的交易去中心化:订单簿和订单结算settlement的一致性,和服务的正确执行是可以由参与者独立验证的-在Filecoin里面的矿工和全节点。我们简化可验证市场来进行以下构建:
定义5.1
可验证市场是一个有两个阶段的协议:订单匹配和结算。订单是购买意图或者出售商品或服务安全性的表述,订单簿就是所有可用订单的列表。
5.2 存储市场
存储市场是可验证的市场,它允许客户(即买家)请求他们的存储数据和存储矿工(即卖家)提供他们的存储空间。
5.2.1 需求
我们根据以下需求来设计存储市场协议:
-
链式订单簿(In-chain orderbook) 重要的是(1)存储矿工的订单是公开的,所以最低价格的订单总是网络可知的,客户可以对订单做出明智的决定(2)客户订单必须始终提交给订单簿orderbook,即使当他们接受了最低的价格,这样市场就可以对新的报价做出反应。因此我们要求订单添加到Filecoin区块链,为的是能被加入订单簿。
-
参与者投入资源(Participants committing their resources):我们要求参与双方承诺他们的资源作为避免损害的一种方式。为了避免存储矿工不提供服务和避免客户没有可用的资金。为了参与存储市场,存储矿工必须保证在DSN中存入与其存储量成比例的抵押品pledge(更多详细信息请参看第4.3.3节)。通过这种方式,网络可以惩罚那些承诺存储数据但又不提供存储证明的存储矿工。同样的,客户必须向订单充入特定数量的资金,以这种方式保证在结算期间的资金可用性。
-
故障自处理(Self-organization to handle faults) 只有在存储矿工反复证明他们已经在约定的时间内存储了数据的情况下,订单才会结算给矿工。网络必须能够验证这些证明的存在性和正确性并且它们是按照规则来处理的。在4.3.4节有修复部分的概述。
5.2.2 数据结构
Put订单 有三种类型的订单:出价订单,询价订单和交易订单(bid orders, ask orders and deal orders.)。存储矿工创建询价ask订单添加存储,客户创建出价bid订单请求存储,当双方对价格达成一致时,他们共同创建处理deal订单。订单的数据结构和订单参数的明确定义如图10所示。
Put订单簿 存储市场的订单簿是目前有效和开放的询价,出价和 交易订单的集合。用户可以通过Put协议中定义的方法与订单簿进行交互:AddOrders,MatchOrders如图7所示。
订单簿是公开的,并且每个诚实的用户都有同样的订单簿视图。在每个周期,如果新的订单交易(txorder)出现在新的区块中那它将被添加到订单簿中。如果订单被取消,失效或者结算,则会被删除。订单将被添加到区块链中,因此在订单簿中如果是有效的:
定义5.2 我们定义出价,询价,交易订单的有效性:
如果作恶客户端从存储矿工处收到了签名的交易,但从来没有将其添加到订单簿,那么存储矿工就无法重新使用订单中提交的存储。这个字段ts就可以防止这种攻击,因为,在超过ts之后,订单变得无效,将无法在订单簿中提交。
5.2.3 存储市场协议
简而言之,存储市场协议分为两个阶段:订单匹配和结算:
-
订单匹配:客户端和存储矿工通过提交交易到区块链来将订单提交到订单簿(步骤1)。当订单匹配时,客户端发送数据碎片给存储矿工,双方签署交易并提交到订单簿(步骤2)。
-
结算: 存储矿工密封扇区(步骤3a),生成扇区所包含的碎片的存储证明,并将其定期提交到区块链(步骤3b);同时,其余的网络必须验证矿工生成的证明并修复可能的故障(步骤3c)。
存储市场协议在图11中详细描述。
5.3 检索市场
检索市场允许客户端请求检索特定的数据,由检索矿工提供这个服务。与存储矿工不同,检索矿工不要求在特定时间周期内存储数据或者生成存储证明。在网络中的任何用户都可以成为检索矿工,通过提供提供检索服务来赚取Filecoin令牌。检索矿工可以直接从客户端或者检索接收数据碎片,也可以存储它们成为存储矿工。
5.3.1 需求
我们根据以下的需求来设计检索市场协议:
-
链下订单簿 客户端必须能够找到提供所需要数据碎片的检索矿工,并且在定价之后直接交换。这意味着订单簿不能通过区块链来运行-因为这将成为快速检索请求的瓶颈。相反的,参与者只能看到订单簿的部分视图。我们要求双方传播自己的订单。
-
无信任方检索 公平交换的不可能性[10]提醒我们双方不可能没有信任方的进行交流。在存储市场中,区块链网络作为去中心化信任方来验证存储矿工提供的存储。在检索市场,检索矿工和客户端在没有网络见证所交换文件的情况下来交换数据。我们通过要求检查矿工将数据分割成多个部分并将每个部分发送给客户端来达到这个目的,矿工们将收到付款。在这种方式中,如果客户端停止付款,或者矿工停止发送数据,任何一方都可以终止这个交易。注意的是,我们必须总是假设总是有一个诚实的检索矿工。
-
支付通道 客户端当提交付款的时候可以立即进行检索感兴趣的碎片。检索矿工只有在确认收到付款的时候才会提供数据碎片。通过公共账本来确认交易可能会成为检索请求的瓶颈,所以,我们必须依靠有效的链下支付。Filecoin区块链必须支持快速的支付通道,只有乐观交易和仅在出现纠纷的情况下才使用区块链。通过这种方式,检索矿工和客户端可以快速发送Filecoin协议所要求的小额支付。未来的工作里包含了创建一个如[11,12]所述的支付通道网络。
5.3.2 数据结构
获取订单 检索市场中包含有三种类型的订单:客户端创建的出价单 Obid,检索矿工创建的询价单Oask,和存储矿工和客户端达成的交易订单Odeal。订单的数据结构如图10所示。
获取订单簿 检索市场的订单簿是有效的和公开出价订单,询价订单和交易订单的集合。与存储市场不同,每个用户有不同的订单簿视图,因为订单是在网络中传播的,每个矿工和客户端只会跟踪他们所感兴趣的订单。
5.3.3 检索市场协议
简而言之,检索市场协议分为两个阶段:订单匹配和结算:
订单匹配 客户端和检索矿工通过广播将订单提交给订单簿(步骤1)。当订单匹配的时候,客户端和检索矿工建立小额支付通道(步骤2)。
结算 检索矿工发送小部分的碎片给到客户端,然后对每个碎片客户端会向矿工发送收妥的收据receipt(步骤3)。检索矿工向区块链出示收据从而获得奖励(步骤4)。
该协议在图12中详细解释。
---------------------------------------------------------------------------------------------------
6 有用工作共识
有用 如果计算的输出对网络来说是有价值的,而不仅仅是为了保证区块链的安全。我们认为矿工在共识协议中所作的工作是有用的.
6.1 动机
确保区块链的安全是至关重要的。POW的证明方案往往要求不能重复使用的或者需要大量的浪费计算才能找到难题的解决方案。
不可重复利用的工作 大多数无许可型的区块链要求矿工解决硬计算难题,譬如反转哈希函数。通常情况下这些解决方案都是无用的,除了保护网络安全之外,没有其他任何价值。我们可以重新设计让这件事有用吗?
尝试重复使用的工作:已经有几个尝试重复使用挖矿电路进行有用的计算。有些尝试是要求矿工与标准的POW同时进行一些特殊计算,其他一些尝试用有用问题替代POW的依然难以解决。例如,Primecoin重新使用矿工的计算能力来找到新的素数,以太坊要求矿工与工作证明一起执行小程序,同时证明某些数据正在归档。虽然这些尝试中的大多数都执行有用的工作,但在这些计算中浪费的工作量仍然很普遍的。
浪费的工作 解决难题在机器成本和能力消耗方面是非常昂贵的,特别是如果这些难题完全依赖计算能力。当挖矿算法不能并发的时候,那解决难题的普通因素就是计算的功率。我们可以减少浪费的工作吗?
试图减少浪费:理想情况下,大部分网络资源应该花费在有用的工作上。一些尝试是要求矿工使用更节能的解决方案。例如,“空间挖矿”(?Spacemint)要求矿工致力于磁盘空间而不是计算;虽然更加节能,但磁盘空间依然”浪费“,因为它们被随时的数据填满了。其他的尝试是用基于权益证明的传统拜占庭协议来代替难题的解决,其中利益相关方在下一个块的投票与其在系统中所占有的货币份额成正比。
我们着手设计一个基于用户数据存储的有用工作的共识协议。
6.2 Filecoin 共识
功率容错 在我们的技术报告[13]中,我们提出了功率容错,这是对在参与者对协议结果的影响方面重新构建拜占庭故障的抽象。每个参与者控制了网络总功率n中的一部分功率,其中f是故障节点或作恶节点所控制的功率占比。
Filecoin功率 在Filecoin中,在时刻t,矿工Mi的功率Pt>i是Mi总和的存储任务。Mi的 Iti是网络中Mi总功率的影响因子。
在Filecoin中,功率有以下属性:
-
公开:网络中当前正在使用的存储总量是公开的。通过读取区块链,任何人都可以计算每个矿工的存储任务-因此任何人都可以计算出在任意时间点的每个矿工的功率和总功率。
-
可公开验证的:对于每个存储任务,矿工都需要生成”时空证明“,证明持续提供服务。通过读取区块链,任何人都可以验证矿工的功率声明是否是正确的。
-
变量: 在任意时间点,矿工都可以通过增加新增扇区和扇区补充的抵押来增加新的存储。这样矿工就能变更他们能提供的功率。
6.2.2 功率会计与时空证明
每个∆proof 区块(∆proof 是系统参数),矿工们都必须向网络提交“时空证明”,只有网络中大多数功率认为它们是有效的,才会被城管添加到区块链。在每个区块中,每个全节点会更新分配表(AllocTable),添加新的存储分配、删除过期的和标记缺少证明的记录。可以通过对分配表的记录来对矿工Mi的功率进行计算和验证。这些可以通过两种方式来完成:
-
全节点验证:如果节点拥有完整的区块链记录,则可以从创始块开始运行网络协议直到当前区块,这个过程中验证每一个分配给Mi的“时空证明”。
-
简单存储验证:假设轻客户端可以访问广播最新区块的信任源。轻客户端可以从网络中的节点请求(1)Mi在当前分配表中的记录 (2)该记录被包含在最新区块的状态树中的Merkle路径(3)从创世块到当前区块的区块头。这样轻客户端就可以将“时空证明”的验证委托给网络。
功率计算的安全性来自于“时空证明”的安全性。在这个设置里面,Post保证了矿工无法对他们所分配的存储数量说谎。事实上,他们不能声称能够存储超过他们的存储空间的数据,因为这会花费时间来运行PoSt.Setup,另外PoSt.Prove是串行的计算,并不能并行化的快速生成证明。
6.2.3 使用功率达成共识
我们预计通过扩展现在(和未来)的权益证明共识协议来实现Filecoin共识的多种策略,其中权益被替换为分配的存储。我们预计了权益证明协议的改进,我们提出了一个基于我们前期工作,称为预期共识的构建[14]。我们的策略是在每一轮选举一个(或多个)矿工,使得赢得选举的概率与每个矿工分配的存储成比例。
预期共识(Expected Consensus) 预期共识的基本直觉是确定性的,不可预测的。并在每个周期内秘密选举一个小的Leader集合。预期的期望是每个周期内当选的Leader是1,但一些周期内可能有0个或者许多的Leader。Leader们通过创建新区块并广播来扩展区块链网络。在每个周期,每个区块链被延伸一个或多个区块。在某个无Leader的周期内,空区块被添加到区块链中。虽然链中的区块可以线性排序,其数据结构是有向无环图。EC是一个概率共识,每个周期都使得比前面的区块更加确定,最终达到了足够的确定性,且出现不同的历史块链的可能性是足够小的。如果大多数的参与者都通过签署区块链来扩展区块链,加大这个区块所属链的权重,那么这个区块就被确认了。
选举矿工 在每个周期,每个矿工检查他们是否被选为Leader,这类似于完成前面的协议:CoA[15],Snow White[16],和Algorand[17]。
译者注:下面的公式表达式请参考英文原版为佳
在图13中,我们描述了矿工(ProveElect)和网络节点(VerifyElect)之间的协议。这种选举方案提供了三个属性:公平,保密和公开的可验证性。
-
公平 每个参与者每次选举只有一次试验,因为签名是确定性的,而且t和rand(t)是固定的。假设H是安全的加密散列函数,则H(Mi)/2L必须是从(0,1)均匀选择的实数,因此,可能使得方程等式为true必须是Pti/Σjptj,这等于矿工在在网络中的部分功率。因为这个概率在功率上是线性的,这种可能性在分裂或者汇集功率情况下被保留。注意随机值rand(t)在时刻t之前是未知的。
-
保密 由于有能力的攻击者不拥有Mi用来计算签名的秘钥,考虑到数字签名的假设,这个是可以忽略不计的。
-
公开可验证: 当选Leader i ∈ Lt 可以通过给出t,rand(t),H(i)/2L,来说服一个有效的验证者。鉴于前面的观点,有能力的攻击者在不拥有获胜秘密秘钥的情况下不能生成证明。
----------------------------------------------------------------------------------------------------------------
7 智能合约
Filecoin为最终用户提供了两个基本原语:Get和Put。 这些原语允许客户以优惠的价格存储数据并从市场中检索数据。 尽管原语涵盖了Filecoin的默认使用案例,但我们通过支持智能合约的部署,允许在Get和Put之上设计更复杂的操作。 用户可以对我们分类为文件合约以及通用智能合约的新的细粒度存储/检索请求进行编程。 我们整合了一个合约系统(基于[18])和一个Bridge系统,将Filecoin存储装入其他区块链,反之亦然,将其他区块链的功能带入Filecoin。
我们期望在Filecoin生态系统中存在大量的智能合约,我们期待着一个智能合约开发者社区。
7.1 Filecoin智能合约
智能合约使得Filecoin的用户可以编写有状态的程序,来花费令牌向市场请求存储J/检索数据和验证存储证明。用户可以通过将交易发送到账本触发合约中的功能函数来与智能合约交互。我们扩展了智能合约系统来支持Filecoin的特定操作(如市场操作,证明验证)。
-
文件合约: 我们允许用户对他们提供的存储服务进行条件编程。有几个例子值得一提:(1)承包矿工:客户可以提前指定矿工提供服务而不参与市场 (2)付款策略:客户可以为矿工设计不同的奖励策略,例如合约可以给矿工支付随着时间的推移越来高的费用 ,另一个合约可以由值得信任的Oracle的通知来设置存储的价格。(3)票务服务:合约可以允许矿工存放令牌和用于代表用户的存储/检索的支付 (4)更复杂的操作:客户可以创建合约来运行数据更新。
-
智能合约:用户可以将程序关联到其他系统(如以太坊[18])他们的交易上,他们不直接依赖存储的使用。我们预见了以下的应用程序:去中心化命名服务,资产跟踪和预售平台。
7.2 与其他系统的集成
桥(Bridges)是旨在连接不同区块链的工具;现在正在处理中的,我们计划支持跨链交互,以便能将Filecoin存储带入其他基于区块链的平台,同时也将其他平台的功能带入Filecoin。
-
Filecoin进入其他平台:其他的区块链系统,如比特币[19],Zcash [20],特别是Ethereum [18]和Tezos,允许开发人员写智能合约;然而,这些平台只提供很少的存储能力和非常高的成本。我们计划提供桥将存储和检索支持带入这些平台。我们注意到,IPFS已经被作为几个智能合约(和协议令牌)引用和分发内容的一种方式来使用。增加到Filecoin的支持将允许这些系统以交换Filecoin令牌的方式来保证IPFS存储内容。
-
其他平台进入Filecoin:我们计划提供Filecoin连接其他区块链服务的桥。例如,与Zcash的集成将支持发送隐私数据的存储请求。
-----------------------------------------------------------------------------------------------------------------------
8 未来的工作
这项工作为Filecoin网络的建设提供了一个清晰和凝聚的道路;但是,我们也认为这项工作将成为今后研究去中心化存储系统的起点。在这个我们识别和填充三类未来 工作。这包括已经完成只是等待描述和发布的工作,提出改进当前协议的开放式问题,和协议的形式化。
8.1 正在进行的工作
以下主题代表正在进行的工作。
-
•每个块中的Filecoin状态树的规范。
-
Filecoin及其组件的详细绩效估计和基准。
-
完全可实现的Filecoin协议规范。
-
赞助检索票务模型,其中通过分配每个可持票花费的令牌,任何客户端C1可以赞助另一个客户端C2的下载。
-
分层共识协议,其中Filecoin子网可以在临时或永久分区进行分区并继续处理事务。
-
使用SNARK / STARK增量区块链快照。
-
FileCoin-Ethereum合约接口和协议。
-
使用编织(Braid?)进行区块链归档和区块链间冲压。
-
只有在区块链解决冲突的时候才发布"时空证明”。
-
正式证明实现了Filecoin DSN和新型存储证明。
8.2 开放式问题
作为一个整体,有一些公开的问题,其答案有可能可以大大改善网络。尽管事实上,在正式启动之前并不是必须必须解决的问题。
-
一个更好的原始的"复制证明“密封功能,理想情况下是O(n)解码(不是O(nm)),可公开验证,无需SNARK / STARK。
-
“复制证明”功能的一个更好的原语,可以公开验证和透明没有SNARK / STARK。
-
一个透明,可公开验证的可检索证明或其他存储证明。
-
在检索市场中进行检索的新策略(例如,基于概率支付,零知识条件支付)。
-
“预期共识”更好的秘密Leader选举,在每个周期,只有一位当选Leader。
-
更好的可信赖的SNARK设置方案,允许增加扩展公共参数(可以运行MPC序列的方案,其中每个附加的MPC严格降低故障概率,并且每个MPC的输出可用于系统)。
8.3 证明和正式的验证
由于证明和正式验证的明确价值,我们计划证明Filecoin网络的许多属性,并在未来几个月和几年内开发正式验证的协议规范。几个证明正在进行中还有些正在思考中。但注意,要证明Filecoin的许多属性(如伸缩,离线)将是艰难的,长期的工作。
-
预期共识和变体的正确性证明。
-
功率故障容错正确性的证明,异步1/2不可能导致分叉。
-
在通用组合框架中制定Filecoin DSN,描述Get,Put和Manage作为理想的功能,并证明我们的实现。
-
自动自愈保证的正式模型和证明。
-
正式验证协议描述(例如TLA +或Verdi)。
-
正式验证实现(例如Verdi)。
-
Filecoin激励的游戏理论分析。