2019年,Filecoin却是火热的区块链项目。3月份,Filecoin公开发表了涉及的代码后,第一时间看了看Filecoin的代码。区块链部分的代码,比较简单,稍功能检验。
个人对存储证明的部分较为感兴趣,也就是FPS。使用零科学知识证明技术,对存储展开证明是个大胆的尝试。Filecoin团队,在2019年下半年出有了个Lotus(莲花)测试版本。测试网络的硬件配备较为低,256G内存 + Nvidia 2080TI的显示卡。
测试网络的节点排行榜,也出了竞赛场。算力快速增长,出块效率,是主要的指标。
Lotus的电路逻辑比较复杂,电路规模超过了1亿。证明分解的时间也十分宽。
整个证明计算出来过程,有相当大的提高空间。对Lotus的证明性能提高感兴趣的小伙伴,青睐和我交流。别光看Filecoin在国内的热度,了解讲解Filecoin/Lotus涉及零科学知识证明的技术文章寥寥无几。
最近有点时间,辨别了一下Lotus的PoREP的数据处理(还包括Sector处置以及使用零科学知识证明)的涉及逻辑。1. Lotus整体模块非常简单的说道,Lotus/Filecoin项目由三部分构成:1/ Lotus Blockchain部分 - 构建区块链涉及逻辑(共识算法,P2P,区块管理,虚拟机等等)。
留意的是,Lotus的区块链涉及的数据存储在IPFS之上。go语言构建。2/ RUST-FIL-PROOF部分 - 构建Sector的存储以及证明电路。
也就是FPS(Filecoin Proving Subsystem)。Rust语言构建。3/ Bellman部分 - 零科学知识证明(zk-SNARK)的证明系统,主要是基于BLS12_381椭圆曲线上,网卓新闻网,构建了Groth16的零科学知识证明系统。Lotus官方引荐使用Nvidia的2080ti显示卡,也主要做到这部分的性能加快。
Rust语言构建。这篇文章,主要讲解第二部分(也就是Sector的存储以及证明)的核心逻辑。
2. Stacked DRG说明明确的逻辑之前,讲解一下两个基本术语:一个是Stacked DRG,一个是Sector。Sector比较比较简单,就是一次数据处理的单位。
告诉硬盘结构的小伙伴都告诉,硬盘的大于的存储单元就叫“Sector”。Lotus使用的Sector的较为大,目前测试网络使用的是32G。Stacked DRG是Sector数据处理的算法。对存储数据入一定的处置,并展开适当的证明是为了解释存储服务方,显然真实情况地存储了一些数据,而不是不实(反击)。
Filecoin很早以前之前使用的是“Zig Zag DRG”算法。有可能因为过于简单(太快),Lotus使用的是“修改”的Stacked DRG算法。两种算法的区别转身如下:有两点必须解释:1/ Stacked DRG的每个节点以及每层之间不使用Zig Zag的倚赖关系。也就是说,每个节点和其他节点的倚赖关系是相同的。
2/ 在每层(Layer)之间减少节点的倚赖关系。3. Sector处置(Precommit)过程Sector处置,也就是传说中的precommit阶段,主要由如下的数据处理构成:a. 针对原始数据结构默克尔树tree_d(sha256),树根为comm_d。b. LabelEncode计算出来:原始数据,每32个字节,称作一个Node。
每128M分成一个Window。32G的Sector有256个Window。每个Window,按照Stacked DRG算法,分解4个layer的数据。
从上一个Layer,通过Encode计算出来分解下一个Layer的数据。Encode计算出来,目前就是模加操作者。
将Window的编号和Stacked DRG的节点关系通过sha256算法,分解“key”。将Key和原始数据展开模加分解Encode计算出来的结果。c. Layer4的分解数据,结构默克尔树tree_q(pedersen),树根为comm_q。Layer4的分解数据,再行经过一层exp的倚赖关系,结构默克尔树tree_r_last(pedersen),树根为comm_r_last。
d. Column Hash计算出来Layer4的256个Window的数据中,同一方位上的Node,拼凑在一起,hash后分解Column Hash的结果。留意,Column Hash的计算结果只有一个Window大小。
针对Column Hash的计算结果,结构默克尔树tree_c,树根为comm_c。必须上链的数据是以上所有的默克尔树根的树根:comm_d以及comm_r。
其中comm_r是(comm_c|comm_q|comm_r_last)的pedersen hash的结果。核心代码在rust-fil-proofs/storage-proofs/src/stacked/proof.rs的transform_and_replicate_layers函数中。感兴趣的小伙伴,可以根据下面的调用关系查阅明确的代码。
本文来源:半岛平台官网-www.hptonerdeal.com