區塊鏈中的分散式模式

banq發表於2017-08-06
本文從分散式系統角度討論了區塊鏈中的幾種創新模式:不可變模式、非同步和共識以及網路容錯可靠性。

不可變模式

區塊鏈是不可變的。 分散式系統已經在相當一段時間內依靠不變性來消除異常。 比如日誌結構的檔案系統、日誌結構的合併樹和Copy-On-Write(寫時複製)是分散式系統中用於模擬不可變資料結構的常見模式/技巧。 區塊鏈以類似於事件溯源Event Sourcing的方式來處理事務,這是分散式計算中用於處理事實和操作的常用技術。 不是用最新資料覆蓋舊資料,而是建立一個包含所有事件/行動的只能不斷追加append-only的日誌。

帕特·赫蘭德(Pat Helland)在他重要的流行論文“不變性改變一切 ”中描述了不變性:

會計師不能使用橡皮擦; 否則他們舊可能蹲監獄。 分類流水賬中的所有條目都保留。 可以進行更正,但只能在分類帳中新增要進行更正的條目。 正如當公司的季度業績公佈時,會包括上一季度的小幅修正,這種小修正是屬於追加性質的,因為上一季度的資料已經公佈,無法改變,只能在本季度進行資料修正,這種修正從時間角度看實際是新增追加。

區塊鏈是簡單的分散式會計分類帳,因此名稱稱為Distributed Ledger Technology(分散式分類帳技術),簡稱DLT。


非同步

區塊鏈可能執行在距離數千英里的各種伺服器上。 在這種非同步網路中想保證各種訂單交易的前後順序性是分散式系統經典問題。 所有不可能的理論如像FLP定理(分散式系統的共識(consensus)演算法)和CAP定理都適用於區塊鏈。

如同分散式系統一樣,區塊鏈塊中沒有“現在”概念 ,分散式系統中的不同節點的時鐘可能會相互隔離,因此,在全域性所有機器上的對事件進行全域性性的實時排序並不簡單,因為所有節點時鐘不能始終處於同步之中,因此使用機器本地時間戳將不再有幫助,除此之外,訊息的延遲可以達到任意時間,可以是毫秒或秒級,甚至達到分鐘甚至幾天的數量級,對於比特幣區塊鏈,創始人中本聰設計了一種巧妙的方式來排序訂單交易,以防止雙重支出的問題,在沒有全域性時鐘情況下使用了分散式Timestamp伺服器 。中本聰的比特幣白皮書中說:

我們的解決方案是基於時間戳伺服器,時間戳伺服器的工作就是透過獲取要被時間戳標識的某個區塊的條目的雜湊值,然後廣泛釋出這個雜湊值,例如在報紙或BBS帖子中,總是附加具體的釋出時間,這個時間戳提供了當時資料(新聞或帖子)存在的證明。 每個當前時間戳包含之前的時間戳雜湊,由此形成一個鏈條,這樣一個時間戳相當於有兩份存在證明,更加堅固可靠。

這類似於DBMS(資料庫管理系統)中透過事務日誌記錄儲存所有對資料庫的寫入操作事件。 在這種情況下,區塊鏈本質上是一個分散式事務日誌 。


共識

在沒有全域性同步時鐘的情況下,決定訂單交易順序的唯一方法是透過分散式共識。 就像在分散式機器上對事件/事務進行排序達成共識一樣,但是在分散式系統中達成共識很困難:

FLP(不可能的結果)表明,在非同步網路中,訊息可能被延遲但不會丟失,如果至少有一個節點發生故障停機了,那麼就不可能達到所有機器獲得共識一致。

能夠對網路的崩潰故障進行容錯的演算法有:Paxos , Zab , Raft , Viewstamped複製,這些網路容錯演算法能夠在流程或機器可能發生崩潰或導致訊息傳遞延遲的情況下達成共識一致性。上述演算法通常在一個可控的組織內實現分散式系統。

區塊鏈工作在更加複雜的條件下,用來處理稱為“拜占庭將軍問題”的故障型別 ,其中一些節點可能是惡意的,因為節點是由不相互信任的不同實體/組織執行。 區塊鏈假設是你自己的網路並不在你身邊。 因此,您需要拜占庭容錯演算法才能在區塊鏈中達成共識。 拜占庭容錯演算法已經在分散式系統文獻中存在很長期的研究了。 1999年,Miguel Castro和Barbara Liskov介紹了實際拜占庭容錯 (PBFT)演算法,該演算法提供了高效能拜占庭狀態機複製,每秒處理數千個請求,延遲時間為毫秒級。 雖然這篇文章是在1999年寫就的,但是直到比特幣在2008年使用“工作證明”演算法,還沒有其他BFT演算法的已知實踐實現,只是在一些系統中用來限制垃圾電子郵件。 區塊鏈引起了對BFT演算法重新研究的興趣,並在學術界積極努力下催生了大量新的BFT演算法,一些應用案例包括 Proof Of Stake, Bitcoin-NG, Tendermint 和 Honey Badger.。


網路可靠性
與普通人大眾想法不同的是:網路預設是不可靠 。 分散式系統工程師必須處理這個冷酷事實。 比特幣和其他加密貨幣被建立在網際網路上工作,其中網路分割槽和訊息丟失/重新排序是常見的。 有趣的是,區塊鏈資料結構本身是檢測訊息丟失和重新排序的一種聰明的方法。 每個塊都有一個指向前一個塊的指標,類似於一個連結串列,可以很容易地檢測到丟失的塊(塊連結中的“孤立塊”)。 再次引用中本聰語錄:

新的交易不一定需要廣播到達所有節點。 只要能到達大多數節點即可,這些新交易很快進入一個區塊中。堵塞廣播也能容忍訊息的丟棄。 如果一個節點沒有收到一個塊,它會在接收到下一個塊時,如果意識到那塊被忽略了就會重新請求它。

這個原理類似於複製交易日誌或日誌傳送,這是用於保持副本(特別是只讀副本)同步的常用技術。 當一個交易日誌被訂閱關注時,就會提供了一個簡單的機制來檢測差距和修復副本。 類似地,可以透過檢查區塊中的merkle根(代表區塊中所有交易的雜湊)來驗證塊鏈中每個塊的完整性。 因此,很容易發現缺少的交易。提醒一下,merkle樹是在複製同步技術anti-entropy中非常常用的技術。

區塊鏈是一個令人興奮的技術突破。 讓我們首次擁有一個在不相互信任的實體之間實現的分散式資料庫。 我們還處在這個有趣技術的早期階段,類似於當初編寫第一個分散式的NoSQL資料庫,如亞馬遜的Dynamo或Google的BigTable時期。 這些分散式資料庫為我們展示了構建大型資料庫的新途徑,並且開闢了新的設計模式和資料結構。 NoSQL資料庫現在已經被商品化了。 如果您聽到有關新的NoSQL資料庫,90%的模式和演算法是一樣的。 DLT也正在經歷類似的階段,最終將成為商品化。 但是現在還是早期階段,我們正在挖掘建立它們的最佳模式。

Why aren’t distributed systems engineers working o

[該貼被banq於2017-08-06 12:03修改過]

相關文章