Lotus的Sector處理的演算法,從window SDR切換到了SDR。所謂的SDR,就是Stacked DRG (Depth Robust Graph,深度魯棒圖)。重點,就在於演算法去掉了“window”。切換演算法後,在intel的CPU上,Sector處理(Precommit phase1)階段的時間非常長,超過了30個小時。Filecoin官方,推薦AMD的RX 3970x,Sector處理時間在4個小時左右。本文深入SDR的邏輯,分析Sector處理慢的原因。相關的邏輯實現在rust-fil-proof專案中,本文中使用的原始碼的最後一個提交資訊如下:
commit 14870d715f1f6019aba3f72772659e38184378bfAuthor: Rod Vagg <[email protected]>Date: Fri Mar 20 22:30:18 2020 +1100 feat(filecoin-proofs): expose filecoin_proofs::pad_reader
01回顧window SDR演算法
window SDR演算法中的window,就是每個Sector的資料,先分割成一個個128M的window。
一個32G的Sector會劃分成256個window。window和window之間相互獨立。每個window,單獨進行SDR的計算(labeling encode)。總共需要做4層(layer)。也就是說,獨立的window之間,做4層運算。層與層之間滿足SDR的關係。
02SDR演算法
相對window SDR,SDR的演算法更加簡單和粗暴。一個Sector,再也不劃分window。整個Sector,進行SDR的計算,並且計算11層。相關原始碼從storage-proofs/src/porep/stacked/vanilla/proof.rs的generate_labels函式開始。
計算SDR的過程,可以拆分為三步。
在計算SDR之前,整個Sector,每32個位元組,分割成一個個的節點(node)。為什麼要分割成節點,因為DRG。有了節點,才能按照圖,確定節點和節點之間的關係。