【IPFS】Filecoin: 一个去中心式存储网络(五-六章)

5 Filecoin的存储市场和检索市场

Filecoin有两个市场:存储市场和检索市场。这两个市场结构相同但设计不同。存储市场让客户通过付费使得存储矿工储存数据。检索市场让客户向检索矿工付费来取回数据。这两种情况下,客户和矿工都可以设置报价或接受报价。整个交易是由网络来运行—Filecoin中的所有节点构成了拟人化的网络。网络保证了矿工在提供服务时可以得到客户的奖励。

5.1 验证市场

交易市场是一种协议,它们通过促使买家和买家达成交易,促进特定商品和服务的交换。对我们而言,交易应当是可验证的:参与者们构成的去中心化网络必须能够在买家和卖家间对交易进行验证。

这里我们提出验证市场的概念。它没有单一的实体来管理交易,交易是完全透明的,任何人都可以匿名参与。可验证市场协议可以去中心化地完成服务和货品的交易:订单簿的一致性、订单的处理和服务的正确执行都可以由参与者,也就是Filecoin里面的矿工和全部节点,来进行独立验证。简化的可验证市场模型如下:

定义5.1

可验证市场协议分两个阶段:订单匹配和处理。订单是购买或出售抵押品、商品或服务的解决方案,订单簿就是所有订单的集合列表。

图9 可验证市场的一般性协议

5.2 存储市场

存储市场是可验证的市场,它允许客户(即买家)请求存储数据以及存储矿工(即卖家)提供存储空间。

5.2.1 需求

我们根据以下需求来设计存储市场协议:

  • 链式订单簿:重点(1)存储矿工的订单公开的,所以最低价是透明的,客户可以对订单做出最优抉择。(2)客户订单必须提交给订单簿,即使他们选择了最低价格,这样市场就可以对新的订单做出反应。因此为了能被添加到订单簿,我们要求订单必须被添加到Filecoin区块链。
  • 参与者投入抵押:为了避损,防止存储矿工不提供存储或者客户没有支付能力,我们要求参与双方投入抵押资源。为了参与存储市场,存储矿工必须保证在DSN中存入与其存储量成比例的抵押品(更多细节请参考3.3节)。通过这种方式,网络对承诺存储数据但又不提供存储证明的矿工进行惩罚。同样的,客户必须预存一定数量的资金,以保证其支付能力。
  • 故障自处理:只有在存储矿工反复证明他们已经在约定时间内存储了数据的情况下,订单才会进行结算。网络必须能够验证这些证明的存在性和正确性,并且保证它们按3.4节修复部分所讲的规则运行。

5.2.2 数据结构

Put订单 有三种类型的订单:出价订单,询价订单和交易订单。存储矿工创建询价订单来提供存储,客户创建出价订单以及请求存储,当双方谈妥价格时,他们共同创建交易订单。订单的数据结构和参数的细节如图10所示。

Put订单簿 存储市场的订单簿是对当前情况有效的,并且对询价,出价和交易订单都是开放的。用户可以通过Put协议中的方法(AddOrders,MatchOrders)与订单簿进行交互。具体方法如图7所示。

订单簿是公开的,对所有用户都有同样的可见性。在每个周期,如果最新的区块中出现新的交易,新订单就会立即被添加到订单簿。如果订单被取消,失效或已被完成,就会被删除。如果订单是有效的,它将被添加到区块链中,也就同时被添加到订单簿:

定义5.2 我们定义出价,询价,交易订单的有效性:

(有效出价单):从客户发出的投标单Ci,Obid:= (hsize, funds[, price,time, coll, coding])>Ci,如果满足下面的条件就是有效的:

  • Ci 在账户里有可用的资金。
  • 时间没有超时。
  • 订单必须保证最少的存储周期(这是个系统参数)。

(有效询价单):从存储矿工发出的询价单Mi,Oask:= (hspace, pricei)Mi,如果满足下面的条件就是有效的:

  • Mi承诺做矿工,并且在订单周期内不会反悔。
  • 空间必须小于Mi的可用存储:Mi承诺的存储减去预留给订单簿的部分(在询价订单和交易订单中)。

