1. 程式人生 > >詳解瑞波程式中共識演算法

詳解瑞波程式中共識演算法

瑞波共識協議(Ripple Consensus Protocol,RCP),使一組節點能夠基於特殊節點列表達成共識。初始特殊節點列表就像一個俱樂部,要接納一個新成員,必須由一定比例的該俱樂部會員投票通過。
  RCP機制的工作原理如下:

  1. 驗證節點接收儲存待驗證交易。首先驗證節點接收待驗證交易,將其儲存在本地;其次本輪共識過程中新到的交易需要等待,在下次共識時再確認。
  2. 活躍信任節點發送提議:首先,信任節點列表是驗證池的一個子集,其信任節點來源於驗證池;其次,參與共識過程的信任節點須出於活躍狀態,驗證節點與信任節點間存在保活機制,長期不活躍節點將被從信任節點列表刪除;最後,信任節點根據自身掌握的交易雙方額度、交易歷史等資訊對交易做出判斷,並加入到提議中進行傳送。
  3. 本驗證節點檢查收到的提議是否來自信任節點列表中的合法信任節點,如果是,則儲存;如果不是,則丟棄。
  4. 驗證節點根據提議確定認可交易列表的步驟如下:首先,令信任節點列表中活躍的信任節點個數為M(比如5個),本輪中交易認可闊值為N(百分比,比如50%),則每一個超過M*N個信任節點認可的交易將被本驗證節點認可;其次,本驗證節點生成認可交易列表。系統為驗證節點設定一個計時器,如果計時器時間已到,本信任節點需要傳送自己的認可交易列表。
  5. 賬本共識達成的步驟如下:首先,本驗證節點仍然在接收來自信任節點列表中信任節點的提議,並持續更新認可交易列表;其次,驗證節點認可列表的生成並不代表最終賬本的形成以及共識的達成,賬本共識只有在每筆交易都獲得至少超過一定闊值(比如80%)的信任節點列表認可才能達成。如果賬本中每筆交易都獲得至少超過一定闊值的信任節點列表認可,則共識達成,交易驗證結束,否則繼續上述過程。
  6. 共識過程結束後,已經形成最新的賬本,現將上輪剩餘的待確認交易以及新交易納入待確認交易列表,開始新一輪共識過程。



  有兩個事情需要共識演算法:
    1. 賬本中的事務集合.
    2. 賬本的關閉時間.
  基本流程:
    1. 首先呼叫`startRound`使Node處於`Open` 階段.  在這個階段Node開啟賬本等待交易事務
    2. 不停地呼叫`timerEntry` 檢查Node是否能關閉賬本,一旦Node `Close` 賬本,Node將進入 `Establish` 階段,Node將分享或接收對等Node的提案(將被關閉賬本中接收的提案)

    3. 在呼叫 `timerEntry`的後續期間, Node將決定是否在某個事務上和對等Node達成共識,進入一個 `Accept` 階段,在這個期間,Node將用這個交易事務更新之前的賬本從而產生一個新的關閉賬本,一旦新的賬本已經完成,Node將和網路其他Node分享這個有效賬本,然後再進行一些登記的工作,接著再次呼叫`startRound` 進入下一輪迴圈週期

單個賬本的共識階段如下:

              "close"             "accept"
     open ------- > establish ---------> accepted
       |                     |                                |
       |---------------|                                |
                     "startRound"                     |
       |--------------------------------------|

當出現錯誤賬本時的處理方法:

當我們進入提議或觀察的輪詢後,如果我們發現我們正在處理錯誤的先前Ledger,我們就進入wrongLedger類並試圖獲得正確的一個,
   一旦我們獲得正確的Ledger,我們進入switchedLedger 模式,有可能Ledger又落後了,發現有新的更好Ledger,這樣來回移動wrongledger和switchledger之間試圖解決該問題。

     proposing               observing

         \                       /
          \---> wrongLedger <---/
                     ^
                     |
                     |
                     v
                switchedLedger

一致共識(consensus)

  1. 綜述

協商是整個網路就同一總賬(Ledger)達成一致的過程,這讓所有人在同一賬頁(page)。

系統說明協商過程是如何運作的

白皮書(white paper) Ripple達成一致共識圖解 視訊 Ripple總賬一致共識過程 Ripple達成一致性共識 1.1總賬

