Filecoin - PoRep和PoSt算法源代碼導讀

幾個星期前摹闽,我看了看Filecoin的代碼宏邮,整理了Filecoin的一些概念颜曾,架構以及協(xié)議 -Filecoin邏輯梳理及源代碼導讀纠拔。

PoRep以及PoSt的數(shù)據(jù)存儲證明是通過FPS模塊實現(xiàn)。整個FPS模塊是通過Rust語言實現(xiàn)泛豪。技術人總是想打破沙鍋問到底稠诲,究竟PoRep/PoSt的證明過程如何?我就從源代碼的角度诡曙,講述一遍數(shù)據(jù)證明的邏輯調(diào)用部分臀叙。方便其他小伙伴理解或者優(yōu)化相關的邏輯。有關零知識證明的推導代碼岗仑,后續(xù)文章詳細介紹匹耕。

01 Filecoin代碼模塊依賴關系

從PoRep以及PoSt存儲證明的角度來看,F(xiàn)ilecoin代碼模塊由如下三層組成:

rust-fil-proofs是存儲證明的具體實現(xiàn)荠雕,通過Rust語言實現(xiàn)稳其。rust-fil-proofs模塊依賴bellman項目(零知識證明)。bellman項目是ZCash項目使用的零知識證明模塊炸卑。bellman項目也是用Rust語言實現(xiàn)既鞠。在go-filecoin的rustverifier.go文件實現(xiàn)go到rust語言的調(diào)用。

在該導讀中盖文,go-filecoin代碼的最后一個commit信息如下:

commit b716be02c0e15436141a5c20274a38aec749490e (HEAD -> master, tag: nightly-13394-b716be, origin/master, origin/HEAD)

Author: Sidney Keese sidke.z@gmail.com

Date: ? Wed Mar 27 14:06:13 2019 -0700

