Filecoin 存储证明 浅析

概 要

  1. 存储证明是 Filecoin 网络成立的基础,Filecoin的存储证明包括:PoRep(复制证明)和 PoSt(时空证明)

  2. PoRep = PoS + PoR

  3. 算法的设计目标是,复制证明必须在足够长的时间内才能完成,而时空证明要足够快,从而达到防止作弊的目的

  4. 证明算法具体实现在 rust-fil-proofs 项目中,Filecoin实现通过CGo调用 Rust 相关函数

1. 为什么需要存储证明

信息产业发展至今,存储已经成为一个最为基础的产业。整个存储市场处于高速发展之中,基本上是每两年存储容量就翻一番。然而,作为信息的承载体,存储市场起步晚于网络市场,因此,其发展也较晚,当通用网络协议和实现都已经标准化的今天,存储市场却完全被巨头把控。在存储越来越重要的今天,通用的统一的存储网络呼声也就越来越高。

Filecoin就是致力于建立这样一个通用的人人可以参与的存储网络,在这个网络之中,没有寡头控制,也无需巨头背书。一个基本的目标就是,网络(代码)本身就可以形成一个良性的生态,奖优罚劣,形成一个高质量的网络。其首要任务就是防攻击(防欺骗)。在Filecoin的白皮书中提到了三种攻击方式:女巫攻击、生成攻击和外包攻击。对这些攻击的定义这里不展开,需要提到的是,所谓的防攻击,也就是要让欺骗者现行,让诚实者获得利益。

从存储的角度来理解,很简单,这个网络需要防止存储提供者作假,也就是要保证:1)不能虚报存储空间;2)不能虚报存储的数据或存储份数;3)不能虚报存储相应数据的时间周期。如果网络(代码)本身能够防止这些欺骗,那么,就不需要一个企业或机构来背书或仲裁。网络的生态形成了。

2. Filecoin 相关的存储证明

具体在Filecoin的实现之中,大致可以划分为两个部分:PoRep(Proof of Replication,复制证明)和 PoSt(Proof of Spacetime,时空证明)。还有数据片段证明和可检索证明。

  1. Proof of Replication: 复制证明,证明数据的的一个单独的拷贝已经在一个特定的扇区内创建成功。复制证明由封印(****Seal****)操作完成,封印操作创建一份数据的拷贝,并产生相应的复制证明

  2. Proof of Space-Time:时空证明, 证明一定数量的已封印的扇区在一定的时间范围内存在于指定的存储空间之中 — 而不是证明者临时生成的数据(这被视为攻击)

  3. Piece Inclusion Proof:数据片段包含证明,证明一个给定的数据片段存在于一个已封印的扇区之中

  4. Proof of Retrievability:可检索证明,一种默克树证明,用来表明一个给定的叶节点存在于一个已封印的扇区内

Filecoin的时空证明是与复制证明算法紧密相关的。从实现的角度而言,实际上是一起实现的。协议实验室在前人研究的基础上进行了创新,组合了两种(图)算法,实现了更严格的证明和更高效的验证,这种算法就叫做** Zigzag,目前最高效,最严格的存储证明算法**。

Zigzag: 当前最高效,最严格的存储证明算法
是两种(图)算法的组合 - 实现了更严格的证明和更高效的解封

  • Depth Robust Graph
  • Expander Graph
    仅使用其中任何一种,都不能达到此目的

3. 存储证明和验证流程

要做好存储证明,整个过程分为几个主要阶段,包括:初始化(仅执行一次),数据预处理(对每一片数据进行),生成复制数据(对每片数据进行),复制证明(每个节点周期性进行),数据还原(当有检索的时候进行),挑战随机数生成(需要验证时进行),复制证明,复制验证。

理论上讲,就是对应以下7个步骤:

  1. PoRep.Setup(λ,T) → pp :初始化阶段,每个节点执行,产生公共参数pp(每个节点一样),security parameter λ, time parameter T (挑战响应时间)
  2. PoRep.Preproc(sk, D) → D ̃ , τD :预处理过程,节点自己完成。sk, 秘钥,D要处理的数据;产生,处理后的数据D ̃ 和数据标识τD :数据标识需要发送给验证方,也即网络。
  3. PoRep.Replicate(id, τD , D ̃ ) → R, aux :产生复制数据。id为复制数据序号,在节点上执行,产生复制数据R,aux是附加信息,在做证明和验证的时候要用到
  4. PoRep.Extract(pp, id, R) → D ̃ :从复制数据还原成原数据(预处理过的原数据)
  5. PoRep.Prove(R, aux, id, r) → π :复制证明,输入分别为,复制数据及其附加信息,序号,加上挑战信息(一个由验证者产生的随机数),生成证明 π
  6. PoRep.Poll(aux) → r :产生挑战信息,输入:复制数据的附加信息。
  7. PoRep.Verify(id, τD, r, aux, π) → {0,1} :验证证明是否有效,输入包括:复制数据序号,原数据标识,挑战随机数,复制附加信息,验证信息。所有这些都需要传送给网络进行验证。验证只有通过或不通过两种状态。

注意:这里似乎并没有提到时空证明,其实,时空证明包含着复制证明和验证之中。这是因为系统周期性地发送挑战信息给每个节点,而每个节点都需要证明在一定的期间之内能够完成数据存储的验证,通过持续的证明和验证,就完成了时空证明。

4. 如何防攻击

要真正做到存储提供者不能欺骗,设计出证明和验证算法并不特别难。真正难的是,在一个去中心化的世界里这个算法也有效。这里先不说任意人验证和数据拥有者验证难度上的天壤之别。单说,在去中心化的世界里,其实没有绝对的防止欺骗或攻击的手段。

以大家都熟知的比特币为例,为防止双花(对网络的攻击),PoW提高了其难度,但不能抵御51%攻击。也就是说,机制的设计是让攻击者付出极高的成本,太不划算而不去做。

Filecoin的存储证明也是一样,没有绝对的安全,所设计的算法只是提高欺骗(攻击)的成本。那Filecoin存储证明的一个基本原则就是:让欺骗者付出比诚实者高得多的成本,那还不如做一个诚实节点,赚更多的钱。根据前文所述,欺骗者的一个主要手段就是在没有存储数据的情况谎报存储而获取利益。存储证明不能避免这种情况发生。但是整个协议的设计是:上节的7个步骤中的第3步(生成复制数据)比较复杂,需要较长的时间和运算,而第5步要求很快。那么当一个存储提供方,在没有保存第3步产生的数据的情况下,要证明自己(第5步),就必须临时做第3步,者需要消耗大量的计算,需要非常高的系统配置才来得及,否则就会超时被判存储证明失败。去大大提高系统的配置,还不如加一点存储老老实实做简单得多。

作弊者需要首先seal,如果在规定的时间完成,则需要极高的成本

5. Filecoin 存储证明的实现

Filecoin 所有证明的真正实现,都是在 rust-fil-proofs 项目中用 rust 语言编写的。采用 rust 的一个重要原因是 rust 具有与 c/c++ 相当的高效性,同时其语言设计又大大提高了安全性,在内存分配和管理方面强大得多。

rust-fil-proofs 代码请参见:https://github.com/filecoin-project/rust-fil-proofs. 其与Filecoin证明相关的 API 定义在 filecoin-proofs/src/api/ 目录之下。其中:

验证相关的接口,就定义在 filecoin-proofs/src/api/ 目录中;而与复制证明相关的接口,则定义在 filecoin-proofs/src/api/sector_builder/helper/ 目录中,这些接口包括:

  • add_piece: 往一个sector 里面填充内容
  • seal: 封印,即通过密码运算产生一个可证明的复制,当产生之后,原数据可删除
  • retrieve_piece: 获取用户数据,包括unseal

rust-fil-proofs 是一个独立的项目,Filecoin 的Go语言实现(目前唯一的一种实现)通过 CGo 来调用 rust-fil-proofs函数。其中接口定义在 https://github.com/filecoin-project/go-filecoin/blob/master/proofs/sectorbuilder/interface.go;

更多信息,参见rust-fil-proofs Readme文件,以下列出了与Filecoin API相关部分。


参考

胡飞瞳
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容