欢迎你们来到第七章,通过前章《【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群及矿池设计思路》的介绍,咱们分享了如何在单机部署多节点集群的知识以及矿池设计的一些思路。html
咱们将在本章介绍目前Filecoin工程实现中所采用的复制证实(PoRep)方式与时空证实(PoSt)方式,以及如何参与协议实验室发起的复制证实游戏(Replication-Game)。linux
Filecoin是一个利用区块链技术来实现的去中心化存储系统,咱们都知道,在一个区块链系统中,须要保证每一个节点公平有序地按照规则自行运转,能抵制恶意攻击,确保整个体系的可信安全。git
为此,Filecoin体系下也须要一个严谨的证实手段来确保矿工不会在没有存储数据的状况下谎称本身存储了用户的数据,须要矿工凭借他们的存储能力争夺出块资格。程序员
Filecoin系统中的证实算法最初源于存储证实(PoS)、数据持有性证(PDP)和可检索证实(PoRet),后面逐渐迭代、加强约束条件,才完善为现在工程中所采用的复制证实(PoRep)与时空证实(PoSt),这里分别详细介绍一下它们的含义:github
以下图所示,这6种证实的定义并非互斥独立的,PoS包括PDP, PoRet, PoRep, PoSpace;而PoRep和PoSt是PoSpace的两种实例,他们之间的定义相互有交叉:算法
复制证实和时空证实的实现方式决定了 Filecoin 矿机的配置。间接决定 Filecoin 系统的总体成本。Filecoin 提供了存储和数据下载服务两种服务,系统成本最终决定用户的使用成本。sql
若是复制证实和时空证实消耗的资源过多,那么会系统性的提高整个 Filecoin 成本,这会让 Filecoin 系统的价值大打折扣。数据库
目前所开源的初版go-filecoin0.1.x
系列所采用的是ZigZagDrg和StackedDrg的VDF方式来做为PoRep的实现,官方对此认为仍有改进空间,协议实验室也为此设立了RFPs基金,专门研究该课题,而复制游戏的诞生也是为了更好地让社区爱好者提早参与测试和协助官方优化这个部分。json
PoRep算法的职能是用来证实一个存储系统确实存储了某一份数据的拷贝,并且每一份拷贝使用不一样的物理存储,并用来抵御去中心化系统中三种常见的攻击:api
PoRep本质是一个加密时间长,解密时间短且证实与验证过程高效的算法, 这个过程在学术圈,被称为可验证时延加密(Verifiable Time-Delay Encoding Function):
如上图,咱们假设这一加密算法的验证时长是一倍,解密时间大约2-5倍,挑战有效时间算做10倍,那么这一加密时间大约要1000倍才能在几率上达到99.9%的相对安全。
Filecoin证实机制的角色和过程能够抽象成以下,挑战者、证实者、检验者。他们能够是矿工、用户或者任何网络内其余角色。涉及的定义包括以下:
如上图,验证过程能够表述为: 验证者会按照必定的规则向矿工提起挑战,挑战是随机生成的,矿工不能提早获知。矿工做为证实者相应向检验者提交证实,证实的生成须要原始数据与随机挑战信息。证实生成后,证实者会交给验证者,并由验证者断定该证实是否有效,若是有效,则挑战成功。
对于VDF,Filecoin最初受到了相似Cipher Block Chaining 分组块加密链的启发,从而改进和优化属于本身的VDF方式。
咱们先看一下CBC的原理:大文件分块成 d1-d4…
除了c1初始化向量比较特殊,后续全部文件块编码都须要作XOR运算和AES加密,例如c2由c1与d2共同生成,以此类推。这样在编码过程就没法并行,从而速度变慢。
再看右边的过程,是对CBC算法的进一步优化,采用的深度鲁棒链(Depth Robust Chaining),在分块上使用了有向无环图来作,进一步压缩了解码验证的复杂度,也提升了随机性。
Filecoin目前工程上的实现是基于前面两个算法的改进版:ZigZagDRG算法 ,以下图所示:
原始数据data首先依次分红一个个小数据(d1-d5),每一个小数据将被计算出一个散列值(32个字节),小数据自己也将散列值做为加密种子来进行编解码。这些小数据的散列值按照DRG(Depth Robust Graph)创建链接关系。
数据块的散列关系将构成Merkle Tree结构(类MySql数据库的索引使用B+树实现)。
这样是为了在进行挑战与检验的时候,无需针对全部数据块解码,便可以快速验证,也更好地抵御了攻击性。
例如:树根即为副本的哈希,系统或者用户随机发起挑战,位置d5,矿工只需计算d5到根节点root的路径,输出一个证实给发起挑战的验证节点。
至于VDF中每一个数据块的单元加密,以下图所示,应用到了BLS12-381来进行单元编码与解码:
(源码路径:github.com/filecoin-pr…
BLS12-381是一种Zcash中所用的新型zk-SNARK 椭圆曲线的构造加密算法,隶属于Bellman库,由Rust语言所实现,它的特色是小巧易用,能快速验证。Bellman的目标是让普通程序员更加简单地使用zk-SNARKs。
散列函数因为须要适应于SNARKS,目前沿用了Zcash中的Pedersen(Blake二、SHA256也在作实现和选择):
整个PoRep的计算过程分为若干层 (目前在Filecoin中设置为4层,在复制游戏项目中设置为10层) ,每一层的DRG关系的箭头方向是互斥的,上一层向右,下一层就向左,所以得名ZigZag(Z字型),数据解码过程当中,每一层之间互不依赖,便可并行执行,相对于串行编码要更为快速。
综上,这样就实现了PoRep的本质:编码快,而解码和验证证实快的效果,从而防范各类攻击。
如图所示,PoSt能够理解为矿工必定时间内持续地生成复制证实和接受挑战和验证的过程,并经过这个过程,更新全网存储算力。
挑战者在PoRep循环重复执行的i轮,输入一个随机挑战参数c,以后,挑战参数C会被链式递归计算,即上一次的输出做为下一次的输入,直到T时间内,最后一次的结果做为PoSt的证实,接受反向验证。
很明显,不正当的矿工若是没有老老实实执行PoSt,是没法反推出C的。
以下图所示,目前,go-filecoin中所定义的阈值是:每隔20000个区块(平均6天左右),存储矿工必须提供一次PoSt(Proof of Space Time)的证实,代表仍存有用户数据的证实。与此同时,存储市场(上帝)会每隔100个区块(平均50分钟),去对PoSt发起证实验证,以判断是否须要下发惩罚。
(源码路径:github.com/filecoin-pr…
Filecoin Proving Subsystem(FPS)是Filecoin体系中全部证实算法的工程实现,因为底层依赖Bellman库的缘由,彻底由Rust编写,源码仓库地址:github.com/filecoin-pr…
FPS在设计之时,十分注重解耦性:filecoin-proofs实现了为go-filecoin提供存储证实的接口,并依赖其余两个模块:storage-proofs(存储证实生成与验证的模块)和 sector-base (扇区控制模块)。
这两个模块又依赖于storage-backend中间件实现存储控制和消息转发。
关于FPS的其余细节导读,这里推荐李星前辈的一篇文章:
以后,能够配合官方的rust-fil-proofs源码仓库进行阅读和获取最新的变更:
关于PoRep和PoSt的推演论证过程,想深刻了解的童靴能够对照这两篇论文进行剖析:
复制游戏是一项复制竞赛,参与者挑战 Filecoin 官方提供的默认的复制证实算法(前文提到的VDF),看是否可以提供更优(相对于默认算法)的算法或执行结果。
参与游戏的方法是:经过当前 Filecoin 提供的复制算法(运行或重构FPS),并将执行结果发送到 Filecoin 服务器。
以下准备环境依赖,小编采用的是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可执行文件:
# 启动指令:
# 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脚本将自动从游戏服务器下载种子,复制数据,生成证据,而后将该证据发布到游戏服务器。
Play脚本将经过curl提交游戏结果:
curl -X POST -H "Content-Type: application/json" -d @./proof.json https://replication-game.herokuapp.com/api/proof
复制代码
咱们能够经过访问Rank页面:replication-game.herokuapp.com/,来查看排行。
小编的机型配置:
Drg复制证实耗时2.1s/MiB:
ZigZag复制证实耗时11.2s/MiB:
咱们的游戏结果将记录在proof.json中,能够手动打开proof.json,分析一下证实的数据结构:
经过查阅Proof.json的数据结构,也能够帮助你们更好地理解2.4所述内容。
从硬件和软件方面优化:增长硬件配置,更快的 CPU 更大的内存(RAM),或者使用其余的替换方案好比使用 FPGA, GPU, ASICs 等更擅长进行深度计算的硬件。另外你能够优化你操做系统的一些参数设置,好比 IO 参数等。
从算法方面优化:你能够不使用 Filecoin 给你提供的默认实现算法,本身设计一种新的可以更快生成存储证实的算法,好比打破顺序假设, 生成存储更少数据的证实,打破 Pedersen 哈希等。
固然,光追求Rank数据是无心义的,PoRep和PoSt的时延在Filecoin体系下,只是影响存储效率的一个因子而已,对于矿工来讲,须要追求的是综合性价比。
【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点 【Filecoin源码仓库全解析】第二章:如何建立帐户钱包并获取FIL Mock代币 【Filecoin源码仓库全解析】第三章(上):存储提供方(矿工)的配置操做
【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操做
【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操做
【Filecoin源码仓库全解析】第五章:检索市场及检索矿工
【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群
广东星蓝区块链技术有限公司 汇集了一批志向于IPFS生态建设的“先锋”,也是中国最先、最专业的IPFS生态布道、交流社区,公司拥有最成熟完整的产业供应链,包括矿机、矿场、矿池、合做托管、数据支持、专业运维、应用开发、知识服务等在内的全方位立体化服务的企业,为IPFS生态提供最全面、专业的支持。做为国内IPFS生态的第一批布道者,“星蓝”的团队十分看好IPFS将来的价值,也会全力推进IPFS的发展及应用落地。咱们团队置身于区块链革命的第一线,投身IPFS生态建设,坚信IPFS将为世界带来更好的体验,为商业创造更大的价值。星蓝核心价值观:共建、双赢、共担,块链有框,星蓝无界,星蓝产品“TimeBook”期待您的关注!
感谢广东星蓝区块链技术有限公司(www.xlipfs.com) 对嘉乐SOHO的原创内容提供支持。
本人从业经验有限,难免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,若是以为对您有帮助,能够帮点击好看推广和打赏支持噢,感激涕零!
(识别图中二维码,关注嘉乐SOHO微信公众号)