(有效交易订单):交易订单Odeal:= (hask, bid,ts)Ci,Mj,如果满足下面的条件就是有效的:

  • 询价(ask)参考这样的订单Oask:它在存储市场的订单簿中储存,并不涉及其他订单。它由Ci签署。
  • 出价(bid)订单参考这样的订单Obid:它在存储市场的订单簿中储存,并不涉及其他订单。它由Mj签署。
  • ts 不能设置为将来的时间,或者太为过去的时间

评论:如果恶意的客户从存储矿工收到了签名的交易,但从来没有将其添加到订单簿,那么存储矿工就无法重新使用交易中涉及的存储。ts可以防止这种攻击,因为超过ts之后,订单就会失效,并无法在订单簿中进行提交。

图10 检索和存储市场的命令数据结构

5.2.3 存储市场协议

简单来说,存储市场协议分两个部分:订单匹配和结算:

  • 订单匹配:客户和存储矿工将交易提交到区块链,这样可以使订单同步到订单簿(步骤1)。当订单匹配时,客户发送数据给存储矿工,双方签署交易协议并提交到订单簿(步骤2)。
  • 结算: 存储矿工将扇区密封(步骤3a),为存储有数据片段的扇区生成存储证明,并定期将其提交到区块链(步骤3b);同时,其余的网络需要验证矿工生成的证明并修复可能存在的故障(步骤3c)。

存储市场协议的详细情况请参考图11。

5.3 检索市场

检索市场允许客户请求特定的数据,并由检索矿工提供该数据。与存储矿工不同的是,检索矿工不要求在特定时间内存储数据或者生成存储证明。网络中的任何用户都可以成为检索矿工,通过提供数据片段来赚取Filecoin代币。检索矿工可以直接从客户接收数据片段,也可以成为存储矿工存储它们。

5.3.1 需求

我们根据以下的需求来设计检索市场协议:

  • 链下订单簿:客户必须能够找到提供所需要数据片段的检索矿工,并在商定价格之后直接交换数据。这意味着订单簿不能通过区块链来运行—否则这将成为快速检索请求的瓶颈—不按此操作的参与者只能看到订单簿的一部分。因此,我们要求双方都参与订单。
  • 无信任方检索:公平交换不可能性的结果[10]提醒我们,交易双方不可能在没有信任方的情况下进行交换。在存储市场中,区块链网络作为(去中心化的)信任方来验证存储矿工提供的存储。在检索市场中,检索矿工和客户交换文件的时候并没有网络的监督。为了实现这种结果,我们要求检索矿工将数据分割成多个部分,每当客户收到一个片段时,矿工们会收到一定的报酬。这种方式中,遇到客户停止付款,或者矿工停止发送数据,任何一方都可以终止交易。值得注意的是,我们必须假设至少有一个检索矿工是诚实的。
  • 支付通道:客户希望付款时可以立即收到数据,而检索矿工只有在确认收到付款后才会提供数据片段。通过公共账本确认交易可能会成为检索请求的瓶颈,所以,我们必须依赖有效的链下支付。Filecoin区块链必须支持快速的支付通道,只有在出现纠纷的情况下才使用区块链,来使交易高效无误地进行。通过这种方式,检索矿工和客户可以快速发送协议所要求的小额支付。在我们未来的工作中,包含了创建一个如[11,12]所述的支付通道网络。

5.3.2 数据结构

获取订单 检索市场中包含三种类型的订单:客户创建的出价订单Obid,检索矿工创建的询价订单Oask,以及存储矿工和客户达成的交易订单Odeal。订单的数据结构如图10所示。

获取订单簿 检索市场的订单簿包含公开有效的出价订单,询价订单和交易订单。与存储市场不同,每个用户所能看到的订单簿都不同。因为订单在网络中传播,每个矿工和客户只会追踪他们所感兴趣那一部分。

图11 存储市场协议详情

5.3.3 检索市场协议

简单来说,检索市场协议分为两个部分:订单匹配和结算:

  • 订单匹配:客户和检索矿工通过广播将订单提交给订单簿(步骤1)。订单匹配后,客户和检索矿工创建小额支付通道(步骤2)。
  • 结算:检索矿工发送小部分的数据片段发送给客户,然后对每个碎片客户会向矿工发送签名收据(步骤3)。检索矿工向区块链提交收据并获得回报(步骤4)。

该协议在图12中有详细解释。

图12 检索市场协议详情

