1. 程式人生 > >Ripple結點和相關共識介紹及思考

Ripple結點和相關共識介紹及思考

1. RPCA概述

目前,針對決拜占庭將軍問題,已經有幾種可行的解決方案,比如比特幣與以太坊採用的POW演算法,HyperLedger採用的PBFT演算法。然而,在這種分散式支付系統中,由於節點間需要同步溝通,導致共識效率比較低。

在RPCA演算法中,為了降低這種同步溝通的成本,使用了一種子網路內部互相信任,由這些內部信任的子網路構成大的網路的方案。這裡子網路的信任成本非常低,可以被進一步降低為網路節點對於子網路內部其它節點的原子性選擇。另外,為了維護全網節點資料的一致性,子網路之間需要的連線度不能小於一個閾值。

通過以上解決方案,RPCA實現了一種高效能,同時擁有較高拜占庭容錯的演算法。RPCA演算法已經應用在Ripple共識協議中。

2. 要解決的問題

近些年,針對分散式共識系統的研究越來越多,研究的目標是實現一種高效能,低花費,同時去中心化的交易系統。在這類系統的研究過程中主要問題可歸為三類:正確性、一致性、可用性。

正確性指的是分散式系統要能識別正常交易與欺詐交易。在中心化系統中,這個問題是通過機構之間的信任以及數字簽名來保證交易確實是由某個機構發出來解決的。而在去中心化系統中,大家甚至都不認識對方,自然無法建立類似的信任關係,因此,必須找到一種替代方案來保證交易的正確性。

一致性指的是要在去中心化系統中保證能達成全域性唯一的共識。與正確性不同的是,一個惡意使用者也許不會發起欺詐交易,但是他可以通過同時發起多筆正確的交易來謀利。在區塊鏈中,典型的例子是“雙花”問題。雙花問題就是一筆錢花兩次,比如你拿著比特幣,在A商店買了瓶水,在B商店買了包瓜子。兩個商店幾乎同時花,假設商店都不等交易確認。那麼可能A或B商店最後有一家沒有能收到幣。那麼就實現一次雙花。 因此一致性問題可被歸結為如何保證系統中只能有一個全域性唯一識別的交易集的問題。

可用性在去中心化支付系統中一般指的是效能問題。假設一個系統既能保證正確性又能保證一致性,但是需要一年時間才能確認一筆交易 ,那很顯然這個系統的可用性很低。另外,可用性的其它方面包括達成正確性與一致性需要的算力水平、為避免一個使用者被欺詐所應用的演算法複雜度等。

RPCA演算法就能很好的解決以上三個問題。

3. RPCA中的基本概念

在講演算法之前,有一些基本概念需要了解:

  1. 服務節點,就是可以接收交易的區塊鏈節點,包括驗證節點與非驗證節點兩種,驗證節點是指被其它節點加入到信任列表中的節點,可參與共識過程,非驗證節點不參與共識過程。

  2. 區塊,區塊記錄交易,在RPCA中有兩種區塊比較關鍵,一個是最新關閉的區塊,也就是最新被共識過的區塊,另一個是開放區塊,開放區塊是指當前正被共識的區塊,當開放區塊被共識過,也就成了新的最新關閉的區塊。

  3. UNL(Unique Node List)信任節點列表,每個服務節點都會維護一個信任節點列表,這裡的信任並不是我們通常理解的信任,而是指我信任這個列表中的節點不會聯合起來作弊。在共識過程中,我們只接受來自信任節點列表中節點的投票。在Ripple中,我們用在配置檔案中加入其它驗證節點的公鑰的方式來指定UNL。

4.共識過程

Ripple網路每隔幾秒就會產生一個新的區塊,這個區塊的產生過程就是所有網路節點RPCA共識的過程。假設共識過程是成功的,並且網路中沒有分叉產生,那麼新生成的區塊就是全網唯一的。

RPCA對交易分兩個階段完成,第一階段是達成交易集的共識,第二階段是對新生成的區塊進行提議,最終形成被共識過的區塊。

達成交易集的共識分輪進行,在每一輪中進行下面的操作:

交易共識,形成交易集

1 每個節點在共識開始時儘可能多的收集所能收集到的需要共識的交易,並放到“候選集”裡面;

2 每個節點對它信任節點列表中的 “候選集”做一個並集,並對每一個交易進行投票;

3 UNL中的服務節點交流交易的投票結果,達到一定投票比例的交易會進入到下一輪,達不到比例的交易要麼被丟棄,要麼進入到下一次共識過程的候選集中;

  1. 在最終輪中,所有投票超過80%的交易會被放到共識過的交易集中,這裡的交易集與比特幣類似,也是Merkle樹的資料結構。

區塊打包,再共識

