轉發科普人類又一偉大的科技區塊鏈

.區塊鏈定義:

區塊鏈本質上是一個去中心化的分佈式賬本數據庫。其本身是一串使用密碼學相關聯所產生的數據塊,每一個數據塊中包含了多次比特幣網絡交易有效確認的信息。

1.1區塊鏈是一個放在非安全環境中的分佈式數據庫(系統)

這裡的要點有兩個:(1)分佈式,(2)非安全環境。

首先,這是一個分佈式的,去中心化的系統。

什麼是去中心化?

先來考慮一箇中心化集中式處理的過程。你要在某寶上買一部手機,交易流程是:你將錢打給支付寶-支付寶收款後通知賣家發貨-賣家發貨-你確認收貨-支付寶把錢打給賣家。

下圖為中心化集中式交易模式

在這個過程中,雖然你是在和賣家交易,但是這筆交易還牽扯到了除了你和賣家的第三方,即支付寶,你和賣家的交易都是圍繞支付寶展開。因此,如果支付寶系統出了問題便會造成這筆交易的失敗。並且雖然你只是簡單的買了一個手機,但是你和賣家都要向第三方提供多餘的信息。

而去中心化的處理方式就要顯得簡單很多,你只需要和賣家交換錢和手機,然後雙方都聲稱完成了這筆交易,就OK了。

可以看出在某些特定情況下,去中心化的處理方式會更便捷,同時也無須擔心自己的與交易無關的信息洩漏。

1.2區塊鏈採用密碼學的方法來保證已有數據不可能被篡改

這個部分的兩個核心要點是:(1)密碼學哈希函數(2)非對稱加密。

兩個都是密碼學的基礎概念,網上都有非常清晰的定義:

(密碼學)哈希函數:一個函數Y=H(X),有如下性質:1,有X可以很容易算出Y;2,有Y不可能算出X;3,有Y不可能找到另一個X'使得H(X')=Y;4,如果X和X'相差很小,H(X)和H(X')則完全不相關。

這東西主要用於驗證信息完整性——在一個信息後面放上這個信息的哈希值,這個值很小,例如256bit,而且計算方便。收到信息之後收信人再算一遍哈希值,對比兩者就知道這條信息是否被篡改過了。如果被篡改過,哪怕只有一bit,整個哈希值也會截然不同。而根據哈希函數的性質,沒有人能夠偽造出另一個消息具有同樣的哈希值,也就是說篡改過的數據完全不可能通過哈希校驗。

非對稱加密:這東西很好理解——對稱加密就是有個密鑰,可以理解成保險箱鑰匙,你把消息加密變成密文,沒有人能看懂這是啥,然後同一把鑰匙解密成原來的消息。

非對稱加密就是有兩把鑰匙,一把叫公鑰,一把叫私鑰,用其中一把加密的話,只能用另一把解密,反之亦然。另一個重要的性質是,給你密文,明文和其中一把鑰匙,你還是解不出來另一把鑰匙是啥。原理基本上是基於一些困難數學問題,例如因數分解和離散對數,常用的有RSA,Diffie-Hellman和ECC(橢圓曲線),比特幣用的是橢圓曲線。

非對稱加密除了和對稱加密一樣用於信息加密之外,還有另一個用途,就是身份驗證。因為通常情況我們假設一對公私鑰,公鑰是公開的,而私鑰只有本人有,於是一個人如果有對應的私鑰,我們就可以認定他是本人。其中一個重要的應用就是數字簽名——某個消息後面,發信人對這個消息做哈希運算,然後用私鑰加密。接著收信人首先對消息進行哈希運算,接著用相應的公鑰解密數字簽名,再對比兩個哈希值,如果相同,就代表這個消息是本人發出的而且沒有被篡改過。

至於區塊鏈怎麼實現的,很簡單:

交易(數據)寫在區塊裡。

第一個區塊叫創世區塊,寫啥都行。

從第二個區塊開始,每個區塊的第一部分有前一區塊的哈希值。此外,區塊裡的每一筆交易(數據),都有發起人的數字簽名來保證真實性和合法性。於是,先前區塊裡的任何數據都不可被篡改,原因見上。

如何保證區塊鏈數據保持一致?

中本聰在白皮書裡面提到,簡單來說,要想控制賬本,得要先付出和投資,是得要一定數量以上的(51%攻擊)。投資以後,投資所有人面臨兩個選擇:亂搞然後毀掉比特幣使投資打水漂,或者加入網絡賺錢,並使網絡變得更強大。理性人都會選擇後者。

如果真有想破壞的人,也不容易做到,因為區塊鏈的過往賬本都存在,虛假修改賬本很容易被查到。如果要把過往賬本全部修改,就需要把整條鏈的哈希數都算一遍,這樣即使擁有網絡51%算力也都還是不夠的。

如果不幸真的有這種事發生,那麼我們還有一個辦法補救,就是放棄這個所謂的主鏈,因為這個攻擊者已經不被人信任了,所以從他那裡產出的區塊也就沒有了價值,是不是主鏈又有什麼關係呢,我們可以從所有被他拒絕的孤塊組成的鏈上繼續挖礦,類似於etc和eth的關係,而真實的數據全部存放在孤鏈上,這就是所謂的硬分叉。所以說,數據會被修改,但是真實的數據和虛假的數據會共存在兩條鏈上。

到這為止有人可能會問:為什麼要弄個鏈啊?直接所有數據加個哈希值不就行了?

因為這個數據庫並不是靜止的啊。

數據庫的數據是會增加的,而每次增加的數據,就是一個區塊,於是這些生成時間不同的區塊,就以這種形式鏈在一起了。

1.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個獨立系統。

Lamport提出這個問題之後,有無數的算法被提出來,統稱BFT(拜占庭容錯)算法,其中最有代表性的叫PBFT,然後由於最近區塊鏈的熱度,無數針對區塊鏈應用場景優化過的BFT算法也湧現出來,但是一個重要的問題是,所有目前的BFT算法,都只能應用在小型網絡裡。原因很簡單——因為BFT這個問題是設計給類似於航天飛機控制系統這樣的場景的,早期的算法考慮的也主要是這種場景。PBFT論文裡考慮的就是一個5個節點的系統。就算算上新提出的BFT算法,也最多應用在不超過100個節點的網絡裡。

這個問題被擱置了很久,直到比特幣的誕生——中本聰從某種意義上簡化了這個問題,在比特幣中,同樣是共識問題,中本聰引入了一個重要的假設——獎勵,他之所以能這樣做的原因是,他考慮的是一個數字貨幣,也就是說共識這個東西是有價值的。

於是在這樣的系統上,他提出了工作證明機制。

所有挖礦,礦工,最長鏈,分叉等等等等,都可以歸結為一句話:

說話是要有代價的,說真話是有好處的,說假話是要扣錢的。

目前兩類共識算法的核心區別:

BFT共識模型:惡意節點可以幹任何事。

比特幣共識模型:模型中有公認的“價值”,每個節點說話都需要一定代價,誠實節點會受到獎勵,而惡意節點由於只付出代價而收不到獎勵,變相受到了懲罰。

也就是說,BFT共識模型其實涵蓋了比特幣共識模型的場景,比特幣共識其實放寬了BFT共識模型的限制。

2.區塊鏈技術的應用前景:

區塊鏈技術在金融業的典型應用是支付和清算,因為解決了不同主體間的信任問題,基於區塊鏈技術的支付系統呈現出與傳統支付系統完全不同的格局。

基於區塊鏈技術產生的數字貨幣還能賦予貨


分享到:


相關文章: