Istanbul BFT共識算法解讀

Istanbul BFT共識算法詳細文檔

Istanbul BFT做爲BFT類算法的一種已經有過在以太坊上的實踐。雖然Istanbul目前還存在一些潛在的問題,但其算法思想和實現仍是值得學習和借鑑的。git

源代碼:https://github.com/jpmorganchase/quorumgithub

術語

  • Validator: 區塊驗證者。
  • Proposer: 出塊者。
  • Round: 共識的輪數。一輪從出塊者提出一個區塊proposal開始,結束於區塊提交或者輪數改變(輪數改變可能因爲出錯或者區塊更新)。
  • Proposal: 提出的一個在處理中的新的區塊。
  • Sequence: proposal的高度。塊高和sequence相對應。
  • Blocklog: 未來的信息記錄在backlog裏面。core.backlogs
  • Round state: RoundSequence綁定在一塊兒組成view
  • Consensus proof: 提交的區塊簽名。每一個validator對區塊驗證後會對其進行簽名。
  • Snapshot: validator的投票狀態。

共識算法描述

Istanbul BFT修改自PBFT算法,包括三個階段:PRE-PREPAREPREPARE以及COMMIT。在N個節點的網絡中,這個算法能夠最多容忍F個出錯節點,其中N=3F+1。在每一輪開始前,validator會選擇其中一個做爲proposer,默認以輪詢的方式(除此以外還有sticky的方式,搜索stickyProposer方法去看細節)。而後proposer會提出一個區塊的proposal,而且廣播PRE-PREPARE信息。一旦一個validator收到PRE-PREPARE信息,會把狀態標記爲PRE-PREPARED,而後廣播PREPARE信息。這一步是爲了確保全部的validator在同一個seqnence和round(代碼中爲view)上進行共識驗證。一旦收到2F+ 1PREPARE信息,validator進入PREPARED狀態而後廣播COMMIT信息。這一步是爲了通知節點的peer已經接收到了提出的區塊,而且即將插入區塊到鏈中。最後,validator等待2F + 1COMMIT信息,而後進入COMMITTED狀態而後插入區塊到鏈中。
Istanbul BFT算法中的區塊是肯定的,意味着鏈沒有分叉而且合法的區塊必定是在鏈中。爲了防止一個惡意節點生成不一樣的鏈,在把區塊插入進鏈以前,每個validator必須把2F + 1COMMIT簽名放進區塊頭的extraData字段。所以,區塊時能夠自我驗證的(由於有簽名)而且輕客戶端也支持。然而動態的extraData也會形成區塊的hash計算問題。由於一個區塊能夠被不一樣的validator驗證,因此會有不一樣的簽名,因此同一個區塊會有不一樣的hash。解決的方案是,計算區塊hash的時候把COMMIT簽名排除在外。所以咱們任然能夠在保證block hash一致性的同時進行共識驗證。算法

共識狀態

  • New Round: 一個proposer發送新的區塊proposal。validator等待PRE-PREPARE信息。
  • PRE-PREPARED: 一個validator已經收到PRE-PREPARE信息,而且廣播PREPARE信息。而後等待2F + 1PREPARE或者COMMIT信息。
  • PREPARED: 一個validator已經收到2F + 1PREPARE信息而且廣播COMMIT信息。而後等待2F + 1COMMIT信息
  • COMMITTED: 一個validator已經收到2F + 1COMMIT信息而且此時可以把提出的block插入鏈中。
  • FINAL COMMITTED: 一個validator已經成功把區塊插入了鏈中,而且等待下一輪。
  • ROUND CHANGE: 一個validator等待關於同一個round下的2F + 1ROUND CHANGE信息。

狀態轉換

  • NEW ROUND -> PRE-PREPARED:
    • Proposer在txpool中收集交易。
    • Proposer提出一個區塊proposal而且廣播給validator。而後進入PRE-PREPARED狀態。
    • 每個validator進入到PRE-PREPARED狀態,一旦收到PRE-PREPARED信息而且伴隨着如下狀況:
      • 區塊proposal是來自於有效的proposer。
      • 區塊頭有效。
      • 區塊proposal的sequence和round和validator的狀態匹配。
    • Validator廣播PREPARE信息給其餘validators。
  • PRE-PREPARED -> PREPARED:
    • Validator收到2F + 1個有效的PREPARE信息,所以而進入PREPARED狀態。有效信息須要知足如下條件:
      • sequence和round匹配。
      • 交易hash匹配。
      • 信息是來自已知的validators。
    • 一旦進入PREPARED狀態,Validator廣播COMMIT信息。
  • PREPARED -> COMMITTED:
    • Validator收到2F + 1個·有效的COMMIT信息,以此進入COMMITTED狀態。有效的信息須要知足如下條件:
      • sequence和round匹配。
      • block hash匹配
      • 信息是來自已知的validators。
  • COMMITTED -> FINAL COMMITTED:
    • Validator把2F + 1個commitment簽名放進區塊頭的extraData而且嘗試插入區塊進區塊鏈。
    • 當插入區塊成功,Validator進入FINAL COMMITTED狀態。
  • FINAL COMMITTED -> NEW ROUND:
    Validators選一個新的proposer開始新的一輪。

潛在問題

相關文章
相關標籤/搜索