形成交易集後,每個節點開始打包新的區塊,打包區塊的過程如下:

  1. 把當前區塊號、共識交易集的Merkle樹根Hash、父區塊Hash、當前時間戳等內容放到一起,計算一個區塊雜湊

  2. 每個節點廣播自己得出的區塊雜湊到它可見的節點,這裡的可見節點不僅僅指可信列表中的節點,而是通過節點發現過程能發現的節點

  3. 節點收集到它所有可信列表中節點廣播過來的區塊雜湊後,結合自己生成的區塊雜湊,對每個區塊雜湊計算一個比例,如果某一雜湊的比例超過一個閾值(一般是80%),則認識這個雜湊是共識通過的區塊雜湊。如果自己的雜湊與之相同,則說明自己打包的區塊得到了確認,是新的被共識過的區塊,直接存到本地,並且更新狀態。如果自己的雜湊與共識通過的雜湊不同,那就需要去某個區塊雜湊正確的節點索要新的區塊資訊,要到之後儲存到本地並且更新當前狀態。

  4. 如果上面沒有對某一區塊雜湊超過設定的閾值,那麼重新開始共識過程,直到滿足條件。

至此,一個區塊的共識過程結束,開啟下一輪共識過程。

5.驗證

前面第三節中我們提出了三個問題,正確性、一致性、可用性,下面我們挨個驗證:

  1. 正確性:

RPCA中正確性的驗證方式很簡單,因為共識需要80%的閾值,那麼只要UNL中有80%的誠實節點,就能達成共識,另外即使有超過20%的欺詐節點,也不能破壞正確性,因為欺詐節點也必須達到80%以上才能達成共識。無論欺詐節點還是誠實節點,達不到80%,都無法通過共識。

  1. 一致性:

RPCA中一致性是通過子網路與其它子網路的連通性來保證的,要保證區塊鏈不分叉,必須確保每個子網路必須至少與整個網路節點中的20%保持連通性。達到20%連通性的前提下,如果一個子網路中得出的共識區塊雜湊與整個網路得出的不一致,也就無法達成80%的共識要求,也就無法產生分叉。

  1. 可用性

在每一輪投票過程中,節點會蒐集它UNL中每個節點的響應時間,一直響應時間慢的節點將會被剔除出去,這樣UNL就能保持一個較高的溝通效率。在高效溝通的前提下,RPCA演算法能保證每3秒左右就能產生一個區塊,Ripple官方給出的tps資料是1500。這樣的效能基本能滿足一般的生產需求。


6、UNL

     配置檔案中的可信任列表。

     其實Ripple中的這個東西有好處也有詬病,好處是可以控制鏈的安全性,不管鏈上有多少不安全的作弊的驗證節點,只要節點不信任你,作弊的就無計可施。壞處是,Ripple也因此被認為不是完全去中心化的網路,違背了初衷。

7、validation_quorum

    validation_quorum是達成共識的門檻數量。

8、普通節點與驗證節點

      普通節點只轉發交易,信任UNL中的信任節點,參與共識。

      驗證節點可以被普通節點信任,決定共識。

9、公鑰和私鑰

     Ripple和Bitcoin採用橢圓曲線演算法,生成一對公私鑰,公鑰可以根據私鑰生成,但是反過來不行。私鑰用來簽名,公鑰驗證,具體後面專門講解。

10、雙花

     Ripple和Bitcoin都面臨的問題是雙花和分叉。

雙花通俗的說,就是一筆錢花兩次,因為Ripple每提交一次交易先本地驗證接受,然後提交網路共識,共識過程可能耗費3-8秒。

在共識未成功之前,可以以這筆錢再提交一次交易,本地由於前一次還沒有共識通過,所以此次交易還是能驗證通過,然後提交網路共識。

Ripple的解決方法看起來很簡單,就是依據共識的時間先後,對於上述例項,第一次交易共識通過,第二次交易的共識就通不過。

11、分叉與防作弊

   對於一個Ripple網路,假設有個普通節點的UNL中的驗證節點都是作弊節點,或者作弊節點超過UNL總數量的2/3(具體怎麼算的,後面專門介紹,涉及到數學證明過程),那麼對於這個普通節點的本地區塊鏈就會分叉。

 RIpple是如何防作弊的呢?當分叉後的作弊區塊鏈又連線到網路上時,首先節點會廣播區塊資訊,這是Ripple網路上的節點發現這個區塊和自己的接不上或不一致,就把它標記為INSANE,意為我們都不信任你的區塊,所以作弊的區塊鏈無效。(具體如何標記,如何比對,後面專門介紹)。

12、共識

 Ripple網路上的每筆交易發出時,先經過本地節點的驗證(簽名和交易合法性,簽名是用公鑰驗證交易的簽名,合法性主要是驗證有沒有這筆錢可以花費等),再提交網路參與共識。共識就是UNL中的信任節點參與投票的過程,後面會詳細講解。

博主QQ: 122209017