用架構師思惟解讀區塊鏈技術

不少童鞋反饋,區塊鏈技術有點繞,有點晦澀,大都是隻知其一;不知其二,理解不夠通徹。但在阿里技術專家鄭吉看來,區塊鏈特別是比特幣自己,並無使用高大上覆雜的新技術,只是對現有技術的組合。其天才的地方體如今系統的架構上,體如今把金融學,貨幣學,博弈學,甚至是哲學思想體如今比特幣的系統架構上。若是單純從系統中的技術點着手學習研究,那麼每每就會以爲有點繞,有點晦澀。這就像咱們在平時工做中瞭解某個系統,若是首先搞清楚業務自己,瞭解清楚系統架構的設計,再去看具體的實現技術,從大局到面到點,那麼就有豁然開朗的感受。算法

今天,鄭吉將試着幫助你們轉換視角,從架構的思惟分析去解析比特幣,從而對區塊鏈技術有一個更深刻的理解。數據庫

準備工做安全

區塊鏈不是一種技術實現,而是一個系統的架構設計,使用一系列的技術組合用於完成去中心化的數據存儲。比特幣在區塊鏈之上融入了金融學,貨幣學,博弈學,甚至必定程度的哲學思想,用於電子貨幣的發行,運行和交易。在學習區塊鏈以前有一些基礎知識須要提早掌握好,後面將再也不對具體技術展開描述,而是從這個技術解決了什麼問題,爲何要用這個技術這個角度去描述。服務器

P2P網絡

不可逆算法架構

不對稱加密算法分佈式

Merkle樹oop

CAP理論學習

最終一致性算法區塊鏈

比特幣要作什麼?

若是你是一個架構師,作一個系統的架構,你首先要搞清楚這個系統要作什麼?要解決一個什麼問題?帶着這個問題進行分析,設計系統總體的架構。對於比特幣也同樣,首先搞清楚比特幣是要作什麼,要解決什麼問題?而後帶着這些問題去解析比特幣的技術實現。

若是用一句話來描述比特幣要作什麼,那麼能夠這樣描述:作一個去中心化電子貨幣發行交易系統。這裏有三個關鍵詞:

1. 去中心化

2. 電子貨幣發行

3. 電子貨幣交易

分析和設計

本章針對上述比特幣的三個關鍵詞,去中心化,電子貨幣發行,貨幣交易,進行分析和設計。

去中心化

當今世界的全部貨幣交易都是有一個第三方可信任的金融機構提供服務處理,任何人不能訪問由這個第三方機構中心化存儲的數據,理論上來講若是這個金融機構發生了欺詐或倒閉,那麼存儲在這個機構中的貨幣,以及所作的交易就會存在風險。 固然比特幣的去中心化,不是由於擔憂這種風險,而是根本就不須要這個第三方機構了。這也是區塊鏈的強大顛覆性之一,凡是須要某個第三方可信任的機構須要安全保存處理的數據,均可以去中心化安全存儲,全部人均可以訪問。

從技術角度分析,如何作到去中心化?

中心化對應的就是分佈式,去中心化就是分佈式。把原先存儲在某個第三方機構,中心化存儲的數據,進行分佈式存儲。

分佈式存儲要解決的3個基本問題

1. 網絡結構

2. 數據不可篡改性

3. 最終一致性

網絡結構

去中心化的分佈式存儲是指整個發行的電子貨幣,以及貨幣交易數據由不一樣機構,不通我的的成千上萬的計算機共同存儲,共同維護了同一份相同的數據,只有共同維護的這份相同的數據纔是認爲最終正確的數據,任何我的篡改本身的數據都沒有意義,而且存儲的數據全部人均可訪問。

若是作爲架構師,你會選擇什麼樣的網絡結構去實現這個分佈式存儲?一種方式是可採用相似Hadoop中HDFS的方式,由某個中心節點NameNode進行協調訪問,但這種方式就會帶來單點風險,破壞了中心節點,整個體系都將不可訪問。或者採用Cassandra無中心化投票機制維護整個集羣狀態,可是這種方式在全球化開放式部署中會致使根本沒法收斂。

因此比特幣採用了一種更加簡單直接的方式,利用P2P協議維護整個比特幣網絡集羣,不須要某個中心節點協調節點之間的通訊,不須要全部機器投票維護集羣狀態。而是經過P2P協議進行節點之間的數據傳輸,任何節點均可以隨時加入或者離開比特幣網絡集羣,而不會對比特幣網絡集羣產生影響,也不須要特地去修復這個集羣中的故障機器。

利用P2P協議進行節點之間數據傳輸主要有兩個功能點:

a. 把須要存儲的數據廣播到全部節點上進行儲存。

b. 查詢整個網絡集羣中全部節點的最新數據,若是本身節點的數據與大部分節點的數據不一致,則更新自身的數據與大部分節點存儲的數據一致。

比特幣是去中心化存儲,最大的風險是整個比特幣網絡集羣被破壞,篡改了整個網絡存儲的數據。可是上述第二個功能點可以有效的防止這種風險,因爲系統會自動更新爲整個集羣中大部分節點存儲的相同數據,因此要篡改數據,必需要同時篡改整個網絡一半以上的數據,這不是說作不到,可是比特幣利用區塊鏈的方式再加上利益博弈機制,當你擁有這種能力的時候,也不須要去作篡改這種投入產出比這麼低的事了,在數據不可篡改性一節中再詳細描述。

經過圖示看一下比特幣網絡結構的運行:

Jack把某一筆交易數據往A服務器上提交,A服務器驗證數據合法性後存儲到自身的數據庫中,同時把這筆交易數據點對點的傳輸到比特幣網絡集羣的全部B,C,D,E節點上。A和全部其它的B,C,D,E節點保持點對點通訊,自動更新爲這個集羣中大多數節點維護的相同的數據。若是B,C,D三臺服務器保存的數據相同,可是與A,E不一致,則A和E自動更新爲與B,C,D相同的數據。因此Jack的這筆交易,須要等待這個比特幣網絡集羣中全部節點都接受到,而且認爲合法存儲後,才認爲這筆交易成功完成。固然在現實狀況下,不須要等待全部節點都確認完成,一般只須要少數服務器確認完成後便可認爲交易完成,由於每一個服務器維護的自身與整個網絡集羣的數據狀態,當少許服務器都認爲與整個集羣一致時,此時從機率上就是一致的。在最終一致性一節中將繼續對這種網絡結構下的數據存儲進行描述。

數據不可篡改性

在設計了比特幣系統運行的網絡結構以後,須要考慮數據的不可篡改性,由於這種數據存儲是去中心化的,任何人均可以訪問,那麼就容易被篡改,上節描述了在這種網絡結構的運行機制下,要篡改數據,必須同時更改這個網絡集羣上一半以上的節點數據,若是每一個節點沒有一個安全的保護機制的話,那是很容易作到被同時修改網絡集羣中一半以上節點的數據。

先想一想,若是你是架構師,你會如何設計這個保護機制,確保存儲的數據沒法被篡改?在傳統上,咱們把交易數據一條記錄一條記錄的保存在數據庫表中,數據庫放在某個第三方機構的服務器上,這個第三方機構給服務器所處的網絡,服務器,數據庫設置了嚴格的訪問限制用於數據的安全性。可是在一個去中心化,沒有一個機構或者一我的能夠控制系統的訪問權限的狀況下,如何去保護數據的安全性?

一種方式是每一個人把本身的插入的這條數據hash後用本身的密鑰進行簽名,而後附帶上本身的公鑰,系統能夠用簽名和公鑰驗證插入的數據是否被修改過。若是把數據庫表比喻爲一本賬本,表中的每一條數據就認爲是帳本中記錄的每一筆交易。這裏還有兩個問題,第一,不能隨意插入數據,若是你沒有比特幣,但仍是插入一條轉賬給某人的數據,系統須要發現是不合法的,拒絕這次插入請求。第二,除了不能隨意插入和修改外,也須要防止刪除數據,上述把每條記錄進行簽名並不能阻止被惡意刪除。帶着這些問題,若是你是架構師,你會作什麼樣的架構設計實現這些需求?

