Data chain是一个建立在激励机制上,可审计、可查证的去中心化存储网络。客户向矿工支付代币来获取数据存储和检索数据服务,矿工提供存储空间和传输带宽来获得回报。矿工们只有当网络能够查证他们在正确提供服务的时候才能获得报酬。
在本节中,我们通过DSN的定义和“时空证明”来梳理Data chain架构。
4.1 设置
4.1.1 参与者
任何用户都可以成为、存储矿工和/或检索矿工。
· 客户在DSN中通过Put和Get请求存储或检索数据,并支付代币。
· 存储矿工为网络提供数据存储。存储矿工通过提供磁盘空间和响应Put请求来参与Data chain运作。要想成为存储矿工,用户必须用与存储空间成比例的抵押品来抵押。存储矿工通过在特定时间内存储数据,来响应用户的Put请求。存储矿工生成时空证明并提交到区块链网络,来证明他们在特定时间内存储了数据。如果数据失效或丢失,存储矿工将被罚没部分抵押品。存储矿工也可以挖掘新区块。如果挖到了新区块,矿工就能获得挖取新块的奖励和新区块中的交易费用。
· 检索矿工为网络提供数据检索服务。检索矿工通过提供用户Get请求所需要的数据来参与Data chain运作。和存储矿工不同,他们不需要抵押品,不需要提交存储数据,也不需要提供存储证明。存储矿工同样可以担任检索矿工。检索矿工可以直接从客户或者从检索市场赚取收益。
4.1.2 网络,N
我们将运行在Data chain各个节点上的全体用户抽象为一个实体:网络。这个网络作为中介运行整个管理协议。简单来说,区块链中的每个新区块,都由全节点构成的网络来管理。网络可以管理可用存储,验证抵押品,审核存储证明以及修复可能存在的故障。
4.1.3 账本
我们的协议应用在基于账本的货币上。一般来说,我们管这个叫账本 L。在任意给定的时间t(也叫时期)内,所有的用户都能访问t时期的账本Lt,它是这段时期内交易序列的记录。账本只能被追加,不能被篡改。Data chain协议可以运行在任意可验证Data chain证明的账本上。在第六节中我们会展示了如何基于有效工作建立一个账本。
4.1.4 市场
存储的需求和供给在两个Data chain市场相遇:存储市场和检索市场。这两个市场属于去中心化交易所,我们第5节中对其进行阐述。简而言之,客户和矿工们通过向各自的市场提交订单来为服务定价。交易所为客户和矿工们提供了匹配交易和牵线的方法。运行管理协议后,如果服务请求被成功提供,网络会确保矿工得到奖励,客户得到服务。
4.2 数据结构
片段 片段指客户在DSN所存数据的某一部分。例如,数据可以被随意划分为许多片段,每个片段可以由不同的存储矿工来存储。
扇区 扇区指存储矿工向网络提供的磁盘空间。矿工将客户的数据片段存储到扇区,并以此赚取代币。为了存储片段,矿工们必须向网络抵押他们的扇区。
分配表 分配表是一个数据表,记录数据片段的流向和其分配的扇区。分配表在账目下的区块中都会更新,它的Merkle根存储在最新的区块中。在实际操作中,该表用来维持DSN的状态,证明验证的过程中能够保证快速查找。详细内容请参考图5。
订单 订单是请求或提供服务的声明。客户向市场提交出价来请求服务(分别在存储数据的存储市场和检索数据的检索市场),矿工们提交应答订单来提供服务。订单数据结构如图10所示。市场协议将在第5节详细介绍。
订单簿 订单簿是订单的集合。存储市场订单簿请查看第5.2.2节,检索市场订单簿第5.3.3节。
抵押 抵押是向网络提供存储(特别是扇区)的承诺。想要在存储市场接受订单,存储矿工必须将抵押提交给总账。抵押包括了抵押扇区的大小和存储矿工的抵押品(详见图5)。
Figure 5: Data Structures in a DSN scheme
4.3 协议
本节中我们通过对客户、网络和矿工的介绍,对Data chain有了一个整体的概括。我们在图7中给出了Get和Put协议的方法,在图8中给出了Manage协议,并用图6给出了一个协议实例。Data chain整体的协议概览请参见图1。
4.3.1 客户周期
本节会简要介绍客户周期的概念;下文中各协议的深入解释请参考第五节。
1. Put:客户在Data chain 中存储数据。
客户通过向矿工支付代币可以对数据进行存储。Put协议在节中有详细介绍。
客户向存储市场的订单簿发起投标(通过向区块链提交订单),就启动了Put协议。当有匹配的矿工应答时,客户就可以将数据片段发送给矿工。双方签署交易订单,并将其发送到存储市场的订单簿。
客户应当能够通过提交多重订单(或者在订单中指定复制扇区)来决定数据的拷贝数量。更高的冗余度可以提高储存的容错率。
2. Get:客户从Data chain中取回数据。
客户可以通过向检索矿工支付代币来获取DSN中的任何数据。Get协议在5.3节中有更详细的解释。
客户向检索市场的订单簿投标(向网络提交订单),就开始了get协议。当有匹配的矿工应答被找到,客户就会从矿工处得到数据片段。收到片段后,双方签署交易协议并提交到区块链,证明交易已完成。
4.3.2 挖矿周期(对存储矿工)
我们简单介绍一下挖矿周期。
1. Pledge:存储矿工向网络抵押存储。
存储矿工通过Manage.PledgeSector在区块链中存放抵押品,来保证向网络提供稳定的存储。抵押品为了保证服务而存在,如果矿工为所存储的数据生成了存储量证明,抵押品就会被退回。如果没有成功生成存储量证明,矿工就得不到抵押品了。
一旦抵押交易在区块链中出现,矿工就可以在存储市场中提供存。矿工们设置价格,并响应市场订单簿中的订单要求。
Manage.PledgeSector
· inputs:
– current allocation table allocTable
– pledge request pledge
· outputs: allocTable'
2. Receive Orders:存储矿工从存储市场获取存储请求。
一旦抵押交易出现在区块链中(在AllocTable中),矿工就能在存储市场中提供存储。他们设定价格并通过Put.AddOrders向市场订单簿响应订单。
Put.AddOrders
· inputs: list of orders.On
· outputs: bit b, equals 1 if successful
通过Put.MatchOrders来对客户的报价订单进行匹配。
Put.MatchOrders
· inputs:
–the current Storage Market OrderBook
– query order to match Oq
· outputs: matching orders .On
一旦订单匹配,客户就将数据发给存储矿工。存储矿工接收到数据后,运行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
3. Seal:存储矿工为数据片段准备未来证明。
存储矿工的存储空间被切分为很多扇区,每个扇区包括了分配给矿工的数据片段。网络通过分配表来记录每个存储矿工的扇区。当一个扇区被填满了,这个扇区就被密封(sealed)起来。密封是一种缓慢的顺序操作。密封可以将扇区中的数据转换成为唯一的物理副本,并与存储矿工的公钥相关联。密封在复制证明中是一项必须的操作,相关问题可参见第3.4节。
Manage.SealSector
· inputs:
– miner public/private key pair M
– sector index j
– allocation table allocTable
· outputs: a proof πSEAL, a root hash rt
4. Prove:存储矿工证明他们正在存储数据。
当存储矿工被分配了数据时,必须重复生成复制证明来确保他们正在存储数据(详情参看第3节)。证明被发布在区块链中,并由网络来验证。
Manage.ProveSector
· inputs:
– miner public/private key pair M
– sector index j
– challenge c
· outputs: a proof πPOS
4.3.3 挖矿周期(对于检索矿工)
本节简要概括检索矿工的挖矿周期。
1. Receive Orders:检索矿工从检索市场得到获取数据的请求。
检索矿工设置价格并发送到市场订单簿,并通过向网络发送报价。
Get.AddOrders
· inputs: list of orders .On
· outputs: none
然后检索矿工检查是否与客户的订单报价匹配。
Get.MatchOrders
· inputs:
– the current Retrieval Market OrderBook
– query order to match Oq
· outputs: matching orders O1..On
2. Send:检索矿工向客户发送数据碎片。
一旦订单匹配,检索矿工就将数据发送给客户(第5.3节)。数据接收完成后,矿工和客户就签署交易订单提交到区块链。
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. Assign:网络将客户的数据片段分配给存储矿工的扇区。
客户通过向存储市场提交订单来启动Put协议。当询价单和报价单匹配的时候,参与各方共同为交易担保并向市场提交订单。此时,网络将数据分配给矿工,并将其记录到分配表中。
Manage.AssignOrders
· inputs:
– deal orders O1deal..Ondeal
– allocation table allocTable
· outputs: updated allocation table allocTable'
2. Repair:网络发现故障并试图修复
所有的存储分配都是全网公开的。在每个区块中,网络都会检查储存分配的证明是否存在,以确保它们有效,并按照下列要求正确工作:
· 如果有部分证明丢失或失效,网络会罚没部分抵押品来惩罚存储矿工。
· 如果存在大量的证明丢失或失效(由系统参数Δfault定义),网络会认定存储矿工存在故障,将订单设定为失效,并为这部分数据引入新订单,重新进入市场。
· 如果所有该数据的存储矿工都发生故障,则认定该数据丢失,客户获得退款。
Manage.RepairOrders
· inputs:
– current time t
– current ledger L
– table of storage allocations allocTable
· outputs: orders to repair O1.Ondeal, updated allocation table allocTable
Figure 6: Example execution of the Data chain, grouped by party and sorted chronologically by row