歡迎關注一下我的 知乎賬號,以后主要在知乎分享內容,感謝~
https://www.zhihu.com/people/ypjiang96/posts
說一下自己的理解,如果理解有誤歡迎評論區討論 : )
首先區分一下分布式 (distributed) 和去中心化 (decentralized) 這兩個詞,
- 分布式:多節點共同組成一個系統,這些節點屬于同一個信任域
- 去中心化:也是多個節點組成一個系統,但是這些節點可能屬于不同的信任域
同一個信任域內的節點互相信任,不同信任域的節點之前不存在信任,
區塊鏈是一個去中心化系統,有多個信任域,不同信任域可能有多個節點,
傳統的分布式系統絕大部分應該都是屬于單信任域系統,
注意,即使在同一個信任域內的系統,也可能需要拜占庭容錯,因為節點可能遭受外部攻擊,
不過傳統的單信任域的系統出于性能考慮絕大部分都沒有考慮拜占庭容錯,使用了 Paxos 或者 Raft 共識演算法,
而區塊鏈則天然就要求拜占庭容錯,因為根據定義區塊鏈屬于多信任域系統,
那么,區塊鏈就是支持拜占庭容錯的分布式系統嗎?
其實二者還有更加微妙的區別,
在細說之前,我們再來區分一個詞:transaction,資料庫里一般翻譯成事務,區塊鏈里一般稱為交易,
但是,區塊鏈里的 transaction 和資料庫里的 transaction 其實是有很大區別的,
如果非要對應的話,區塊鏈中的 transaction 其實對應資料庫里的存盤程序 (stored procedure) ,二者都是在 server 端完成存盤和計算,
而資料庫里的 transaction 只是使用了資料庫 server 端提供的 read/write/commit/abort 等介面,真正的計算是在單個 client 端完成的,注意這里的 client 是指應用程式所在的 server,
一個資料庫系統也可能支持多個不同的應用,
那么,資料庫的正確性就取決于這些應用是否是正確的,如果任何一個應用被攻擊,就可能導致資料庫的資料出現錯誤,
比如,某個應用的 transaction 邏輯被攻擊之后篡改了,那么攻擊者可能發起惡意的 transaction,也能 commit 到資料庫,
如果使用存盤程序,那么攻擊者需要攻擊資料庫節點的存盤程序邏輯才能攻擊成功,而且資料庫節點使用了共識演算法來容錯,系統可以容忍部分節點被攻擊,
感覺資料庫的存盤程序和另一個概念非常類似,這里也一起講一下:復制狀態機 (state machine replication, SMR), 二者的本質都是把 client 端的邏輯移到了 server 端,直接給 client 提供更加豐富的 API 來實作上層應用,而且為了不同節點的一致性,存盤程序和 SMR 都要求邏輯是確定性的 (deterministic) ,
那么區塊鏈就是支持拜占庭容錯的 SMR 嗎?

Hyperledger Fabric 的論文里其實已經說了三點區別:
- BFT SMR 只支持一個應用,區塊鏈支持多個應用并行
- 區塊鏈的應用 (智能合約) 可以被任何人(可能有權限控制)動態部署
- 應用代碼是不受信的,甚至可能是惡意代碼
感覺 BFT SMR 要想支持動態部署多應用也不難,所以關鍵還是在于第三點:既然應用可能是惡意代碼,那么就需要對應的措施來防止惡意代碼可能的危害,也就是需要解決停機問題,Ethereum 里用了 Gas 費用來解決停機問題,
此外,關于 determinism,傳統的存盤程序和 SMR 都是直接假設了 determinism,一旦存在 nondeterminism 就會導致非常嚴重的問題,而 Ethereum 則是設計了 EVM 和 Solidity 來從語言層面消除 nondeterminism ,
綜上,個人認為,區塊鏈相比傳統分布式系統最核心的區別在于可能存在惡意代碼,需要解決停機問題和 nondeterminism 問題,而傳統分布式系統都是假設不存在這兩個問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/355385.html
標籤:區塊鏈
上一篇:位元幣中的地址們
下一篇:個人投資筆記(一)
