一、什麼是區塊鏈?
說到區塊鏈,就不得不說比特幣。
2008年底,比特幣之父中本聰發表了一個關於他研究的電子現金系統的九頁白皮書,2009年初,中本聰在位於芬蘭赫爾辛基的一個小型伺服器上挖出了比特幣的第一個區塊——創世區塊,並將當天泰晤士報頭版一則關於救助銀行的新聞標題寫入創世區塊,這也代表著比特幣誕生了。
區塊鏈是比特幣的底層技術,它可以理解為一種公共記賬的機制(技術方案),它並不是一款具體的產品。其基本思想是:通過建立一組網際網路上的公共賬本,由網路中所有的使用者共同在賬本上記賬與核賬,來保證資訊的真實性和不可篡改性。而之所以名字叫做“區塊”鏈,顧名思義,是因為區塊鏈儲存資料的結構是由網路上一個個“儲存區塊”組成一根鏈條,每個區塊中包含了一定時間內網路中全部的資訊交流資料。隨著時間推移,這條鏈會不斷增長。
圖3:區塊鏈是一種公共記賬機制
1、區塊鏈的特點
區塊鏈具有去中心化、去信任化、可擴充套件、匿名化、安全可靠等特點。去中心化:由於區塊鏈是靠各個節點共同實現系統的維護和保證資訊傳遞的真實性,基於分散式儲存資料,而沒有某個中心進行集中管理,因此某一個節點受到攻擊和篡改不會影響整個網路的健康運作。去信任化:任意兩個節點之間建立連線不需要信任彼此的身份,雙方之間進行資料交換無需互相信任的基礎。由於網路中的所有節點都可以扮演“監督者”的身份,因此不用擔心欺詐的問題。可擴充套件:區塊鏈是一種底層開源技術,在此基礎上可以實現各類擴充套件和去中心化、去信任化的應用。匿名化:資料交換的雙方可以是匿名的,網路中的節點無需知道彼此的身份和個人資訊即可進行資料交換。安全可靠:由於任意節點之間的活動均受到全網的監督,並且資料庫採用分散式儲存,對於黑客來說,第一無法偽裝和進行欺詐活動,第二無法僅靠攻克某個節點而控制網路。
圖4:區塊鏈的特點
2、區塊鏈的作用
下面以傳統貨幣與比特幣(數字貨幣)來介紹一下區塊鏈所扮演的角色。
傳統貨幣的交易模式中,銀行管理賬戶採用的是中心化管理。由銀行建立中心資料庫,每個人的銀行賬戶資訊和以及賬戶裡有多少餘額都由銀行進行集中管理。
舉個例子:如A要轉賬一筆錢給B,需經過銀行O進行驗證、對賬,再修改A、B的賬戶,將錢劃給B。
圖5:傳統貨幣交易模式
而基於區塊鏈技術的比特幣交易模式則剔除了銀行作為中心資料庫的角色,每個比特幣使用者的電腦都是一個節點,每個節點都能儲存資料,節點和節點之間相連形成了巨大的網路。
例如:A向周邊節點廣播:我要轉賬給B一個比特幣。然後A將比特幣的資訊發給周邊節點進行驗證,周邊節點確認A持有該比特幣的合法性。當一定數量的節點驗證通過後,交易成立,周邊節點記錄下這筆交易並確認比特幣的新主人是B。周邊的節點再向網路中其它節點進行廣播,直至所有節點記錄下這筆交易為止。
(圖6:基於區塊鏈的比特幣交易模式)
比特幣交易通過區塊鏈技術提升了資料的真實性與不可篡改性。該系統依靠的是網路上多個參與者的公平約束,所以任意每幾個節點的權利和義務都是均等的,而且每一個節點都會儲存這個區塊鏈上所有資料。即使該節點被損壞或遭受攻擊,仍然不會對賬簿造成任何威脅。同樣地,當發生一筆交易時,全世界的使用者都可以擔當監管者的角色,如果大家不認可交易的合法性,則交易無法達成,區塊鏈上的資料由大家集體去維護。
二、區塊鏈的發展和應用
1.技術演進:區塊鏈是怎麼來的
》1982年
拜占庭將軍問題
Leslie Lamport等人提出拜占庭將軍問題(Byzantine Generals Problem),把軍中各地軍隊彼此取得共識、決定是否出兵的過程,延伸至運算領域,設法建立具容錯性的分散式系統,即使部分節點失效仍可確保系統正常 執行,可讓多個基於零信任基礎的節點達成共識,並確保資訊傳遞的一致性,而2008年出現的比特幣區塊鏈便解決了此問題。
David Chaum提出密碼學網路支付系統
David Chaum提出注重隱私安全的密碼學網路支付系統,具有不可追蹤的特性,成為之後比特幣區塊鏈在隱私安全面的雛形。
》1985年
橢圓曲線密碼學
Neal Koblitz和Victor Miller分別提出橢圓曲線密碼學(Elliptic Curve Cryptography,ECC),首次將橢圓曲線用於密碼學,建立公開金鑰加密的演演算法。相較於RSA演演算法,採用ECC好處在於可用較短的金鑰,達 到相同的安全強度。
》1990年
David Chaum基於先前理論打造出不可追蹤的密碼學網路支付系統,就是後來的eCash,不過eCash並非去中心化系統。
Leslie Lamport提出具高容錯的一致性演演算法Paxos。
》1991年
使用時間戳確保數位檔案安全
Stuart Haber與W. Scott Stornetta提出用時間戳確保數位檔案安全的協議,此概念之後被比特幣區塊鏈系統所採用。
》1992年
Scott Vanstone等人提出橢圓曲線數位簽章演演算法(Elliptic Curve Digital Signature Algorithm,ECDSA)
》1997年
Adam Back發明Hashcash技術
Adam Back發明Hashcash(雜湊現金),為一種工作量證明演演算法(Proof of Work,POW),此演演算法仰賴成本函式的不可逆特性,達到容易被驗證,但很難被破解的特性, 最早被應用於阻擋垃圾郵件。Hashcash之後成為比特幣區塊鏈所採用的關鍵技術之一。
Adam Back於2002年正式發表Hashcash論文。
》1998年
Wei Dai發表匿名的分散式電子現金系統B-money
Wei Dai發表匿名的分散式電子現金系統B-money,引入工作量證明機制,強調點對點交易和不可竄改特性。不過在B-money中,並未採用Adam Back提出的Hashcash演演算法。Wei Dai的許多設計之後被比特幣區塊鏈所採用。
Nick Szabo發表Bit Gold
Nick Szabo發表去中心化的數位貨幣系統Bit Gold,參與者可貢獻運算能力來解出加密謎題。
》2005年
可重複使用的工作量證明機制(RPOW)
Hal Finney提出可重複使用的工作量證明機制(Reusable Proofs of Work,RPOW),結合B-money與Adam Back提出的Hashcash演演算法來創造密碼學貨幣。
》2008年
Blockchain 1.0:加密貨幣
數位貨幣與支付系統去中心化
比特幣
Satoshi Nakamoto(中本聰)發表一篇關於比特幣的論文,描述一個點對點電子現金系統,能在不具信任的基礎之上,建立一套去中心化的電子交易體系。
》2012年
Blockchain2.0:智慧資產、智慧契約
市場去中心化,可作貨幣以外的數位資產轉移,如股票、債券。如Colored Coin便是基於比特幣區塊鏈的開源協議,可在比特幣在區塊鏈上發行多項資產
》2014年
Blockchain 3.0:更復雜的智慧契約
更復雜的智慧合約,將區塊鏈用於政府、醫療、科學、文化與藝術等領域
》2016年
Blockchain 2.5:金融領域應用、資料層
Blockchain2.5:強調代幣(貨幣橋)應用、分散式帳本、資料層區塊鏈,及結合人工智慧等金融應用
Blockchain 3.0:更復雜的智慧契約
更復雜的智慧合約,將區塊鏈用於政府、醫療、科學、文化與藝術等領域。
2.區塊鏈應用——比特幣的發展
自2008年底首次提出,區塊鏈技術和以比特幣為代表的區塊鏈應用在在短短8年間經歷了飛速的發展。
圖7:區塊鏈發展大事記
3、萬能的區塊鏈
區塊鏈未來應用空間巨大:從理論上說,圍繞區塊鏈這套開源體系能夠創造非常豐富的服務和產品,比特幣只是區塊鏈巨大應用空間的冰山一角。
圖8:區塊鏈可能的應用
三、區塊鏈5大關鍵技術
比特幣區塊鏈的關鍵核心技術,包括用Hashcash演演算法來進行工作量證明,且交易過程採用橢圓曲線數位簽章演演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函式以及Merkle Tree,同時也使用時間戳來確保區塊序列
比特幣區塊鏈的關鍵核心技術,包括採用Hashcash演演算法來進行工作量證明,讓區塊鏈中的各節點有機會參與驗證,達到公正性,且交易過程採用橢圓曲線數 位簽章演演算法來確保交易安全,並在每筆交易與每個區塊中使用多次Hash函式以及Merkle Tree,不只是為了節省儲存空間,更重要的是藉由將前一個區塊的Hash值加入新區塊中,讓每個區塊環環相扣,也因此做到所謂的可追蹤且不可竄改的特 性,同時也使用時間戳來確保區塊序列,以下便依序解釋這些關鍵技術。
關鍵技術 1
採用工作量證明達到去中心化及公正性
首先,最關鍵的便其工作量證明機制(Proof of Work,POW),這是一個可以讓每個參與的節點可共同參與交易驗證的方式,來實現一個能多方共同維護的單一系統,並共享同一份記錄交易的帳本,以形成一個基於零信任基礎,卻能實現去中心化的P2P網路系統。
工作量證明是讓任一運算節點,花費時間和運算資源來計算出一組數學公式的結果,且要完成一次有效的工作量證明,需經過一連串地嘗試與失敗。不過,一旦這個數值被算出來後,其他參與節點也可用相關的數學公式,便能很容易去驗證這個值是否有效。
比特幣區塊鏈採用Hashcash演演算法(雜湊現金演演算法)作為工作量證明,讓各節點經由POW計算來產生每一個有效的新區塊,再經由其他節點驗證並接受。
進行POW計算的過程也被稱作挖礦,很多人用解一道數學題、或是解一個數獨來形容,不過,怎樣才是真的算出一個有效的新區塊,這些節點到底在算什麼?
由於每個區塊中Block Header會包含許多固定的值,其中只有Nonce值為一隨機值,因此每個節點進行POW計算時要算的就是,藉由不斷替換這個Nonce值,來讓這個區 塊的Block Header Hash值,小於一個被設定好的難度目標值(Difficulty Target),至於為什麼要小於這個目標值,則是因為這個難度值意味著每個區塊在理論上應該要被產生完成。
這裡提到的難度值 (Difficulty)是指,節點要運算出低於困難度目標值的Hash值,平均需花多久時間,也就是平均要完成一次POW的時間。而比特幣區塊鏈目前設 定為,大約每10分鐘會有節點成功算出新的區塊,不過這10分鐘只是基於理論值,實際每個新區塊產生的時間,有可能只需要17秒(第407062個區塊的 實際產生時間),也有可能需要20分鐘以上(第407068個區塊的實際產生時間)。
Difficulty可動態調整,目前每產生2016個區塊會調整一次難度,以每10分鐘產生一區塊估算,大約是每兩週會調整一次Difficulty。 由於POW具有一定的難度,因此無法預期哪個運算節點可以最快算出新區塊,藉此來確保交易驗證的公正性。
關鍵技術 2
每筆交易採橢圓曲線數位簽章演演算法加密
比特幣區塊鏈便採用橢圓曲線數位簽章演演算法(ECDSA),與另一種RSA演演算法,都屬於公開金鑰加密演演算法(Public Key Cryptography),公開金鑰加密技術在1970年代被髮明,也稱為雙金鑰密碼安全系統,每個使用者會擁有公開金鑰(Public Key)與私密金鑰(Private Key)這兩把鑰匙,公開金鑰可讓其他人知道,而私密金鑰則只有本人知道。當A要傳送一筆訊息或交易給B時,需使用B的公開金鑰來將這份交易加密,而這這 個加密過的訊息或交易,只有使用B的私密金鑰才能解開。
在比特幣區塊鏈中,比特幣區塊鏈便採用橢圓曲線數位簽章演演算法,每一個比特幣區塊 鏈中的節點使用者,會同時擁有這兩把金鑰,以及一次性使用的比特幣位址(Address),公開金鑰可讓區塊鏈網路中的其他人知道,而私密金鑰則須自行保管,可用來接收貨幣、進行電子簽章或是傳送貨幣,而Address就像電子郵件一樣可用來當作存取比特幣的地址,使用者可重複取得新的Address,且 可以在離線狀態下產生,不過,每個Address只能使用一次。
在比特幣區塊鏈中,每一枚電子貨幣被視為一串數位簽章,使用者要進行比特幣交易時,必須將前一筆交易以及收款方的公開金鑰經由Hash產生數位簽章,加到電子貨幣那串數位簽章的後方。
RSA 加密演演算法是一種非對稱的加密演演算法,利用兩個質數作為加密與解密用的兩把鑰匙,金鑰長度約在40個位元到1024位元。不過比特幣所採用的ECDSA能 算出更短的金鑰長度,也就是能夠使用相對較少的資源,做到與RSA相同的安全性。在ECDSA演演算法中,由私密金鑰算出公開金鑰很容易,但要從公開金鑰推 回私密金鑰卻很困難。
關鍵技術 3
Hashcash演演算法及多種Hash函式確保資料不被竄改
前面提到比特幣區 塊鏈採用Hashcash演演算法來進行工作量證明,Hashcash可將任意長度的資料經由Hash函式轉換為一組固定長度的程式碼,原理是基於一種密碼學 上的單向雜湊函式 (One Way Hash Function),這種函式很容易被驗證,但是卻很難破解,還回推出原本的值。先前Hashcash演演算法也被用來做阻擋垃圾郵件的機制。
常使用的單向雜湊函式包括MD5、SHA-1、SHA-256、SHA-384及SHA-512等,MD5的Hash值長度為128位元,雖然廣為使用,但 因長度不夠較容易破解,SHA-1的Hash值長度有160位元,雖比MD5好但仍然不夠安全,因此美國國家安全域性(NSA)又提出多種更復雜的SHA- 2演演算法,包括224、256、384、512位元長度的Hash值演算法。
Hashcash最早在1997年由Adam Back提出,並於2002 正式發表一篇描述雜湊現金系統的論文。比特幣區塊鏈採用Hashcash來建立一套幾乎無法被竄改的電子現金系統,每個區塊的Block Header都會被Hash成一串很難被回推的程式碼後,放進下一個區塊中,來確保區塊的正確性。
關鍵技術 4
經由Merkle Tree將大量訊息縮短成一個Hash值
在 比特幣區塊鏈中,每筆交易產生後,都已經被Hash成一段程式碼才廣播給各節點,不過這樣做還不夠,因為在各節點的區塊中,可能包含數百筆到數千筆的交易, 因此,為節省儲存空間並減少資源耗費,比特幣區塊鏈的設計原理採用Merkle Tree機制,讓這些數百到數千筆的交易Hash值,經由兩兩一組形成一個新Hash值的方式,不斷重複進行,直到最後產生一組最終的Hash值,也就是 Merkle Tree Root,這個最終的Hash值便會被記錄到Block Header中,只有32 Bytes的大小。Merkle Tree機制可大幅減少資料傳輸量與運算資源消耗,驗證時,只需驗證這個Merkle Tree的Root值即可。
關鍵技術 5
用時間戳伺服器(Timestamp Server)確保區塊序列
比特幣採用時間戳伺服器機制(Timestamp Server),將每個區塊Hash後加上一個時間戳(Timestamp)併發布出去,這個時間戳用來證明資料在特定時間的有效性,每一個時間戳章會與 前一個戳章一起進行Hash,這個Hash值會在與下一個時間戳章進行Hash,因此而形成一個用來確保區塊序列的鏈條。
從一筆交易看區塊鏈運作流程
在比特幣區塊鏈中,當一筆交易經由某個節點或錢包產生時,這筆交易需要被傳送給其它節點來作驗證。做法是將交易資料經由數位簽章加密並經由Hash函式得出 一串代表此交易的唯一Hash值後,再將這個Hash值廣播(Broadcast)給比特幣區塊鏈網路中的其它參與節點進行驗證。
1)產生一筆新交易
一筆新交易產生時,會先被廣播到區塊鏈網路中的其它參與節點
2)各節點將數筆新交易放進區塊
每個節點會將數筆未驗證的交易Hash值收集到區塊中,每個區塊可以包含數百筆或上千筆交易。
3)決定由誰來驗證這些交易
各節點進行工作量證明的計算來決定誰可以驗證交易,由最快算出結果的節點來驗證交易,這就是取得共識的做法。
4)取得驗證權的節點將區塊廣播給所有節點
最快完成POW的節點,會將自己的區塊廣播給其他節點。
5)各節點驗證並接上新區塊
其他節點會確認這個區塊所包含的交易是否有效,確認沒被重複花費且具有效數位簽章後,接受該區塊,此時區塊才正式接上區塊鏈,無法再竄改資料。
6)交易驗證完成
所有節點一旦接受該區塊後,先前沒算完POW工作的區塊會失效,各節點會重新建立一個區塊,繼續下一回POW計算工作。
四、相關開源專案
目前當大家單獨說到區塊鏈的時候,就是指的區塊鏈技術,是實現了資料公開、透明、可追溯的產品的架構設計方法,算作廣義的區塊鏈。而當在具體產品中談到區塊鏈的時候,可以指類似比特幣的資料儲存方式,或許是資料庫設計,或許是檔案形式的設計,這算作狹義的區塊鏈。廣義的區塊鏈技術,必須包含點對點網路設計、加密技術應用、分散式演算法的實現、資料儲存技術的使用等4個方面,其他的可能涉及到分散式儲存、機器學習、VR、物聯網、大資料等。狹義的區塊鏈僅僅涉及到資料儲存技術,資料庫或檔案操作等。本文的區塊鏈,指的是廣義的區塊鏈。
架構圖
從架構設計上來說,區塊鏈可以簡單的分為三個層次,協議層、擴充套件層和應用層。其中,協議層又可以分為儲存層和網路層,它們相互獨立但又不可分割。如圖:
(1)C/C++
這兩個語言是無法逾越的,任何開發遇到瓶頸,基本上都會找到它們,自然應該排在第一位要介紹的。同時,區塊鏈技術的鼻祖,比特幣(協議層)就是用C++語言開發的,而且目前為止,沒有比比特幣更加成功的區塊鏈產品。所以,無論你使用什麼語言開發,在正式進入這個行業的過程中,都應該先研究研究比特幣。比特幣官方客戶端錢包用的Qt,第三方錢包有Python語言開發的,特別是第三方整理的開發庫(Api包)很多是Nodejs設計的。比特幣的架構,與上面的架構設計基本相同,另外,因為共識演算法採用的是工作量證明機制(PoW:Proof of work),還有一些特殊的挖礦的過程。其他競爭幣都是直接來自比特幣的分支,所以程式語言相同,具體的技術選型和技術實現上可能有所改進,比如:萊特幣,使用了其他的加密演算法。
官方網站:https://bitcoin.org/
原始碼庫:https://github.com/bitcoin
(2)Nodejs/Javascript
Nodejs平臺強大的網路程式設計能力,以及js指令碼語言的簡單快捷,在區塊鏈領域自然少不了它的身影。億書便是這樣一個區塊鏈產品,億書幣是它的協議層,使用了著名的express開發框架,基於http協議開發而成。同時,它採用了授權股權證明機制(DPoS),演算法上的改進,讓它在處理交易時更加輕量,處理能力大大提升。它提供了強大的協作機制,為數字出版、版權保護提供了便利;擴充套件了側鏈功能,可以基於它開發任何去中心化的應用,從而為專業作者、部落格愛好者和開發者提供很多方便。《Nodejs開發加密貨幣》這本書完整分享了它的原始碼,從區塊鏈基礎概念到程式碼實現,從基本原理到開發設計思路,都做了比較詳細的探索,目前為止,從協議層面深入程式碼講解區塊鏈技術實現的書籍極少,這算作一本。
原始碼庫:https://github.com/Ebookcoin
(3)Python
如果是Python語言愛好者,我建議研究研究以太坊(Ethereum)的Python實現。儘管因為The Dao事件鬧得沸沸揚揚,但從技術實現的角度來說,仍然值得參考學習。以太坊官方定位為一種開發管理分散式應用的平臺,主攻方向就是“智慧合約”,併為其定製了一種程式語言Solidity。以太坊的核心是以太坊虛擬機器(EVM),允許使用者按照自己的意願建立操作。以太坊給出了Go、Java、Python等多語言的實現。其中以python為基礎的實現主要包括三個部分:Pyethapp是客戶端部分;pyethereum是核心庫,實現了區塊鏈、以太坊模擬機和挖礦等功能;pydevp2p是點對點網路庫,實現了節點發現、合約程式碼傳輸、加密簽名等功能,這三者組合在一起就是完整的區塊鏈實現,後面兩個核心庫共同組成了協議層。另外,go-ethereum是go語言的完整實現;Ethereum(J) 是純Java實現,它作為可以嵌入任何Java/Scala專案的庫提供。客戶端方面,還有Rust、Ruby、Javascript等語言的實現。
原始碼庫:https://github.com/ethereum/pyethapp
(4)Go
在多核時代,Go語言備受喜愛,它可以讓你用同步方式輕鬆實現高併發,特別是在分散式系統、網路程式設計等領域,應用非常廣。所以,在區塊鏈開發領域,也有很多使用Go語言的專案。其中,由linux基金會主導的超級賬本(HyperLeger),版本庫的名字叫Fabric,就是其中一個。該專案試圖為新一代的事務應用建立一種開放的分散式賬本標準,支援許可式區塊鏈(這種方式可能無法再現比特幣那種強大的網路效應)。Fabric的開發環境建立在VirtualBox虛擬機器上,部署環境可以自建網路,也可以直接部署在BlueMix上,部署方式可docker化,支援用Go和JavaScript開發智慧合約。它採用PBFT分散式演算法,網路程式設計方面用gRPC來做P2P通訊,使用 Protocol Buffer來序列化要傳遞的資料結構。在架構設計上,Fabric可能與比特幣等區塊鏈產品有所不同,但是上述基本組成部分還是不可或缺的。
官方網站:https://www.hyperledger.org/
原始碼庫:https://github.com/hyperledger
(5)C#
眾多語言,怎能少了微軟的C#,C#是企業級應用的首選,以其最好用的程式碼編輯器沒有之一,以及持續的版本升級優化,成為開發效率最高的程式語言,應對各種新技術毫無壓力。