DFINITY區塊鏈連載(三) - 技術FAQ

上一篇介紹了DFINITY網路達成一致性的模型並解析了區塊生成的步驟,本章將簡單的對有關技術做一個FAQ,可以很好的回顧技術實現的細節和部分架構設計的考量因素。

作者:季宙棟、叢宏雷

核心關鍵詞:驗證塔、驗證樹、閾值接力、分片

為什麼DFINITY依賴於隨機性?

我們發現,到目前為止,只有通過密碼學生成隨機數的方法才能在一個抗攻擊的網路中管理大量的客戶端(礦工),從而實現一個虛擬的超級計算機。當然,中本聰也是設計讓礦工去計算隨機難題的方法產生隨機性。DFINITY需要一個更強的、更不易被操縱,而且更高效的隨機數生成演算法。

我們採用的演算法稱為閾值接力,這個演算法基於密碼學,可以在一個參與者足夠多的網路中生成幾乎不可攻破、完全不可操縱、不可預測的隨機數。基於閾值接力演算法,DFINITY網路中的參與者可以生成一個可驗證的隨機函數VRF,基於VRF隨機函數DFINITY網路完成對自己組織和運行管理。

而且,在比特幣出現之前,隨機數也在分散式系統中有重要的運用。比如著名的拜占庭共識協議演算法,這個演算法可以實現非同步網路沒有leader的情況下實現共識,但是他也依賴於一個common coin的概念去生成一個拋硬幣隨機序列,在2000年IBM通過RSA演算法實現了這個隨機序列。在2014年,Dominic在一個高擴展密碼項目中對此類共識協議做出進一步的擴展。這就是在去中心化的網路中,通過BLS簽名實現隨機數生成的演算法以及基於此演算法的眾多強大的應用的由來。基於RSA的閾值系統依賴於一個可信的代理節點,但是基於BLS的閾值系統不需要可信代理。

一個隨機源對於雲應用很有必要嗎?

是的。隨機源可以說是開放式雲應用平台的根本。除了通常的應用,比如為彩票/遊戲系統提供公平性外,可以為金融交易所的已提交事務進行隨機排序,從而抑制礦工的非法預先交易。在基於區塊鏈的自治系統中隨機源有更重要的作用,一個很好的例子就是目前String Labs正在開發的去中心化商業銀行系統PHI。

PHI是一個完全自治的系統,基於演算法隨機順序挑選外部的驗證者,委託它們對貸款申請進行驗證,實現智能放貸。同時,當前大多數其它的自治系統也都依賴於系統外部的輸入數據作出決策,由於自治系統本身無法驗證輸入的數據的正確性,所以自治系統通過隨機選擇的方式來抵抗外部系統可能的攻擊。

DFINITY如何產生隨機數?

DFINITY引入了『閾值接力』這一新的機制。它可以創造出一個確定的、幾乎不可攻破,同時完全不可操縱、不可預測的隨機數源。

為什麼不直接使用區塊哈希作為一個隨機數?

在DFINITY系統中的很多協議都基於隨機數的不可操縱、不可預測性來實現系統的橫向擴展。在傳統POW系統中,雖然也可以達到基本的隨機數要求,但是每個隨機數的產生都伴隨著一定的算力成本。在POS系統中,雖然沒有算力的要求,但是礦工可以很容易地通過修改區塊中的內容從而改變區塊的哈希值,這樣就使區塊的哈希值失去隨機性。綜上考慮,區塊的哈希值無法滿足我們的需求。

為什麼不用commit-reveal的方式生成隨機數?

這個方法有一個『最後披露人』漏洞。他可以選擇不披露,從而影響別人已經處理的結果。 對那些拒絕披露的人來說,懲罰並不奏效,因為通過操縱隨機性獲得的回報可能會更高。 除了有安全漏洞之外,這個方案效率也很低、容易失敗,因為他依賴所有參與者提交結果,才能進行處理。

