比特幣與區塊鏈
早上看到一則新聞,說比特幣可能要分裂比特幣現金,很多持有者可能會憑空多出很多財富,又聯想到前端時間微信群中討論的很火熱的區塊鏈的話題,記得當時有人曾說這可能是影響未來幾年最重要的技術之一,覺得為看懂未來趨勢,有必要再深入的了解一下區塊鏈。
印象中區塊鏈就是一個去中心化的分布式數據庫,沒有中心權威代理,就要解決信息點對點傳遞的真實有效性問題。下面轉載一下剛看到的一篇不錯的解釋。
作者:maxdeath 代爾夫特理工大學 (TU Delft) 博士後區塊鏈博士後,共識算法專家
鏈接:https://www.zhihu.com/question/37290469/answer/167477833比特幣——〉區塊鏈是比特幣的底層技術。
或者
比特幣——〉比特幣是一種區塊鏈。
具體到什麽是區塊鏈的問題,目前沒有看到很好的定義和介紹,更多的是大而化之地講區塊鏈的意義在哪裏的空泛文章,要不然就是一水的礦工和挖礦。所以我來從純理論角度說一下我個人對區塊鏈的定義:
1,區塊鏈是一個放在非安全環境中的分布式數據庫(系統)。
2,區塊鏈采用密碼學的方法來保證已有數據不可能被篡改。
3,區塊鏈采用共識算法來對於新增數據達成共識。
具有以上三個性質的系統,就是區塊鏈。
1,區塊鏈是一個放在非安全環境中的分布式數據庫(系統)。
這裏的要點有兩個:(1)分布式,(2)非安全環境。
首先,這是一個分布式的,去中心化的系統。所以,有一個中心服務器或者節點的,不是區塊鏈。節點都是安全的,無惡意的,那這不是區塊鏈。同理,從應用的角度講,如果你的應用必須要使用中心節點(例如要用超級計算機做深度學習)或者沒必要考慮節點不安全的情況(例如某個安全的工廠裏的傳感器),那麽並不需要考慮區塊鏈技術。
至於後面的詞“數據庫”,目前大部分成熟的區塊鏈都是數據庫,例如比特幣就是一個分布式賬本,而賬本其實就是數據。然後,根據數據的格式,又可以分三種——1,數據是完全不相關的,只是達成的共識,沒有有效無效之分;2,數據有某些邏輯結構,例如賬本中,一筆交易實際上除了金額,還有輸入和輸出,連接到之前的交易,這些數據需要通過邏輯驗證(例如交易中,節點需要驗證輸入的交易是否有效);3,數據擁有圖靈完備的邏輯,而驗證的時候需要通過節點使用算力運算,每筆交易可以有不同的輸出和狀態,每個節點要做的不僅僅是驗證交易的真實性和輸入的正確性,還要根據交易裏的邏輯讀入數值,進行驗算然後再驗證結果。
比特幣的系統就是第二種,又叫分布式賬本;以太坊是第三種。第三種可以支持智能合約。
用比特幣舉例的話,1,它是一個完全去中心化的系統,2,它放在一個非安全的環境,它並不要求所有使用比特幣的人都沒有惡意。
2,區塊鏈采用密碼學的方法來保證已有數據不可能被篡改。
這個是誤解最多的部分,因為很多人一提到區塊鏈就只覺得是這個。誠然,這部分很重要,而且確實區塊鏈也因此得名,但這只是區塊鏈的定義的一部分。
這個部分的兩個核心要點是:(1)密碼學哈希函數,(2)非對稱加密。
兩個都是密碼學的基礎概念,網上都有非常清晰的定義,我只簡單說下:
(密碼學)哈希函數:一個函數Y=H(X),有如下性質:1,有X可以很容易算出Y;2,有Y不可能算出X;3,有Y不可能找到另一個X‘使得H(X‘)=Y;3.5,如果X和X‘相差很小,H(X)和H(X‘)則完全不相關。
這東西主要用於驗證信息完整性——在一個信息後面放上這個信息的哈希值,這個值很小,例如256bit,而且計算方便。收到信息之後收信人再算一遍哈希值,對比兩者就知道這條信息是否被篡改過了。如果被篡改過,哪怕只有一bit,整個哈希值也會截然不同。而根據哈希函數的性質,沒有人能夠偽造出另一個消息具有同樣的哈希值,也就是說篡改過的數據完全不可能通過哈希校驗。
非對稱加密:這東西很好理解——對稱加密就是有個密鑰,可以理解成保險箱鑰匙,你把消息加密變成密文,沒有人能看懂這是啥,然後同一把鑰匙解密成原來的消息。
非對稱加密就是有兩把鑰匙,一把叫公鑰,一把叫私鑰,用其中一把加密的話,只能用另一把解密,反之亦然。另一個重要的性質是,給你密文,明文和其中一把鑰匙,你還是解不出來另一把鑰匙是啥。原理基本上是基於一些困難數學問題,例如因數分解和離散對數,常用的有RSA,Diffie-Hellman和ECC(橢圓曲線),比特幣用的是橢圓曲線。
非對稱加密除了和對稱加密一樣用於信息加密之外,還有另一個用途,就是身份驗證。因為通常情況我們假設一對公私鑰,公鑰是公開的,而私鑰只有本人有,於是一個人如果有對應的私鑰,我們就可以認定他是本人。其中一個重要的應用就是數字簽名——某個消息後面,發信人對這個消息做哈希運算,然後用私鑰加密。接著收信人首先對消息進行哈希運算,接著用相應的公鑰解密數字簽名,再對比兩個哈希值,如果相同,就代表這個消息是本人發出的而且沒有被篡改過。
以上是基礎知識,至於區塊鏈怎麽實現的,很簡單:
交易(數據)寫在區塊裏。
第一個區塊叫創世區塊,寫啥都行。
從第二個區塊開始,每個區塊的第一部分有前一區塊的哈希值。此外,區塊裏的每一筆交易(數據),都有發起人的數字簽名來保證真實性和合法性。於是,先前區塊裏的任何數據都不可被篡改,原因見上。
到這為止有人可能會問:為什麽要弄個鏈啊?直接所有數據加個哈希值不就行了?
因為——這個數據庫並不是靜止的啊。
數據庫的數據是會增加的,而每次增加的數據,就是一個區塊,於是這些生成時間不同的區塊,就以這種形式鏈在一起了。
至於如何增加區塊,就涉及到第三個部分——共識算法。
3,區塊鏈采用共識算法來對於新增數據達成共識。
共識算法的目的,就是讓所有節點對於新增區塊達成共識,也就是說,所有人都要認可新增的區塊。對於有中心的系統,這事很簡單,中心說什麽大家同意就好了,但是放到去中心化系統裏,尤其是當有些節點有惡意的時候,這東西非常復雜,計算機科學裏有個相應的問題,叫做“拜占庭將軍問題”或者“拜占庭容錯”(BFT)。
有很多用Lamport給出的那個例子來講BFT的東西,我在這裏換一個角度。
Lamport大神當年提出這個問題的時候在斯坦福研究中心給NASA做項目,他提出這個問題的原因並不是考慮類似比特幣的應用場景(整個互聯網成千上萬個用戶),而是考慮特殊背景下的一個簡單的系統——
航天飛機的控制系統。
如果有航空背景的同學可能知道,飛機有三套獨立的控制系統,為什麽呢?因為任何系統都不可能完全不出故障,就算飛機控制系統的故障率已經極低了,還是有飛到一半這東西壞了的可能。於是我們可以弄兩套獨立的系統,同時壞掉的幾率就會大大降低。
可是兩套獨立的系統還是不足以容下一個系統的錯誤——一架飛機迎面飛來,兩套系統一個說要躲,一個說不躲,那到底是躲還是不躲呢?所以我們需要三臺獨立的系統,這樣,如果有一個系統有故障了,還有兩臺能正常工作,能少數服從多數給出正確的結果。學過糾錯碼的同學對這個應該不陌生,這個系統的輸出之間的漢明間距是3,所以可以糾正一位的錯誤。
然而,對於航天飛機,在冷戰的背景下,萬一某個系統不是壞掉了,而是被敵人控制了呢?三套系統還夠嗎?
答案是否定的,因為不同於單純只是壞掉的節點,惡意節點可以做一些別的事來阻止整個系統達成共識。
這個部分略復雜要講的話要單開一帖,所以我們只說最簡單的情況(無簽名同步系統)。
我們管三個系統叫ABC,正常工作流程是三個人每次得出結果就互相告訴一下,然後每個人選多數人同意的結果。這是個沒有中央節點的分布式系統,也就是說三人不能聚在一起開個會啥的,仨人只能兩兩通信。這個時候,假設C有惡意,它的目標是破壞這個系統。於是,假設正確的讀數是1,A和B都得出了1這個結果,這個時候C這個小婊砸告訴A說“我的結果是0,B也覺得是0”,同時打個電話跟B說“哎我覺得是0,A也這麽說”,於是A和B就懵逼了。假設你是A,你聽到了兩個不同版本的B的答案,B說自己選了1,C說B選了0,可是A這個時候沒法知道B和C誰才是那個騙了自己的小婊砸,因為如果B真的告訴A選了1然後告訴C是0,他聽到的結果和現在是一模一樣的。
於是結論是,拜占庭容錯,也就是需要容下一個惡意系統而非錯誤系統,需要4個獨立系統。
(當然,簽名可以解決這個問題,但是這只是同步系統的情況,在異步系統裏這問題會變得更加復雜,原因是正常節點的回答有延遲,而惡意節點可以不回復,所以,正常節點一方面要等另一個節點的回復,但是它又不知道對方會不會回復因為對方有可能會有惡意,而在收到回復之前,它完全沒法判斷對方是正常節點還是惡意節點,這個問題叫異步BFT,也是BFT的最復雜的情況,這裏不再做更多的解釋,下文提到的BFT算法,其實都是異步BFT的算法)
Lamport提出這個問題之後,有無數的算法被提出來,統稱BFT(拜占庭容錯)算法,其中最有代表性的叫PBFT,然後由於最近區塊鏈的熱度,無數針對區塊鏈應用場景優化過的BFT算法也湧現出來,但是一個重要的問題是,所有目前的BFT算法,都只能應用在小型網絡裏。原因很簡單——因為BFT這個問題是設計給類似於航天飛機控制系統這樣的場景的,早期的算法考慮的也主要是這種場景。PBFT論文裏考慮的就是一個5個節點的系統。就算算上新提出的BFT算法,也最多應用在不超過100個節點的網絡裏。
這個問題被擱置了很久,直到比特幣的誕生——中本聰從某種意義上簡化了這個問題,在比特幣中,同樣是共識問題,中本聰引入了一個重要的假設——獎勵,他之所以能這樣做的原因是,他考慮的是一個數字貨幣,也就是說共識這個東西是有價值的。
於是在這樣的系統上,他提出了工作證明機制。
所有挖礦,礦工,最長鏈,分叉等等等等,都可以歸結為一句話:
說話是要有代價的,說真話是有好處的,說假話是要扣錢的……
這就是目前兩類共識算法的核心區別:
BFT共識模型:惡意節點可以幹任何事。
比特幣共識模型:模型中有公認的“價值”,每個節點說話都需要一定代價,誠實節點會受到獎勵,而惡意節點由於只付出代價而收不到獎勵,變相受到了懲罰。
也就是說,BFT共識模型其實涵蓋了比特幣共識模型的場景,比特幣共識其實放寬了BFT共識模型的限制。
比特幣共識對於BFT的優勢在於,由於給惡意節點的能力做了限制,惡意節點所能造成的破壞大大降低了,尤其是對於異步系統——BFT共識裏惡意節點可以一直拒絕相應而誠實節點還需要一直等它(因為不知道它是不是惡意的),而對於比特幣共識,隨你便,你不響應就沒有獎勵可拿。於是,比特幣共識算法可以應用於成千上萬個節點,而且,任何人隨時都可以加入,不需要預先在網絡裏註冊自己的身份(而BFT算法裏,網絡中節點的數量和身份都必須是已知的)。
但比特幣共識的缺陷在於,首先,得有個有價值的東西,也就是說放在比特幣裏這東西還行,以太坊的話現在可能也湊合,但是其他數字貨幣嘛……BFT共識有個嚴格的限定,就是惡意節點不能超過總數的1/3,然而其實比特幣共識沒有這樣的限制,唯一的限制就是假定大部分節點都是理性的,是逐利的,也就是會采用最佳的策略來賺取最大的價值。所以,嚴格來說,自私挖礦這種行為在比特幣共識裏是允許的,而多數攻擊,其實也算不上一種攻擊,因為這些都沒有突破比特幣共識的框架——如果這個價值無限大,比特幣共識是非常可靠的。然而這並不是事實,因為並不是每個虛擬貨幣都和比特幣一樣值錢,而在價值不高的情況下,比特幣共識的前提就站不住腳了——當損失可能是幾千上萬塊錢的時候,假定每個人都是理性的是合理,但是如果損失就幾分錢這個假設就相當扯淡了,事實上也發生過一個比特幣礦池跑到另一個貨幣惡意挖礦搞垮對手的情況。
此外,比特幣共識是最長鏈共識,也就是說最長鏈-->大多數-->理性,於是分叉是允許的。於是導致了一些附帶的問題,例如,如果網絡有延遲,你怎麽知道你手裏那條鏈是整個網絡裏當前的最長鏈呢?於是,如果需要傳輸的數據多,那麽延遲加大。延遲加大,那麽越多的人手裏的鏈並不是全網絡的最長鏈。於是,全網絡的最長鏈,就沒法代表大多數。這就打破了比特幣共識的根本,這也是為什麽比特幣區塊頻率是10分鐘一塊的原因。比特幣目前有個著名的7幣交易每秒的上限,而現在擴容鬧得很厲害,以太坊的交易格式不同,也用了新的工作證明,想要改成權益證明,但這些都不本質。真正本質的是,在目前的網絡條件下,如果適用全網的話,比特幣共識的交易量基本上超不過100筆交易每秒這個量級。
上面這幾段有可能太深了,簡單來說,BFT共識和比特幣共識的區別可以這麽理解:
BFT共識:來,大家開個會討論一下集思廣益啊,討論出大家都滿意的結果為止。
問題:開會的效率大家都懂,人越多越不容易出結果。只能用於少數節點,用於上千個節點的話……大家想象一下一天開一次人大的場景。
比特幣共識:你的詩念得不錯,組織已經決定了,今天就你來當領導了,做得好有獎,做不好扣錢。
問題:獎勵幾千塊錢還好,獎勵幾分錢誰好好幹?
而區塊鏈也就因此被分成了涇渭分明的兩類,很多人都聽過什麽公有鏈私有鏈聯盟鏈,但是,如果你們以為這是根據應用區分的就大錯特錯,其實,這兩種區塊鏈最本質的區別,還是因為共識模型或者說算法不同——BFT算法沒法應用於大量節點,所以用BFT算法的就沒法做公有鏈。而比特幣共識得有個價值體系,這東西去做私有鏈聯盟鏈就很不靠譜,因為一個單純逐利的人的假設還算靠譜,但是如果對象是公司的話,公司的利益就太復雜了,不能簡單認為他們只追逐區塊鏈上那點價值。
1,公有鏈,以比特幣,以太坊和所有虛擬貨幣為代表,都采用比特幣共識,共識算法基本上都采用工作證明機制,也就是挖礦那些,這種機制其他回答裏已經講得夠清楚了,就略過。工作證明一切都好,除了費電……費多少電呢?比特幣的話,差不多和一個百萬人級別的城市那麽多。此外以太坊的創始人特別喜歡權益證明,似乎很快要小範圍投入使用(100個區塊裏一個用權益證明)。但是目前為止,大家對這東西的可靠性還持觀望態度。
2,私有鏈和聯盟鏈。以IBM的hyperledger-fabric,以及一大堆其他的類似於tendermint,甚至R3 corda和ripple為代表,都用BFT共識。其實這方面的應用已經很多了,問題是,1,目前基本上所有應用給人的感覺都還是為了做區塊鏈而區塊鏈,真的覺得這東西好到不可或缺的應用還基本沒有。2,由於為了區塊鏈而區塊鏈,其實很多場景的安全性和可靠性還值得懷疑,這點經常被被公有鏈的支持者詬病。
比特幣與區塊鏈