IPFS-星际文件传输系统

【Filecoin源码仓库全解析】第七章:了解PoRep与PoS

2019-04-24  本文已影响0人  嘉乐的SOHO

欢迎大家来到第七章,经过前章《【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群及矿池设计思路》的介绍,我们分享了如何在单机部署多节点集群的知识以及矿池设计的一些思路。

我们将在本章介绍目前Filecoin工程实现中所采用的复制证明(PoRep)方式与时空证明(PoSt)方式,以及如何参与协议实验室发起的复制证明游戏(Replication-Game)。

一、Filecoin所设计的证明类型

Filecoin是一个利用区块链技术来实现的去中心化存储系统,我们都知道,在一个区块链系统中,需要保证每个节点公平有序地按照规则自行运转,能抵制恶意攻击,确保整个体系的可信安全。

为此,Filecoin体系下也需要一个严谨的证明手段来确保矿工不会在没有存储数据的情况下谎称自己存储了用户的数据,需要矿工凭借他们的存储能力争夺出块资格。

Filecoin系统中的证明算法最初源于存储证明(PoS)、数据持有性证(PDP)和可检索证明(PoRet),后面逐渐迭代、增强约束条件,才完善为如今工程中所采用的复制证明(PoRep)与时空证明(PoSt),这里分别详细介绍一下它们的含义:

如下图所示,这6种证明的定义并不是互斥独立的,PoS包括PDP, PoRet, PoRep, PoSpace;而PoRep和PoSt是PoSpace的两种实例,他们之间的定义相互有交叉:

image

复制证明和时空证明的实现方式决定了 Filecoin 矿机的配置。间接决定 Filecoin 系统的整体成本。Filecoin 提供了存储和数据下载服务两种服务,系统成本最终决定用户的使用成本。

如果复制证明和时空证明消耗的资源过多,那么会系统性的提升整个 Filecoin 成本,这会让 Filecoin 系统的价值大打折扣。

目前所开源的第一版go-filecoin0.1.x系列所采用的是ZigZagDrg和StackedDrg的VDF方式来作为PoRep的实现,官方对此认为仍有改进空间,协议实验室也为此设立了RFPs基金,专门研究该课题,而复制游戏的诞生也是为了更好地让社区爱好者提前参与测试和协助官方优化这个部分。

二、复制证明PoRep

2.1 PoRep职能

PoRep算法的职能是用来证明一个存储系统确实存储了某一份数据的拷贝,而且每一份拷贝使用不同的物理存储,并用来抵御去中心化系统中三种常见的攻击:

image

2.2 PoRep本质

PoRep本质是一个加密时间长,解密时间短且证明与验证过程高效的算法, 这个过程在学术圈,被称为可验证时延加密(Verifiable Time-Delay Encoding Function):

image

如上图,我们假设这一加密算法的验证时长是一倍,解密时间大约2-5倍,挑战有效时间算作10倍,那么这一加密时间大约要1000倍才能在概率上达到99.9%的相对安全。

2.3 挑战及证明模型

Filecoin证明机制的角色和过程可以抽象成如下,挑战者、证明者、检验者。他们可以是矿工、用户或者任何网络内其他角色。涉及的定义包括如下:

image

如上图,验证过程可以表述为: 验证者会按照一定的规则向矿工提起挑战,挑战是随机生成的,矿工不能提前获知。矿工作为证明者相应向检验者提交证明,证明的生成需要原始数据与随机挑战信息。证明生成后,证明者会交给验证者,并由验证者判定该证明是否有效,如果有效,则挑战成功。

2.4 可验证时延加密函数(VDF)

image

对于VDF,Filecoin最初受到了类似Cipher Block Chaining 分组块加密链的启发,从而改进和优化属于自己的VDF方式。

我们先看一下CBC的原理:大文件分块成 d1-d4…

除了c1初始化向量比较特殊,后续所有文件块编码都需要做XOR运算和AES加密,例如c2由c1与d2共同生成,以此类推。这样在编码过程就无法并行,从而速度变慢。

