13

Filecoin - Lotus存储证明了什么? | 深入浅出区块链技术博客

 4 years ago
source link: https://learnblockchain.cn/article/681?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Filecoin - Lotus存储证明了什么? | 登链社区 | 深入浅出区块链技术

Filecoin - Lotus存储证明了什么?

Filecoin - Lotus存储证明了什么?

2019 年,Filecoin 算是火热的区块链项目。3 月份,Filecoin 公开了相关的代码后,第一时间看了看 Filecoin 的代码。

Filecoin 逻辑梳理及源代码导读

区块链部分的代码,比较简单,偏功能验证。个人对存储证明的部分比较感兴趣,也就是 FPS。采用零知识证明技术,对存储进行证明是个大胆的尝试。

Filecoin - PoRep 和 PoSt 算法源代码导读

Filecoin 团队,在 2019 年下半年出了个 Lotus(莲花)测试版本。测试网络的硬件配置比较高,256G 内存 + Nvidia 2080TI 的显卡。测试网络的节点排行榜,也成了竞赛场。算力增长,出块效率,是主要的指标。

Lotus 的电路逻辑比较复杂,电路规模达到了 1 亿。证明生成的时间也非常长。整个证明计算过程,有很大的提升空间。对 Lotus 的证明性能提升感兴趣的小伙伴,欢迎和我交流。

别光看 Filecoin 在国内的热度,深入介绍 Filecoin/Lotus 相关零知识证明的技术文章寥寥无几。最近有点时间,梳理了一下 Lotus 的 PoREP 的数据处理(包括 Sector 处理以及采用零知识证明)的相关逻辑。

01 Lotus 整体模块

null

简单的说,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 的存储以及证明)的核心逻辑。

02 Stacked DRG

解释具体的逻辑之前,介绍一下两个基本术语:一个是 Stacked DRG,一个是 Sector。Sector 相对比较简单,就是一次数据处理的单位。知道硬盘结构的小伙伴都知道,硬盘的最小的存储单元就叫“Sector”。Lotus 采用的 Sector 的比较大,目前测试网络采用的是 32G。

Stacked DRG 是 Sector 数据处理的算法。对存储数据进一定的处理,并进行相应的证明是为了说明存储服务方,确实如实地存储了一些数据,而不是造假(攻击)。Filecoin 很早之前采用的是“Zig Zag DRG”算法。可能因为太复杂(太慢),Lotus 采用的是“简化”的 Stacked DRG 算法。两种算法的区别示意如下:

null

有两点需要说明:

1/ Stacked DRG 的每个节点以及每层之间不采用 Zig Zag 的依赖关系。也就是说,每个节点和其他节点的依赖关系是固定的。

2/ 在每层(Layer)之间增加节点的依赖关系。

03 Sector 处理(Precommit)过程

Sector 处理,也就是传说中的 precommit 阶段,主要由如下的数据处理组成:

a. 针对原始数据构造默克尔树 tree_d(sha256),树根为 comm_d。

b. Label & Encode 计算:

null

原始数据,每 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 计算

null

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 函数中。感兴趣的小伙伴,可以根据下面的调用关系查看具体的代码。

null

04 Sector 证明(Commit)过程

在 Sector 处理后,需要对处理后的数据进行“证明”,毕竟不能把所有处理后的数据全部提交到区块链上。Lotus 使用 Bellman 的零知识证明库,采用 Groth16 算法进行数据处理的证明。

RUST-FIL-PROOF(FPS)实现了 StackedCompound,专门用来实现 Stacked DRG 的数据处理证明。StackedCompound,将两部分整合在一起,一部分是电路(Stacked Circuit),另一部分是 Stacked Drg,实现电路数据的准备。这些部分又分成一个个的子功能(Window,Wrapper,ReplicaColumn 等等)。在调用 Bellman 生成证明时,相应电路的 synthesize 接口就会被调用,从而完成整个电路生成 R1CS 的过程。

话说,Lotus 的 Sector 的数据证明证明了什么呢?Lotus 的数据证明了如下的事实:

1/ 结合链上生成的随机数,随机挑选 50 个处理后数据 Node,也就是在 replica(复制数据)中,随机挑选 50 个 Node 数据。

2/ 证明这些数据是从原始数据一步步处理生成的。而且,能构造出之前处理过程中生成的 4 个默克尔树的树根。

3/ 重复步骤 1 和 2,10 次。

步骤 1/2 的证明,如下图所示:

null

简单的说,从链上获取了随机信息后(和区块高度有关),随机选择了 500 个处理后的 Node 数据,并证明这些数据是通过 Stacked DRG 算法从原始数据计算而来。并且,这些数据能构成之前递交到链上的四个默克尔树的树根。

Lotus 的电路逻辑比较复杂,电路规模达到了 1 亿。证明生成的时间也非常长。

05 Sector 证明链上验证

提交到链上的数据包括:comm_d,comm_r 以及 proof 证明数据。链上的 miner 智能合约会验证提交的证明是否正确:

func ValidatePoRep(ctx context.Context, maddr address.Address, ssize uint64, commD, commR, ticket, proof, seed []byte, sectorID uint64) (bool, ActorError)

具体的代码在 lotus/chain/actors/actor_miner.go 文件。其中 ticket 和 seed 就是链上提供的随机信息。验证过程就是 RUST-FIL-PROOF 模块调用 Bellman 验证零知识证明是否正确。验证过程比较快,毫秒级的计算。相对来说,存储证明的生成过程时间比较长,有比较大的提升空间。

Lotus(莲花),采用 Stacked DRG 算法对存储的数据进行处理,并采用 Groth16 零知识证明算法对数据处理过程进行证明。Lotus 的零知识证明,证明了随机抽选的 500 个节点数据是正确地通过 Stacked DRG 算法生成,并能生成指定的默克尔树的树根。Lotus 的电路逻辑比较复杂,电路规模达到了 1 亿,证明生成时间比较长。整个计算性能有很大的提升空间。

我是 Star Li,我的公众号星想法有很多原创高质量文章,欢迎大家扫码关注。

15797929845654.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK