- 區塊鏈+:智能社會進階與場景應用
- 申丹
- 4420字
- 2019-07-16 17:42:20
1.1 從數據和效果兩個維度來看區塊鏈技術原理
區塊鏈最初是由中本聰設計出來的一種獨具特色的數據庫技術,該技術是以密碼學中的橢圓曲線數字簽名算法為基礎來實現去中心化的P2P系統設計。很多人認為,區塊鏈只能在比特幣上發揮作用,但事實卻并非如此。從目前的情況來看,區塊鏈的含義似乎已經變得多種多樣,例如,數據結構、數據庫、數據庫技術等。而無論是哪一種含義,都與比特幣沒有必然的聯系。
1.1.1 數據:區塊鏈是一種分布式數據庫
如果從數據的角度來看,區塊鏈應該是一種分布式數據庫,而這里所說的“分布式”則主要體現為數據的分布式儲存,對此可以從以下兩個方面進行詳細說明。
(1)大家必須知道,區塊鏈儲存的基本單元是區塊,在鏈式結構的助力下,新增的區塊都知道自己的前一個區塊是什么,而且可以一直追溯到根。此外,哈希值為區塊鏈提供了標識,鏈式結構又將業務產生的軌跡保留了下來。因此,在有新交易增加的時候,鏈式結構就可以根據區塊的標識和前面的記錄對新交易進行校驗,進而保證區塊的數據不會輕易被篡改,具體如圖1-1所示。

圖1-1 數據的分布式儲存
當然,在傳統的數據庫設計中,與之相類似的模式也經常會被采用,例如,拉鏈表模式。在拉鏈表模式下,數據的每一次更新都會被追加,交易歷史(例如,起始時間、是否生效、失效時間等)也會被完整地保存下來。區塊鏈在該模式的基礎上,加入了哈希、時間戳等新技能,以此來保證鏈條的準確性和完整性。
(2)既然區塊鏈以分布式的方式來儲存數據,那就必須要解決存儲時分布式一致性的問題,在解決這一問題的時候,區塊鏈的前身比特幣采用了工作量證明的方法。那么,何謂工作量證明呢?具體來說,就是通過工作獲得成果,然后再用成果證明已經付出的努力。
對此,很多人可能有所不解,為什么一定要用工作量來證明,難道就沒有其他辦法了嗎?實際上,自從區塊鏈與比特幣分離以后,上述問題就被歸結為共識問題了,而工作量證明也成為了達成共識的一種方式。
實際上,除了工作量證明以外,權益證明、實用拜占庭容錯也是達成共識的方式。其中,權益證明是一種通過業務規則達成共識的方式;實用拜占庭容錯是一種通過技術規則達成共識的方式。
這里還需要介紹一個知識點,區塊鏈可以分為三種類型——公有鏈、私有鏈、聯盟鏈。在公有鏈和私有鏈上,達成共識的最主要方式就是工作量證明,而且這一方式在短期內不會被輕易取代。但是在聯盟鏈上,完全可以根據實際情況,創造出一些新的方式達成共識,以便更好、更有效地解決分布式數據存儲的一致性問題。
總而言之,區塊鏈可以實現全球數據的分布式儲存,也正是因為如此,它才變成了一個巨大的數據庫。在這個數據庫當中,任何企業、機構、個人都可以完成數據儲存,而且根本不需要擔心自己的數據會被刪除或者篡改。
1.1.2 效果:記錄時間先后的、不可篡改的、可信任的數據庫
如果我們想建立一個可以在世界范圍內使用的數據庫,那么就會面臨三個亟待解決的棘手問題。
(1)如何讓數據庫既能儲存海量的數據,又能記錄這些數據產生的時間?
(2)如何保證存儲在數據庫當中的數據不被篡改?
(3)如何使數據庫變得可信任,進而確保我們在無實名的背景下也不會上當受騙?
自從區塊鏈出現以后,上述三個問題便不再像之前一樣那么棘手,似乎已經有了解決的可能。之所以這樣說,主要是因為如果從效果的角度來看,區塊鏈可以生成一個記錄時間先后的、不可篡改的、可信任的數據庫。
為了生成一個這樣的數據庫,區塊鏈做了不少努力。首先,創新數據庫的結構,將數據庫中的數據分成不同的區塊;其次,通過特定的信息,把區塊鏈接到上一個區塊的后面;最后,讓區塊以前后順連的方式形成一條鏈,從而呈現出一套完整的數據。
在區塊鏈當中,數據以電子記錄的形式被永久儲存下來,區塊的主要作用就是儲存這些電子記錄,其生成遵循著嚴格的時間順序。具體而言,每一個區塊都會將自己被創建期間的交易活動記錄下來,把全部區塊匯總在一起就可以形成一個記錄合集。
另外,不同區塊鏈的區塊結構可能會有所不同,但基本上都被分為區塊頭和區塊體兩個部分。區塊頭的作用是鏈接到前面的區塊并保證區塊鏈數據庫的完整性;區塊體的作用是儲存與交易有關的所有記錄。一般來說,區塊結構有以下兩個非常關鍵的特點。
第一,每一個區塊上記錄的都是上一個區塊形成之后、該區塊被創建前發生的交易活動。
第二,通常情況下,只要新區塊完成記錄并被加入到區塊鏈的最后,那么記錄在這個新區塊上的交易信息以及數據就不可以被刪除或者篡改。
上述所提到的第一個特點為區塊鏈數據庫的完整性提供了有力保障,使其變得可以被信任。第二個特點為區塊鏈數據庫的嚴謹性提供了有力保障,使其變得不可以被隨意篡改。也正是因為有了這兩個特點的助力,區塊鏈數據庫才可以發揮如此巨大的作用。
那么,何謂區塊鏈數據庫呢?顧名思義,以“區塊鏈+”的方式形成的數據庫就被稱為區塊鏈數據庫。在儲存數據的時候,區塊鏈數據庫有自己的一套模式,如圖1-2所示。

