
我們首先要搞清一個問題——比特幣是區(qū)塊鏈,但是區(qū)塊鏈并不是比特幣。
于是,在區(qū)塊鏈的這個問題回答里,提到“礦工”,“挖礦”,“最長鏈”,“分叉”等等詞的,其實都不準(zhǔn)確。
1,區(qū)塊鏈?zhǔn)且粋€放在非安全環(huán)境中的分布式數(shù)據(jù)庫(系統(tǒng))。
這里的要點有兩個:(1)分布式,(2)非安全環(huán)境。
首先,這是一個分布式的,去中心化的系統(tǒng)。所以,有一個中心服務(wù)器或者節(jié)點的,不是區(qū)塊鏈。節(jié)點都是安全的,無惡意的,那這不是區(qū)塊鏈。同理,從應(yīng)用的角度講,如果你的應(yīng)用必須要使用中心節(jié)點(例如要用超級計算機做深度學(xué)習(xí))或者沒必要考慮節(jié)點不安全的情況(例如某個安全的工廠里的傳感器),那么并不需要考慮區(qū)塊鏈技術(shù)。
至于后面的詞“數(shù)據(jù)庫”,目前大部分成熟的區(qū)塊鏈都是數(shù)據(jù)庫,例如比特幣就是一個分布式賬本,而賬本其實就是數(shù)據(jù)。然后,根據(jù)數(shù)據(jù)的格式,又可以分三種——1,數(shù)據(jù)是完全不相關(guān)的,只是達成的共識,沒有有效無效之分;2,數(shù)據(jù)有某些邏輯結(jié)構(gòu),例如賬本中,一筆交易實際上除了金額,還有輸入和輸出,連接到之前的交易,這些數(shù)據(jù)需要通過邏輯驗證(例如交易中,節(jié)點需要驗證輸入的交易是否有效);3,數(shù)據(jù)擁有圖靈完備的邏輯,而驗證的時候需要通過節(jié)點使用算力運算,每筆交易可以有不同的輸出和狀態(tài),每個節(jié)點要做的不僅僅是驗證交易的真實性和輸入的正確性,還要根據(jù)交易里的邏輯讀入數(shù)值,進行驗算然后再驗證結(jié)果。
比特幣的系統(tǒng)就是第二種,又叫分布式賬本;以太坊是第三種。第三種可以支持智能合約。
用比特幣舉例的話,1,它是一個完全去中心化的系統(tǒng),2,它放在一個非安全的環(huán)境,它并不要求所有使用比特幣的人都沒有惡意。
2,區(qū)塊鏈采用密碼學(xué)的方法來保證已有數(shù)據(jù)不可能被篡改。
這個是誤解最多的部分,因為很多人一提到區(qū)塊鏈就只覺得是這個。誠然,這部分很重要,而且確實區(qū)塊鏈也因此得名,但這只是區(qū)塊鏈的定義的一部分。
這個部分的兩個核心要點是:(1)密碼學(xué)哈希函數(shù),(2)非對稱加密。
兩個都是密碼學(xué)的基礎(chǔ)概念,網(wǎng)上都有非常清晰的定義,我只簡單說下:
(密碼學(xué))哈希函數(shù):一個函數(shù)Y=H(X),有如下性質(zhì):1,有X可以很容易算出Y;2,有Y不可能算出X;3,有Y不可能找到另一個X'使得H(X')=Y;3.5,如果X和X'相差很小,H(X)和H(X')則完全不相關(guān)。
這東西主要用于驗證信息完整性——在一個信息后面放上這個信息的哈希值,這個值很小,例如256bit,而且計算方便。收到信息之后收信人再算一遍哈希值,對比兩者就知道這條信息是否被篡改過了。如果被篡改過,哪怕只有一bit,整個哈希值也會截然不同。而根據(jù)哈希函數(shù)的性質(zhì),沒有人能夠偽造出另一個消息具有同樣的哈希值,也就是說篡改過的數(shù)據(jù)完全不可能通過哈希校驗。
非對稱加密:這東西很好理解——對稱加密就是有個密鑰,可以理解成保險箱鑰匙,你把消息加密變成密文,沒有人能看懂這是啥,然后同一把鑰匙解密成原來的消息。
非對稱加密就是有兩把鑰匙,一把叫公鑰,一把叫私鑰,用其中一把加密的話,只能用另一把解密,反之亦然。另一個重要的性質(zhì)是,給你密文,明文和其中一把鑰匙,你還是解不出來另一把鑰匙是啥。原理基本上是基于一些困難數(shù)學(xué)問題,例如因數(shù)分解和離散對數(shù),常用的有RSA,Diffie-Hellman和ECC(橢圓曲線),比特幣用的是橢圓曲線。
非對稱加密除了和對稱加密一樣用于信息加密之外,還有另一個用途,就是身份驗證。因為通常情況我們假設(shè)一對公私鑰,公鑰是公開的,而私鑰只有本人有,于是一個人如果有對應(yīng)的私鑰,我們就可以認定他是本人。其中一個重要的應(yīng)用就是數(shù)字簽名——某個消息后面,發(fā)信人對這個消息做哈希運算,然后用私鑰加密。接著收信人首先對消息進行哈希運算,接著用相應(yīng)的公鑰解密數(shù)字簽名,再對比兩個哈希值,如果相同,就代表這個消息是本人發(fā)出的而且沒有被篡改過。
以是基礎(chǔ)知識,至于區(qū)塊鏈怎么實現(xiàn)的,很簡單:
交易(數(shù)據(jù))寫在區(qū)塊里。
先進個區(qū)塊叫創(chuàng)世區(qū)塊,寫啥都行。
從第二個區(qū)塊開始,每個區(qū)塊的先進部分有前一區(qū)塊的哈希值。此外,區(qū)塊里的每一筆交易(數(shù)據(jù)),都有發(fā)起人的數(shù)字簽名來保證真實性和合法性。于是,先前區(qū)塊里的任何數(shù)據(jù)都不可被篡改,原因見上。
到這為止有人可能會問:為什么要弄個鏈?。恐苯铀袛?shù)據(jù)加個哈希值不就行了?
因為——這個數(shù)據(jù)庫并不是靜止的啊。
數(shù)據(jù)庫的數(shù)據(jù)是會增加的,而每次增加的數(shù)據(jù),就是一個區(qū)塊,于是這些生成時間不同的區(qū)塊,就以這種形式鏈在一起了。
至于如何增加區(qū)塊,就涉及到第三個部分——共識算法。
3,區(qū)塊鏈采用共識算法來對于新增數(shù)據(jù)達成共識。
共識算法的目的,就是讓所有節(jié)點對于新增區(qū)塊達成共識,也就是說,所有人都要認可新增的區(qū)塊。對于有中心的系統(tǒng),這事很簡單,中心說什么大家同意就好了,但是放到去中心化系統(tǒng)里,尤其是當(dāng)有些節(jié)點有惡意的時候,這東西非常復(fù)雜,計算機科學(xué)里有個相應(yīng)的問題,叫做“拜占庭將軍問題”或者“拜占庭容錯”(BFT)。
有很多用Lamport給出的那個例子來講BFT的東西,我在這里換一個角度。
Lamport大神當(dāng)年提出這個問題的時候在斯坦福研究中心給NASA做項目,他提出這個問題的原因并不是考慮類似比特幣的應(yīng)用場景(整個互聯(lián)網(wǎng)成千上萬個用戶),而是考慮特殊背景下的一個簡單的系統(tǒng)——
航天飛機的控制系統(tǒng)。
如果有航空背景的同學(xué)可能知道,飛機有三套獨立的控制系統(tǒng),為什么呢?因為任何系統(tǒng)都不可能完全不出故障,就算飛機控制系統(tǒng)的故障率已經(jīng)極低了,還是有飛到一半這東西壞了的可能。于是我們可以弄兩套獨立的系統(tǒng),同時壞掉的幾率就會大大降低。
可是兩套獨立的系統(tǒng)還是不足以容下一個系統(tǒng)的錯誤——一架飛機迎面飛來,兩套系統(tǒng)一個說要躲,一個說不躲,那到底是躲還是不躲呢?所以我們需要三臺獨立的系統(tǒng),這樣,如果有一個系統(tǒng)有故障了,還有兩臺能正常工作,能少數(shù)服從多數(shù)給出正確的結(jié)果。學(xué)過糾錯碼的同學(xué)對這個應(yīng)該不陌生,這個系統(tǒng)的輸出之間的漢明間距是3,所以可以糾正一位的錯誤。
然而,對于航天飛機,在冷戰(zhàn)的背景下,萬一某個系統(tǒng)不是壞掉了,而是被敵人控制了呢?三套系統(tǒng)還夠嗎?
答案是否定的,因為不同于單純只是壞掉的節(jié)點,惡意節(jié)點可以做一些別的事來阻止整個系統(tǒng)達成共識。
這個部分略復(fù)雜要講的話要單開一帖,所以我們只說最簡單的情況(無簽名同步系統(tǒng))。
我們管三個系統(tǒng)叫ABC,正常工作流程是三個人每次得出結(jié)果就互相告訴一下,然后每個人選多數(shù)人同意的結(jié)果。這是個沒有中央節(jié)點的分布式系統(tǒng),也就是說三人不能聚在一起開個會啥的,仨人只能兩兩通信。這個時候,假設(shè)C有惡意,它的目標(biāo)是破壞這個系統(tǒng)。于是,假設(shè)正確的讀數(shù)是1,A和B都得出了1這個結(jié)果,這個時候C這個小婊砸告訴A說“我的結(jié)果是0,B也覺得是0”,同時打個電話跟B說“哎我覺得是0,A也這么說”,于是A和B就懵逼了。假設(shè)你是A,你聽到了兩個不同版本的B的答案,B說自己選了1,C說B選了0,可是A這個時候沒法知道B和C誰才是那個騙了自己的小婊砸,因為如果B真的告訴A選了1然后告訴C是0,他聽到的結(jié)果和現(xiàn)在是一模一樣的。
于是結(jié)論是,拜占庭容錯,也就是需要容下一個惡意系統(tǒng)而非錯誤系統(tǒng),需要4個獨立系統(tǒng)。
(當(dāng)然,簽名可以解決這個問題,但是這只是同步系統(tǒng)的情況,在異步系統(tǒng)里這問題會變得更加復(fù)雜,原因是正常節(jié)點的回答有延遲,而惡意節(jié)點可以不回復(fù),所以,正常節(jié)點一方面要等另一個節(jié)點的回復(fù),但是它又不知道對方會不會回復(fù)因為對方有可能會有惡意,而在收到回復(fù)之前,它完全沒法判斷對方是正常節(jié)點還是惡意節(jié)點,這個問題叫異步BFT,也是BFT的最復(fù)雜的情況,這里不再做更多的解釋,下文提到的BFT算法,其實都是異步BFT的算法)
Lamport提出這個問題之后,有無數(shù)的算法被提出來,統(tǒng)稱BFT(拜占庭容錯)算法,其中最有代表性的叫PBFT,然后由于最近區(qū)塊鏈的熱度,無數(shù)針對區(qū)塊鏈應(yīng)用場景優(yōu)化過的BFT算法也涌現(xiàn)出來,但是一個重要的問題是,所有目前的BFT算法,都只能應(yīng)用在小型網(wǎng)絡(luò)里。原因很簡單——因為BFT這個問題是設(shè)計給類似于航天飛機控制系統(tǒng)這樣的場景的,早期的算法考慮的也主要是這種場景。PBFT論文里考慮的就是一個5個節(jié)點的系統(tǒng)。就算算上新提出的BFT算法,也最多應(yīng)用在不超過100個節(jié)點的網(wǎng)絡(luò)里。
這個問題被擱置了很久,直到比特幣的誕生——中本聰從某種意義上簡化了這個問題,在比特幣中,同樣是共識問題,中本聰引入了一個重要的假設(shè)——獎勵,他之所以能這樣做的原因是,他考慮的是一個數(shù)字貨幣,也就是說共識這個東西是有價值的。
于是在這樣的系統(tǒng)上,他提出了工作證明機制。
最后,小馬給大家介紹一下我們巨推傳媒旗下的巨推鏈:www.jutuilian.com,巨推鏈?zhǔn)蔷尥苽髅狡煜碌馁Y訊網(wǎng)站,里面有各路大咖討論關(guān)于區(qū)塊鏈的問題,還有巨推學(xué)院:www.jutuiedu.com,里面是各個講師在里面的課程,也歡迎大家來看看。
以上就是小馬對于區(qū)塊鏈的個人定義了,如果大家還有什么問題或者想和我探討的可以加我的微信:15594963298,歡迎大家一起來談?wù)搮^(qū)塊鏈。