正如民謠像一杯酒,有故事的人聽不得。深夜失眠的我,無心翻起中本聰的白皮書,就註定了無眠。今夜的我只醉心於技術,別問是真是假。
這是一篇關於區塊鏈基礎的筆記,涉及了我認爲對於初學者來講,想要進一步深刻前須要瞭解的最重要的幾個概念,歸納以下圖:html
在深刻了解區塊鏈的技術細節以前,明白它爲何存在對理解它是頗有幫助的。
區塊鏈技術,最先是在金融交易領域破土發芽的,但在這以前,金融交易系統已經大致正常運做了許多年。所謂變革的新技術,一定對既有領域中一些核心理念發起了衝擊,並提出了本身的解決方案。只在一個行業領域的「興風做浪」,充其量只能算做改進,若說成是變革,那麼這項技術的思想及提供的解決方案,一定能跨越多個行業領域繼續「興風做浪」。git
在咱們探究金融交易系統的緣起流變以前,先埋下兩個問題。算法
假設咱們回到金融交易的歷史源頭,來爲人們設計搭建一套金融系統。首先得明白人們的現狀和需求:每一個人都擁有屬於本身並能夠提供給他人的產品或服務,同時也存在本身所稀缺的。爲了均衡這種稀缺和富餘,每一個人能夠對本身所擁有東西的價值進行評估,以及所要換取的東西進行預期,這即是貿易的開始。npm
但以物易物的貿易存在一個不爭的事實:交易雙方須要經過溝通談判,來肯定交易時物品的價值。當從小範圍內的交易,擴展到更大範圍的貿易時,相對公允的價格參考就須要被呼喚出來了。而像黃金這樣,存量稀缺有價值、屬性穩定可長存、體積不大便攜帶的物品,做爲價格參考便再合適不過。更進一步地,人們創造出貨幣代替了黃金。安全
因爲貨幣屬於人造物,天然就須要對於基於此的交易進行記錄和管理,已保證人們擁有財富的安全,因而銀行做爲可信賴第三方便出現了。人們可在銀行中安全的存放金錢,信賴基於貨幣進行的交易,這是很是有價值的。微信
同時難免想問,銀行又是如何作到這一點的呢?網絡
當一個有價值的創新,成爲了平常生活中不可或缺的一部分時,它的實現原理與運行機制,對於大多數使用者來講就會變的透明瞭。
可想而知,在全球貿易如此廣泛的今天,銀行維持系統正常運做,所須要的子系統及工具絕對成百上千。這裏介紹其中一個重要的工具:分類帳,它記錄的交易信息包括:發送方、接收方、交易時間、交易額度。銀行能夠利用分類帳記錄的信息作一些很酷的事情。好比,因爲知道誰有錢,誰負債,以及擁有錢的數額,那麼即可以確保互不認識的交易雙方達成信賴。同時這也幫助解決了所謂的「雙花問題」,所謂雙花問題就是,某人將同一份筆錢花了不止一次。爲使一個金融系統正常運行,這種現象是不被容許的,由於你能夠想象,這徹底是在印鈔呀。銀行能夠經過分類帳上的記錄,來避免雙花問題,由於銀行知道第一次交易發生的時間,那麼同筆錢第二次交易時就能夠認定爲無效。框架
銀行做爲可信賴第三方,對於金融交易信息的全知視角,即是咱們長期以來解決這個問題的一種途徑。可是區塊鏈技術提供了一種不一樣的,或許是更好的方式。由於現有的金融系統,不能否認地依然存在着一些問題:分佈式
銀行在金融系統中的地位太太重要,它肯定擁有咱們全部的交易數據,但咱們不肯定銀行是否將這些數據一樣共享給咱們,這樣是否真的合理呢?任何的不公,都是從信息不對稱開始的,你說呢。相似於銀行所用的分類帳,咱們能夠建立一個共享的分類帳來供全部人訪問。函數
解決一個問題的同時,總會有新的問題伴隨着產生。
所建立的共享分類帳,是否能達到與目前銀行一樣的安全與信任程度?
如今咱們有一個轉帳需求要完成,可採用的途徑並不是去銀行借記一種方式,還能夠信用卡、支付寶、微信、PayPal等等。不管你選擇哪一種,你都須要給他們提供相關必要的信息。而若當你嘗試進行更加複雜的交易時,可能涉及中間環節的公司也會愈來愈多,這必然會產生額外的費用以及交易延遲。這也是區塊鏈技術嘗試解決的一點。
區塊鏈技術發展迅速,想法和工具都會層出不窮,只有咱們緊緊抓住目標,咱們才能作出明智的取捨。
區塊鏈如今已是一個跨越許多平臺和行業的熱門話題,天天都有許多更新層出不窮,若是咱們要去對區塊鏈追根溯源,比特幣是一個不容忽視的里程碑。它的相關概念和想法影響着全部後來的其餘區塊鏈應用,因此咱們能夠經過了解比特幣,來明白它的核心思想,是如何幫助創建起今天所熟知的區塊鏈的。
比特幣使用塊的概念,來分組和驗證交易信息,將若干個交易打包到一個塊中進行管理。這個想法對比特幣乃至區塊鏈來講都很是重要,但卻不是比特幣首先提出來的,早在1991年,Haber
和Stornetta
發表了一篇名爲How to Time-stamp a Digital Document的論文,提出了一種驗證文檔的新方式:採用文檔更新的時間戳,將不一樣的版本按此順序組成一個文檔連。如此看這兩位老鐵也算是區塊鏈的先驅了。
區塊鏈元年2008年,一個叫作中本聰(Satoshi Nakamoto)的神祕做家發表了一封名爲Bitcoin: A Peer to Peer Electronic Cash System的白皮書,奠基了比特幣的基礎,也徹底改變了咱們看待和理解貨幣的方式。接着在2009年1月3日,中本聰發佈了比特幣軟件,同時將第一個比特幣帶到了這個世界。
中本聰的這篇白皮書真是讀一讀神清氣爽,開篇第一句就開始描述,點對點電子現金系統如何繞過對中心化銀行的需求。通篇談及了交易、時間戳、工做量證實、網絡以及許多關於比特幣如何運做的概念,或許目前你對於這些概念的技術細節還不是很清楚,不過不要緊,當咱們初次面對一個新技術的時候都這樣。
讓咱們懷着如下問題,繼續往下探索:
目前咱們對區塊鏈技術的起心動念,已經有了一個大致的瞭解。接下來咱們逐一簡介,上圖區塊鏈框架中的各部分組件,首先是哈希和一個特殊的哈希函數SHA256。
哈希值能夠被當作是信息的數字指紋,它是由字母和數字組成的惟一字符串,用以表明或者說是對應一組數據,哈希函數的做用,就是完成給定數據到惟一哈希值得映射。SHA256是一個特殊的哈希函數,SHA是Secure Hashing Algorithm的縮寫,256表示其輸出的哈希值是256位的。除此以外還有許多不一樣的哈希函數,比特幣從中選擇了SHA256函數,來計算區塊鏈上每一個區塊的哈希值,這樣作的緣由是方便對區塊的引用,以及完整性的校驗。更詳細的使用方式能夠參考JS類庫crypto-js。
爲了理解哈希值是如何將數據組成爲鏈的,咱們須要對區塊和區塊鏈的概念有更多一點的瞭解。
如字面意思,區塊就是保存區塊鏈上必定量交易信息的容器。如前所述,區塊鏈是一個在網絡中存儲全部交易記錄的共享分類記帳單,當咱們讓它無限地運行下去時,就意味着這個記錄全部交易的帳單會變得很是龐大。那麼將全部的記錄做爲一個總體來使用或管理,都會很是困難,明智的方法即是化整爲零,來存儲這些交易信息於許多個小區塊中。
那這樣包含數量有限交易信息的小區塊長什麼樣呢?一個區塊大致分爲主體和頭部,交易信息存儲在主體中,而頭部包含了一些額外信息諸如:
Merkle root
。是一個表明區塊中每一個交易的哈希值。一個哈希值如何表明區塊中全部的交易呢?這裏的騷操做是這樣的:全部的交易對象兩兩取哈希值,而後再對獲得的哈希值再兩兩取哈希值,以此類推,所獲得的最後一個哈希值便是Merkle root
,說白了就是一個二叉樹的根節點。這麼作的緣由是,能夠快速查找出區塊中不一致的交易,不一致的產生多是由於傳輸損壞或篡改。Nonce
隨機數。在建立區塊時,網絡中可能會存在許多個體同時發起請求,想要建立該區塊,這其實就是所謂的「挖礦」,那麼區塊鏈網絡該如何決定由誰來建立一個區塊呢?這就是所謂的建立區塊的複雜度問題。解決方案的關鍵就是這個隨機數,比特幣系統要求每一個想要建立下一個區塊的請求方,都要提供一個特定的哈希值,這個哈希值由區塊所包含的內容blockData
和這個隨機數nonce
,即SHA256({ blockData, nonce})
,經過哈希函數計算獲得。額外的要求是,所獲得的哈希值須要以特定數量0
開始,這就須要重複的取哈希值一遍又一遍的計算,直到知足要求。也能夠看出,該特定哈希值開頭要求得0
數量越多,建立該區塊的複雜度就越高,反之亦然。區塊鏈是一個共享數字分類帳,它包含了發生在網絡上的全部交易的歷史信息,存儲在區塊鏈上的信息永久保存且不可改變。構成區塊鏈的兩個重要因素是:區塊和哈希值,每個區塊包含本身的哈希值,以及一個指向前一個區塊的哈希值,經過哈希值將全部區塊按照建立順序鏈接成區塊鏈。
區塊鏈這種由哈希值連接而成的結構,帶來了一個有趣的性質:不易更改。當想要更改一個區塊的內容時,因爲哈希值得完整性,該區塊的哈希值也必將更改,又因爲該區塊的下一個區塊的頭部中,包含了指向該區塊的哈希值,後繼區塊哈希值的計算包含了指向前序區塊的哈希值,前序區塊哈希值得更改,就必然連鎖的更改全部後繼的哈希值。
區塊鏈不易更改的性質,造就了其安全性。
運行區塊鏈的網絡比較特殊,叫作分佈式點對點網絡。爲了可以清楚地理解,就字面能夠拆成兩塊來看:點對點網絡和分佈式網絡。
所謂點對點網絡,就是容許網絡中的任意兩個節點,能夠相互直接通訊,而不須要經過什麼中心化的節點。舉些例子,微信,Google的環聊,Skype都屬於點對點網絡。而分佈式網絡,容許在許多用戶間進行信息傳遞。這樣的定義,我第一次看到也很費解,爲了更好地理解,最好的方法論就是比較與鑑別。我能夠把中心化網絡,非中心化網絡以及分佈式網絡拿到一塊兒來看。但在細看以前,須要明白一點,每一種網絡都有他們各自的優點和使用場景,咱們在區塊鏈中採用分佈式網絡,只是因爲比較來看,分佈式網絡更適合於區塊鏈應用。
在中心化網絡中,全部的信息都集中於一個節點上,其餘節點都與中心節點相連。能夠拿圖書館的例子來類比,將全部圖書都集中保存在惟一的一個圖書館中,人們須要查閱資料或借閱圖書,都來這個圖書館就好。好處是書籍與資料集中後便於管理,但問題也是顯而易見的:其一,容災性較差,假如這個惟一的圖書館失火或遭到破壞,因爲全部信息只有這裏獨一份,損失後便沒法恢復。其二,對於用戶來講,很是不方便,全部人都須要到圖書館才能獲取信息,不管你在何處。
因而就有了非中心化網絡的改進方案,備份出所有或部分圖書館中的資料,創建多個地區或區域性的圖書館,這樣便有了必定的災備性。而分佈式網絡,則是把這個思路作到了極致。不須要圖書館了,每一個人家裏書架擺上50來本樹,若是沒有的話再相互借。把上述例子中的圖書換成交易數據,就是咱們比特幣網絡的樣子,每一個節點雖然不必定存儲了全部的數據,可是經過這個分佈式點對點網絡,他們能夠獲取到區塊鏈的全部數據。
咱們隨時的起心動念均可以產生一個交易,但這並不意味着網絡處理交易的速度,可以實時的跟上交易產生的速度。也就是說,必定時間內,產生交易的數量可能會超過網絡處理交易的數量,那麼對於那些暫時未確認寫入區塊鏈的交易,就須要一個地方來存儲這些信息,這個地方就叫作:內存池。
交易信息被寫入區塊以前,須要通過網絡的確認與驗證,這個工做是由區塊鏈網絡中一些叫做「礦工」的節點來完成的。具體到如何挖礦稍後介紹,這裏先大體有一個概念。
blockchain.info這個站點提供了一些比特幣區塊的專業服務以及加密貨幣錢包,除此以外,還有一些區塊狀態的神仙圖標能夠免費查看。好比咱們能夠來關注一下,當前未確認的區塊狀況:
圖中和日期一行的字符串,是一條交易的哈希值;和綠色箭頭一行的字符串,是交易雙方的錢包,能夠類比電子郵箱,只不過這裏是用來發送比特幣的。
一條交易信息離開內存池的緣由,除了由礦工校驗事後加入區塊,還有一些其餘緣由:
先來看一個著名的問題:「拜占庭將軍問題」。假設有9個拜占庭的將軍,各自領着一支軍隊圍着一座城的不一樣方位,他們之間彼此物理隔離,只能經過傳令兵進行通訊。他們須要達成共識究竟是攻打仍是撤退,要麼一同攻打要麼一同撤退,若是有一支軍隊和其餘軍隊行動不一致,都會形成失敗。同時這其中還有更復雜的因素,或許有某個將軍已經叛變了,但其餘人還不知道,這就意味着叛變的將軍會破壞此次決議的投票;同時負責消息傳遞的傳令兵,在路上也可能發生不可測的情況,而致使送達的信息失真,也可能壓根沒送到。
咱們將將軍換成區塊鏈網絡中的節點,兩個場景中面對的問題是相似的,咱們須要一種策略來幫助創建,在通訊沒那麼穩定順暢的狀況下用戶之間的信任。這即是所謂的共識機制,達成這個目的有許多備選的算法,好比工做量證實,股份證實等等。
工做量證實最先是比特幣提出的一種解決「拜占庭將軍問題」的方案,基本思想就是利用,前面談到的區塊頭部中那個隨機數以及哈希值,計算出這個有着特定數量0開頭的哈希值比較困難,也就意味着你在爲這件事情付出成本(人們每每會爲本身付出成本作的事情負責任,反之若是沒有任何成本約束,你說你認真負責,我信你個鬼),同時還須要網絡中的其餘節點驗證起來比較容易,這樣可行性纔會高。
嘗試解題計算這個特定哈希值的節點稱做礦工,礦工挖礦解題的過程會消耗計算機的電量,若是你在諸多節點的競爭計算中,得到了下個區塊寫入區塊鏈的資格,那麼你消耗的電量是值得的。同時可想而知,那些沒有競爭成功的節點,所消耗的電量真的就是打水漂了。
那爲何有那麼多節點前仆後繼地要參與到這場算力的競爭中呢?由於得到資格成功寫入區塊鏈的節點,會得到比特幣網絡獎勵的比特幣,而且這是網絡產生新比特幣的惟一方式。固然礦工除了從這種方式得到比特幣外,他還能夠從發生的交易中收取小費。
工做量證實存在的問題:
第一個問題如前所述,對於第二個問題,具體來講,因爲解出特定哈希值問題快慢的機率,和幾點擁有的計算資源大小成正比。也就是說,你擁有越多的資源你就越容易得到寫入下一個區塊的資格,也就意味着你得到比特幣獎勵的機率越大。利益的驅使下,全網的算力資源就會逐漸傾向彙集到少數人身上。
股權證實是另外一種共識機制算法,這種機制中沒有礦工,也不須要投資計算設備用以挖礦得到數字貨幣,由於從一開始全部的數字貨幣就已經存在了。取而代之的角色叫作驗證者,或者股東,爲了驗證交易和建立區塊,股東須要使用他們的數字貨幣進行下注,若是他們驗證了一個虛假的交易,他們將失去所下注的數字貨幣,以及將來參與驗證的機會,這將會驅策系統只驗證正確的交易。
在股權證實機制中,下注越大的股東,得到寫入下個區塊資格的機率越大。驗證者將會按照其下注的比例得到數字貨幣做爲獎勵,這就會引出一個問題,對於一個雞賊的驗證者,若是他同時對多個區塊進行下注,那麼在最後他也並不會損失什麼?這無疑是一個潛在的問題,因此網絡的策略是對在錯誤支鏈上下注的驗證着給予處罰,或者對在全部可能的支鏈上下注的驗證者給予處罰。
誰在使用股權證實機制:
Delegated Byzantine fault tolerance,簡稱DBFT,是一種基於給不一樣節點賦予角色來協調共識的一致性算法。
DBFT一樣沒有礦工角色的節點,取而代之的是將節點分紅了普通節點和共識節點,網絡中的絕大多數節點屬於普通節點,只能進行轉化或交易資產,可是他們不能參與到區塊的驗證;只有共識節點有權驗證寫入區塊鏈中的每一個區塊,它至關於網絡中其它節點的表明,相似於我天朝的人民表明制度。普通節點能夠轉變成共識節點,但不一樣的平臺須要知足的轉變標準又太一致。
當決定往區塊鏈寫入新區塊的時候,會從全部的共識節點中隨機選取一個負責寫入。在Neo中,這個被選出來寫入區塊的共識節點叫作speaker
(報告人),其他共識節點叫作delegates
(表明)。在報告人建立出一個新區塊後,並將它提交給諸位表明,若是有2/3的表明證實經過,則這個新區塊就被加入到區塊鏈中;若是沒有被證實經過,被選擇的報告人節點將變成普通的表明,新的報告人節點會被從新選擇。
DBFT對比工做量證實更快且消耗的資源更少,同時避免了股權證實可能會出現的區塊鏈分叉現象,這並非說DBFT就天衣無縫了:
總的來講,目前尚未完美的共識機制,目測之後也不可能會有,由於這須要根據具體的需求和使用場景進行權衡。同時瞭解新出現的區塊鏈應用,所提出本身的共識機制,並分析其優缺點,是很開眼界且有趣的。