圖1-2 區塊鏈數據庫儲存數據的模式
因為每一個區塊頭都包含了前一個區塊的“交易信息壓縮值”,所以,把開始的第一個區塊,到當前最近的區塊連接起來就形成了長鏈。又因為如果不知道前一區塊的“交易信息壓縮值”就不能繼續生成當前區塊,所以,每個區塊必須要嚴格按照時間順序跟隨在前一個區塊之后。
在這種模式下,儲存在區塊鏈數據庫中的數據就可以有非常明確的產生時間,各自的先后順序也十分的清晰明確。但應該知道的是,區塊鏈數據庫是以區塊鏈為基礎的,最后還要歸結到區塊鏈上。因此,與區塊鏈數據庫儲存數據的模式相比,區塊鏈的基本結構也同樣重要。
在《區塊鏈:互聯網金融的終局》當中,有這樣一段話:“人們把一段時間內生成的信息(包括數據或代碼)打包成一個區塊,蓋上時間戳,與上一個區塊銜接在一起,每下一個區塊的頁首都包含了上一個區塊的索引數據,然后再在本頁中寫入新的信息,從而形成新的區塊,首尾相連,最終形成了區塊鏈。”
該段話深刻闡明了區塊鏈的基本結構,而這一結構還有一個不得不提的最大創新點——“區塊鏈=時間戳”。“區塊鏈”的結構可以保證區塊鏈的完整性,從第一個區塊開始,一直到生成當前區塊為止,區塊鏈上儲存了與交易有關的所有數據。
不僅如此,在區塊鏈的幫助下,區塊鏈數據庫中的任何數據都可以被查詢,也可以被追本溯源,這樣的話,無論是企業,還是機構,抑或是個人,都可以對這些數據進行驗證,從而保證數據的真實性和有效性。
除了區塊鏈的基本結構以外,區塊鏈數據庫的最大創新點也是“區塊鏈=時間戳”。區塊鏈數據庫可以在儲存數據的過程中為每一個區塊都蓋上時間戳,以表示數據是在這個時間被記錄到區塊當中的。
上述做法不僅可以證明數據的儲存順序,還可以確保數據沒有被篡改,更重要的是,可以大幅度地提升區塊鏈數據庫的可信任度。由此看來,區塊鏈的確有能力生成一個記錄時間先后的、不可篡改的、可信任的數據庫,而這個數據庫便是區塊鏈數據庫。
1.1.3 拜占庭將軍問題
前面已經說過,區塊鏈是一種分布式數據庫,然而,提到分布式就會出現一個繞不開也躲不掉的難題——“拜占庭將軍問題”。這個問題是由著名計算機科學家萊斯利·蘭伯特提出的,而且廣泛存在于點對點通信當中。
簡單來說,“拜占庭將軍問題”其實是一個在缺少可信任的中央節點和相關通道的情況下,分布在網絡中的各個節點應該怎樣達成共識的問題。此外,為了讓我們可以更好地理解這個問題,萊斯利·蘭伯特還編出了一個以拜占庭帝國時期為背景的小故事,具體內容如下。
拜占庭帝國時期,突然出現了一個像“怪獸”一樣的敵人,于是拜占庭國王就派出了9支軍隊與這個敵人對抗,并采用包圍戰術以提高勝利的概率,如圖1-3所示。

圖1-3 拜占庭帝國的包圍戰術
通過圖1-3可以看出,拜占庭帝國的9支軍隊分散在敵人的四周。不過,敵人雖然比較小,但還是可以憑一己之力抵抗4支軍隊的力量的,也就是說,任何1支軍隊都無法單獨打敗敵人。
在這種情況下,如果想真正打敗敵人的話,就要有5支以上的軍隊達成進攻共識。與此同時,還要有相應的通信兵在各個軍隊間傳遞由將軍下達的防守或撤退的命令,9個軍隊的將軍不能聚在一起,因為只要出現這種現象,敵人就很可能會逃跑。
但現在的問題是,這些將軍無法確定他們當中是不是有背叛者,一旦真的有背叛者,那么這個背叛者就會向其他將軍傳遞假的命令,從而促成一個不是所有將軍都認可的行動。例如,當將軍們都希望撤退時卻因為假命令促成進攻行動。
那么,各將軍應該如何達成共識,從而順利打敗敵人呢?這便是困擾了計算機科學家們很多年的“拜占庭將軍問題”。后來,計算機科學家們發現有兩種辦法可以解決這個問題、一種是口頭解決;另一種是書面解決。然而,從這兩種解決辦法中又可以得出結論:當背叛者的數量少于三分之一時,各將軍才能夠達成共識。
假設在9個將軍中有1個背叛者,那這個背叛者就可能會給4個希望防守的將軍傳遞防守命令,而給另外4個希望撤離的將軍傳遞撤離命令。不過,因為其他8個將軍都是忠誠的,所以這8個將軍在互相通信后還是能夠達成共識的,也就是說,1個背叛者的干擾行為不會對最終的共識產生任何影響。當然,有2個背叛者的時候結果也是一樣的。
但是,假設有3個背叛者,這3個背叛者給希望防守的將軍傳遞防守命令,又給希望撤離的將軍傳遞撤離命令,當3個希望防守的忠誠將軍與3個希望撤退的忠誠將軍通信之后就會發現,分別有6個將軍希望防守,6個將軍希望撤退。這也就意味著,各將軍之間并沒有達成共識,無法做出一致的防守或者撤退的決定。當然,有3個以上背叛者的時候結果也是一樣的。
由此可知,當背叛者的數量多于三分之一時,無論是口頭解決還是書面解決,都將無濟于事。那么,“拜占庭將軍問題”究竟應該怎樣解決呢?區塊鏈似乎為這個問題提供了一些比較不錯的解決辦法,主要包括工作量證明、權益證明、委任權益證明等。下面就以工作量證明為例進行詳細說明。
在上一小節當中,對工作量證明這一概念做了詳細介紹。簡單來說,工作量證明實際上就是一份用來確認已經做過一定工作量的證明。如果將其放在區塊的生成過程中,就變成了我們俗稱的“挖礦”。
如果現在已經挖出了第1000個區塊,但有的“礦工”還想挖第1001個,與其他區塊一樣,這第1001個區塊也是由區塊頭和區塊體構成的,被用來儲存數據。“礦工”們通過改變區塊頭中的隨機數,經過哈希函數的計算輸出一組哈希值。
在有效的哈希值出現之前,數十億個無效的哈希值會被計算出來,整個過程需要花費大量的算力,而計算出有效哈希值的“礦工”就可以搶到記賬權,并獲得相應的獎勵,這便是“工作量證明”,如圖1-4所示。

圖1-4 “礦工”的“挖礦”過程
對應到上述拜占庭帝國的故事當中,我們可以知道不僅通信兵傳遞命令需要時間,各將軍對收到的命令進行驗證和判斷同樣也需要時間。在這個過程中,9個將軍之間就可以相互交流、溝通,當某個將軍收集到正確且有效的命令并將其傳遞給其他將軍驗證之后,這個將軍就相當于做出了貢獻,也就可以獲得獎勵,如果把這個獎勵放到區塊鏈當中的話,那就是比特幣。