各位好,上次我與 @antonsteemit探討了區塊鏈的側鏈概念:
在鏈圈幣圈裡,「中心化」與「分散式」這兩個詞,我們常常聽到,尤其是前者,被當成是壞蛋的感覺,鏈圈人人得而以區塊鏈銖之,邁向「去中心化」的美好境界。也不是不可以,只是,我們真的夠了解網路系統的這些特性嗎?只怕,都是望文生義,不求甚解。固然不會出什麼大錯,但要稱為專家,可能頂多是「磚家」了... lol
沒關係,「DA-ChainTalk」這次與下次,就要來給你加持一下,讓你底氣更足一些!先從「分散式」系統的特徵談起...
此一系列以「DA-ChainTalk」的名稱開頭,您亦可從 #da-chaintalk來追蹤我們的文章。謝謝!
Image Source:https://pplware.sapo.pt
這些問題聽起來可能有些耳熟,因為分散式系統會面臨的問題必定是區塊鏈也必須解決的問題,不過一般的分散式系統跟區塊鏈最大的差別在於,分散式系統不需要符合「去中心化」的條件,這大大降低了這些問題的難度。舉個例子來說,分散式系統可以有著「Master-Slave」這樣的階層關係,讓某些節點負責發出命令。因此如果你對區塊鏈已經略有了解的話,再回頭看分散式系統會覺得問題單純許多。
不過如果我們以「單台電腦作業」為出發點,拓展到「分散式系統」的話,就比較能理解這些問題的為何發生了。接下來我們就簡單介紹分散式系統中的一致性問題、共識機制,以及從CAP理論的角度來看區塊鏈這個分散式系統的特例。
只有一台電腦在運作一個程式時,不會有一致性問題,一個變數是100就是100,如果這個數字沒有要被第二個人用的話,就沒有所謂「相異」或「相同」的問題。但是當有一天,我們必須架設第二個伺服器承擔流量、或是我們的資料庫需要分到不同的節點上運作時,一致性問題就產生了。我們如何讓所有的電腦都了解現在Alice的存款有100元,就是標準的一致性問題,這也是共識演算法(Consensus Algorithm) 的來源:如何讓同一個系統中的不同節點,對於系統中應該一致的「值」保持同步?
為什麼呢?因為一般的分散式系統是不存在「惡意的節點」的。就像一家銀行,在全世界架設了10000臺的ATM,這些ATM可能時不時有些故障、離線,但是不會存在「故意混亂網路」或是想要「欺騙其他機器」的ATM。一個普通的分散式系統中,所有的節點都是可以被統籌管理,並且可以彼此互信的。這跟區塊鏈有著很大的區別,這也是為什麼區塊鏈應該被視為分散式系統中的一個特例。
所以共識演算法的來源是分散式系統,而區塊鏈因為他去中心化的特質,在這方面的演算法設計勢必更加困難。(我們就留到下一期再仔細介紹去中心化xD)
Image Source: Ebook: Distributed System
我們可以這樣理解:如果我們是一個「分區容錯」的系統,當一個網路發生故障、造成兩個節點無法溝通時(Partition發生,這時我們要繼續運作),我們勢必要在C (一致性)與A(可用性)之間做出選擇:因為在沒辦法與另一個節點Node B取得聯繫的情況下,如果我們允許A(可用性、被使用者操作),則我們狀態改變後就無法保持與Node B的一致性;反之,若我們在這時鎖住系統不讓任何人操作,即保持了一致性,但放棄了可用性。
答案是,「系統」的定義其實是很廣的,透過不同的Client端設計,我們可以將區塊鏈視為CP或是AP系統。
如果我們單單透過節點的特性來看的話,區塊鏈應該是一個不符合Consistency的AP系統。為什麼呢?因為一旦一筆交易被放到一個Block裡之後,那個節點就會告訴使用者這筆交易成功了。但在區塊鏈的世界裡,大家的帳本是存在歧異的,我們知道有時候鏈會分叉,因此在此時如果你去問另一個節點,它可能還沒收到這個Block,或是它選擇一條不包含此交易的分支,因此同時訪問這兩個節點,得到的結果可能不同,不符合Consistency。
你可能會覺得奇怪,區塊鏈不就主打著安全而且可靠嗎?沒錯,但是共識是需要時間的,尤其在PoW這種模式之下,我們可以保證「長期來看」大家會持有相同的帳本,但卻無法確保每個時間點保有Consistency。
換一個角度說,如果我們的Client端(如錢包)設計成:在確定達成共識之後才認帳,也就是說,不再是一打包就確定扣款,而是在確定這個Block被成功加到鍊上,並且又經過X個區塊在他之上後,才在錢包顯示「轉帳完成」;這樣子設計的系統就變成大家比較信任的,符合Consistency但無法隨時提供Availability的CP系統。像是我們轉帳到交易所時,常常要等待好久才會確定入帳讓我們買賣,就是這種模式。
這就是分散式系統系統設計有趣的地方,同樣是在區塊鏈之上,單看我們如何規定不同的Client行為,就好像是描述兩種截然不同的系統。
總之,這是我目前學習分散式系統回頭檢視區塊鏈的一些小心得,其實並不多,希望未來越學越深可以再來跟大家分享。那麼,大家就來期待下一篇關於「去中心化」的討論吧!