【Filecoin源碼倉庫全解析】第七章:瞭解PoRep與PoSt並參與複製證實遊戲

歡迎你們來到第七章,通過前章《【Filecoin源碼倉庫全解析】第六章:如何單機部署多節點集羣及礦池設計思路》的介紹,咱們分享瞭如何在單機部署多節點集羣的知識以及礦池設計的一些思路。html

咱們將在本章介紹目前Filecoin工程實現中所採用的複製證實(PoRep)方式與時空證實(PoSt)方式,以及如何參與協議實驗室發起的複製證實遊戲(Replication-Game)。linux

1、Filecoin所設計的證實類型

Filecoin是一個利用區塊鏈技術來實現的去中心化存儲系統,咱們都知道,在一個區塊鏈系統中,須要保證每一個節點公平有序地按照規則自行運轉,能抵制惡意攻擊,確保整個體系的可信安全。git

爲此,Filecoin體系下也須要一個嚴謹的證實手段來確保礦工不會在沒有存儲數據的狀況下謊稱本身存儲了用戶的數據,須要礦工憑藉他們的存儲能力爭奪出塊資格。程序員

Filecoin系統中的證實算法最初源於存儲證實(PoS)、數據持有性證(PDP)和可檢索證實(PoRet),後面逐漸迭代、加強約束條件,才完善爲現在工程中所採用的複製證實(PoRep)與時空證實(PoSt),這裏分別詳細介紹一下它們的含義:github

  • 存儲證實(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 提供了存儲和數據下載服務兩種服務,系統成本最終決定用戶的使用成本。sql

若是複製證實和時空證實消耗的資源過多,那麼會系統性的提高整個 Filecoin 成本,這會讓 Filecoin 系統的價值大打折扣。數據庫

目前所開源的初版go-filecoin0.1.x系列所採用的是ZigZagDrg和StackedDrg的VDF方式來做爲PoRep的實現,官方對此認爲仍有改進空間,協議實驗室也爲此設立了RFPs基金,專門研究該課題,而複製遊戲的誕生也是爲了更好地讓社區愛好者提早參與測試和協助官方優化這個部分。json

2、複製證實PoRep

2.1 PoRep職能

PoRep算法的職能是用來證實一個存儲系統確實存儲了某一份數據的拷貝,並且每一份拷貝使用不一樣的物理存儲,並用來抵禦去中心化系統中三種常見的攻擊: api

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(Blake二、SHA256也在作實現和選擇):

整個PoRep的計算過程分爲若干層 (目前在Filecoin中設置爲4層,在複製遊戲項目中設置爲10層) ,每一層的DRG關係的箭頭方向是互斥的,上一層向右,下一層就向左,所以得名ZigZag(Z字型),數據解碼過程當中,每一層之間互不依賴,便可並行執行,相對於串行編碼要更爲快速。

綜上,這樣就實現了PoRep的本質:編碼快,而解碼和驗證證實快的效果,從而防範各類攻擊。

3、時空證實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...

4、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的其餘細節導讀,這裏推薦李星前輩的一篇文章:

以後,能夠配合官方的rust-fil-proofs源碼倉庫進行閱讀和獲取最新的變更:

關於PoRep和PoSt的推演論證過程,想深刻了解的童靴能夠對照這兩篇論文進行剖析:

5、參與複製證實遊戲

複製遊戲是一項複製競賽,參與者挑戰 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體系下,只是影響存儲效率的一個因子而已,對於礦工來講,須要追求的是綜合性價比。

參考文獻

往期系列文章回顧:

【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微信公衆號)

相關文章
相關標籤/搜索