再看右边的过程,是对CBC算法的进一步优化,采用的深度鲁棒链(Depth Robust Chaining),在分块上使用了有向无环图来做,进一步压缩了解码验证的复杂度,也提高了随机性。

Filecoin目前工程上的实现是基于前面两个算法的改进版:ZigZagDRG算法 ,如下图所示:

image

原始数据data首先依次分成一个个小数据(d1-d5),每个小数据将被计算出一个散列值(32个字节),小数据本身也将散列值作为加密种子来进行编解码。这些小数据的散列值按照DRG(Depth Robust Graph)建立连接关系。

数据块的散列关系将构成Merkle Tree结构(类MySql数据库的索引使用B+树实现)。

这样是为了在进行挑战与检验的时候,无需针对所有数据块解码,即可以快速验证,也更好地抵御了攻击性。

例如:树根即为副本的哈希,系统或者用户随机发起挑战,位置d5,矿工只需计算d5到根节点root的路径,输出一个证明给发起挑战的验证节点。

至于VDF中每个数据块的单元加密,如下图所示,应用到了BLS12-381来进行单元编码与解码:

image

(源码路径:https://github.com/filecoin-project/rust-fil-proofs/blob/41d7fe97b2d98e79eaf52959590a86c4d1749843/storage-proofs/src/vdf_sloth.rs

BLS12-381是一种Zcash中所用的新型zk-SNARK 椭圆曲线的构造加密算法,隶属于Bellman库,由Rust语言所实现,它的特点是小巧易用,能快速验证。Bellman的目标是让普通程序员更加简单地使用zk-SNARKs。

散列函数由于需要适应于SNARKS,目前沿用了Zcash中的Pedersen(Blake2、SHA256也在做实现和选择):

image

整个PoRep的计算过程分为若干层 (目前在Filecoin中设置为4层,在复制游戏项目中设置为10层) ,每一层的DRG关系的箭头方向是互斥的,上一层向右,下一层就向左,因此得名ZigZag(Z字型),数据解码过程中,每一层之间互不依赖,即可并行执行,相对于串行编码要更为快速。

综上,这样就实现了PoRep的本质:编码快,而解码和验证证明快的效果,从而防范各种攻击。

三、时空证明PoSt

image

如图所示,PoSt可以理解为矿工一定时间内持续地生成复制证明和接受挑战和验证的过程,并通过这个过程,更新全网存储算力。

挑战者在PoRep循环重复执行的i轮,输入一个随机挑战参数c,之后,挑战参数C会被链式递归计算,即上一次的输出作为下一次的输入,直到T时间内,最后一次的结果作为PoSt的证明,接受反向验证。

很明显,不正当的矿工如果没有老老实实执行PoSt,是无法反推出C的。

如下图所示,目前,go-filecoin中所定义的阈值是:每隔20000个区块(平均6天左右),存储矿工必须提供一次PoSt(Proof of Space Time)的证明,表明仍存有用户数据的证明。与此同时,存储市场(上帝)会每隔100个区块(平均50分钟),去对PoSt发起证明验证,以判断是否需要下发惩罚。

image

(源码路径:https://github.com/filecoin-project/go-filecoin/blob/a45c0f1a70c2e8a61d6d5b4e01e641bedb344a06/actor/builtin/miner/miner.go

四、Filecoin Proving Subsystem(FPS)

Filecoin Proving Subsystem(FPS)是Filecoin体系中所有证明算法的工程实现,由于底层依赖Bellman库的原因,完全由Rust编写,源码仓库地址:https://github.com/filecoin-project/rust-fil-proofs

[图片上传失败...(image-a9bdd-1556037280097)]

FPS在设计之时,十分注重解耦性:filecoin-proofs实现了为go-filecoin提供存储证明的接口,并依赖其他两个模块:storage-proofs(存储证明生成与验证的模块)和 sector-base (扇区控制模块)。

这两个模块又依赖于storage-backend中间件实现存储控制和消息转发。

关于FPS的其他细节导读,这里推荐李星前辈的一篇文章:

之后,可以配合官方的rust-fil-proofs源码仓库进行阅读和获取最新的变动:

关于PoRep和PoSt的推演论证过程,想深入了解的童靴可以对照这两篇论文进行剖析:

五、参与复制证明游戏

复制游戏是一项复制竞赛,参与者挑战 Filecoin 官方提供的默认的复制证明算法(前文提到的VDF),看是否能够提供更优(相对于默认算法)的算法或执行结果。

参与游戏的方法是:通过当前 Filecoin 提供的复制算法(运行或重构FPS),并将执行结果发送到 Filecoin 服务器。

5.1 编译游戏客户端

如下准备环境依赖,小编采用的是linux系统,macOS环境类似,可使用brew包管理工具代替apt。


//安装Rust
curl https://sh.rustup.rs -sSf | sh

重启terminal

//切换rust到nightly版
rustup install nightly

//若想自行部署游戏服务端,需安装PostgreSQL 数据库
brew install postgresql@10

apt-get install postgresql

//安装clang和libclang 
apt-get install clang

//安装pq库
apt-get install libpq-dev

//下载replication-game源码
git clone https://github.com/filecoin-project/replication-game.git

cd replication-game

//执行编译
cargo +nightly build --release --bin replication-game

编译完成后,可在bin/目录下看到play可执行文件:

image

5.2 启动游戏

# 启动指令:
# bin/play NAME SIZE TYPE

# E.g.

# Zigzag 10MiB
bin/play NAME 10240 zigzag

# Zigzag 1GiB
bin/play NAME 1048576 zigzag

# DrgPoRep 10MiB
bin/play NAME 10240 drgporep

# DrgPoRep 1GiB
bin/play NAME 1048576 drgporep

Play脚本将自动从游戏服务器下载种子,复制数据,生成证据,然后将该证据发布到游戏服务器。

5.3 发送游戏结果至Rank服务器

Play脚本将通过curl提交游戏结果:

curl -X POST -H "Content-Type: application/json" -d @./proof.json https://replication-game.herokuapp.com/api/proof

我们可以通过访问Rank页面:http://replication-game.herokuapp.com/,来查看排行。

小编的机型配置:

Drg复制证明耗时2.1s/MiB:

image

ZigZag复制证明耗时11.2s/MiB:

image

我们的游戏结果将记录在proof.json中,可以手动打开proof.json,分析一下证明的数据结构:

image

通过查阅Proof.json的数据结构,也可以帮助大家更好地理解2.4所述内容。

5.4 如何提升Rank位置?

当然,光追求Rank数据是无意义的,PoRep和PoSt的时延在Filecoin体系下,只是影响存储效率的一个因子而已,对于矿工来说,需要追求的是综合性价比。

参考文献

往期系列文章回顾:

【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点
【Filecoin源码仓库全解析】第二章:如何创建账户钱包并获取FIL Mock代币
【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作

【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作

【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作

【Filecoin源码仓库全解析】第五章:检索市场及检索矿工

【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群

本章赞助品牌:

image

广东星蓝区块链技术有限公司 聚集了一批志向于IPFS生态建设的“先锋”,也是中国最早、最专业的IPFS生态布道、交流社区,公司拥有最成熟完整的产业供应链,包括矿机、矿场、矿池、合作托管、数据支持、专业运维、应用开发、知识服务等在内的全方位立体化服务的企业,为IPFS生态提供最全面、专业的支持。作为国内IPFS生态的第一批布道者,“星蓝”的团队十分看好IPFS未来的价值,也会全力推动IPFS的发展及应用落地。我们团队置身于区块链革命的第一线,投身IPFS生态建设,坚信IPFS将为世界带来更好的体验,为商业创造更大的价值。星蓝核心价值观:共建、共赢、共担,块链有框,星蓝无界,星蓝产品“TimeBook”期待您的关注!

感谢广东星蓝区块链技术有限公司(www.xlipfs.com) 对嘉乐SOHO的原创内容提供支持。

联系作者:

本人从业经验有限,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广打赏支持噢,感激不尽!

image

(识别图中二维码,关注嘉乐SOHO微信公众号)

上一篇下一篇

猜你喜欢

热点阅读