區塊鏈(Blockchain)-核心技術概覽
運用之妙奪造化,存乎一心勝天工。
有人可能會遇到這樣的問題:
- 跨境商貿合作中籤訂的合同,怎麼確保對方能嚴格遵守和及時執行?
- 酒店宣稱剛打撈上來的三文魚,怎麼追蹤捕撈和運輸過程中的時間和衛生?
- 現代數字世界裡,怎麼證明你是誰?怎麼證明某個資產屬於你?
- 經典囚徒困境中的兩個人,怎樣才能達成利益的最大化?
- 宇宙不同文明之間的“黑暗森林”猜疑鏈,有沒有可能被徹底打破?
這些看似很難解決的問題,在區塊鏈的世界裡已經有了初步的答案。本文將帶領大家探索區塊鏈的核心技術,包括其定義與原理、關鍵的問題等,還將探討區塊鏈技術的演化,並對未來發展的趨勢進行展望。最後,對一些常見的認識誤區進行了澄清。
定義與原理
1、定義
公認的最早關於區塊鏈的描述性文獻是中本聰所撰寫的文章《Bitcoin:A Peer-to Peer Electronic Cach System》,但該文獻重點在於討論比特幣系統,實際上並沒有明確提出區塊鏈的定義和概念,在其中指出,區塊鏈是用於記錄比特幣交易賬目歷史的資料結構。
另外,Wikipedia上給出的定義中,將區塊鏈類比為一種分散式資料庫技術,通過維護資料塊的鏈式結構,可以維持持續增長的、不可篡改的資料記錄。
區塊鏈技術最早的應用出現在比特幣專案中。作為比特幣背後的分散式記賬平臺,在無集中式管理的情況下,比特幣網路穩定運行了八年時間,支援了海量的交易記錄,並且從未出現嚴重的漏洞,這些都與巧妙的區塊鏈結構分不開的。
區塊鏈技術自身仍然在飛速發展中,目前相關規範和標準還在進一步成熟中。
2、基本原理
區塊鏈的基本原理理解起來並不複雜。首先,區塊鏈包括三個基本概念:
- 交易(transaction):一次對賬本的操作,導致賬本狀態的一次改變,如新增一條轉賬記錄;
- 區塊(block):記錄一段時間內發生的所有交易和狀態結果,是對當前賬本狀態的一次共識;
- 鏈(chain):由區塊按照發生順序串聯而成,是整個賬本狀態變化的日誌記錄。
如果把區塊鏈作為一個狀態機,則每次交易就是試圖改變一次狀態,而每次共識生成的區塊,就是參與者對於區塊中交易導致狀態改變的結果進行確認。
在實現上,首先假設存在一個分散式的資料記錄賬本,這個賬本只允許新增、不允許刪除。賬本底層的基本結構是一個線性的連結串列,這也是其名字“區塊鏈”的來源。連結串列由一個個“區塊”串聯組成(如圖2-1所示),後繼區塊記錄前導區塊的雜湊值(pre hash)。新的資料要加入,必須放到一個新的區塊中。而這個塊(以及塊裡的交易)是否合法,可以通過計算雜湊值的方式快速檢驗出來。任意維護節點都可以提議一個新的合法區塊,然而必須經過一定的共識機制來對最終選擇的區塊達成一致。
圖2-1 區塊鏈結構示例
3、以比特幣為例理解區塊鏈工作過程
以比特幣網路為例,可以具體看其中如何使用了區塊鏈技術。
首先,比特幣客戶端發起一項交易,廣播到比特幣網路中並等待確認。網路中的節點會將一些收到的等待確認的交易記錄打包在一起(此外還要包括前一個區塊頭部的雜湊值等資訊),組成一個候選區塊。然後,試圖找到一個nonce串(隨機串)放到區塊裡,使得候選區塊的雜湊結果滿足一定條件(比如小於某個值)。這個nonce串的查詢需要一定的時間去進行計算嘗試。
一旦節點算出來滿足條件的nonce串,這個區塊在格式上就被認為是“合法”了,就可以嘗試在網路中將它廣播出去。其他節點收到候選區塊,進行驗證,發現確實符合約定條件了,就承認這個區塊是一個合法的新區塊,並新增到自己維護的區塊鏈上。當大部分節點都將區塊新增到自己維護的區塊鏈結構上時,該區塊被網路接受,區塊中所包括的交易也就得到確認。
當然,在實現上還會有很多額外的細節。這裡面比較關鍵的步驟有兩個:
- 一個是完成對一批交易的共識(建立區塊結構);
- 一個是新的區塊新增到區塊鏈結構上,被大家認可,確保未來無法被篡改。
比特幣的這種基於算力尋找nonce串的共識機制稱為工作量證明(Proof of Work,PoW)。目前,要讓雜湊結果滿足一定條件,並無已知的快速啟發式演算法,只能進行嘗試性的暴力計算。嘗試的次數越多(工作量越大),算出來的概率越大。
通過調節對雜湊結果的限制,比特幣網路控制平均約10分鐘產生一個合法區塊。算出區塊的節點將得到區塊中所有交易的管理費和協議固定發放的獎勵費(目前是12.5比特幣,每四年減半),這個計算新區塊的過程俗稱為挖礦。
讀者可能會關心,比特幣網路是任何人都可以加入的,如果網路中存在惡意節點單,能否進行惡意操作來對區塊鏈中的記錄進行篡改,從而破壞整個比特幣網路系統。比如最簡單的,故意不承認收到的別人產生的合法候選區塊,或者乾脆拒絕來自其他節點的交易等。
實際上,比特幣網路中存在大量(據估計數千個)的維護節點,而且大部分節點都是正常工作的,預設都只承認所看到的最長的鏈結構。只要網路中不存在超過一半的節點提前勾結一起採取惡意行動,則最長的鏈將很大概率上成為最終合法的鏈。而且隨著時間增加,這個概率會越來越大。例如,經過6個區塊生成後,即便有一半的節點聯合起來想顛覆被確認的結果,其概率也僅為(1/2)6≈1.6%,即低於1/60的可能性。
當然,如果整個網路中大多數的節點都聯合起來作惡,可以導致整個系統無法正常工作。要做到這一點,往往意味著付出很大的代價,跟通過作惡得到的收益相比,得不償失。
技術的演化與分類
區塊鏈技術自比特幣網路設計中被大家發掘關注,從最初服務數字貨幣系統,到今天在分散式賬本場景下發揮著越來越大的技術潛力。
1、區塊鏈的演化
比特幣區塊鏈已經支援了簡單的指令碼計算,但僅限於數字貨幣相關的處理。除了支援數字貨幣外,還可以將區塊鏈上執行的處理過程進一步泛化,即提供智慧合約(smart contract)。智慧合約可以提供除了貨幣交易功能外更靈活的合約功能,執行更為複雜的操作。
這樣,擴充套件之後的區塊鏈已經超越了單純資料記錄的功能,實際上帶有一點“智慧計算”的意味;更進一步,還可以為區塊鏈加入許可權管理和高階程式語言支援等,實現更強大的、支援更多商用場景的分散式賬本。
從計算特點上,可以看到現有區塊鏈技術的三種典型演化場景,如表2-1所示。
場景 | 功能 | 智慧合約 | 一致性 | 許可權 | 型別 | 效能 | 程式語言 | 代表 |
---|---|---|---|---|---|---|---|---|
工信的數字貨幣 | 記賬功能 | 不帶有或較弱 | PoW | 無 | 公有鏈 | 較低 | 簡單指令碼 | 比特幣網路 |
工信的交易處理 | 智慧合約 | 圖靈完備 | PoW、PoS | 無 | 公有鏈 | 受限 | 特定語言 | 以太坊網路 |
帶許可權的分散式賬本處理 | 商業處理 | 多種語言,圖靈完備 | 包括CFT、BFT在內的多種機制,可插拔 | 支援 | 聯盟鏈 | 可拓展 | 高階語言 | 超級賬本 |
表2-1 區塊鏈技術的三種典型演化場景
2、區塊鏈與分散式記賬
現代複式記賬系統(double entry bookkeeping)由義大利數學家盧卡·帕西奧利於1494年在《Summa de arithmetica,geometrica,proportioni et proportionalità》一書中最早制定。複式記賬法對每一筆賬目同時記錄來源和去向,首次將對賬驗證功能引入記賬過程,提升了記賬過程的可靠性。
從這個角度來看,區塊鏈是首個自帶對賬功能的數字記賬技術實現。
更廣泛地看,區塊鏈屬於一種去中心化的記錄技術。參與到系統上的節點,可能不屬於同一組織,彼此無需信任;區塊鏈資料由所有節點共同維護,每個維護節點都能複製獲得一份完整或部分記錄的拷貝。
跟傳統的記賬技術相比,基於區塊鏈的分散式賬本應該包括如下特點:
- 維護一條不斷增長的鏈,只可能新增記錄,而發生過的記錄都不可篡改;
- 去中心化,或者說多中心化,無需集中控制而能達成共識,實現上儘量採用分散式;
- 通過密碼學的機制來確保交易無法被抵賴和破壞,並儘量保護使用者資訊和記錄的隱私性。
3、分類
根據參與者的不同,可以分為公開(public)鏈、聯盟(consortium)鏈和私有(private)鏈。
- 公有鏈,顧名思義,任何人都可以參與使用和維護,如比特幣區塊鏈,資訊是完全公開的;
如果進一步引入許可機制,可以實現私有鏈和聯盟鏈兩種型別:
- 私有鏈,由集中管理者進行管理限制,只有內部少數人可以使用,資訊不公開;
- 聯盟鏈則介於兩者之間,由若干組織一起合作維護一條區塊鏈,該區塊鏈的使用必須是帶有許可權的限制訪問,相關資訊會得到保護,如供應鏈機構或銀行聯盟。
目前來看,公有鏈更容易吸引市場和媒體的眼球,但更多的商業價值會在聯盟鏈和私有鏈上落地。
根據使用目的和場景的不同,又可以分為以數字貨幣為目的的貨幣鏈,以記錄產權為目的的產權鏈,以眾籌為目的的眾籌鏈等,也有不侷限特定應用場景的通用鏈。
現有大部分割槽塊鏈實現都至少包括了網路層、共識層、智慧合約和應用層等結構,聯盟鏈實現往往還會引入一定的許可權管理機制。
關鍵問題和挑戰
從技術角度講,區塊鏈所涉及的領域比較繁雜,包括分散式系統、儲存、密碼學、心理學、經濟學、博弈論、控制論、網路協議等,這也就意味著大量工程實踐上的技術挑戰。
下面列出了目前業內關注較多的一些技術話題。
1、抗抵賴與隱私保護
- 怎麼防止交易記錄被篡改?
- 怎麼證明交易雙方的身份?
- 怎麼保護交易雙方的隱私?
密碼學的發展為解決這些問題提供了不少手段。傳統方案包括Hash演算法、加解密演算法、數字證書和簽名(盲簽名、環簽名)等。
隨著區塊鏈技術的應用,新出現的需求將刺激密碼學的進一步發展,包括更高效的隨機數產生、更高強度的加密、更快速的加解密處理等。同時,量子計算等新技術的出現,也會帶來更多的挑戰,例如,RSA演算法等目前商用的加密演算法,在未來可能無法提供足夠的安全性。
能否滿足這些新的需求,將依賴於數學科學的進一步發展和新一代計算技術的突破。
2、分散式共識
這是個經典的技術難題,學術界和業界都已有大量的研究成果(包括Paxos、拜占庭系列演算法等)。
問題的核心在於如何解決某個變更在分散式網路中得到一致的執行結果,是被參與多方都承認的,同時這個資訊是被確定的,不可推翻的。
該問題在公開匿名場景下和帶許可權管理的場景下需求差異較大,從而導致了基於概率的演算法和確定性演算法兩類思想。
最初,比特幣區塊鏈考慮的是公開匿名場景下的最壞保證。通過引入了“工作量證明”策略來規避少數人的惡意行為,並通過概率模型保證最後參與方共識到最長鏈。演算法在核心思想上是基於經濟利益的博弈,讓惡意破壞的參與者損失經濟利益,從而保證大部分人的合作。同時,確認必須經過多個區塊的生成之後達成,從概率上進行保證。這類演算法的主要問題在於效率的低下。類似演算法還有以權益為抵押的PoS、DPoS和Casper等。
後來更多的區塊鏈技術(如超級賬本)在帶許可權管理的場景下,開始考慮支援更多的確定性的共識機制,包括經典的拜占庭演算法等,可以解決快速確認的問題。
共識問題在很長一段時間內都將是極具學術價值的研究熱點,核心的指標將包括容錯的節點比例、決策收斂速度、出錯後的恢復、動態特性等。PoW等基於概率的系列演算法理論上允許少於一半的不合作節點,PBFT等確定性演算法理論上則允許不超過1/3的不合作節點。
3、交易效能
雖然一般來說,區塊鏈不適用於高頻交易的場景,但由於金融系統的需求,業界目前十分關心如何提高區塊鏈系統交易的吞吐量,同時降低交易的確認延遲。
目前,公開的比特幣區塊鏈只能支援平均每秒約7筆的吞吐量,一般認為對於大額交易來說,安全的交易確認時間為一個小時左右。以太坊區塊鏈的吞吐量略高一些,但交易效能也被認為是較大的瓶頸。
區塊鏈系統跟傳統分散式系統不同,其處理效能很難通過單純增加節點數來進行橫向擴充套件。實際上,傳統區塊鏈系統的效能,在很大程度上取決於單個節點的處理能力。高效能、安全、穩定性、硬體輔助加解密能力,都將是考查節點效能的核心要素。
這種場景下,為了提高處理效能,一方面可以提升單個節點的效能(如採用高配置的硬體),同時設計優化的策略和演算法;另外一方面試圖將大量高頻的交易放到鏈外來,只用區塊鏈記錄最終交易資訊,如比特幣社群提出的“閃電網路”等設計。類似地,側鏈(side chain)、影子鏈(shadow chain)等思路在當前階段也有一定的借鑑意義。類似設計可以將交易效能提升1~2個數量級。
此外,在聯盟鏈的場景下,參與多方存在一定的信任前提和利益約束,可以採取更優化的設計,換來效能的提升。以超級賬本Fabric專案為例,在普通虛擬機器配置下,單客戶端交易吞吐量可達幾百次每秒(transactions per second,tps);在有一定工程優化或硬體加速情況下可以達到每秒數千次的吞吐量。
客觀地說,目前開源區塊鏈系統已經可以滿足不少應用場景的效能需求,但離大規模交易系統在峰值每秒數萬筆的吞吐效能還有較大差距。
4、擴充套件性
常見的分散式系統可以通過增加節點來橫向擴充套件整個系統的處理能力。對於區塊鏈網路系統來說,根據共識機制的不同,這個問題往往並非那麼簡單。
例如,對於比特幣和以太坊區塊鏈而言,網路中每個參與維護的核心節點都要保持一份完整的儲存,並且進行智慧合約的處理。此時,整個網路的總儲存和計算能力取決於單個節點的能力。甚至當網路中節點數過多時,可能會因為一致性的達成過程延遲降低整個網路的效能。尤其在公有網路中,由於存在大量低效能處理節點,導致這個問題將更加明顯。
要解決這個問題,根本上是放鬆對每個節點都必須參與完整處理的限制(當然,網路中節點要能合作完成完整的處理),這個思路已經在超級賬本中得到應用;同時儘量減少核心層的處理工作。
在聯盟鏈模式下,還可以專門採用高效能的節點作為核心節點,相對較弱的節點僅作為代理訪問節點。
5、安全防護
區塊鏈目前最熱門的應用場景是金融相關的服務,安全自然是討論最多、挑戰最大的話題。區塊鏈在設計上大量採用了現代成熟的密碼學演算法。但這是否就能確保其絕對安全呢?
世界上並沒有絕對安全的系統。
系統是由人設計的,系統也是由人來運營的,只要有人蔘與的系統,就難免出現漏洞。如下幾個方面是很難避免的。
首先是立法。對區塊鏈系統如何進行監管?攻擊區塊鏈系統是否屬於犯罪?攻擊銀行系統是要承擔後果的。但是目前還沒有任何法律保護區塊鏈(特別是公有鏈)以及基於它的實現。
其次是軟體實現的潛在漏洞。考慮到使用了幾十年的OpenSSL還帶著那麼低階的漏洞(heart bleeding),而且是原始碼完全開放的情況下,讓人不禁對執行中的大量線上系統持謹慎態度。而對於金融系統來說,無論客戶端還是平臺側,即便是很小的漏洞都可能造成難以估計的損失。
另外,公有區塊鏈所有交易記錄都是公開可見的,這意味著所有的交易即便被匿名化和加密處理,但總會在未來某天被破解。安全界一般認為,只要物理上可接觸就不是徹底的安全。實際上,已有文獻證明,比特幣區塊鏈的交易記錄很大可能是能追蹤到真實使用者的。
作為一套完全分散式的系統,公有的區塊鏈缺乏有效的調整機制。一旦執行起來,出現問題也難以修正。即使是讓它變得更高效、更完善的修改,只要有部分既得利益者聯合起來反對,就無法得到實施。比特幣社群已經出現過多次類似的爭論。
最後,執行在區塊鏈上的智慧合約應用可能是五花八門的,可能存在潛在的漏洞,必須有辦法進行安全管控,在註冊和執行前需要有合理的機制進行探測,以規避惡意程式碼的破壞。
2016年6月17日發生的“DAO系統漏洞被利用”事件,直接導致價值6000萬美元的數字貨幣被利用者獲取。儘管對於這件事情的反思還在進行中,但事實再次證明,目前基於區塊鏈技術進行生產應用時,務必要細心謹慎地進行設計和驗證。必要時,甚至要引入“形式化驗證”和人工稽核機制。
6、資料庫和儲存系統
區塊鏈網路中的大量資訊需要寫到檔案和資料庫中進行儲存。
觀察區塊鏈的應用,大量的讀寫操作、Hash計算和驗證操作,跟傳統資料庫的行為十分不同。當年,人們觀察到網際網路應用大量非事務性的查詢操作,而設計了非關係型(NoSQL)資料庫。那麼,針對區塊鏈應用的這些特點,是否可以設計出一些特殊的針對性的資料庫呢?
LevelDB、RocksDB等鍵值資料庫,具備很高的隨機寫和順序讀、寫效能,以及相對較差的隨機讀的效能,被廣泛應用到了區塊鏈資訊儲存中。但目前來看,面向區塊鏈的資料庫技術仍然是需要突破的技術難點之一,特別是如何支援更豐富語義的操作。
大膽預測,未來將可能出現更具針對性的“塊資料庫”(BlockDB),專門服務類似區塊鏈這樣的新型資料業務,其中每條記錄將包括一個完整的區塊資訊,並天然地跟歷史資訊進行關聯,一旦寫入確認則無法修改。所有操作的最小單位將是一個塊。為了實現這種結構,需要原生支援高效的簽名和加解密處理。
7、整合和運營
即便大量企業系統準備遷移到區塊鏈平臺上,但在相當長的一段時間內,基於區塊鏈的新業務系統必將與已有的中心化系統整合共存。
兩種系統如何共存,如何分工,彼此的業務交易如何進行合理傳遞?出現故障如何排查和隔離?已有資料如何在不同系統之間進行遷移和災備?區塊鏈系統自身又該如何進行運營(如網路的設計選擇、狀態監控、災備等)?
這些都是迫切要解決的實際問題。若解決不好,將是區塊鏈技術落地的不小阻礙。
趨勢與展望
關於區塊鏈技術發展趨勢的探討和爭論,自其誕生之日起就從未停息。或許,讀者從計算技術的演變歷史中能得到一些啟發。計算技術的發展歷史如圖2-3所示。
圖2-3 計算的歷史
以雲端計算為代表的現代計算技術,其發展歷史上有若干重要的時間點和事件:
- 1969——ARPANet(Advanced Research Projects Agency Network):現代網際網路的前身,由美國高階研究計劃署(Advanced Research Project Agency)提出,其使用NCP協議,核心缺陷之一是無法做到和個別計算機網路交流;
- 1973——TCP/IP:Vinton.Cerf(文特·瑟夫)與Bob Karn(鮑勃·卡恩)共同開發出TCP模型,解決了NCP的缺陷;
- 1982——Internet:TCP/IP正式成為規範,並被大規模應用,現代網際網路誕生;
- 1989——WWW:早期網際網路的應用主要包括telnet、ftp、email等,Tim Berners-Lee(蒂姆·伯納斯-李)設計的WWW協議成為網際網路的殺手級應用,引爆了現代網際網路,從那開始,網際網路業務快速擴張;
- 1999——Salesforce:網際網路出現後,一度只能進行通訊應用,但Salesforce開始以雲的理念提供基於網際網路的企業級服務;
- 2006——AWS EC2:奠定了雲端計算的業界標杆,直到今天,競爭者們仍然在試圖追趕AWS的腳步;
- 2013——Cognitive:以IBM Watson為代表的認知計算開始進入商業領域,計算開始變得智慧,進入“後雲端計算時代”。
從這個歷史中能看出哪些端倪呢?
首先,技術領域也存在著週期律。這個週期目前看是7~8年左右。或許正如人有“七年之癢”,技術也存在著七年這道坎,到了這道坎,要麼自身突破邁過去,要麼就被新的技術所取代。如果從比特幣網路上線(2009年1月)算起,到今年正是在坎上。因此,現在正是相關技術進行突破的好時機。
其次,最早出現的未必是先驅。創新固然很好,但過早播撒的種子,若沒有合適的土壤,往往也難長大。技術創新與科研創新很不同的一點是,技術創新必須立足於需求,過早過晚都會錯失良機。科研創新則要越早越好,比如20世紀出現的物理學巨匠們,超前的研究成果奠定了後續一百多年的科技革命的基礎。
最後,事物的發展往往是延續的、長期的。新生事物大都不是憑空蹦出來的,往往是解決了前輩未能解決的問題,或是出現了之前未曾出現過的場景。而且很多時候,新生事物的出現需要長期的孵化;堅持還是放棄,故事不斷重複。筆者認為,只要是朝著提高生產力的正確方向努力,遲早會有出現在舞臺上的一天。
目前,區塊鏈在數字貨幣領域(以比特幣為代表)的應用已經相對成熟,而在智慧合約和分散式賬本方向尚處於初步實踐階段。但毫無疑問的是,區塊鏈技術在已經落地的領域,確實帶來了生產力提升。因此可以相信,隨著相關技術的進一步發展,區塊鏈技術必然會在更多的領域中大放異彩,特別是金融科技相關領域。
認識上的誤區
目前,由於區塊鏈自身仍是一種相對年輕的技術,不少人對區塊鏈的認識還存在一些誤區。下面是需要注意的一些問題:
首先,區塊鏈不等於比特幣。雖說區塊鏈的基本思想誕生於比特幣的設計中,但發展到今日,比特幣和區塊鏈已經儼然成為了兩個不太相關的技術。前者更側重從數字貨幣角度發掘比特幣的實驗性意義;後者則從技術層面探討和研究可能帶來的商業系統價值,試圖在更多的場景下釋放智慧合約和分散式賬本帶來的科技潛力。
其次,區塊鏈不等於資料庫。雖然區塊鏈也可以用來儲存資料,但它要解決的核心問題是多方的互信問題。單純從儲存資料角度,它的效率可能不高,也不推薦把大量的原始資料放到區塊鏈系統上。當然,現在已有的區塊鏈系統中,資料庫相關的技術十分關鍵,直接決定了區塊鏈系統的吞吐效能。
最後,區塊鏈並非一門萬能的顛覆性技術。作為融合多項已有技術而出現的新事物,區塊鏈跟現有技術的關係是一脈相承的。它在解決多方合作和可信處理上向前多走了一步,但並不意味著它是萬能的,更不會徹底顛覆已有的商業模式。很長一段時間裡,區塊鏈所適用的場景仍需不斷摸索,並且跟已有系統也必然是長期合作共存的關係。
小結
本章剖析了區塊鏈的相關核心技術,包括其定義、工作原理、技術分類、關鍵問題和認識上的誤區等。通過本章的學習,讀者可以對區塊鏈的相關核心技術形成整體上的認識,並對區塊鏈在整個資訊科技產業中的位置和發展趨勢形成更清晰的認知。
除了數字貨幣應用外,現在業界越來越看重區塊鏈技術可能帶來的面向商業應用場景的計算能力。開源社群發起的開放的“以太坊”和“超級賬本”等專案,讓使用者可以使用它們來快速設計複雜的分散式賬本應用。
有理由相信,隨著更多商業應用場景的出現,區塊鏈技術將在未來金融和資訊科技等領域佔據越來越重要的地位。
摘自:區塊鏈原理、設計與應用