這裏就開始要引出區塊鏈的設計了。上面把數據庫表比喻爲一本賬本,若是系統中只有一張表,也就是一本賬本,那麼這本賬本中的數據很容被更改。若是讓系統每10分鐘自動生成一張表,也就是生成一本新賬本,新的交易記錄都記錄在新賬本中。 而且建立這個新賬本須要必定的條件,用當前賬本的順序號,上一個賬本的全部記錄的hash值,系統時間戳(10分鐘一個維度),再找一個隨機值,幾個數據加在一塊兒Hash後知足必定的條件,好比開始多少位都是0,那麼系統就接收這個新賬本。產生的新賬本經過賬本順序號串在上個賬本以後,造成一個賬本的鏈式結構,新的賬本依賴於上一個賬本的數據和當前系統時間戳,所以一旦新賬本產生後,歷史賬本的數據就沒法被篡改,由於一旦篡改,就與以後的賬本對不上,賬本被破壞,按照上節網絡結構中描述的自動更新爲網絡集羣中大部分節點維護的相同的賬本。

一旦造成了鏈式賬本後就沒法去更改某個歷史賬本中的數據,更改了某個歷史賬本,那麼在它以後的全部賬本都須要更改,可是每一個賬本都是根據當前的系統時間戳驗證hash值是否知足條件才能接收,因此沒法去篡改歷史賬本的數據。所能作的只能另外投入很是大的代價再構建一個比特幣集羣,這個集羣超過當前的集羣,那麼數據就自動按照新構建的集羣爲準。這就是多個賬本的相互保護機制比單個賬本更難以被篡改。後續貨幣的發行和交易中再會描述,當你有能力從新構建一個新的比特幣網絡集羣用於去攻擊篡改數據時,你得到的收益將遠遠低於你投入的成本。

爲了防止上個賬本的數據被篡改,產生新的賬本須要依賴於上一個賬本中的全部交易記錄的hash值,這樣一旦上個賬本的數據發生變化就與新賬本對應不上。可是賬本中全部交易記錄計算hash值是一件耗時的計算,所以比特幣採用了merkle樹對某個賬本中的全部交易記錄進行hash計算。它主要是解決賬本中交易記錄hash計算的效率問題。以下圖HA,HB...HP是具體的交易記錄,每相臨的兩條交易記錄向上造成一個Hash值,再與相鄰的節點再往上造成hash值,一直到樹根造成全部交易記錄的惟一hash值。

以前描述的網絡結構和本節描述的賬本鏈式結構,本質上都是用於解決去中心化的數據安全存儲。

最終一致性

是分佈式存儲就繞不開CAP理論,比特幣也同樣,比特幣採用P2P協議進行節點之間的數據傳輸,放棄了CAP中的Consistency,採用了AP兩個維度。若是放棄了Consistency這個屬性,那麼就產生了拜占庭將軍問題,這麼多節點如何達成數據一致性。拜占庭軍隊都是一個個小分隊組成,每一個小分隊都有一個將軍負責,將軍們經過號令兵傳達一系列行動,可是當中出現一些叛將,故意破壞號令怎麼辦?

分佈式存儲系統和拜占庭將軍問題同樣,作到一致性是很難的,在比特幣開放式的全球化部署的系統集羣更是如此。因此比特幣放棄了強一致性,而且經過P2P點對點通訊,沒有中心節點,整個集羣中的服務器故障,離開,加入集羣都不會對整個集羣產生影響。

上節中描述了賬本的產生基本機制,用當前賬本的順序號,上一個賬本的全部記錄的hash值,系統時間戳(10分鐘一個維度),再找一個隨機值,幾個數據加在一塊兒Hash後知足必定的條件,好比開始多少位都是0,那麼系統就接收這個新賬本,這就是這個集羣中全部節點的共識,全部節點只接收這樣的賬本,而尋找這個隨機值是須要龐大的計算能力。在比特幣中稱它爲Proof-of-Work(POW)挖礦。

當每隔10分鐘找到這個值,就是生成了新的賬本。但網絡集羣都是開放的,可能同時找到了兩個值,在集羣中少部分節點中產生了2個賬本,針對這種狀況比特幣系統設計爲:整個網絡集羣採用少數服從多數原則,集羣中大部分採用了哪一個賬本,少數節點服從多數節點,丟棄沒被大多數採用的賬本,達到最終一致性。

電子貨幣發行