為什麼不用TPM晶元做隨機源?

很難確定網路中誰會擁有這樣的硬體,而且TPM可以被關掉。

DFINITY網路都有什麼組成?

一個DFINITY網路有眾多的礦工客戶端組成,也稱之為『進程』,它們通過一個p2p廣播網路連接在一起。每個礦工都有一個礦工ID,用來對其所有發送的消息進行簽名,整個網路記錄著每個礦工的ID。在DFINITY公有網路,礦工向去中心化的BNS管理系統支付一定的DFN代幣作為準備金,BNS將為其在網路中創建一個安全帳戶作為礦工ID。在DFINITY私有網路中,可以通過一個可信的代理,比如公司的系統管理員來創建礦工ID。

系統的每個礦工都需要通過USCID向系統提供一些可保證質量的計算資源,包括數據處理能力,網路帶寬和存儲容量(後面部分有細節解釋)。隨著網路規模的擴大,為防止廣播通信的瓶頸,整個廣播網路會被劃分為若干子網。

進程間通過Kademlia DHT組成p2p網路,每個進程和很多其它進程間保持鏈接,通過gossip協議進行通信,基於此每個進程發出的消息很大程度上可以廣播到所有其它進程,同時其它進程發出的消息這個進程也可以接收到。這種廣播通信機制是去中心化網路的基礎。但是攻擊者仍然可以通過『月食攻擊』的方法對某一個進程進行攻擊,也就是將一個正確的進程包圍,使其鏈接的所有其它進程都是錯誤的進程,從而對這個正確進程發出和收到的消息進行過濾控制。在DFINITY的Tungsten版本中,我們將基於DFINITY內生的隨機燈塔和基於身份的密碼學演算法是這種月食攻擊更加的困難。通過將整個網路不停重組為各種帶約束的隨機形式,從而杜絕在網路中進行這種攻擊的可能性。

閾值接力是如何工作的?

前面的FAQ已經描述了DFINITY網路中礦工的組織方式。閾值接力演算法可以生成一個內生的隨機燈塔,每一個新的值定義了礦工的隨機組,這些礦工獨立地嘗試組建為閾值組。每個閾值組的組建都是完全隨機的,不同組之間可能有交集,一個礦工可能在多種閾值組中。在DFINITY中每個組有400個成員。當其組建完成,組中的礦工將基於分散式密鑰生成協議,為這個組生成一個BLS閾值簽名。如果它們在給定的區塊數目中完成了簽名的生成,這個組就可以將它們的BLS閾值簽名通過一個特定的事務請求將其公鑰(ID)註冊到全局區塊鏈中。在下下個區塊鏈的EPOCH周期,這個組將在網路中被激活,成為網路中的有效閾值組。DFINITY網路啟動的時候,有若干預定義好的閾值組構成,並選定其中一個閾值組進行第一塊簽名。第一個簽名也就是第一個隨機值,此隨機值用於選出下一個組,下一個組將會對前一個隨機值進行簽名,從而產出新的隨機值,進而選出下下個組,這樣不斷進行接力,從而生成無限的隨機數序列。

基於密碼學的閾值簽名,一個組中的礦工對某個消息的簽名分片的數量超過閾值後就組合整個組的閾值簽名,DFINITY網路中這個閾值設為51%。要完成一個消息的閾值簽名,組中的礦工對這個消息分別進行獨立簽名,生成相互獨立的組簽名分片,並且將各自的組簽名分片廣播到組中其它礦工,在收到超過閾值數目的組簽名分片後,就可以構建出整個組的閾值簽名。比如,一個組的大小為400,如果他的閾值設定為201,任意一個礦工收集到201個組簽名分片後,將可以構建出那個組對這個消息的唯一的閾值簽名。組中每個礦工都可以驗證組中其它礦工的組簽名分片,整個組的閾值簽名可以通過組的閾值公鑰進行驗證。BLS簽名策略的神奇之處在於它的簽名的唯一性和確定性。基於BLS的閾值簽名,組中任意礦工組合,只要滿足閾值數目,創造出來的閾值簽名都是相同的,也就是對一個消息,這個組的閾值簽名是唯一的,也是確定的。