總賬是系統狀態的快照。它包括每個人的餘額和信託額度。總賬被按照 雜湊樹(Hash Tree)結構排列,從而它可以被概括為單一的數字。

1.2不串通

我們選擇“相信不會串通欺騙我們”的特定的驗證者,而不是隨機驗證者。這遠比“相信”一個人不撒謊的標準要寬鬆的多。

想象一下,我們認為Wile E. Coyote和Road-Runner是競爭對手。由於他們事實上長期處在鬥爭中,所以一般來說,他們不會串通起來,尤其是不會串通起來欺騙我們。如果他們都證實了某件事,那麼這件事非常可能是真實的。這表明,當他們可能完全不可靠時,我們可以利用他們不會串通而欺騙我們的特點,從而得出某件事非常可能成真的結論。

1.3 唯一節點列表(Unique Node List)

驗證者執行代表它們自己處理驗證的Ripple節點。我們相信不會串通起來進行欺騙的驗證者列表被稱為我們的唯一節點列表(Unique Node List,簡稱UNL)。

為了更好地確認某事是真實的,我們向UNL中添加了更多的驗證者。例如,我們添加了Itchy 和Scratchy。它們不具有百分百的可信度,但不太會串通起來欺騙我們。

1.4精選驗證者

在現實世界關係中,人們應精選包括1000個驗證者的UNL列表。他們應從5個不同大洲選擇200個驗證者。他麼應選擇具有不同利益的驗證者:做市商、金融公司、非盈利機構、政黨、宗教組織等。通過選擇大量不可能說謊、不可能被迫成為一個組織及串通欺騙我們的有信譽度的派別,可以確認總賬是準確的。

實際上,大多數人會使用由客戶端提供的預設UNL。但軟體允許他們選擇特定的驗證者。

1.5通用一致性

如果每個人選擇了一套完全不相干的驗證者,網路將不會達成一致共識,總賬的特殊版本就是唯一正確的總賬。但實際上,人們的UNL列表會重複。這種重複導致可靠的驗證者達成同樣的協商。

每個人可靠的系統使用者都想讓系統達成協商。驗證者會選擇其他驗證者格外相信的,因為他們也想達成協商。基本上,所有可靠的系統使用者合作保證協商是可以達成的且可維持的。當然同時,缺乏一致性共識是很容易發覺的。

1.6說謊者

如果有人不誠實,那麼誠實的參與者將會注意到他們撒謊,並且不考慮他們今後的證明。也就是說,如果你撒謊一次,你就不會再有收益,網路在未來不會再考慮你說的話。

Ripple協議要求驗證者在每次驗證間隔在協商總賬上簽字。如果驗證者忘記做這件事,是很容易被發覺的。同樣,如果如果一個驗證者簽了總賬而且是在有效交易不能實現的情況下籤了總賬,也是很容易被發覺的。

1.7人格分裂

有人說Sybil可能偽裝成為一個百萬節點。Sybil希望選擇信任Sybil節點的人不串通,然後Sybil就能撒謊。Ripple不受這種型別的攻擊的影響,因為人們避免選擇匿名節點來防止這個問題。人們只選擇實體作為非匿名或具有良好聲譽的驗證者。即便他們偶然選擇了Sybil的一些節點,這些節點也不會成為主流,不會產生有意義的影響。

此外,除非你的行為很明顯,沒有什麼途徑能造成任何實際傷害。如果一個交易完全有效,而且比協商視窗先被發現,那就沒有不給交易投yes的理由。如果一個交易叢集被接受成為主流,就沒有理由不證實交易叢集形成的總賬。我們可以預見的這個攻擊帶來的最糟糕的傷害是讓網路癱瘓。如果這種情況真發生了,所有系統可靠使用者都會判斷是什麼節點導致了這個問題並停止信任他們。目前,攻擊者回到了起點。

1.8協商可擴充套件性

Ripple的協商程序只用一些驗證者。當Ripple網路開始工作,就只有非常少的驗證者了。然而,那些驗證者對Ripple網路的成功有非常既定的興趣。因此,他們非常不願意串通其他驗證者來欺騙某些人或破壞網路。一旦他們這樣做了,他們就會被抓住,從此之後被忽視。

向網路中新增更多的驗證者只能強化網路不會欺騙任何人的可信度。

1.9結論

通過信任驗證者不串通來尋找協商是一種建立有效總賬的簡單而可靠的方式。因為,網路不是依賴工作證明,該協商過程很快,而且允許Ripple網路在數秒內證實總賬。

