Filecoin: PoRep算法流程分析
本篇笔记主要对 PoRep复制证明(P1/P2/C1/C2)的代码层流程进行分析。
有关挖矿流程对PoRep和PoSt的简要描述可见上一篇文章: Filecoin: 简要分析挖矿流程与软硬件分配
核心算法流程
Filecoin系统中的证明算法最初源于存储证明(PoS)、数据持有性证(PDP)和可检索证明(PoRet)。
后面逐渐迭代、增强约束条件,才完善为如今工程中所采用的复制证明(PoRep)与时空证明(PoSt)。
一、PoRep算法解析【1,2】
PoRep方案的核心流程,是有效证明人P说服验证者V,数据D的一个P专用的独立物理副本R已经被存储。其协议是一个多项式时间算法的原组(Setup、Prove、Verify)
- PoRep.Setup 目标是生成副本Replica R。
- 同时给予P、V必要的计算信息,以便后续的Prove、Verify可以进行。
- 这些信息是R的Merkle证明根,Root(R) 和证明 Proof(R,SEAL)。
- PoRep.Prove,目标是生成一个证明,证明在PoRep.Setup阶段,Setup算法通过SEAL密封算法,生成一个副本R,并且提供副本的证明Proof(πSEAL)。这个证明由证明人输出,发给验证者。注意,R不需要发给验证者。
Inputs:
-证明秘钥对(prover key pair):(pkP,skP)。
-密封证明私钥prover SEAL key: pkSEAL,这个和密封验证证明秘钥是一对。
-data D。这个是32G输入数据
Outputs:
-副本Replica R。
-R的默克尔证明根MerkleCRH,Merkle root rt of R
-证明Proof:πSEAL
Setup阶段的计算过程包括:
1. 计算hD=CRH(D),计算D的CRH 哈希值。
2. 计算R=Seal(D,skP)
3. 计算rt=MerkleCRH(R)
4. x=(pkP,hD,rt),w=(skp,D)
5. 计算πSEAL=SCIP.Prove(pkSEAL,x,w)
- PoRep.Prover阶段:
- Prover算法生成副本R的存储证明Proof(πPOS)。
- 证明这收到来自验证者的随机挑战C,要求在树根为rt的Merkle树R中确认特定叶子节点Rc。
- 证明人生成从树根rt到叶子Rc的路径的知识证明来证明这点。
Inputs:
-存储证明私钥(prover Proof-of-Storage key):(pkPOS)。这个和存储验证证明秘钥是一对。
-副本Replica R。
-随机挑战random challenge C。
Outputs:
-证明Proof:πPOS
Prover阶段的计算过程包括:
1. 计算rt=MerkleCRH(R),计算R的Merkle CRH 哈希值。
2. 计算path=从 叶子Rc到rt的Merkle路径
3. x=(rt,c),w=(path,Rc)
4. 计算πPOS=SCIP.Prove(pkPOS,x,w)
- PoRep.Verify阶段
- Verify算法检查前面两个证明Proof(πSEAL)和Proof(πPOS)的有效性。证明本身是可以公开验证的。
Inputs:
-证明公钥 prover public key,pkP。
-SEAL/POS验证证明秘钥:vkSEAL/vkPOS
-数据D的hash,hD。
-R的默克尔证明根MerkleCRH,Merkle root rt of R。
-随机挑战random challenge C。
-证明Proof(πSEAL)和Proof(πPOS)
Outputs:
-bit b。验证成功结果为1
Verify阶段的计算过程包括:
1. x=(pkp,hd,rt)
2. 计算b1=SCIP.Verify(vkSEAL,x,πSEAL)
3. x=(c,rt)
4. 计算b2=SCIP.Verify(vkPOS,x,πPOS)
5. output b1 and b2
二、PoRep实现架构【3,4】
在具体实现中,PoRep的Setup/Prover/Verify,可以分解成如下4个阶段。
Sealing preCommit的阶段1(P1)
在P1阶段,复制证明的SDR算法会进行编码运算。可以分解成2部分的计算。
1. 计算原始数据的merkle树(二叉树,sha256 hash计算)
2. label,也就是SDR的计算。
原始数据的merkle树(tree _d),树根为comm_d。
注意:由于SDR的算法特性,SDR的计算目前官网是采用CPU直接计算的,其计算效率和系统的CPU性能有关,是单线程运算(不能进行并行运算)。
这个阶段可能会长达若干小时,具体花费的时间和所封装扇区的大小及机器的配置有关。
协议实验室的相应评估报告,支持SHA功能的AMD处理器在这方面有很大的优势,并且CPU的频率越高越好。这个原因是AMD高端CPU直接带SHA加速指令。
Sealing preCommit的阶段2(P2)
在P2 阶段,系统要用到Poseidon哈希算法产生默克尔树。可以分解成如下3个部分的计算。
1. column hash
2. 针对column hash的计算结果生成merkle树(八叉树,poseidon hash计算)
3. 针对label的计算结果,再做一次encoding,生成merkle树(八叉树,poseidon hash计算)。
注意:这个阶段因为支持并行。官方推荐采用GPU实现。效率和系统GPU的性能有关,也可以用CPU替代GPU,但性能就差很多。使用GPU时,这个阶段大概要花45分钟到1个小时。
Sealing Commit的阶段1(C1)
C1是个过渡阶段,它为后续的证明工作进行各项准备工作,其性能与CPU有关,通常花费几十秒。
Sealing Commit的阶段2(C2)
这个封装过程要进行零知识证明运算,它会对前面产生的结果再次进行压缩,然后将其广播到区块链。
注意:这个过程支持并行计算,极度依赖GPU,通常要花费20至30分钟。
协议实验室发现,P2、C1和C2这三个阶段可以在算力配置强,配置GPU的同一台机器上运行。
但是在preCommit阶段1和preCommit阶段2之间会进行大量的文件传输,主要是P1阶段的原始阶段SDR数据。
对32GB的Seal单元来说,至少需要352G的SDR。如果处理这两个阶段的机器网络性能差,或者存储设备使用的是普通硬盘而非固态硬盘则会大大降低系统的整体效率。
注意:SDR 352G文件在P2和C2的处理,如果可以考虑和P1合并进行预计算。这样在不影响集群架构的情况下,降低网络数据传输要求。
参考文献
【1】Filecoin白皮书英文版,https://filecoin.io/filecoin.pdf
【2】yuzhou_1shu@163.com,Filecoin白皮书英文版中文翻译版本, https://blog.csdn.net/yuzhou_1shu/article/details/81745092
【3】CoinON,Filecoin挖矿指南之设备性能对证明计算的影响,https://www.coinonpro.com/news/toutiao/142395.html
【4】LIANYI ,Filecoin – testnet3中Sector处理逻辑变化,https://www.lianyi.com/zixun/2438713
【5】StarLi, Filecoin - Precommit2计算介绍, https://zhuanlan.zhihu.com/p/277841521