因此,基於組的閾值簽名所產生出來的隨機數序列也是完全確定的,而且不可操縱的。因此各個閾值組間的閾值接力也就形成一個可驗證的隨機函數VRF的定義。給定一些閾值組,雖然它們所生成的隨機數序列是完全確定的,每個隨機數也只有在一個組中超過閾值的礦工對其進行簽名後才能生成出來。也就是說,如果要攻破這個隨機函數,也就需要打斷這種閾值接力的過程,必須需要使某個組超過一定數量的礦工停止工作,所以在配置網路的時候需要恰當選擇組大小和閾值,從而儘可能降低隨機函數被攻破的概率。

比如,一個組的大小為400,閾值為201,那麼需要使這個組超過200個礦工停止工作。假設整個網路中有10000個礦工,有3000個礦工是不工作的,在(400, 201)這個配置下,VRF函數被攻破的概率為10e-17。這結果是基於大數定律,即使每個礦工本身的行為是不可預測的,但是只要有足夠多的礦工後,整體行為是可以進行預測的。

在保證VRF演算法堅固的同時,整個系統也是非常高效的。在一個gossip廣播網路中,一個400個礦工的閾值組接力一次閾值簽名只需要大概20KB的數據通訊,而且DFINITY所使用的BLS簽名演算法,在當前主流硬體,完成一次簽名只需要毫秒級以下的運算。

閾值接力的區塊鏈是如何工作的?

閾值接力區塊鏈,基於閾值接力所產生的隨機數序列為每個高度的區塊定義一系列具有優先順序的備選區塊,然後由當前區塊高度對應的閾值組對其進行公證(簽名)。比如,在區塊高度h-1構建出來的隨機數將對所有礦工進行優先順序排序,第一的礦工位於slot 0,第二的位於slot 1。當高度為h的閾值組中的礦工發現前一個區塊的簽名結果選擇當前閾值組為高度為h的閾值組,它們將停止區塊鏈監測,然後等到當前區塊時間結束後,開始對優先順序隊列中的區塊進行處理。

出於效率考慮,區塊時間一超時,slot0的礦工即可產生新的區塊,其它slot等待slot0,若超時時間後未出塊將接手產生新的區塊。每個slot都有自己的權重,比如,slot0的權重為1,slot1為0.5,以此類推。當前閾值組的礦工按照如下規則對收到的區塊進行閾值簽名:

1. 之前沒有對更高權重的鏈上的區塊進行簽名

2. 區塊所指向的前一個區塊被前一個組有效地簽名

3. 區塊本身的內容是有效的

4. 當前組尚未完成對當前高度某個區塊簽名

閾值組成員將持續對隊列中的區塊進行簽名,直至發現當前閾值組已經完成當前高度某個區塊的有效簽名數,然後閾值組成員將停止對剩下的區塊進行簽名。通常情況下,在區塊時間超時時,礦工已經準備好最高優先順序的slot0中的區塊,然後只對此區塊做閾值簽名就完成了整個組的閾值簽名,而不需要對其它區塊再做簽名。不同slot中會有不同區塊可以幫助閾值組選擇最合適的鏈上的區塊進行簽名,但是由於新的區塊的前一個區塊必須被前一個閾值組簽名過的,基於閾值組的公證策略可以加速區塊鏈的最終確認。

相比,閾值接力區塊鏈的公證流程有明顯的優點。在傳統的POW和POS區塊鏈中,礦工總是可以通過超前攻擊,從而從前面區塊開始創造出新的分叉。在閾值接力的鏈上,只有在正確的時間,正確的閾值組中籤名的區塊才能被包含到有效的鏈上。這一點可以很好的的防止『selfish mining和『nothing at stack』攻擊,同時極大地減少了區塊鏈上區塊的確認時間。而且,通常閾值接力鏈上只有slot0上有一個備選鏈,因此新的閾值組可以很快完成閾值簽名,而且一旦簽名完成,簽名結果基本可信,因此閾值鏈上可以在秒級完成區塊確認。

相比其它區塊鏈,基於閾值接力的區塊鏈有極大的優勢。首先,它不需要昂貴算力的POW過程。如果需要,一個網路可以同時運行多個鏈而不會削弱網路的安全性。由於非常快的區塊確認時間,基於它可以達到更好的用戶體驗。由於每個被選區塊都是分配有固定的區塊時間,鼓勵礦工在區塊中包含更多的交易事務。類似SPV的服務也可以實現,對應的客戶端只需保存當前網路中閾值組的默克爾根哈希值。同時,由於備選鏈必須被公開公證,系統安全性也更加可控。

DFINITY如何進行橫向擴展?

雖然相對於當前的其它區塊鏈系統DFINITY有很大的性能提升,但是閾值接力本身仍然無法實現橫向擴展。DFINITY網路將閾值接力應用在三層可橫向擴展的系統架構中,共識、驗證和存儲。共識層通過閾值接力鏈產生隨機心跳,來驅動驗證層中驗證塔的驗證樹,驗證樹採用Merkle樹的形式實現數據驗證。

隨機燈塔同時將礦工組織到存儲層的存儲分片中,存儲層在收到事務請求和對應的結果狀態後,基於自己的閾值接力鏈實現共識,然後將其傳遞到驗證層,然後驗證層完成驗證,最後傳遞到最上面的閾值接力共識鏈,將記錄驗證樹的根節點的信息。

你可能發現整個區塊中沒有事務。是的,DFINITY雲的目標是保存EB級別的狀態,每秒鐘完成億級別的事務處理。每個礦工只能夠看到全局狀態的一小小部分,而網路則專註於確保只能通過合法的方式,執行正確的事務才能對系統的狀態(root hash)進行修改。因此,任何數據的出處,任何事務的執行或者礦工本身所請求的任何活動,都是通過它們到當前全局Merkle根節點的路徑來證明。

整個系統架構和其中的協議都是由Dominic Williams在2015早期完成設計,並且在舊金山的一次比特幣開發聚會和一次倫敦的演講中做了介紹。

驗證塔是幹什麼的,他是如何工作的?

在傳統的區塊鏈系統中,比如比特幣和以太坊,從創始塊開始所有交易記錄都保存在區塊中,網路中的所有參與者都可以檢查區塊中的數據和對這些數據的更新操作是否合法。在DFINITY系統中,這一點是完全不可行的,因為DFINITY的系統設計目標是EB級的數據和億級的TPS,網路任何一個節點不可能獨自完成所有請求的處理。因此,DFINITY網路需要新的區塊驗證方法,只需要網路中一小部分礦工即可安全地完成各個分片的數據更新。這樣,只需在其最頂層的鏈上保存一個Merkle根就可以鎖定整個網路的狀態。

要構造出Merkle根,首先需要一個驗證樹。和Merkle樹通過一個根節點哈希就可以驗證無限多的數據類似,驗證樹也可以在去中心網路中對無限多的事務實現公證。驗證樹的每一個節點對應一個驗證塔,每個驗證塔可以驗證給定的輸入信息所產生的輸出信息的摘要,在塔的最底層是輸入的事務請求和相應的狀態轉移結果。

驗證塔的目的是使用網路中一小部分進程進行驗證,同時可以達到網路中所有進程都進行驗證類似的安全等級。初看起來這事不可能,但是實際是可行的。

一個驗證塔可以有無限多層,塔中每添加一個新層將對新層下面的狀態轉移數據增加一些的新的證據。比如,一些事務更新了一些存儲分片數據,就可以用一個驗證塔來驗證這些更新的有效性。驗證塔的每一層都是由不同的進程組進行驗證,進程組的選擇則是由基於最頂層的閾值接力鏈的隨機燈塔完成。一個進程組要完成了一個新層的構建,這個進程組需要為這個新層以及其向下d層中對應的狀態轉移的有效性作公證。

驗證塔中向上d層都被某些進程組驗證有效後,當前層中包含的事務才被整個網路認為是經過驗證的,也是就是構建上面的d-1層的閾值組都為此層事務的有效性作證。也就是說,在一個進程組完成了一個新層的構建的同時,其下第d層中的事務也完成了『完全驗證』。這樣就使攻擊者作出的無效的事務很難實現完全驗證,因為如果要一個無效事務達到完全驗證的狀態,需要連續控制d層的隨機進程組,也許只有這個無效事務可以讓他獲利上百億美元,才值得去嘗試。

下面我們解釋一下為什麼這個是不可能的。首先考慮在一個礦工完成了對一個新層的簽名後,它進入潛伏狀態,直至這個新層上面有了d-1層後他才能再次啟用(實際情況中,礦工在參與到網路事務處理時必須證明他的上一層已經完成驗證)。攻擊者在提交完錯誤的驗證結果後,只能停止參與網路中事務的處理,但是每個礦工在創建的時候都有一個安全帳戶,在其停止參與網路事務後,其帳戶也無法繼續操作。

攻擊者可能通過概率來以小博大,那麼他首先遇到的問題是每個層的構建組都是由隨機燈塔選擇的,隨機燈塔本身是完全不可操縱、不可預測的,因此很難確保自己能被選中。如果有正確的礦工被選中,前面攻擊事務所在層將會被認定為無效的。攻擊者可能試圖拒絕隨機燈塔所選出的下一個閾值組,直至他所控制的閾值組被選中,然後繼續標記攻擊事務為有效。但是,驗證塔協議本身禁止了這種情況:如果一個新層不是被隨機燈塔的鎖定階段構建出來的,所有未完成驗證的驗證層都重新需要d-1層的驗證。

現在你就能看出這其中的問題。攻擊者每一次嘗試提交一個錯誤的事務請求,期望他控制的閾值組能被隨機選中執行接下來d-1層,有極大極大可能是他所控制的礦工將被強制退出。在這個例子中,沒有一層驗證失敗,他將失去6個礦工進程。如果與進程關聯的安全賬戶價值為10,000美元,則創建一個錯誤的層的代價是$ 5.36^e16。 很顯然,在現實世界中這幾乎不可能!

驗證塔的好處是它使網路能夠僅使用一小部分進程就可以非常安全地驗證狀態轉換。 所有這些操作都需要一個不可破壞的、不可操縱和不可預測的由閾值接力鏈提供的隨機源。

驗證樹是如何工作的?

驗證樹的功能是記錄虛擬計算機的狀態數據和網路中所發生的重要事件,基於這些數據計算出一個Merkle樹。通過Merkle樹的根節點的摘要,只需要20位元組,實現對一個無限大輸入數據的摘要。輸入的數據將被組織到整個Merkle樹的葉子節點,每個葉子節點的哈希向上組成一個n-ary的樹。可以通過從根到葉子節點的路徑上的哈希值來證明每個葉子節點數據的有效性。

通過構造一顆Merkle根,整個驗證樹可以鎖定無限的數據。作為一個分散式的數據結構,每個驗證塔作為樹中的節點。這些操作都是在隨機燈塔的心跳驅動之下,對輸入進行驗證,然後輸出經過完全驗證過的數據的哈希作為輸出。在樹的最底層是驗證塔的下面是狀態數據節點,通常也就是各個子網的礦工們所管理的數據分片。它們將狀態轉移信息輸入到分配的驗證塔中,然後驗證塔最終將計算出它們所驗證過的新的狀態的哈希值。這個系統的強大之處在於,一個驗證塔可以對其他驗證塔的輸出做驗證,並且組成一個驗證塔的Merkle樹。

比如,當前的驗證塔的最底層將為當前的某些狀態數據分片的根節點哈希提供證詞。在Merkle樹中,它的父節點將會將其以及其兄弟節點組合在一起,一直向上直到構建出整個樹的根節點。在DFINITY這樣的大規模去中心網路中,存在一個問題就是,有太多的葉子節點哈希,一個單獨的礦工無法將所有葉子節點構建出一個Merkle樹。因此,我們希望將整個樹的不同子集分配到不同的礦工,分別構建出整個樹的不同部分,然後通過協議將它們組合在一起。但是這樣如何驗證整個樹的有效性就成為了一個問題。解決方案就是通過驗證塔將葉子節點組合在一起,向上形成一棵樹,直至生成根節點哈希。這樣,更高層的驗證塔將其子節點的哈希組合到一起,生成一個新的經過完全驗證過的哈希,然後繼續上傳到他的父節點,向上一直傳遞,直到生成根節點。

就這樣,就有了一些可以生成正確根哈希的根驗證塔,它們生成的完全驗證過的根哈希被保存到整個網路最頂層的共識層中。由於驗證塔之間相互獨立運行,可以以各自不同處理速度運行,這樣防止了某些子網的處理速度成為限制整個網路的處理速度的瓶頸。共識層中記錄的最新的根節點的哈希就鎖定了保存在眾多分片中的某個全局狀態,同樣可以用於鎖定一些網路中發生的重要事件。網路中參與節點可以通過,從根節點哈希到他所參與的驗證塔的路徑,來向網路中其他節點來證明他在網路中所作的貢獻。採用這種方式,我們既可以完成對EB級別數據的鎖定,也可以判斷網路中的礦工的行為是否是有效的。

當然,從一個狀態更新操作被執行,到共識層的系統根哈希完成對這個修改的鎖定需要走相當長的一段路程(因為要經歷整個樹形結構中的驗證塔的層層驗證)。這一點是不可避免的,因為共識層中的數據必須是正確有效的,但是整個網路的處理速率並不一定需要下降。如果一個數據分配被足夠多的礦工共同維護,則在這個分片廣播出事務結果的時候,網路中的礦工就可以接受其作為事務的執行結果,而且,在最底層的驗證塔對這個事務完成驗證的時候,即使還需要一段時間才能在最頂層的共識層確認,就可以認為這個事務結果已經完全確認。對於運行在一個去中心雲平台上的應用來說,額外多一些的計算費用也是完全可以接受的,畢竟它是運行在一個自治的,永不停機也不會被攻破的系統之上,相對可以極大減少人力維護的費用。

什麼是USCID,他是如何工作的?

去中心化雲的設計目標就是建造一個永不停機的計算平台,基於此平台可以構建永不停機的應用。這個目標要求客戶端也能安全地存儲數據。在比特幣和以太坊平台,整個網路中只有一個鏈,鏈上所有事務都保存在這個鏈上,因此每個客戶端都可以有完整的整個以太坊的狀態資料庫。DFINITY網路設計目標是保存無限量的數據,可能是EB級的數據,因此一個客戶端不可能保存整個鏈的狀態資料庫。這就需要將整個鏈的狀態資料庫在所有客戶端上進行分片,這就自然引出了如何進行分片來確保整個資料庫的安全性。同時也就有另一個很重要的問題:我們怎麼確定數據被真正的備份了?

這裡面必須解決的問題就是即使有很多礦工看起來是保存了數據的備份,這些礦工可能是某個攻擊者為賺到更多收益而創造出來的偽裝,實際上並不做任何事情。在IPFS和其使用的激勵系統FileCoin中就明顯存在這個問題。IPFS是一個去中心化的文件存儲,其保存的所有數據和對象都通過數據哈希進行訪問。問題就在於,在一個用戶上傳了數據後,用戶無法確定他的數據被備份了多少份,也不知道當前哪些IPFS礦工存儲或緩存了他的數據,也不知道礦工會將它的數據保存多少時間。FileCoin的目標就是通過向礦工支付代幣的形式來鼓勵礦工更多更廣泛的做數據備份。但是還有一個未解決的問題就是,IPFS協議無法確認這些客戶端是不是只是一個超級計算機的代理客戶端,它們的所有數據實際上都是同一個備份。

要為數據的安全性提供真實的保證,DFINITY網路必須確認網路中數據的備份因子。同時也確認網路中的備份數目也不要太多,畢竟每個文件都備份一百萬份也很可笑。DFINITY的解決方案就是通過『唯一狀態拷貝ID -- USCID,要求每個礦工都採用唯一的方式對分配給它們的數據進行備份。這要求每個客戶端使用一個從它們的網路ID生成的密鑰對他的數據進行加密,而每個礦工的網路ID在網路中是公開的。具體加密演算法是一個特殊定製的對稱加密演算法,整個演算法加密速度相對較慢,但是解密速度很快,雖然在更新和寫入數據的同時也可以進行數據加密,但是要在很短的時間內完成所有分配數據的加密是不可能的。

USCID系統要求客戶端在通訊的時候對它們唯一加密的狀態提供證詞。比如,當一個客戶端在一個閾值接力鏈的PSP中創造出一個備選塊的時候,他必須提供這樣一個證詞。由於客戶端要想使自己的備選塊被包括到主鏈當中,從而可以獲得一份獎勵,備選塊必須在一個幾秒鐘的時間窗口內被廣播出去,這樣就給攻擊者製造了一個問題。證詞是在客戶端加密的狀態數據上隨機遊走所產生出來的哈希鏈-從閾值接力網路中隨機燈塔指定了隨機遊走的起始塊-一個塊加到哈希摘要,然後選擇另一隨機塊,一直持續到指定步數。由於哈希計算是非常快的,只要之前的數據是已經加密好的,整個證詞的生成也是很簡單的。但是,如果之前的數據如果是明文保存的,比如在之前假設的那個超級主機上,數據就必須先進行加密然後計算哈希摘要,由於之前提到的經過定製的加密演算法,要在短時間內計算出證詞是不可能的。

在通常通訊中,每個客戶端都需要生成這樣的證詞,但是這些證詞通常不會被校驗。然而,隨機燈塔可以隨機請求進行驗證,或者當一個區塊被接受一份獎勵要被發放的時候,其他保存著相同數據的客戶端可以對其證詞進行校驗。校驗過程是,這個礦工會從當時隨機遊走的起點區塊開始,首先對自己的數據進行解密,然後採用對應證詞所有人的ID所生成出來的密鑰對數據進行加密,然後計算哈希摘要,最終與證詞進行比較驗證。由於所使用的密碼演算法的特殊性,整個驗證過程會需要一段時間,因此在進行驗證的同時整個網路還會繼續向前運行。當然,為防止網路重組造成的影響,客戶端應當保存它不同歷史版本的狀態數據,這樣當需要對歷史數據進行驗證的時候也沒有問題。系統中也採用一個類似驗證塔的數據結構來最終判決一個證詞的有效性。如果發現無效證詞,證詞所有人的安全帳戶將會被停止,分配給他的數據備份也將分配給其他的客戶端。

好了,看到這裡你一定眩暈了!!!恭喜你,可以返回連載一重新開始理解DFINITY網路了

下一篇 帶來激動人心的挖礦簡介


推薦閱讀:

18年數字貨幣的發展趨勢將如何?還有什麼潛力股數字貨幣值得投資嗎?
ico還會再回到中國嗎?
如何看待比特幣Segwit2x硬分叉?
區塊鏈的 「去中心化」 效果是否將導致系統性風險?
手上有1W,全买了EOS币,这个币有前景吗??

TAG:分布式计算 | 区块链Blockchain | 分布式系统 |