2.技術說明

2.1綜述

一致共識過程的目標是確保所有節點同意相同的總賬。總賬是在某個特殊時間點每個人餘額和要約的即時性快照。你可以通過接管先前的總賬及申請自那時起已經發生的所有交易來形成總賬。因此,為了對現有總賬取得一致意見,節點必須同意先前的總賬及自那時發生的交易叢集。

Ripple網路中每個參與者都有一個驗證者列表。它也被稱為獨特節點表(UNL)。每個線上驗證節點將看到所有的交易。所有節點會試圖定期驗證或關閉一個新總賬。每個節點會顯示它認為的交易叢集應用到先前總賬的內容。如果一個節點發現它的大部分UNL都支援一個交易叢集,那麼它就會轉向這個新的交易叢集。

這個過程是反覆進行的。一個節點會建議一個特定的交易叢集,如果它發現大部分UNL支援一個不同的叢集,它會轉向並建議這個由大多數支援的叢集。在一定迴圈後,節點會集中於同一交易叢集。交易叢集被精選的內容是不相干的。所有之中最重要的是每個人都同意。一旦交易叢集被選中,它就會被應用到先前的總賬。這是一個確定的過程,從而每個人開始於同一先前總賬,交易叢集得到同一結果。

如果某個有效交易被投票移除正在關閉的總賬且持續有效,它將被寫入下一個關閉總賬。新總賬大約每五秒被關閉一次。所以你只需要等5-10秒,交易就可以被網路確認。

許多人想知道,既然每個節點有不同的UNL,那麼這是否會導致總賬有許多不同版本。只要UNL間有最小程度的內部連線,一致共識就會快速達成。這根本上是因為每個可靠節點的最初目標是實現一致共識。

此外,如果一致共識過程中很早宣佈了一個交易且充分有效,那所有可靠節點會認為它應該進入下個叢集。如果交易很晚被接受或者可能與另一交易有衝突,那麼沒有可靠節點會特別關注它是否進入一致性叢集。如果交易實際上有效,那它無論如何都會進入下一個一致性過程,因為所有可靠節點都認為它該這樣做。它們真正看重的是一致性。

2.2更多細節

一致共識發生在每個總賬的多輪中。

參與演算法的每個節點提出一個交易集(通過樹根的單一雜湊值)

節點獲取它們信任的節點提出的所有交易集。(這意味著多虧樹狀結構,只在差異中有錯誤)

如果一個節點不瞭解一個交易,那它不會把交易放入任何提出的雜湊樹中,不會給交易投票。這讓系統比較容易地處理符合。如果交易沒有被足夠多的驗證者看到或處理,那麼大多數會投否定票。剩餘的會在一致共識過程中把投票轉成否定,交易會被推遲。

基本原則是,如果你的UNL上,包括你自己,有50%的節點投票贊成一個交易,那你就收入了它。反之,則無法收入。幾秒後,入口從50%升至60%,且持續上升(同意失敗就是失敗協議)。這保證了較長一段時間交易投票不會只在50%附近波動。

有兩個需要理解的重要事項:1)任何合法交易,如果在本輪開始前被發現,可以得到絕對多數。2)任何出局而合法的交易會在下一個總賬中被每個可靠節點投票通過。有一點例外的是在總賬關閉時間恰好進來的交易。這種情況下,我們不管交易是否通過,結果都是“正確的”。它們都是正確的,因為交易會出現在這個總賬或下個總賬中。

現在這個被同意的交易叢集只是一個候選叢集。如果節點認為交易應進入總賬,它們會投票贊成,但理論上它可能會在應用到總賬上時失敗。 如果兩個相沖突的交易同時被贊成進入一個交易叢集,這是沒有關係的。申請交易的程序是確定性的,而且至多一個會成功。由於相沖突的交易不再有效,它將永遠不會允許進入另一個叢集。

恢復未能進入一致性叢集的過程也是確定性的。所以,如果有兩個相沖突的交易且沒有一個佔據多數,那將在下一次一致共識視窗中由大多數可靠節點選擇,它將進入下個一致性交易叢集。

為Ripple網路選定的時間方案被稱為持續總賬關閉(continuous ledger close)。

2.3規模擴充套件

這裡有一些幫助擴充套件規模的事項。交易樹完成同步的事實意味著你只需要傳送小的更新。

你只需要一次檢查一個交易。如果節點給你無效交易,你可以在重新連線時,通過不連線及要求工作證明來懲罰它。沒有重要節點會發送給你無效交易。沒有人會讓可靠節點發送無效資料。

規則是隻有你相信交易能索取費用才能推進這個交易。這防止網路因不能成功的交易而堵塞。

我們處理看起來是合法交易的DoS攻擊的主要方式是提高交易費用。如果51%的網路要求特定的交易費用,那麼如果你不付費的話,就不能達成一致性共識。

節點只是處理本地工作,稱有人斷開可能濫用的節點,要求邊界濫用節點的工作證明,提高他們要求推進交易的費用,從而傳送無效交易給他們。驗證者還在驗證中釋出交易費用標準來在事件中施加反向壓力,因此得到更多的可靠交易,甚至超出他們處理的能力。

如果驗證者趕不上被投票贊成進入一致性叢集的交易負荷,那它將轉向發行區域性驗證。這讓那些相信它的人知道,它不是從網路中被分離出來的(而且可能驗證其他總賬)。此外,驗證者將提升交易費用,從而防止網路縮小為“超級節點”小叢集,儘管這樣會增加串通風險。

2.4迷你FAQ

2.4.1 假設33%的節點首先看到交易A,33%的節點看到交易B,34%的節點看到交易C,且這三個交易是相互衝突的,這種情況下會發生什麼?

沒有交易會被投票贊成,同時,具有確定性演算法(deterministic algorithm)只會選擇一個交易作為下一總賬的候選。

2.4.2 收入總賬交易的確定性演算法是如何運作的?

基本上,它按最大效率原則 應用交易,直到沒有新交易進入。交易可能是:通過,hard fail或soft fail 三種結果。如果交易通過了,它們就會被收錄。如果是hard fail,交易就會失敗。如果是soft fail,交易就會成為候選。

一旦交易進入,所有與之的衝突的其它交易都會hard fail。

現有演算法首先是按雜湊順序,所有賬戶/佇列順序中反覆soft fail。當沒有新交易通過時,該執行過程結束。


相關推薦

程式共識演算法

瑞波共識協議(Ripple Consensus Protocol,RCP),使一組節點能夠基於特殊節點列表達成共識。初始特殊節點列表就像一個俱樂部,要接納一個新成員,必須由一定比例的該俱樂部會員投票通過。  RCP機制的工作原理如下:驗證節點接收儲存待驗證交易。首先驗證節點接

】CS231n assignment1KNN不使用迴圈計算距離:從原理到程式

本文主要講述不使用迴圈結構來計算兩個矩陣的歐氏距離, 設訓練集矩陣為train,size為num_train * num_features,設驗證集矩陣為validate,size為num_test,num_features。 因此我們計算每一個驗證集樣本到訓練集樣本的距離,就是將訓練集

Java程式設計師——大牛Nginx系列—Ngx的變數

本文來自網路, 在計算機語言中,變數是用來儲存和表示資料的,但不同的語言表示變數的方式不同,像java語言會把變數抽象成各種型別,並且每種型別都會用一個特殊的符號表示,比如表示一個整數需要這樣:      int age= 25;  

【轉載】 $_SERVER 函數QUERY_STRING和REQUEST_URI區別

host dex 執行 sel 實例 server 文件 uri cal 實例:1,http://localhost/aaa/ (打開aaa中的index.php)結果:$_SERVER[‘QUERY_STRING‘] = "";$_SERVER[‘REQUEST_URI‘

順風Nginx系列—Ngx的變量

zhang 只有一個 前綴 oct not 包含 使用curl ali 配置文件 在計算機語言中,變量是用來存儲和表示數據的,但不同的語言表示變量的方式不同,像java語言會把變量抽象成各種類型,並且每種類型都會用一個特殊的符號表示,比如表示一個整數需要這樣: int a

Asp.Net Core的Cookies

ace fault list request escape eal toarray 請求 read 目錄 詳解Asp.Net Core中的cookies 搞懂cookies Asp.Net中cookies的實現 從http中獲取cookies 將cookies寫入http

-vue項目的文件和目錄

mic 適合 建設 特定 更多 編寫 dev vue組件 webpack 可以用vue-cli來支持一個項目。 建議使用npm 3+更高效的依賴關系樹: $ npm install -g vue-cli $ vue init webpack my-project $

