Filecoin - testnet3中Sector處理邏輯變化

買賣虛擬貨幣
前一篇文章嘗試了一下微信公眾號文章收費,挺有意思。付費的大部分是認識的好朋友,主要是鼓勵支援。謝謝朋友們的鼓勵,也會堅持把理解及時寫下來,分享。前段時間看了傅盛的懸崖邊的反思。感觸比較深,文章中的16/17年大事件的時間點,我就在獵豹移動。獵豹移動,確實很早就預知工具會被OS化,工具App的未來比較迷茫。16年,工具App保收入,17年新聞,AI。獵豹移動的文化是小步快跑,快速試錯。確實,那幾年感覺獵豹移動主要在定目標,做任務。沒有找到自己的積累和壁壘。獵豹移動也蠻拼的,最緊張的時候,基本上每週都發布更新。App做的像獵豹移動這麼大,很不簡單,也有自己的比較完善的開發流程和體系。但是,有個大問題,就是收入。收入的模式主要靠廣告。海外廣告,確實很容易被廣告平臺卡脖子。還是沒法還擊,只能妥協的那種。幾點感觸,感知未來的趨勢,但是想改變自己的局勢,特別是想改變自己的DNA,是非常難的事情。商業閉環,很重要。雖然一個小的點,剛開始無法形成閉環,但是,隨著發展,形成自己的閉環很重要。Anyway,獵豹移動,目前在AI和機器人方向做了不少嘗試。希望老東家走出低谷,發展順利。Lotus程式碼更新的頻度變的快了,每天都有不少程式碼merge進來。目前零知識證明的CRS,已經從V20更新到V24版本。目前測試網路也進入了testnet3階段。在之前的V20的版本基礎上,V24版本對Sector處理也有些變化。
Filecoin - Lotus儲存證明了什麼?本文介紹一下testnet3的Sector處理的邏輯。相關的邏輯實現在rust-fil-proof專案中,本文中使用的原始碼的最後一個提交資訊如下:commit 14870d715f1f6019aba3f72772659e38184378bf (HEAD -> master, origin/master, origin/HEAD)Author: Rod Vagg <admin@chaindaily>Date:   Fri Mar 20 22:30:18 2020 +1100    feat(filecoin-proofs): expose filecoin_proofs::pad_reader
commit 78da3a008a1407654db600e6d5161464a8595e851. Sector處理(Precommit)過程Precommit過程分為兩個階段,分別是phase1以及phase2, 也就是階段1和階段2。相關的介面函式在filecoin-proofs/src/api/seal.rs檔案中的seal_pre_commit_phase1和seal_pre_commit_phase2函式。總的來說,Sector Precommit過程的邏輯有兩個比較大的變化:1)label encoding的演算法從window SDR變成了SDR。2)過程分割成兩個階段。SDR的計算過程在之前的文章中已經深入介紹。Filecoin - 為什麼SDR這麼慢?
這裡就不再說了,主要介紹一下Sector處理的兩個階段相關邏輯。1.1 Precommit Phase1Phase1的過程主要是兩部分的計算:1)計算原始資料的merkle樹(二叉樹,sha256 hash計算)2)label,也就是SDR的計算。原始資料的merkle樹(tree _d),樹根為comm_d。1.2 Precommit Phase2Phase2的過程主要也是兩部分的計算:1)column hash 2)針對column hash的計算結果生成merkle樹(八叉樹,poseidon hash計算)3)針對label的計算結果,再做一次encoding,生成merkle樹(八叉樹,poseidon hash計算)。

column hash的計算過程如下:

32GB的Sector,分割成1G個node。SDR的計算會生成11層的處理資料,每層都為32GB。每層的同一個編號的node資料,組合在一起後的hash的結果就是column hash的計算結果。Column hash的計算結果也是32GB。

針對column hash的計算結果,生成八叉樹(tree_c),樹根為comm_c。

label encoding的計算是將SDR的計算結果和原始資料進行encoding。所謂的encoding,目前就是大數的加法。encoding的結果,生成八叉樹(tree_r_last),樹根為comm_r_last。

上鍊的資料是兩個:comm_d和comm_r。其中,comm_r是comm_c和comm_r_last的posedion的hash結果。

整個Sector處理邏輯,總結整體如下圖:

2. Sector證明(Commit)過程

Commit過程分為兩個階段,分別是phase1以及phase2, 也就是階段1和階段2。Sector證明過程和零知識證明的過程密切相關。對零知識證明zk-SNARK理論和應用不熟悉的小夥伴,可以檢視我之前寫的相關文章。相關的介面函式在filecoin-proofs/src/api/seal.rs檔案中的seal_commit_phase1和seal_commit_phase2函式。

Sector證明的階段1,主要是準備電路需要的資料。這些資料即不完全是電路的公開資料,也不完全是電路的私有資料,而是電路資料需要的原始資料。階段1,並不會對Sector的32G對應的1G的節點做證明,而是挑選一些節點做證明。

所有挑選的這些節點分為9個Partition:

    pub static ref POREP_PARTITIONS: RwLock<HashMap<u64, u8>> = RwLock::new(
        [
            (SECTOR_SIZE_2_KIB, 1),
            (SECTOR_SIZE_8_MIB, 1),
            (SECTOR_SIZE_512_MIB, 1),
            (SECTOR_SIZE_32_GIB, 9)
        ]

每個Partition都隨機挑選一些節點。所有的挑選的節點個數不超過最小挑戰節點數:

    pub static ref POREP_MINIMUM_CHALLENGES: RwLock<HashMap<u64, u64>> = RwLock::new(
        [
            (SECTOR_SIZE_2_KIB, 2),
            (SECTOR_SIZE_8_MIB, 2),
            (SECTOR_SIZE_512_MIB, 2),
            (SECTOR_SIZE_32_GIB, 138)
        ]

也就是說,對於32G的Sector而言,9個Parititon,每個Partition隨機選擇16個節點進行挑戰。隨機選擇的具體演算法在storage-proofs/src/porep/stacked/vanilla/challenges.rs的derive_internal函式中。

Sector證明的階段2,就是零知識證明的電路處理以及生成零知識證明的過程。這部分的邏輯,總的框架和之前一樣,主要是SDR的演算法改動有一些變化。RUST-FIL-PROOF(FPS)實現了StackedCompound,專門用來實現Stacked DRG的資料處理證明。StackedCompound,將兩部分整合在一起,一部分是電路(Stacked Circuit),另一部分是Stacked Drg,實現電路資料的準備。這些部分又分成一個個的子功能(Window,Wrapper,ReplicaColumn等等)。在呼叫Bellman生成證明時,相應電路的synthesize介面就會被呼叫,從而完成整個電路生成R1CS的過程。

總結:

Lotus的原始碼更新比較頻繁。Testnet3將Sector的Precommit和Commit處理都分成了兩個階段(Phase1和Phase2)。SDR是演算法改動是最大的變化。零知識證明的CRS已經更新到V24版本。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;