Daoleno

FileCoin Sia 的去中心化存储设计

March 5, 2020 • ☕️☕️ 9 min read

本文会对 FileCoin 和 Sia 的去中心化存储方案进行简要分析

FileCoin 的设计

白皮书: https://filecoin.io/filecoin.v2.pdf

简介

矿工通过向客户提供存储来挖掘 Filecoin。相应的,客户花费 Filecoin 来雇佣矿工存储和分发数据。协议将矿工提供的存储资源组织到一个可以自愈的存储网络里,这样世界各地的人都可以访问这些存储资源。存储网络通过复制和减少冗余来达到健壮性。客户可以选择复制参数来应对不同的风险模型。Filecoin 构建在去中心化的 IPFS 之上。

Filecoin 是一个运行在 Proof-of-Spacetime 上的代币。Filecoin的基本工作流程是:

  1. 客户为存储和检索数据支付代币
  2. 存储矿工通过提供存储服务获得代币
  3. 检索矿工提供数据来获得代币

Filecoin 协议基于四个组

  1. Decentralized Storage Network (DSN)
  2. Novel Proofs-of-Storage
  3. Verifiable Markets
  4. Useful Proof-of-Work

协议概览

  • Filecoin 是一个构建在区块链和本地token上的去中心化存储网络。客户花费token来存储和检索数据,矿工通过存储和服务数据来赚取token
  • Filecoin DSN 分别通过两个可验证的市场(存储市场和检索市场)来提供存储和检索服务。客户和矿工为请求和提供的服务定价并向市场提供他们的订单
  • 市场由 Filecoin 网络操作,该网络使用时空证明(Proof-of-Spacetime)和复制证明(Proof-of- Replication)来确保矿工正确地存储了它们承诺存储的数据。
  • 最后,矿工可以参与到底层区块链新块的创建。矿机对下一个块的影响与它们当前在网络中所被使用的存储量成正比。

Filecoin Protocal Sketch

# 网络
在账本 L 的每个纪元 t 上:
1. 对每个新块:
    a. 检查块的格式是否有效
    b. 检查所有交易是否有效
    c. 检查所有订单是否有效
    d. 检查所有证明是否有效
    e. 检查所有抵押是否有效
    f. 如果任何上述条件失败,丢失区块
2. 对 t 中引入的每个新订单 O
    a. 将 O 添加到存储市场的订单簿中
    b. 如果 O 是 bid: 锁 O.funds
    c. 如果 O 是 ask: 锁 O.space
    d. 如果 O 是 deal: 运行 Put.AssignOrders
3. 对存储市场订单薄中的每个 O:
    a. 检查 O 是否已经过期(或取消)
        * 从订单簿中移除 O
        * 返回未花费的 O.funds
        * 从 AllocTable 中释放 O.space
    b. 如果 O 是 deal,通过运行 Manage.RepairOrder 来检查预期的证明是否存在
        * 如果有一个丢失,惩罚 M 的抵押物
        * 如果缺少的证据超过 𝝙fault 纪元,则取消订单,重新将其引入市场
        * 如果无法从网络中检索和重新构造片段,则取消订单并为客户退款

# 客户端
在任何时刻:
    1. 通过 Put.AddOrders 提交新的存储订单
        a. 通过 Put.MatchOrders 寻找匹配的订单
        b. 将文件发给匹配的矿工 M
    2. 通过 Get.AddOrders 提交新的检索订单
        a. 通过 Get.MatchOrders 找到匹配的订单
        b. 与 M 创建支付通道
从存储矿工 M 处接收 Odeal
    1. 签约 Odeal
    2. 通过 Put.AddOrders 向区块链提交签约的 Odeal
从检索矿工 M 处接收 (pi)
    1. 验证(pi)是有效的,并且它是被请求的
    2. 发送小额支付给 M

# 存储挖矿
在任何时刻:
    1. 通过 Manage.PledgeSector 更新过期的抵押
    2. 通过 Manage.PledgeSector 抵押新的存储
    3. 通过 Put.AddOrder 提价新的 ask 订单
在每个纪元 t:
    1. 对在订单簿中的每个 Oask:
        a. 通过 Put.MatchOrders 找到匹配的订单
        b. 联系匹配的客户开始新的交易
    2. 对每个抵押区:
        a. 通过 Manage.ProveSector 生成存储证明
        b. 如果是发布证明的时候(每 𝝙proof 纪元),将其提交到区块链
从客户端 C 接收片段 p时:
    1. 检查片段是否是订单 Obid 中指定的大小
    2. 创建 Odeal 并签发它,然后将其发给 C
    3. 将片段(piece)存储到扇区(sector)中
    4. 如果扇区满了,运行 Manage.SealSector

# 检索挖矿
在任何时刻:
    1. gossip 向网络请求订单
    2. 从网络监听 bid 订单
从 C 接收到检索请求时:
    1. 开启和 C 的支付通道
    2. 将数据分为多个部分
    3. 只有在收到付款时发送部分数据

数据结构

块(Pieces) 块是客户端存储在 DSN 中的数据的一部分。例如,数据可以被分解成许多块,每一块都可以由一组不同的存储矿工来存储。

扇区(Sectors) 扇区是存储矿工提供给网络的一些磁盘空间。矿工将来自客户端的块存在扇区里并因此赚取代币。为了存储块,矿工必须将他们的扇区抵押给网络。

分配表(AllocationTable) AllocTable 是一个数据结构,用于跟踪块及其相应的扇区。AllocTable 在分类帐中的每个区块上更新,它的 Merkle root 存储在最新的区块中。在实践中,该表用于保存 DSN 的状态,允许在验证过程中快速查找。

订单(Orders) 订单是请求或提供服务的意向声明。客户向市场提交投标(bid)订单以请求服务(响应. 存储市场为存储数据和检索市场为检索数据),矿工提交请求(ask)订单提供服务。

订单簿(Orderbook) 订单簿是一组订单。

抵押(Pledge) 抵押是向网络提供存储(特指 sector)的承诺。存储矿工必须向分类账提交抵押,才能开始在存储市场接受订单。抵押由抵押扇区的大小和存储矿工存放的抵押品组成。

Pledge := <size, coll>Mi
    * size, 抵押扇区的大小
    * coll, Mi 放置在该扇区的抵押品

Orderbook
OrderBook:(O1..On)
    * Oi, 当前有效的 deal, ask, bid 订单

Allocation
allocTable:{M1 --> (allocEntry..allocEntry), M2..}
allocEntry: (sid, orders, lask, missing)
    * sid, 扇区 id
    * Oi, 当前有效的 deal,ask,bid 订单
    * orders, 一组订单(Odeal..Odeal)
    * lask, 账本 L 中最新的存储证明(proof of storage)
    * missing, 缺失证明的计数

Filecoin Protocol 交互

filecoin-protocol.png

上图是客户-矿工交互的概览图。区块链上面为存储市场,下面为检索市场,随着时间的推移,从左边的订单匹配阶段向右边的结算阶段发展。注意,在进行检索的微支付之前,客户端必须锁定微交易的资金。

Decentralized Storage Network (DSN)定义

DSN 聚合了多个独立存储提供者提供的存储并且是自协调的,来为客户端提供数据存储和数据检索。

DSN scheme 是存储提供者可客户端运行的一组协议

(Put, Get, Manage)

  • Put(data) —> key: 客户端执行 Put 协议将数据存储在唯一标识符 key 下
  • Get(key) —> data: 客户端执行 Get 协议利用当前存储的唯一标识符 key 来检索数据
  • Manage(): 参与者网络通过 Manage 协议进行协调:控制可用存储、审计提供者提供的服务和修复可能的错误。Manage 协议通常由存储提供者结合客户端和网络审计者一同运行。

Proof-of-Replication 和 Proof-of-Spacetime

在 Filecoin 协议中,存储提供者必须使他们的客户相信他们提供着客户所支付的存储;实际上,存储提供者需要生成区块链网络(或客户端自身)可以验证的存储证明(Proofs-of-Storage(PoS))

Proof-of-Replication(PoRep) 是一种新型的存储证明,它允许服务器(即验证程序 P)说服用户(即验证者V)某些数据 D 已经复制到它自己惟一专用的物理存储中。

我们的方案是一个交互协议,其中验证者 P: (a) 提交存储数据 D 的 n 个不同副本(物理上独立的拷贝) (b) 通过挑战/响应协议说服验证者 V, P 确实存储着每个副本。

Proof-of-Spacetime(PoSt),验证者检查服务器在一段时间内是否存储着它的数据。

直观地说,需要验证者 (a) 生成顺序的存储验证 (在我们的例子中是 PoRep),以确定时间 (b) 递归地组合执行来生成一个简短的证明。

PoRep 和 PoSt 的实现依赖于零知识证明 zk-SNARKs

Filecoin 的存储证明概述

filecoin-pos.png

Filecoin 共识(挖矿)

网络选举矿工来创建一个新块的概率(称为矿工的投票权)与相对于网络其余部分矿工所提供的正在被使用的存储成正比。 这样矿工们宁愿投资于存储而不是计算能力来并行化挖掘计算。矿商提供存储和重用计算,以证明数据正在被存储,以参与共识。

本质上,Filecoin 拓展了 Proof-of-Stake 共识算法,将 stake 替换为了赋予的存储。

Sia 的设计

简介

Sia 是一个去中心化的存储平台。Sia 允许在对等点之间形成存储协议。合约是存储提供者和他们的客户之间的协议,定义将以什么价格存储什么数据。它们要求存储提供商定期证明它们仍在存储客户的数据。 合约存储在区块链中,使它们可以公开审计。在这方面,Sia 可以被视为一种比特币衍生品,包括对此类合约的支持。

为了形成合约:

  • 存储提供者(host)

    • 同意存储客户端的数据,并周期性的提交证明直到合约过期
    • 从每次提交的证明中获得奖励,确实证明受到惩罚
    • 证明是公开可验证的(在区块链上)
  • 客户端

    • 不需要验证存储证明,只需要简单的将文件上传的网络(网络共识可以自动的验证存储合约)

总体结构

Sia 选择对所有的交易使用 M-of-N 多签名方案

Sia 使用三个拓展(合约,证明,合约更新)来创建和加强存储合约。

交易

一个交易包含下列字段

字段 描述
Version 协议版本号
Arbitrary Data 用来描述元数据或其他数据
Miner Fee 给矿工的回报
Inputs 收入资金
Outputs 支出资金(可选)
File Contract 文件合约(可选)
Storage Proof 存储证明(可选)
Signatures 每个输入的签名

文件合约

文件合约是存储提供者和客户端之间的一份协议。文件合约的核心是 Merkle root hash。为了构造这个 hash,文件被分成常量大小的块并被 hash 到 Merkle 树里。 Root hash 和文件的总大小,可以被用来验证存储。

文件合约还指定了期限、挑战频率和支付参数,包括有效证明的奖励、无效或丢失证明的奖励以及可以丢失的证明的最大数量。 挑战频率指定必须多久提交一个存储证明,并创建分离的挑战窗口,在此期间主机必须提交存储证明(每个窗口一个证明)。

存储证明

为了履行文件合约,定期提交存储证明交易。每个存储证明针对特定的文件合约。存储证明不需要有任何输入或输出;只需要一个合同ID和证明数据。

存储提供者通过提供原始文件的一个片段以及来自文件 Merkle 树的 hash 列表来证明存储