區塊鏈可擴展性問題的來源及解決方向
什么是區塊鏈?
區塊鏈是一個技術術語,解決(或者說顛覆)了現有的依賴第三方中心的交易體系:如果有一個水果市場,我們在市場上用100新臺幣購買了一個芒果,其實是新臺幣的發行方(央行)為這一張薄薄的紙作了信用背書--因為水果銷售者信任這100新臺幣可以在他需要的時候,購買等值的其他用品。
第三方中心的存在,解決了交易雙方的信任問題,但是帶來了新的問題,如果第三方作惡(比如說央行濫發貨幣)怎么辦?最終極的解決項目就是不需要第三方,這個就是區塊鏈產生的根本動機。
在沒有第三方的情形下,怎么實現交易?區塊鏈實現了一個去中心化的帳本實現項目:
- 我們有一個公開的帳本,任何人都可以獲取這個帳本,帳本上有每個人的余額;
- 當Alice向Bob購買商品的時候,Alice向Bob開具一張有一定數額的支票;
- Alice向所有人公示這個支票,大家確認確實是Alice的簽名后,在賬本上記錄 Alice的余額減,Bob的余額加;
- 每隔一段時間,大家交換一下帳本的內容,讓大家的帳本信息同步。
可以看出,區塊鏈是一個完全自治的體系,但是現在有幾個問題:
- 為什么會記帳,每個人都可以指望別人記帳,自己使用別人的帳本才是最節省成本行為;
- 當交易帳本內容的時候,如果兩個人的帳本不一致,該以誰的為準;
- Alice如果賬戶里只有10塊錢,在市場的這一側花了8塊購買后,飛速跑到另外一頭購買另外一件8塊的商品,這時候另外一側的帳本還沒有來得及記錄前面的購買記錄,同樣的錢Alice是不是可以花了兩次?
為了解決這些問題,區塊鏈作了最基本的設計:
- 把所有的交易按時間段組織成區塊;
- 區塊內使用一個哈希防止修改;
- 每個區塊內記錄前一個區塊的哈希,保證永久無法修改;
- 當同時有多個區塊出現時,按某種指定的算法選擇一個區塊為準。
使用此項目后,每次交換帳本,只需要交換總帳本中的一個區塊,大大減少的交換的數量;當多個區塊同時出現時,使用某種約定的算法--這個算法在區塊鏈中被稱為共識,以符合算法條件的某個區塊為準;而Alice同樣的錢花兩次的想法也會落空:商戶只有在支票信息被納入到共識后的區塊里時,才會向Alice提交商品。至于大家為什么愿意記帳呢?注意圖上區塊中有個記帳人,每個被共識承認的區塊的記帳人都會得到一定的獎勵。
這時候,貨幣只是一個數字了(類似于銀行內的存款數字),由于帳本是公開的,因此可以在帳本開始前,大家約定好總共的貨幣數字和記帳人的獎勵項目,在任何一個時間點上,可以流通的數字都是可預測的,而且是不可更改的。
區塊鏈的共識機制
當區塊進行同步時,有可能會同時產生多個區塊,需要一種預先定義的項目來確定使用哪一個區塊,這個項目在區塊鏈中稱為共識機制。而在在一個去中心化的系統中,有什么是可信的?每個人信自己嘛,交易和出塊的結果數據到達我這里的時刻,是無法作假的:數據可能會延時到達(由于網絡延時),但絕對不會提前到達(除非時光倒流)。我們可以設計一種機制,讓每個節點的記賬結果必須達到某個條件,每個節點都認第一個達到這個條件的節點的記錄。
PoW機制
Proof-Of-Work,工作量證明機制。
每個節點在記賬的同時,按照某種規則找一個隨機數,通過這個隨機數可以算出某個符合條件的(哈希)值,誰第一個找到的,他就出塊成功。這個找隨機數的過程就是不斷調整隨機數-->計算的過程,只要這種算法能夠足夠離散(這一次和下一次的計算沒有任何關聯,隨機數的變化導致計算結果變化足夠離散),那么就能夠實現出塊節點的隨機化。
舉個簡單的例子,如果算法得到的哈希值總是在0-10000之間,而算法要求得到的(哈希值)小于1,一臺機器如果一秒鐘能夠計算一次,那么平均計算一萬次,就有一次值可能小于1;或者反過來說,每次計算,有萬分之一的機會小于1. 如果有一萬臺節點同時在計算,那么每秒都有可能有一臺節點得到符合條件的結果,得到符合條件結果的節點就是出塊成功。而每一秒,得到結果的機器都可能不一樣。這樣就獲得了足夠隨機的結果。
POS
Proof-Of-Stake,權益證明機制。
PoW機制很好用,但是有個問題,軍備競賽后,太耗電了,都是做些無意義的計算,除了這個結果和到達時間之外,還有什么可信的數據作為隨機值的呢?有想到一個新的點子,每個人存在賬號里的幣的數量是不一樣的么,是不是可以用來作為一種隨機數呢?
想想也可以啊,每一次出塊的時候,出塊節點(賬號)里誰的幣最多,就認誰的。但這樣有個問題:幣最多的豈不是一直在出塊?