區塊鏈和分散式資料庫有什麼本質不同?

我個人看法區塊鏈和分散式資料庫沒有本質不同,只是區塊鏈沒有owner,或者說所有人都是owner,而分散式資料庫有owner而已。這部分帶來的最大好處是數據難以篡改。但本質上,還是一個分散式資料庫而已。歡迎批評指正!


個人把 bitcoin 理解做一個 P2P 的 consensus 協議,用 PoW 提高篡改成本,一般的存儲軟體不至於放能耗這麼大的殺器,反而要將優化能耗(Cost)作為目標,比如 Five-minute rule。

此外 bitcoin 協議在 CAP 的層面滿足 AP,發生網路 Partition 會發生分叉,不過 P2P 協議挺難人為產生 Partition。


先拋結論,區塊鏈系統是連拜占庭錯誤都可以容錯,即是在拜占庭錯誤發生時,也可以保持系統正確性的系統,而一般的通用分散式資料庫則無法容忍拜占庭錯誤(所以要保證拜占庭錯誤無法出現)

我們知道設計一個系統是需要容錯的(fault tolerance),而這裡fault又是多種多樣的,大多數的分散式資料庫可以容忍down機,網路斷連,網路延遲所造成的偽down機/偽網路斷連等錯誤。這類問題可以簡單的用超時重發+fence token來解決,在需要分散式一致性的系統里,可以用quorum演算法來搞定,比如raft,Paxos,Zab。

還有一種錯誤叫做拜占庭錯誤(Byzantine fault),出自很有名的拜占庭將軍問題(The Byzantine Generals Problem - Microsoft Research),它是雙將軍問題(Two Generals『 Problem)的泛化(generalized)版本。

雙將軍問題:主要是說有兩個將軍要做一個作戰合作計劃,然後決定一個共同時間點一起發動進攻,它們的軍隊分別在兩個不同的地點,而這兩個將軍只能通過信使通信。而信使則可能在送信當中被殺,或者為了躲避抓捕而用超遠所需的最短時間把信送達。(這就好像我們的網路包會丟失或者延遲),那麼如何在這種情況話,用一種演算法保證雙方達成一致。

拜占庭將軍問題:是說如果有n個將軍需要一起制定作戰合作計劃,最終一起決定一個共同時間點一起發動進攻。它們的軍隊在n個不同的地點,同樣它們只能通過信使通信。而信使除了可能被殺,延遲,將軍中還可能有叛徒來發出假的消息,並且沒人知道叛徒是那些將軍,這些叛徒不但會偽造,篡改信息,還儘力不讓自己被發現。拜占庭將軍問題有解的關鍵是,已知多數將軍都是忠誠的。那麼在這種情況下,如何用一種演算法來保證忠誠的將軍可以一致的發動進攻。

而拜占庭容錯(Byzantine fault tolerance)的系統就是指,如何在一個非授信的環境中,每一個單點唯一知道的就是整個網路中,占多數的點是誠信的,在這種情況下,即使不知道那個點是非法的,還能讓所有誠信點取得一致的系統(比如讓上億台計算機一起同意:誰擁有那個幣)。

所以,比特幣是安全無法被單點甚至多點接入的黑客來攻破系統去偽造系統信息的。因為支持比特幣系統的區塊鏈技術是拜占庭容錯的。

...Such behavior is known as a Byzantine fault, and the problem of reaching consensus in this untrusting environment is known as the Byzantine Generals Problem....

----《Designing Data-Intensive Applications》

話說這本真的是神書,超推薦的!阿萊克西斯:2017年,你看了啥很好的計算機的博客/書/視頻?

那麼最後問題來了,如果有一個黑客,利用上億台,10億台,百億台機器接入區塊鏈,並且偽造信息,這時候系統的多數點是非誠信的。那麼比特幣會怎麼樣呢?( ^ω^ ) (&>^ω^&<)( ????? )


分散式資料庫各節點之間的關係是:信任,協作。

區塊鏈各節點之間的關係是:懷疑,制約。


分散式資料庫的作用依然是資料庫,A可以寫入數據,B也可以。

區塊鏈的作用也可以理解為資料庫,A可以寫入,但必須得到B的共識認可。

手機答,大概是這個要點,不精確。


區塊鏈其實是replicated storage,每個人都有全部信息,並保證強一致性

而分散式資料庫的不同partition之間信息是完全不一樣的。只有同一個partition的replica會持有相同信息。

所以比較分散式資料庫中同一個partition的replica和區塊鏈更有意義一些:前者不一定是強一致的,後者是


如@fleuria 所說,Bitcoin的一個重要創新是提出了一種新的共識機制。

「分散式資料庫」和「區塊鏈」看似都是多節點協同,但其中的邏輯完全不同:前者是「分散式」的問題,後者是「去中心」的問題。

Paxos、Raft等協議提供了分散式場景里的共識。它們都有一個選擇leader的階段,而這就意味著所有的節點起碼是可信的。這個領域的拜占庭主要是考慮節點掛了、傳輸不可靠等問題。

Bitcoin則提供了去中心場景里的共識,關鍵在於防範51%攻擊。這就意味著所有節點都是不可靠的,但有能力聯合作弊的那些人不會佔有50%以上的算力,或是聯合起來作弊對他們來說收益不大。


大量數據交換時,分散式資料庫不保證相同標記信息在系統內被驗證未被修改,區塊鏈保證相同標記信息在系統內被驗證未被修改。

但區塊鏈是以犧牲效率保護信息真實性為手段。


量變引起質變。

說區塊鏈本質上是分散式資料庫,這話沒錯,但省略了很多形容詞:

區塊鏈(假設你說的是公有鏈)是一個支持任意數量參與者、參與者能夠自由加入與退出、參與者之間無須互信的分散式資料庫。

少了這些,即時信息本質上也只是通信而已,本質上和飛鴿傳書也沒區別。


分散式資料庫要看DBA臉色,DBA不高興你數據就危險了;區塊鏈只要守規則按規矩玩,就不用看任何人臉色。


推薦閱讀:

設計的時候,如果去掉外鍵關聯,postgresql和mysql,哪個更有優勢?
為什麼新的分散式資料庫又開始支持關係模型了?
適合初學者學習資料庫的書有哪些較好的?
MySQL有什麼推薦的學習書籍?
多線程並發訪問資料庫中不同記錄時應該採用什麼辦法?

TAG:資料庫 | 分散式存儲 | 比特幣Bitcoin | 區塊鏈Blockchain | 比特幣:一個虛幻而真實的金融世界書籍 |