支援向量機—SMO論文(序列最小最優化演算法

SVM的學習演算法可以歸結為凸二次規劃問題。這樣的凸二次規劃問題具有全域性最優解,並且許多最優化演算法可以用來求解,但是當訓練樣本容量很大時,這些演算法往往變得非常低效,以致無法使用。論文《Sequential Minimal Optimization:A Fast Algori

mysql系列三:mysql各類日誌-技術流ken

1.前言 日誌檔案記錄了MySQL資料庫的各種型別的活動,MySQL資料庫中常見的日誌檔案有 查詢日誌,慢查詢日誌,錯誤日誌,二進位制日誌,中繼日誌 。下面分別對他們進行介紹。   2.查詢日誌   1.檢視查詢日誌變數 查詢日誌即檢視日誌記錄了所有對 My

mp-redux:耦小程式的業務與檢視,讓測試更容易

專案地址:點我,歡迎star和issue mp-redux 一個用於小程式和輕量級H5應用的狀態管理工具, 使用方法是一個簡化版本的Redux。之所以是適用於輕量級應用,主要是因為沒有實現元件間的資料共享。因此不適合於複雜,龐大的前端應用。 是否你需要使用它? 如果你也和我有同樣的困惑,那麼你就該嘗試

AndroidJNI使用(3)---Android StudioSO檔案生成

Android中JNI使用詳解(2)---Android Studio中SO檔案生成 上一篇寫到過在Android Studio中配置NDK環境地址:Android Studio中NDK環境配置 這篇文章講解在Android Studio中

AndroidJNI使用(2)---Android StudioNDK環境配置

Android Studio中的NDK環境配置 1、下載NKD 在Android Studio中選擇File----Settings----Appearance&Behavior---System Settings----Andr

kubernetes資源創建【持續完善

edi arr 顯示 replicat _id describe load 主機名 create 目錄 資源創建詳解 一:Pod及常用參數 1.簡介 2.模板 3.刪除pod 4.設置Pod主機名 5.鏡像拉取策略(ImagePullPolicy) 二:RC 1.簡介

【python】pandas.DataFrame.plot( ) 引數secondary_y實現雙座標軸使用

首先看官網的DataFrame.plot( )函式 secondary_y : boolean or sequence, default False # 可以是布林值或者是數列 Whether to plot on the secondary y-axis

Immuable以及在React的實戰

轉載自:https://zhuanlan.zhihu.com/p/20295971, 今天看到這篇文章後情不自禁的轉載過來了,我的天老爺,我看到後直接菊花一緊,這寫的太好了,直接寫進我心坎裡了,我必須推薦你們看一下,太帥了   Shared mutable state is the ro

Autoquad飛控程式SRCDKF演算法分析

個人總結,不正確的地點希望大神指點。 接下來對程式進行分析 (1)演算法初始化 在初始化部分對f->wim,f->wic1,f->wic2進行計算,對應公式(3),f->w0m是在應用程式中進行計算。 (2)sigma點的計算

SSH-key及其在Git的使用

有必要先來了解什麼是SSH和什麼是SSH key。 SSH Secure Shell (SSH) 是一個允許兩臺電腦之間通過安全的連線進行資料交換的網路協議。通過加密保證了資料的保密性和完整性。SSH採用公鑰加密技術來驗證遠端主機,以及(必要時)允許遠端主機驗證使用者。 傳統的FTP、Telnet是再網

SphereFace演算法,公式的講解 SphereFace演算法

原 SphereFace演算法詳解 2017年08月09日 08:19:31 AI之路 閱讀數:9129

spark 引數調優(持續更新

spark引數調優需要對各個引數充分理解,沒有一套可以借鑑的引數,因為每個叢集規模都不一樣,只有理解了引數的用途,調試出符合自己業務場景叢集環境,並且能在擴大叢集、業務的情況下,能夠跟著修改引數。這樣才算是正確的引數調優。 1、背景 使用spark-thriftser

Linux工作筆記034---linux tail命令_linux在vi查詢字串

使用vi編輯器編輯長檔案時,常常是頭昏眼花,也找不到需要更改的內容。 這時,使用查詢功能尤為重要。 方法如下: 1、命令模式下輸入“/字串”,例如“/Section 3”。 2、如果查詢下一個,按“n”即可。 要自當前游標位置向上搜尋,請使用以下命令: /pa