6 有用工作共识

Filecoin DSN协议可以应用在允许验证Filecoin证明的任何共识协议上。在本节中,我们将展示如何引导基于有用工作的共识协议。Filecoin矿工通过生成“时空证明”来参与共识,取代了浪费计算量的工作量证明。

有用工作 如果在保证了区块链安全性的前提下,计算的输出对网络来说是有价值的,我们就认为矿工在共识协议中的工作是有用的。

6.1 动机

虽然确保区块链的安全是至关重要的。但工作量证明证明方案往往会求解一些不能重复的问题,或者需要浪费大量的计算才能找到解决方案的问题。

  • 不可重复的工作:很多区块链要求矿工解决一些难以计算的问题,例如反向求解一个哈希函数。通常情况下这些问题都没有什么用处,除了保护网络安全之外也没有其他价值。我们可以让这件事变得有用吗?

可重复使用工作的尝试:已经有一些人尝试重复使用挖矿能力来进行更有用的计算。有些尝试是要求矿工沿用工作量证明的标准,来进行一些特殊计算。还有其他一些尝试希望用一些目前难以解决但非常有用的问题来替代工作量证明。例如,质数币(Primecoin)重复利用矿工的计算能力来寻找新的质数;以太坊要求矿工沿用工作量证明来执行小程序;Permacoin提供档案管理服务,它要求矿工反向求解哈希函数来证明数据已被归档。虽然这些试探性工作大多很有用,但这些工作中计算能力浪费的现象仍然很普遍。

  • 浪费的工作:解决困难问题在机器损耗和能源消耗方面是十分昂贵的,特别是如果这些问题完全依赖计算能力。当挖矿算法难以并发计算的时候,解决难题的普遍因素就是计算能力。我们可以减少浪费的工作吗?

减少浪费工作的尝试:理想情况下,大部分网络资源应该花费在有用的工作上。一些尝试方案要求矿工使用更节能的解决方案。例如,Spacemint要求矿工着力于磁盘空间而不是计算;虽然更加节能,因为磁盘空间被随机数据填满,所以仍然很浪费。其他的尝试是用传统的基于权益证明的拜占庭协议来取代难题,其中权益拥有者在下一个区块中,按其代币的占有比例进行投票。

我们来设计一个基于用户数据存储的有用工作共识协议。

6.2 Filecoin共识

我们提出了有用工作的共识协议,这个协议中矿工被选出开发新区块的概率(我们称其为矿工的投票权)与其当前储存量在全网中的占比正相关。我们设计了Filecoin协议,这个协议中的矿工更愿意投身于存储而不是计算能力,并以此来平衡挖矿计算。矿工提供存储,并利用自己的计算能力生成数据已被存储的证明,以此参与到这个共识协议中。

6.2.1 挖矿能力建模

功率容错 在我们的技术报告[13]中,我们提出了功率容错,这是对在参与者对协议结果的影响方面进行拜占庭故障重构的抽象。每个参与者控制网络总功率n中的一部分,其中f是故障或竞争参与者控制的部分。

Filecoin功率 在Filecoin中,功率Pti是t时间内,矿工Mi所分配到的存储任务的总和。影响因子Iti是Mi的功率在全网功率中的占比。

在Filecoin中,功率有以下特性:

  • 公开性:网络中正在使用的存储总量是公开的。通过读取区块链,每个人都可以计算任意矿工被分配的存储任务—因此任何人在任意时间点都可以计算出的每个矿工的功率和全网总功率。
  • 公开验证性:对于每个存储任务,矿工都需要生成时空证明来证明自己确实在提供存储服务。通过读取区块链,任何人都可以验证矿工声明的功率是否正确。
  • 可变性:在任意时间点,矿工都可以通过新增抵押扇区和填充扇区来增加新的存储。这样矿工就能对功率大小进行调整。

6.2.2 功率会计与时空证明

在每个∆proof 区块(∆proof 为一个系统参数)中,矿工们都必须向网络提交时空证明,如果网络中大多数功率认为它们有效,证明就可以被成功添加到区块链。在每个区块中,每个完整节点都会会更新AllocTable,添加新的存储任务分配,删除过期和缺少标记的证明。