? use precompiled bls-signatures library (#2368)

rust-fil-proofs代碼的最后一個commit信息如下:

commit 808dc884642acbf7b78b282eb7d933c7cc2cc3a7 (HEAD -> master, origin/master, origin/HEAD)

Author: wayne yang wayne.w.yang@foxmail.com

Date: ? Mon Mar 25 21:12:40 2019 +0800

? ?docs: delete the outdated link

02 rust-fil-proofs的框架

rust-fil-proofs功能主要由四個子模塊組成:

filecoin-proofs實現(xiàn)了filecoin存儲證明的接口嘱蛋,依賴其他兩個模塊:storage-proofs(存儲證明的邏輯)和 sector-base (數(shù)據(jù)存儲的接口)。這兩個模塊又依賴于storage-backend模塊實現(xiàn)數(shù)據(jù)的存儲五续。

相關代碼就在這四個目錄中:

03 PoRep的生成和驗證邏輯

PoRep就是Proof of Replicate洒敏,數(shù)據(jù)存儲證明。模塊之間的調(diào)用關系如下:


node.go代碼在啟動挖礦時疙驾,每120個區(qū)塊調(diào)用一次SealAllStagedSectors函數(shù)(將所有的Staged的Sector數(shù)據(jù)進行Seal)凶伙。順便說一句,用戶的數(shù)據(jù)存儲時分成一個個的Sector(目前設置為256M)它碎。Sector有三個狀態(tài):Staging(數(shù)據(jù)還未寫滿函荣,并且未超時),Staged(數(shù)據(jù)已經(jīng)寫滿或者超時)扳肛,Sealed(數(shù)據(jù)已經(jīng)Seal并存儲)傻挂。

在filecoin-proof模塊接收到請求后,確認目前所有的Staged的Sector挖息,并對每個Sector進行Seal金拒。

核心邏輯在rust-fil-proofs/filecoin-proofs/src/api/internal.rs代碼的seal函數(shù)。seal函數(shù)原型如下:

seal函數(shù)對in_path的原始數(shù)據(jù)套腹,進行復制并存儲到out_path殖蚕。在seal的過程中轿衔,提供Sector的屬性沉迹,證明人的id以及Sector的id睦疫。

3.1?Replica ID

對每一個Seal過的Sector,設置一個Replica ID鞭呕。Replica ID是一個Hash值蛤育,計算過程如下:

相應實現(xiàn)是rust-fil-proofs/storage-proofs/src/porep.rs的replica_id函數(shù)。

3.2?整體邏輯

PoRep的生成邏輯包括兩部分:1/數(shù)據(jù)的復制(replicate)2/數(shù)據(jù)的復制證明葫松。Step1/Step3實現(xiàn)復制的證明瓦糕,Step2實現(xiàn)數(shù)據(jù)的復制。

貼一段代碼腋么,方便小伙伴比對和理解:

3.3?數(shù)據(jù)復制邏輯

PoRep算法的全稱是ZigZag-DRG-PoRep咕娄。整體流程示意如下:

Sector中未Seal的原始數(shù)據(jù)首先依次分成一個個小數(shù)據(jù),每個小數(shù)據(jù)32個字節(jié)珊擂。這些小數(shù)據(jù)之間按照DRG(Depth Robust Graph)建立連接關系圣勒。按照每個小數(shù)據(jù)的依賴關系,通過VDE(Verifiable Delay Encode)函數(shù)摧扇,計算出下一層的所有小數(shù)據(jù)圣贸。整個PoRep的計算過程分為若干層(目前代碼設置為4層),仔細觀察每一層的DRG關系的箭頭方向扛稽,上一層向右吁峻,下一層就向左,因此得名ZigZag(Z字型)在张。

VDE以及ZigZag設置的參數(shù)查看rust-fil-proofs/filecoin-proofs/src/api/internal.rs:

每一層的計算邏輯示意如下:

每一層的輸入稱為d(data)用含,每一層的VDE的結果稱為r(replica)。對每一層的輸入帮匾,建構默克爾樹啄骇,樹根為comm_d, 整個樹的數(shù)據(jù)結構稱為tree_d。對每一層的輸出辟狈,建構默克爾樹肠缔,樹根為comm_r,整個樹的數(shù)據(jù)結構稱為tree_d哼转。

再介紹兩個術語:TAU明未,AUX。

TAU: 希臘字母壹蔓,一棵或者多棵Merkle樹的樹根都稱為TAU趟妥。

AUX: Auxiliary的簡稱,一棵或者多棵Merkle樹的結構稱為AUX佣蓉。

對于一層replica來說披摄,TAU包括comm_d和comm_r亲雪,AUX包括tree_d和tree_r。

對于整個PoRep來說疚膊,也就是多層replica來說义辕,TAU以及AUX示意如下:

其中的comm_r_star是每層comm_r的數(shù)據(jù)和replica id數(shù)據(jù)Hash的結果。

具體實現(xiàn)的源代碼請看兩個函數(shù):

rust-fil-proofs/storage-proofs/src/layered_drgporep.rs中的Layers的replicate函數(shù)

rust-fil-proofs/storage-proofs/src/drgporep.rs中的PoRep的replicate函數(shù)

3.4?復制證明邏輯

復制數(shù)據(jù)完成后寓盗,需要提供零知識的證明灌砖。該證明邏輯需要花很多篇幅仔細介紹,涉及到QAP傀蚌,KCA基显,Groth16,同態(tài)隱藏善炫,雙線性映射撩幽。后續(xù)的文章會詳細講解相關邏輯。本文先有些概念:需要生成證明(Proof)需要有兩步:setup以及prove箩艺。

setup:設置證明的參數(shù)

prove:提供需要證明的內(nèi)容窜醉,包括公共數(shù)據(jù)(public inputs),私有數(shù)據(jù)(private inputs)以及Groth的參數(shù)舅桩。在2.b中的代碼中可以看出酱虎,

PoRep證明的公共數(shù)據(jù)包括原始數(shù)據(jù)的comm_d,最后一層的comm_r和comm_r_star擂涛。

PoRep證明的私有數(shù)據(jù)包括所有層的comm_r/comm_d和每一層的tree_r/tree_d读串。

值得特別提出的是,PoRep提交到Filecoin區(qū)塊鏈上的數(shù)據(jù)是:PoRep的公共數(shù)據(jù)和復制證明數(shù)據(jù)撒妈。

整個數(shù)據(jù)復制的過程時間比較長恢暖,目前1G的數(shù)據(jù)需要消耗40~50分鐘。

3.5?復制驗證邏輯

在某個存儲礦工生成PoRep后狰右,通過CommitSector接口向區(qū)塊鏈提交證明信息杰捂。在Filecoin區(qū)塊鏈的所有礦工接收到CommitSector的Message交易時,調(diào)用VerifySeal進行復制驗證棋蚌,大體流程如下:

具體實現(xiàn)的源代碼請查看rust-fil-proofs/storage-proofs/src/api/internal.rs的verify_seal函數(shù)嫁佳。

04 PoSt的生成和驗證邏輯

在一個存儲礦工存儲(Seal)用戶數(shù)據(jù)后,每隔20000個區(qū)塊谷暮,必須提供一次PoSt(Proof of Space Time)的證明蒿往,也就是說,某個存儲礦工還存有用戶數(shù)據(jù)的證明湿弦。20000個區(qū)塊瓤漏,一個區(qū)塊30秒,也就說每6天提交一次證明。

4.1?PoSt生成邏輯

PoSt的生成是基于最近的存儲狀態(tài)蔬充,所以提交PoSt的證明最好能在一個區(qū)塊之內(nèi)(30秒)完成蝶俱。PoSt生成邏輯的調(diào)用關系如下:

在新的區(qū)塊生成時(OnNewHeaviestTipSet函數(shù)),每個提供存儲的礦工會檢查是否需要提供PoSt的證明饥漫。如果需要榨呆,則調(diào)用generatePoSt函數(shù)生成證明。

generatePoSt函數(shù)提供兩個參數(shù):所有提交到區(qū)塊鏈上的comm_r信息以及隨機挑戰(zhàn)信息 (ChallengeSeed)趾浅。所有提交到區(qū)塊鏈上的comm_r信息通過區(qū)塊鏈查詢可以獲取愕提。ChallengeSeed通過currentProvingPeriodPoStChallengeSeed函數(shù)生成,生成邏輯如下:

簡單的說皿哨,就是從當前區(qū)塊高度往前看幾個TipSet,找出某一個TipSet中眾多區(qū)塊中的最小Ticket纽谒。該Ticket就是ChallengeSeed证膨。

在最新的代碼邏輯中,PoSt每兩個Sector會生成一個Proof鼓黔,也就是post_adapter實現(xiàn)的邏輯央勒。提交到區(qū)塊鏈上的是眾多Proof的列表。

VDFPostCompound::setup函數(shù)設置驗證相關參數(shù)澳化。VDFPostCompound::prove函數(shù)需要四個參數(shù):

a. setup函數(shù)設置的參數(shù)

b. Public數(shù)據(jù)(comm_r的數(shù)據(jù)列表崔步,隨機挑戰(zhàn)信息)

c. 私有數(shù)據(jù)(Seal數(shù)據(jù)構成的Merkle樹的結構信息)

d. Groth相關的參數(shù)信息

具體實現(xiàn)的源代碼請查看rust-fil-proofs/storage-proofs/src/api/internal.rs的generate_post_fixed_sectors_count函數(shù)。

prove函數(shù)實現(xiàn)的邏輯就是白皮書中的PoSt的框架圖:

4.2?PoSt驗證邏輯

在某個存儲礦工生成PoSt證明后缎谷,通過SubmitPoSt接口向區(qū)塊鏈提交證明信息井濒。在Filecoin區(qū)塊鏈的所有礦工接收到SubmitPoSt的Message交易時,調(diào)用VerifyPoST進行復制驗證列林,大體流程如下:

具體實現(xiàn)的源代碼請查看rust-fil-proofs/storage-proofs/src/api/internal.rs的verify_post_fixed_sectors_count函數(shù)瑞你。

總結:PoRep是對某個Sector數(shù)據(jù)存儲的證明,每個Sector一次希痴。PoSt是一系列已經(jīng)Seal過的Sector的存儲證明者甲,每隔一段時間一次。兩個證明的核心是Groth16零知識驗證算法砌创,基于Bellman項目虏缸。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嫩实,隨后出現(xiàn)的幾起案子刽辙,更是在濱河造成了極大的恐慌,老刑警劉巖舶赔,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扫倡,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機撵溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門疚鲤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缘挑,你說我怎么就攤上這事集歇。” “怎么了语淘?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵诲宇,是天一觀的道長。 經(jīng)常有香客問我惶翻,道長姑蓝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任吕粗,我火速辦了婚禮纺荧,結果婚禮上,老公的妹妹穿的比我還像新娘颅筋。我一直安慰自己宙暇,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布议泵。 她就那樣靜靜地躺著占贫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪先口。 梳的紋絲不亂的頭發(fā)上型奥,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音池充,去河邊找鬼桩引。 笑死,一個胖子當著我的面吹牛收夸,可吹牛的內(nèi)容都是我干的坑匠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼卧惜,長吁一口氣:“原來是場噩夢啊……” “哼厘灼!你這毒婦竟也來了?” 一聲冷哼從身側響起咽瓷,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤设凹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茅姜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪朱,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡月匣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奋姿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锄开。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖称诗,靈堂內(nèi)的尸體忽然破棺而出萍悴,到底是詐尸還是另有隱情,我是刑警寧澤寓免,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布癣诱,位于F島的核電站,受9級特大地震影響袜香,放射性物質發(fā)生泄漏撕予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一困鸥、第九天 我趴在偏房一處隱蔽的房頂上張望嗅蔬。 院中可真熱鬧,春花似錦疾就、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猜敢,卻和暖如春姑荷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩擂。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工鼠冕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胯盯。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓懈费,卻偏偏與公主長得像,于是被迫代替她去往敵國和親博脑。 傳聞我的和親對象是個殘疾皇子憎乙,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概 要 存儲證明是 Filecoin 網(wǎng)絡成立的基礎,F(xiàn)ilecoin的存儲證明包括:PoRep(復制證明)和 P...
    胡飛瞳閱讀 1,752評論 0 4
  • 在Filecoin的存儲邏輯中叉趣,需要使用2種證明機制泞边,來證明礦機正確的存儲了數(shù)據(jù)的多個備份并且能夠被任意的人在任意...
    西二旗李老師閱讀 1,276評論 0 1
  • 文 / 無影 昨夜忽被驚起。數(shù)番擾來疗杉,其人語態(tài)之輕盈阵谚,前所未見。“日后當放聲言語梢什,行立于陽光下奠蹬。吾無憂矣!” 何以...
    梅心無影閱讀 655評論 13 21
  • 人生路上從來都不是一馬平川绳矩,幾時起幾時落罩润,浮浮沉沉,幾時哭幾時笑翼馆,悲悲喜喜割以,自信時,相信自已的直覺应媚,失意時严沥,總是把...
    大道行者_閱讀 208評論 0 0
  • 我這里想拿一個收藏的需求作為案例來展示這兩個方法,收藏這個需求經(jīng)常遇到中姜,在localStorage中存取值也很常見...
    愿你如夏日清涼的風閱讀 2,640評論 0 1