本文內容來自FileStorm創始人獻哥。
首先FileStorm有出塊節點和存盤節點兩種不同節點。而出塊驗證和存盤驗證用的是兩個不同的共識。
FileStorm區塊鏈出塊驗證采用的是dPOS,Delegated Proof of Stake,或稱委托權益證明共識機制。它是由選出來的驗證節點(俗稱超級節點)輪流打包塊,并對其他節點出的區塊進行驗證。DPOS利用利益相關方批準投票的權力以公平和民主的方式解決共識問題。 是目前所有共識協議中最快,最有效,最分散,最靈活的共識模式。
FileStorm的檔案驗證采用的是類似PBFT,或稱實用拜占庭容錯的共識。實用拜占庭容錯共識的核心是,所有節點中不能有超過三分之一的壞節點,在n>=3f+1的前提下,可以通過少量的資訊交換達成共識。資訊傳遞的方式可用下圖表示。

FileStorm中的存盤節點會被分到不同的分片(Shard)中,分片是最基本的一個存盤空間單位,就相當于資料庫里的一個分片。每個分片里的存盤節點硬碟一樣大,存的檔案也是一樣。這樣一個分片里的各個節點之間在n>=3f+1的前提下可以互相驗證。所有的檔案的資訊和讀寫交易都寫在區塊鏈上,而檔案內容則存在存盤節點的IPFS中。所以FileStorm平臺上會有很多的分片。分片里的每個節點都會定期做檔案的時空復制證明。
那一個分片里的存盤節點之間是怎樣通過類PBFT共識來做驗證的呢?首先被驗證節點要根據自己存盤的檔案和一個計算方法做一道數學題,然后提交自己的答案;而分片里其他節點也要用同樣的檔案和計算方法來做題得到答案,拿這個結果跟提交的答案比較以后進行投票。如果有超過半數的人投票自己的結果和被驗證節點一樣,說明被驗證節點是誠實節點,并且存了該存的檔案。
分片中每個節點存盤檔案相同,計算方式相同,那怎么樣才能保證每次出的考題不一樣,讓存盤節點沒有辦法作弊呢?這時候,就要請出超級節點來當出題老師了。
但實際上超級節點也不是出題老師。他只是監考老師。出題老師是FileStorm區塊鏈本身。FileStorm每個區塊的區塊頭上有兩個亂數。這兩個亂數的產生跟出塊的時間和上一個區塊哈希有關,所以很難被作弊。就是這兩個亂數,決定了存盤驗證的計算應該怎么做。詳解如下:
存盤節點定期對本地檔案進行驗證。輪到驗證時,它會從當前區塊頭里拿到這兩個亂數。用第一個亂數,它從自己的本地檔案中隨機找到一組檔案,然后用第二個亂數找到每個檔案中的一個隨機的起始位置。從這個起始位置往后數256個位元組,便得到一組隨機的字串組。先對每個檔案中的這組字串進行哈希,然后將哈希結果兩兩哈希,直到得出一個根哈希值。這就是驗證節點要提交的答案。兩個亂數保證了每次提交驗證的結果是不同的。
同時,同分片里的其他節點也要做同樣的操作。因為他們拿到的亂數是一樣的,計算方法也一樣,如果檔案跟被驗證節點一樣,那得到的哈希值就是一樣的。被驗證節點先將自己的哈希值以交易的方式發到鏈上。其他節點收到交易后,跟自己生成的哈希進行比較,然后將比較結果也以交易的方式發出來。最后進行統計,如果超過半數的節點給出的哈希值跟被驗證節點相同。我們認為被驗證節點存了所有的檔案,我們就會給它獎勵。
以上就是檔案復制的空間證明。用亂數選取部分檔案進行驗證可以大大降低檔案驗證時耗費的資源。
檔案復制的時間證明也是通過區塊決定。每個存盤節點都有一個最后驗證區塊高度的引數,然后系統里有一個檔案驗證的頻率引數。頻率引數暫時設定為1000。每天FileStorm區塊鏈要產生大約8640個區塊,也就是說,每天每個存盤節點都要被驗證8次。最后驗證區塊高度引數記錄了這個節點上次被驗證的區塊高度,一旦當前區塊高度多出1000,就要做存盤驗證,并更新最后驗證區塊高度。分片中每個節點都知道其他節點的最后驗證區塊高度。所以會在該投票的時候為被驗證節點投票。
PBFT共識最少需要4個節點來參與。FileStorm分片的大小,現在設定為7到10,是符合PBFT共識要求的。但這可能是FileStorm一個最有爭議的地方。有人認為檔案存盤這么多份,造成了資源浪費。我們不這么認為,理由如下:
我們認為,在一個去中心化的分布式系統中,節點的可靠性只有中心化分布式系統的30%-50%,中心化存盤平臺如Hadoop會將檔案存3份,我們存7到10份是合理的。這個數字將來在分布式存盤系統的穩定性和魯棒性加強后可以做調整。
現在還沒有被市場檢驗過的大型商用去中心化平臺,而為去中心化存盤生產出來的存盤設備明顯高于去中心化存盤需求量。我們早期完全可以這樣做,確保檔案不被丟失。
去中心化存盤的成本會比中心化低本身就是一個偽命題,有人認為中心化存盤和云存盤服務商都有大量資產配置冗余,而去中心化平臺有早期平臺發放加密貨幣帶來的使用紅利。但是真正的資料比較還沒有人做過。
最后還要補充兩點,首先,分片里的存盤節點是全網隨機選取的,沒有可能互相認識,也就沒有作弊的動機。驗證所用的亂數是區塊鏈產生的亂數,也沒法被存盤節點用來作弊。第二,系統自帶修復機制,節點每次驗證時其實還要做檔案檢查和同步,如果有檔案缺損,就會補上。節點下線,就會有新節點加進來。
————————————————
著作權宣告:本文作者「Li_Yu_Qing」
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/30133.html
標籤:區塊鏈技術
上一篇:solidity 0.5.10+call方法呼叫出現引數錯誤
下一篇:各位誰能講一下如何學習以太坊么