矿工Mi的功率可以通过分析AllocTable来计算和验证。分析主要有两种方式:

  • 全节点验证:如果节点拥有完整的区块链记录,则可以从初始区块开始,运行NetworkProtocol读取Mi的AllocTable直到当前区块。这个过程可以验证当前每一个分配给Mi的存储的时空证明。
  • 简单存储验证:假设一个轻客户端可以访问一个可以广播最新区块的信任源。轻客户端可以从网络节点中请求:(1)矿工Mi当前AllocTable的入口 (2)能够证明入口包含在最新区块的状态树中的Merkle路径(3)从初始区块到当前区块的头文件。这样轻客户端就可以将时空证明的验证托付给网络。

功率计算的安全性来自于时空证明的安全性。在这个设置里面,PoSt保证了矿工无法对他们所分配的存储量说谎。事实上,他们不能声称存储过量的数据,因为这会耗费很多时间来获取和运行PoSt.Setup。并且 PoSt.Prove是顺序算法,他们无法通过并行计算快速生成证明。

6.2.3 使用功率达成共识

我们预见了通过扩展权益证明共识协议的当下规模(和未来预期)来实现Filecoin共识的多种策略,其中权益被替换为分配式存储。同时我们预见了权益证明协议的改进,我们提出了一个架构,这个架构基于我们前期“预期共识”的工作 [14]。我们的策略是在每一轮中选出一个(或多个)矿工,赢得选举的概率与矿工被分配的存储量成正例。

预期共识 预期共识(Expected Consensus,EC)的基本直觉是确切地、不可预测地、并且秘密地在每个周期中选举一小组领导人集合。在预期中,每个周期内当选的领导人数是1,但也有一些周期内可能有零个或者许多领导人。每个周期中,区块连网络都会扩展一个或多个区块。如果某个周期内没有领导人,网络就会被添加一个空的区块。虽然链中的区块可以被线性排列,但其数据结构是一个有向无环图。EC是一个概率共识,每个周期都比前面的区块更具有确定性,所以最终可以达到足够的确定性,使得出现不同历史的可能性足够小。如果大多数的参与者都通过扩展区块链或签署区块来将自己的权重附加到链上,这个区块就稳固了。

选举矿工 在每个周期,每个矿工都要检查自己是否被选为领导人,这类似于前面的协议:CoA[15],Snow White16],和Algorand[17]。

定义6.1 (Filecoin中的EC选举)如果下面的条件是满足的,则在时段t 内矿工Mi 成为领导人:

其中rand(t)是在时间t内可以从区块链中提取出来的公开的随机变量,Pti是Mi的功率。考虑对于任意的m,L是H(m)的大小,H是一种安全的加密哈希函数, <m>Mi是由Mi签名的信息m,例如:

图13中,我们描述了矿工(ProveElect)和网络节点(VerifyElect)之间的协议。

这种选举方案提供了三种特性:公平性,保密性和公开可验证性性。

  • 公平性:每次选举中每个参与者只有一次机会,因为签名是确定性的并且t和rand(t)是固定的。假设H是安全的加密哈希函数,那么H(<t||rand(t)>Mi)/2L必须是从(0,1)均匀选择的实数,因此,使等式为真的可能性为Pti/Σjptj,这与矿工在在网络中的功率相等。因为这个概率对功率是线性的,这种可能性在分割或者汇总功率的情况下就会被保留。注意随机值rand(t)在没有给出t之前是未知的。
  • 保密性:在给出的数字签名假设中,即便是非常高效的攻击者,在没有密匙Mi的情况下计算出签名的概率也是极小的。
  • 公开可验证性:被选出的领导人 i ∈ Lt 可以通过给出t、rand(t)、H(<t||rand(t)>Mi)/2L来说服一个有效的验证者;鉴于前面给出的观点,再有能力的攻击者在没有获胜秘钥的情况下也不能生成证明。

图13 预期共识协议中的领导人选举

【翻译作者  |  浙江大学IPFS研究会:王备 刘晨 burning 刘哲 |  版权由区块先锋社区所有】

ipfs原创,作者:bitca,转载请注明出处:http://ipfser.org/2017/12/18/a7/

14

扫一扫,分享到微信

猜你喜欢

文章评论

电子邮件地址不会被公开。 必填项已用*标注

获取验证码
后发表评论

  • raihalqk

    zhi chi

    raihalqk
微信公众号

知识星球