摘要:如上圖,驗證過程可以表述為驗證者會按照一定的規則向礦工提起挑戰,挑戰是隨機生成的,礦工不能提前獲知。三時空證明如圖所示,可以理解為礦工一定時間內持續地生成復制證明和接受挑戰和驗證的過程,并通過這個過程,更新全網存儲算力。
歡迎大家來到第七章,經過前章《【Filecoin源碼倉庫全解析】第六章:如何單機部署多節點集群及礦池設計思路》的介紹,我們分享了如何在單機部署多節點集群的知識以及礦池設計的一些思路。
我們將在本章介紹目前Filecoin工程實現中所采用的復制證明(PoRep)方式與時空證明(PoSt)方式,以及如何參與協議實驗室發起的復制證明游戲(Replication-Game)。
一、Filecoin所設計的證明類型Filecoin是一個利用區塊鏈技術來實現的去中心化存儲系統,我們都知道,在一個區塊鏈系統中,需要保證每個節點公平有序地按照規則自行運轉,能抵制惡意攻擊,確保整個體系的可信安全。
為此,Filecoin體系下也需要一個嚴謹的證明手段來確保礦工不會在沒有存儲數據的情況下謊稱自己存儲了用戶的數據,需要礦工憑借他們的存儲能力爭奪出塊資格。
Filecoin系統中的證明算法最初源于存儲證明(PoS)、數據持有性證(PDP)和可檢索證明(PoRet),后面逐漸迭代、增強約束條件,才完善為如今工程中所采用的復制證明(PoRep)與時空證明(PoSt),這里分別詳細介紹一下它們的含義:
存儲證明(Proof-of-Storage, PoS):為存儲空間提供的證明機制。
數據持有性證明(Provable Data Possession ,PDP):用戶發送數據給礦工進行存儲,礦工證明數據已經被自己存儲,用戶可以重復檢查礦工是否還在存儲自己的數據。
可檢索證明(Proof-of-Retrievability,PoRet):和PDP過程比較類似,證明礦工存儲的數據是可以用來查詢的。
復制證明(Proof-of-Replication,PoRep):存儲證明PoS的一個實際方案,用以證明數據被礦工獨立地保存,可以防止女巫攻擊,外源攻擊和生成攻擊。
空間證明(Proof-of-Space,PoSpace):存儲量的證明,PoSpace是PoW的一種,不同的是PoW使用的計算資源,而PoSpace使用的是存儲資源。
時空證明(Proof-of-Spacetime,PoSt):證明在一段時間內,礦工在自己的存儲設備上實際的存儲了特定的數據。
如下圖所示,這6種證明的定義并不是互斥獨立的,PoS包括PDP, PoRet, PoRep, PoSpace;而PoRep和PoSt是PoSpace的兩種實例,他們之間的定義相互有交叉:
復制證明和時空證明的實現方式決定了 Filecoin 礦機的配置。間接決定 Filecoin 系統的整體成本。Filecoin 提供了存儲和數據下載服務兩種服務,系統成本最終決定用戶的使用成本。
如果復制證明和時空證明消耗的資源過多,那么會系統性的提升整個 Filecoin 成本,這會讓 Filecoin 系統的價值大打折扣。
目前所開源的第一版go-filecoin0.1.x系列所采用的是ZigZagDrg和StackedDrg的VDF方式來作為PoRep的實現,官方對此認為仍有改進空間,協議實驗室也為此設立了RFPs基金,專門研究該課題,而復制游戲的誕生也是為了更好地讓社區愛好者提前參與測試和協助官方優化這個部分。
二、復制證明PoRep 2.1 PoRep職能PoRep算法的職能是用來證明一個存儲系統確實存儲了某一份數據的拷貝,而且每一份拷貝使用不同的物理存儲,并用來抵御去中心化系統中三種常見的攻擊:
2.2 PoRep本質PoRep本質是一個加密時間長,解密時間短且證明與驗證過程高效的算法, 這個過程在學術圈,被稱為可驗證時延加密(Verifiable Time-Delay Encoding Function):
如上圖,我們假設這一加密算法的驗證時長是一倍,解密時間大約2-5倍,挑戰有效時間算作10倍,那么這一加密時間大約要1000倍才能在概率上達到99.9%的相對安全。
2.3 挑戰及證明模型Filecoin證明機制的角色和過程可以抽象成如下,挑戰者、證明者、檢驗者。他們可以是礦工、用戶或者任何網絡內其他角色。涉及的定義包括如下:
挑戰(challenge):系統對礦工發起提問,可能是一個問題或者一系列問題,礦工正確的答復,則挑戰成功,否則失敗。
證明者(prover):一般只礦工。向系統提供證明了完成系統發起的挑戰。
檢驗者(verifier):向礦工發起挑戰(challenge)一方,來檢測是否礦工完成了數據存儲任務。
數據(data):用戶向礦工提交的需要存儲或者礦工已經存儲的數據。
證明(proof):礦工完成挑戰(challenge)時候的回答。
如上圖,驗證過程可以表述為: 驗證者會按照一定的規則向礦工提起挑戰,挑戰是隨機生成的,礦工不能提前獲知。礦工作為證明者相應向檢驗者提交證明,證明的生成需要原始數據與隨機挑戰信息。證明生成后,證明者會交給驗證者,并由驗證者判定該證明是否有效,如果有效,則挑戰成功。
2.4 可驗證時延加密函數(VDF)對于VDF,Filecoin最初受到了類似Cipher Block Chaining 分組塊加密鏈的啟發,從而改進和優化屬于自己的VDF方式。
我們先看一下CBC的原理:大文件分塊成?d1-d4…
除了c1初始化向量比較特殊,后續所有文件塊編碼都需要做XOR運算和AES加密,例如c2由c1與d2共同生成,以此類推。這樣在編碼過程就無法并行,從而速度變慢。
再看右邊的過程,是對CBC算法的進一步優化,采用的深度魯棒鏈(Depth Robust Chaining),在分塊上使用了有向無環圖來做,進一步壓縮了解碼驗證的復雜度,也提高了隨機性。
Filecoin目前工程上的實現是基于前面兩個算法的改進版:ZigZagDRG算法 ,如下圖所示:
原始數據data首先依次分成一個個小數據(d1-d5),每個小數據將被計算出一個散列值(32個字節),小數據本身也將散列值作為加密種子來進行編解碼。這些小數據的散列值按照DRG(Depth Robust Graph)建立連接關系。
數據塊的散列關系將構成Merkle Tree結構(類MySql數據庫的索引使用B+樹實現)。
這樣是為了在進行挑戰與檢驗的時候,無需針對所有數據塊解碼,即可以快速驗證,也更好地抵御了攻擊性。
例如:樹根即為副本的哈希,系統或者用戶隨機發起挑戰,位置d5,礦工只需計算d5到根節點root的路徑,輸出一個證明給發起挑戰的驗證節點。
至于VDF中每個數據塊的單元加密,如下圖所示,應用到了BLS12-381來進行單元編碼與解碼:
(源碼路徑:https://github.com/filecoin-p...)
BLS12-381是一種Zcash中所用的新型zk-SNARK 橢圓曲線的構造加密算法,隸屬于Bellman庫,由Rust語言所實現,它的特點是小巧易用,能快速驗證。Bellman的目標是讓普通程序員更加簡單地使用zk-SNARKs。
散列函數由于需要適應于SNARKS,目前沿用了Zcash中的Pedersen(Blake2、SHA256也在做實現和選擇):
整個PoRep的計算過程分為若干層 (目前在Filecoin中設置為4層,在復制游戲項目中設置為10層) ,每一層的DRG關系的箭頭方向是互斥的,上一層向右,下一層就向左,因此得名ZigZag(Z字型),數據解碼過程中,每一層之間互不依賴,即可并行執行,相對于串行編碼要更為快速。
綜上,這樣就實現了PoRep的本質:編碼快,而解碼和驗證證明快的效果,從而防范各種攻擊。
三、時空證明PoSt如圖所示,PoSt可以理解為礦工一定時間內持續地生成復制證明和接受挑戰和驗證的過程,并通過這個過程,更新全網存儲算力。
挑戰者在PoRep循環重復執行的i輪,輸入一個隨機挑戰參數c,之后,挑戰參數C會被鏈式遞歸計算,即上一次的輸出作為下一次的輸入,直到T時間內,最后一次的結果作為PoSt的證明,接受反向驗證。
很明顯,不正當的礦工如果沒有老老實實執行PoSt,是無法反推出C的。
如下圖所示,目前,go-filecoin中所定義的閾值是:每隔20000個區塊(平均6天左右),存儲礦工必須提供一次PoSt(Proof of Space Time)的證明,表明仍存有用戶數據的證明。與此同時,存儲市場(上帝)會每隔100個區塊(平均50分鐘),去對PoSt發起證明驗證,以判斷是否需要下發懲罰。
(源碼路徑:https://github.com/filecoin-p...)
四、Filecoin Proving Subsystem(FPS)Filecoin Proving Subsystem(FPS)是Filecoin體系中所有證明算法的工程實現,由于底層依賴Bellman庫的原因,完全由Rust編寫,源碼倉庫地址:https://github.com/filecoin-p...
FPS在設計之時,十分注重解耦性:filecoin-proofs實現了為go-filecoin提供存儲證明的接口,并依賴其他兩個模塊:storage-proofs(存儲證明生成與驗證的模塊)和 sector-base (扇區控制模塊)。
這兩個模塊又依賴于storage-backend中間件實現存儲控制和消息轉發。
關于FPS的其他細節導讀,這里推薦李星前輩的一篇文章:
星想法:Filecoin - PoRep和PoSt算法源代碼導讀
之后,可以配合官方的rust-fil-proofs源碼倉庫進行閱讀和獲取最新的變動:
github:rust-fil-proofs
關于PoRep和PoSt的推演論證過程,想深入了解的童靴可以對照這兩篇論文進行剖析:
PoReps: Proofs of Space on Useful Data
Ben Fisch:Tight Proofs of Space and Replication
五、參與復制證明游戲復制游戲是一項復制競賽,參與者挑戰 Filecoin 官方提供的默認的復制證明算法(前文提到的VDF),看是否能夠提供更優(相對于默認算法)的算法或執行結果。
參與游戲的方法是:通過當前 Filecoin 提供的復制算法(運行或重構FPS),并將執行結果發送到 Filecoin 服務器。
5.1 編譯游戲客戶端如下準備環境依賴,小編采用的是linux系統,macOS環境類似,可使用brew包管理工具代替apt。
//安裝Rust curl https://sh.rustup.rs -sSf | sh 重啟terminal //切換rust到nightly版 rustup install nightly //若想自行部署游戲服務端,需安裝PostgreSQL 數據庫 brew install postgresql@10 apt-get install postgresql //安裝clang和libclang apt-get install clang //安裝pq庫 apt-get install libpq-dev //下載replication-game源碼 git clone https://github.com/filecoin-project/replication-game.git cd replication-game //執行編譯 cargo +nightly build --release --bin replication-game
編譯完成后,可在bin/目錄下看到play可執行文件:
5.2 啟動游戲# 啟動指令: # bin/play NAME SIZE TYPE # E.g. # Zigzag 10MiB bin/play NAME 10240 zigzag # Zigzag 1GiB bin/play NAME 1048576 zigzag # DrgPoRep 10MiB bin/play NAME 10240 drgporep # DrgPoRep 1GiB bin/play NAME 1048576 drgporep
NAME: 你的游戲玩家名稱
SIZE: 你打算要復制的文件的大小,單位是 KB
TYPE: 你想要運行的算法名稱(目前可選值有: zigzag 和 drgporep)
Play腳本將自動從游戲服務器下載種子,復制數據,生成證據,然后將該證據發布到游戲服務器。
5.3 發送游戲結果至Rank服務器Play腳本將通過curl提交游戲結果:
curl -X POST -H "Content-Type: application/json" -d @./proof.json https://replication-game.herokuapp.com/api/proof
我們可以通過訪問Rank頁面:http://replication-game.herok...,來查看排行。
小編的機型配置:
Processor Name: Intel Core i5
Processor Speed: 3.1 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 4 MB
Memory: 8 GB
Drg復制證明耗時2.1s/MiB:
ZigZag復制證明耗時11.2s/MiB:
我們的游戲結果將記錄在proof.json中,可以手動打開proof.json,分析一下證明的數據結構:
prover:驗證人。
seed:游戲種子,加密Key。
proof_params:證明配置項。
proof:證明數據塊關系。
tau: 一棵或者多棵Merkle樹的樹根都稱為tau,每一層的輸入稱為d(data),每一層的VDE的結果稱為r(replica)。
comm_d:每一層的輸入構建的默克爾樹根為comm_d。
comm_r:每一層的輸出構建的默克爾樹根為comm_r。
comm_r_star:每層comm_r的數據和replica id數據散列計算后的結果。
通過查閱Proof.json的數據結構,也可以幫助大家更好地理解2.4所述內容。
5.4 如何提升Rank位置?從硬件和軟件方面優化:增加硬件配置,更快的 CPU 更大的內存(RAM),或者使用其他的替換方案比如使用 FPGA, GPU, ASICs 等更擅長進行深度計算的硬件。另外你可以優化你操作系統的一些參數設置,比如 IO 參數等。
從算法方面優化:你可以不使用 Filecoin 給你提供的默認實現算法,自己設計一種新的能夠更快生成存儲證明的算法,比如打破順序假設, 生成存儲更少數據的證明,打破 Pedersen 哈希等。
當然,光追求Rank數據是無意義的,PoRep和PoSt的時延在Filecoin體系下,只是影響存儲效率的一個因子而已,對于礦工來說,需要追求的是綜合性價比。
參考文獻https://github.com/filecoin-project/replication-game
https://z.cash/blog/bellman-zksnarks-in-rust/
往期系列文章回顧:【Filecoin源碼倉庫全解析】第一章:搭建Filecoin測試節點
【Filecoin源碼倉庫全解析】第二章:如何創建賬戶錢包并獲取FIL Mock代幣
【Filecoin源碼倉庫全解析】第三章(上):存儲提供方(礦工)的配置操作
【Filecoin源碼倉庫全解析】第三章(下):存儲提供方(礦工)的配置操作
【Filecoin源碼倉庫全解析】第四章:存儲需求方(用戶)的配置操作
【Filecoin源碼倉庫全解析】第五章:檢索市場及檢索礦工
【Filecoin源碼倉庫全解析】第六章:如何單機部署多節點集群
本章贊助品牌:廣東星藍區塊鏈技術有限公司 聚集了一批志向于IPFS生態建設的“先鋒”,也是中國最早、最專業的IPFS生態布道、交流社區,公司擁有最成熟完整的產業供應鏈,包括礦機、礦場、礦池、合作托管、數據支持、專業運維、應用開發、知識服務等在內的全方位立體化服務的企業,為IPFS生態提供最全面、專業的支持。作為國內IPFS生態的第一批布道者,“星藍”的團隊十分看好IPFS未來的價值,也會全力推動IPFS的發展及應用落地。我們團隊置身于區塊鏈革命的第一線,投身IPFS生態建設,堅信IPFS將為世界帶來更好的體驗,為商業創造更大的價值。星藍核心價值觀:共建、共贏、共擔,塊鏈有框,星藍無界,星藍產品“TimeBook”期待您的關注!
感謝廣東星藍區塊鏈技術有限公司(www.xlipfs.com) 對嘉樂SOHO的原創內容提供支持。
聯系作者:本人從業經驗有限,不免有不足之處,歡迎指正和更多討論,可私信微信公眾號:jialesoho,或者加我微信:daijiale6239,如果覺得對您有幫助,可以幫點擊好看推廣和打賞支持噢,感激不盡!
(識別圖中二維碼,關注嘉樂SOHO微信公眾號)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24651.html
摘要:我們將在本章介紹如何在一臺機器上構建多節點的方案和未來礦池產品設計的一些思路。本文將介紹一種直接在單機上部署和管理多節點的方案。最初起源于比特幣。 歡迎大家來到第六章,經過前章《【Filecoin源碼倉庫全解析】第五章:檢索市場及檢索礦工》的介紹,無論從定位職能,還是從設計原理,還是從工程操作角度,我們應該對目前的Filecoin檢索市場有了更加深入的了解。 我們將在本章介紹如何在一臺...
摘要:我們將在下一章源碼倉庫全解析第四章下存儲需求方的配置操作中重點介紹存儲需求方用戶的配置操作,并反過來驗證第三章中存儲礦工后續挖取新塊的過程,幫助大家融會貫通,并在工程上驗證整個挖礦行為的生命周期。目前已成為華中區最大最具影響力的垂直媒體。 不好意思,這篇加了點八卦: 本來是不太想說這事的,從18年看到現在,不少見圈里的朋友和友商互相吐槽乃至攻擊...最近還鬧得比較大。這里說兩句:區塊鏈...
摘要:情人節,項目開放了核心源碼倉庫,并更新了下的諸多核心成果,這意味著,已然度過了最困難的難點攻關期,進入到了全民公測階段。年月日,開源了核心源碼庫,開啟全民公測階段。 2019.2.14 情人節,Filecoin項目開放了核心源碼倉庫go-filecoin,并更新了 filecoin-project organization下的諸多核心成果,這意味著,Filecoin已然度過了最困難的難...
摘要:之后,存儲端礦工節點會在一定時間間隔可配置,默認為秒自動啟動密封過程,即獲取之前微支付通道中暫存區域的所有數據,并將其密封到礦工的承諾存儲區域中。 歡迎大家來到第四章,經過前章 【Filecoin源碼倉庫全解析】第三章(下):存儲提供方(礦工)的配置操作的內容閱讀后,我們應該會對Filecoin市場機制中的礦工對象有了更詳細的認知,對礦工事務的生命周期有了具象化地理解。 本章,我們將重...
摘要:作者簡介董天一中國區技術布道人指南作者。畢業于北京大學軟件與微電子學院曾擔任甲骨文亞洲研發中心中國數據庫開發工程師。資深區塊鏈技術開發者,現致力于在中國的技術推廣的競爭對手。 作者簡介:董天一 ,IPFS/Filecoin中國區技術布道人 ,《IPFS指南》作者。畢業于北京大學軟件與微電子學院曾擔任甲骨文亞洲研發中心(中國)數據庫開發工程師。 資深區塊鏈技術開發者,現致力于IPFS/F...
閱讀 960·2021-11-24 09:39
閱讀 3383·2021-10-27 14:20
閱讀 2322·2019-08-30 14:08
閱讀 3360·2019-08-29 16:34
閱讀 2175·2019-08-26 12:14
閱讀 2104·2019-08-26 11:54
閱讀 2771·2019-08-26 11:44
閱讀 2474·2019-08-26 11:38