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)

  1. 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)
  1. 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) 
  1. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM