從實現的角度解讀區塊鏈

前言

  隨着比特幣的起起伏伏,區塊鏈技術愈來愈受到關注。區塊鏈和比特幣是當下和人工智能同樣風靡的領域。人們開始尋找區塊鏈技術的用武之地,已經有了很多的嘗試。可是區塊鏈的價值所在衆說紛紜,特別是一些媒體胡亂吹噓或者是故意貶低,給你們都帶來了不小的困惑。其實做爲一名技術人員只須要理解其底層實現原理和運行機制,以後其應用場景和發展前景相信都會有本身的看法。html

  在閱讀完本篇文章對區塊鏈有了必定的瞭解後能夠參考區塊鏈的一個簡單的模擬實現來加深本身的理解:(toychain) 歡迎star :)java

區塊鏈和比特幣

  首先要理清楚區塊鏈和比特幣的區別和聯繫,區塊鏈能夠理解爲一種有特色的數據存儲結構或者說是協議,可以解決一些列的安全、穩定等方面的問題;而比特幣是利用區塊鏈技術實現的一種數字貨幣系統,比特幣也是目前惟一一個成熟的區塊鏈應用,這也是兩者容易混淆的緣由之一。比特幣起始於2008年名爲中本聰(Satoshi Nakamoto)的人發表的一篇論文《比特幣:一種點對點的電子現金系統》(Bitcoin: A Peer-to-Peer Electronic Cash System原文 譯文git

 

  區塊鏈是一種新型去中心化協議,能安全地存儲比特幣交易或其它數據,信息不可僞造和篡改,能夠自動執行智能合約,無需任何中心化機構的審覈。交易既能夠是比特幣這樣的數字貨幣,也能夠是債權、股權、版權等數字資產,區塊鏈技術解決了拜占庭將軍問題,大大下降了現實經濟的信任成本與會計成本,從新定義了互聯網時代的產權制度。github

  中本聰提出了提出了這個具備創造力的構想並實現了比特幣系統,在愈來愈多的支持者的參與下,比特幣系統穩定運行,在2017年迎來了爆發式的發展,一枚比特幣的價格曾經一度突破2萬美圓大關。愈來愈多的技術人員、投資者、金融從業者開始關注區塊鏈技術,並試圖拓展其應用領域,體現其特色和價值。當前區塊鏈技術在金融領域還在繼續深耕,其餘領域也開始了不錯的嘗試,例如遊戲,安全等。算法

  下面經過如下幾個方面進行逐一討論和分析:安全

  • 區塊的基本結構
  • 去中心化與點對點網絡
  • 數據的不可修改性
  • 共識機制
  • 雙重花費和拜占庭將軍問題
  • 隱私保護

區塊的基本結構

  區塊的結構並不複雜,包含了一些字段,總體上看一個區塊的結構相似於雙向鏈表中的節點。能夠先直觀的感覺比特幣系統中第505156個區塊的頭信息。
網絡

  這些字段至關一部分能夠經過字面意思來理解,對於較爲重要的字段進行一一列舉。數據結構

  • Number Of Transactions:此區塊中所包含的交易數量,網頁下方顯示了846個交易的詳細信息,也稱爲區塊體
  • Difficulty:難度係數,爲了控制區塊產生的速度,難度係數表明當前區塊產生的難度
  • Version:區塊鏈的版本
  • Nonce:工做量,在當前難度係數下計算了1683386125次才生成了此區塊
  • Hash:此區塊的Hash簽名,惟一且不可更改
  • Previous Block:前一個區塊的Hash簽名,有且只有一個
  • Next Block(s):後一個區塊的Hash簽名,能夠有多個(區塊鏈存在分叉的狀況)
  • Merkle Root:默克爾樹根,默克爾樹是存儲交易簽名的數據結構,在Git中也有應用

  這些關鍵字段的正確維護是區塊鏈實現的基礎,也是區塊鏈去中心化,解決雙花和拜占庭將軍問題的基本結構。有了關鍵的數據結構,還須要相輔相成的規則和算法才能運行起來。理清楚整個流程以後再回過頭看區塊結構就能一目瞭然了。框架

 

  經過結構的觀察能夠得出結論:electron

  • 一個區塊寫入後Hash惟一且不可更改,除非把整個區塊鏈中全部區塊的Hash,Previous Block,Next Block(s)所有作相應更改
  • 一個區塊的內容更改後Hash隨之更改

去中心化與點對點網絡

  去中心化是區塊鏈的核心思想,這也是與其餘分佈式產品的最大區別,去中心化保證了公平性和安全性。點對點網絡就是在去中心化的框架下的互聯網,類比現實社會,當今的社會制度就是中心化的,國家的中心是政府,金融系統的中心是央行。假如政府腐敗、央行做弊,那麼整個社會就無公平可言,全部的數據也是不可信任的。也許去中心化也是人類社會制度發展的終極目標。只要擁有一臺電腦就能加入點對點網絡成爲一個節點,每一個節點都能擁有整個區塊鏈的信息(目前達到了上百GB),並且在不斷的更新和同步。每個區塊的寫入都會廣播到整個網絡。點對點網絡中每一個點擁有相同的權利和義務,都是對等的,以CPU做爲算力單位每一個點均可以參與投票、計算和打包數據,也擁有同步區塊信息的權利。

 

數據的不可修改性

  在區塊的基本結構中得出了區塊內容一旦寫入則不可修改的結論。緣由很是容易理解,首先一個區塊的經過Hash=SHA256(區塊頭)得出,所以每一個區塊的Hash都是惟一的。而且區塊頭中包含Merkle Root字段,區塊體中的交易數據存儲在默克爾樹的葉子節點中,所以Merkle Root能夠看作是此區塊體中全部交易數據的惟一簽名。基於以上事實,無論是對交易數據的修改仍是對區塊元信息的修改都會致使區塊的Hash字段改變,因爲除了第一個個最後一個區塊外全部節點同時具備Previous Block,Next Block(s)字段,會引發連鎖反應。修改一個區塊數據的代價是要修改區塊鏈中全部區塊的Hash、Previous Block,Next Block(s)字段爲相應值。若是不是同時擁有全網一半以上的算力是不可能作到的。所以能夠說區塊數據一旦寫入區塊鏈就是永久寫入不可修改。這也保證了數據的安全性和可信任度。

 

共識機制

  共識機制是區塊鏈中最重要的特色,共識是指對區塊數據的認同,也能夠看作是投票。只有點對點網絡中半數以上的都認爲區塊數據是真實可靠的才能達成共識。目前有幾種主要的共識機制:工做量證實(PoW)、權益證實機制(PoS)、受權股權證實機制(DPOS)和拜占庭共識算法(PBFT)。其中工做量證實是比特幣採用的機制。在比特幣中工做量證實就是所謂的「挖礦」。

  因爲每一個節點都要去同步最新的區塊鏈數據,因此區塊產生的速度不能太快,否則大部分節點根原本不及同步。中本聰爲此設計了難度係數調節機制,在區塊結構中維護了Nonce和Difficulty兩個字段,分別表明計算的次數和難度係數,區塊產生設計速度是每10min產生一個,隨着算力的提升,這個速度可能會加快,若是區塊的產生速度大於設計速度那麼下一個區塊的難度係數就會增長。所以能夠保證區塊的產生時間間隔圍繞在10min左右。因此在比特幣中隨着時間推移挖礦會愈來愈難。

  若是有兩個區塊同時加入區塊鏈,那麼區塊鏈就會分叉。哪個分支長度先達到6個就會把哪個當作主幹,確認交易,另外一個分支就會被拋棄(選中大多數節點的共識)。所以確認一次交易的時間要1個小時左右。

 

雙重花費和拜占庭將軍問題

  雙重花費是指把同一筆資產花費到兩個不一樣的交易中,例如,節點A一共有1個比特幣,節點A幾乎同時提交了兩個交易:向節點B支付1個比特幣,向節點C支付一個比特幣。在交易記錄以前這兩筆交易可能都是合法的,可能會有不一樣的節點將其記錄到區塊中,若是同時產生了兩個區塊,那麼就按照工做量證實的共識機制來選擇。區塊鏈不經過第三方也能夠解決雙花問題。

  拜占庭帝國想要進攻一個強大的敵人,爲此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國,但也足以抵禦5支常規拜占庭軍隊的同時襲擊。基於一些緣由,這10支軍隊不能集合在一塊兒單點突破,必須在分開的包圍狀態下同時攻擊。他們任一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通訊兵相互通訊來協商進攻意向及進攻時間。困擾這些將軍的問題是,他們不肯定他們中是否有叛徒,叛徒可能擅自變動進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們可否找到一種分佈式的協議來讓他們可以遠程協商,從而贏取戰鬥?這就是著名的拜占庭將軍問題。

  拜占庭將軍問題再區塊鏈中的描述應該是,在不知道具體的誠實節點的狀況下怎麼可以達到共識,在區塊鏈中使用主流的共識機制(工做量證實(PoW)、權益證實機制(PoS)、受權股權證實機制(DPOS)和拜占庭共識算法(PBFT))就能夠解決拜占庭將軍問題。

 隱私保護

   因爲在區塊鏈中,全部節點都由全網惟一的SHA256簽名表明,這個簽名也不能被反向推出信息,所以即便籤名在全網廣播也不能獲得某個節點的信息。基於這一點在全部交易中節點都至關因而匿名的,很好的保護了用戶的隱私。但這也是編寫勒索軟件的黑客們經常使用的勒索支付方式。

 小結

  基於以上對區塊鏈的理解,能夠得出結論,區塊鏈技術是去中心化的,區塊的結構特色能夠很好的保證數據的安全和節點之間的公平性,也能夠利用共識機制來解決雙花和拜占庭將軍等相似問題,比特幣的發展也體現出了對區塊鏈價值的認同。但爲了實現這些特色,也付出了不小的時間和空間成本:每一個節點都須要實時同步整個區塊鏈信息(目前已經達到上百GB);每一個區塊的容量有限;平均每10min才能生成一個區塊,每小時才能確認一次交易,交易處理速度目前來看是遠遠不夠的。

  到目前爲止區塊鏈的應用場景很是有限,在目前的技術水平下成熟的嘗試還侷限在金融貨幣領域。判斷區塊鏈是否能運用到某一個領域只須要判斷三點便可:不須要管理中心,不要求數據的實時性,付出的成本小於收益。如今看來區塊鏈帶來的改變雖然不足以和人工智能相提並論,但區塊鏈的思想很是值得去研究和參考。

  從技術的角度看,任何一個新技術都不是憑空產生的,必定是在已有的技術基礎上加以改進和創新得來的。區塊鏈也不例外,若是你對分佈式計算(分佈式事務,Paxos算法等)和密碼學(對稱加密,非對稱加密,數字簽名)稍微有一些瞭解的話研究區塊鏈時就會很是輕鬆,區塊鏈和Git的實現也有一些類似的地方(好比都使用了默克爾樹)。

 

  因爲時間和水平限制,不免有誤,請指正。存手打,若是對你有幫助請考慮 「推薦」。:)

  參考資料:

  一個區塊鏈的模擬實現(Github歡迎star)

  比特幣入門教程

  BitCoin technology Merkle tree(Hash tree)

  比特幣:一種點對點的電子現金系統

  區塊鏈是什麼

  拜占庭將軍問題深刻探討

相關文章
相關標籤/搜索