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. 保證帳戶的安全性
理論上讓原先需要透過某個第三方機構提供的資料服務,都可以革命性更改為去中心化的方式提供服務,比如比特幣可以替代各個國家的法幣使用。這種特性也會衍生出各行各業的商業模式顛覆性的變化。
轉自:http://mini.eastday.com/a/180312134202111-7.html
更多區塊鏈數字貨幣資訊:http://www.qukuaiwang.com.cn/news