上一章節去中心化中,主要描述了一個去中心化系統,如何作到安全的數據存儲,不被篡改。它主要採用了P2P網絡結構+區塊鏈式結構解決了數據的安全存儲。可是對於一個貨幣,還須要解決一個貨幣的發行,如何發行,發行給誰?如何讓比特幣系統可以讓全部的人自發的運行下去?貨幣的發行須要公平,公開,公正,並且貨幣不能發行到某個第三方機構中,任何人只要符合必定的條件就能獲取發行的貨幣。想想,若是你是架構師,你會如何設計系統去發行貨幣?

本質上講,比特幣系統自身就能夠尋找一個隨機值,產生新的賬本。可是比特幣把發行貨幣和尋找新賬本背後的計算力結合在一塊兒。尋找新賬本須要消耗計算力,誰找到了符合新賬本條件的隨機值,表明了他消耗了大量的計算力,新賬本一旦被系統接收,那麼系統自動在該新賬本中記錄一條轉賬給他必定個數比特幣的紀錄,就完成了貨幣的發行。

比特幣的運行必須依賴於新賬本的產生,而誰找到新賬本,誰就能得到系統自動生成的轉賬紀錄,也就是得到了必定數量的比特幣,這就是挖礦。這也就激勵了人們不斷的投入到挖礦中,不斷的挖出新賬本,經過激勵維持着比特幣系統的運行。

這裏體現設計天才的地方是,比特幣融入了金融學,貨幣學,博弈學,經過系統造成了必定的運行機制,激勵着人們讓這個系統可以自發的運行下去。

電子貨幣交易

上節電子貨幣發行一節中描述了,誰經過算力找到了新的賬本,系統就會自動記一筆帳,轉必定數量的比特幣給誰,他也就得到了比特幣。那麼如何確認記錄的這筆交易是屬於你的,而不被別人拿走呢?作爲架構師的你如何解決這個問題?

比特幣採用了非對稱加密技術對用戶的賬戶操做,公鑰就是用戶的賬戶號碼,誰找到了新賬本,系統自動往新賬本發現者的公鑰賬戶,記一條特定數量比特幣的紀錄。當用戶要消費比特幣時,須要用私鑰進行簽名,系統會用賬戶號碼也就是公鑰驗證簽名是否正確,而且根據用戶的賬戶號碼從歷史的交易中計算出當前賬戶中的真實金額,確保用戶操做的資金在賬戶真實金額以內。這裏的設計有兩個要點:

插入的每一條紀錄都須要用私鑰簽名,系統用賬戶號碼也就是公鑰進行驗證簽名是否正確,驗證正確則認爲合法。

若是知足第一個條件,則驗證插入的紀錄中轉賬金額是否正確,驗證的方式是對該公鑰以往的全部交易紀錄進行計算得出該賬戶當前的金額,若是不超過該金額值則爲合法。圖示以下:

這種機制可以保證只能對本身的賬戶進行操做,再結合P2P網絡結構下的最終一致性原則,以及賬本的鏈式結構,一個攻擊者須要創建超過目前比特幣網絡集羣,而且算力超過目前的集羣下才能建立另一個賬本分之,並且也只能更改本身的賬戶,因此這種攻擊投入和產出的收益極低,而對於比特幣系統來講,你構建了龐大的集羣以及強大的算力,即便攻擊成功了,得到了一部分的收益,反過來卻讓比特幣系統更加的穩健了。

區塊鏈的應用

比特幣系統解決了去中心化的安全存儲問題,解決了貨幣的發行問題,解決了貨幣交易的賬戶安全問題後,就構建了一個當前的比特幣電子虛擬貨幣系統了。而比特幣使用的區塊鏈被認爲是一個顛覆性的技術,革命性的技術,那他的顛覆性體如今什麼地方呢?它不是技術上面的顛覆,主要是在思想層面上的,商業運做模式層面上的革命性。就好比一個國家從集權式的到民主式的轉變,對這個國家和社會就是一個革命性的變化。而區塊鏈技術帶來兩個基本功能:

1. 去中心化的數據存儲

2. 保證賬戶的安全性

理論上讓原先須要經過某個第三方機構提供的數據服務,均可以革命性更改成去中心化的方式提供服務,好比比特幣能夠替代各個國家的法幣使用。區塊鏈這種特性也會衍生出各行各業的商業模式顛覆性的變化。

相關文章
相關標籤/搜索