1. 程式人生 > >區塊鏈概述

區塊鏈概述

區塊鏈技術為比特幣系統解決了數字加密貨幣領域長期以來所必需面對的兩個重要問題, 即雙重支付問題和拜占庭將軍問題。
(關於雙重支付問題和拜占庭將軍問題看文章後面)
區塊鏈定義和概念

狹義來講,區塊鏈是一種按照時間順序將資料區塊以順序相連的方式組合成的一種鏈式資料結構, 並以密碼學方式保證的不可篡改和不可偽造的分散式賬本。
廣義來講,區塊鏈技術是利用塊鏈式資料結構來驗證與儲存資料、利用分散式節點共識演算法來生成和更新資料、利用密碼學的方式保證資料傳輸和訪問的安全、利用由自動化指令碼程式碼組成的智慧合約來程式設計和操作資料的一種全新的分散式基礎架構與計算方式。
基礎架構模型

一般說來,區塊鏈系統由資料層、網路層、共識層、激勵層、合約層和應用層組成。
在這裡插入圖片描述


資料層封裝了底層資料區塊以及相關的資料加密和時間戳等基礎資料和基本演算法;
網路層則包括分散式組網機制、資料傳播機制和資料驗證機制等;
共識層主要封裝網路節點的各類共識演算法;
激勵層將經濟因素整合到區塊鏈技術體系中來,主要包括經濟激勵的發行機制和分配機制等;
合約層主要封裝各類指令碼、演算法和智慧合約,是區塊鏈可程式設計特性的基礎;
應用層則封裝了區塊鏈的各種應用場景和案例。
該模型中,基於時間戳的鏈式區塊結構、分散式節點的共識機制、基於共識算力的經濟激勵和靈活可程式設計的智慧合約是區塊鏈技術最具代表性的創新點。
1、資料層

(1)資料區塊
在這裡插入圖片描述
每個資料區塊一般包含區塊頭(Header) 和區塊體(Body) 兩部分。 區塊頭封裝了當前版本號(Version)、前一區塊地址(Prev-block)、當前區塊的目標雜湊值(Bits)、當前區塊PoW 共識過程的解隨機數(Nonce)、Merkle根(Merkle-root) 以及時間戳(Timestamp) 等資訊。
區塊體則包括當前區塊的交易數量以及經過驗證的、區塊建立過程中生成的所有交易記錄。這些記錄通過Merkle 樹的雜湊過程生成唯一的Merkle 根並記入區塊頭。

(2)鏈式結構

取得記賬權的礦工將當前區塊連結到前一區塊, 形成最新的區塊主鏈。各個區塊依次環環相接, 形成從創世區塊到當前區塊的一條最長主鏈, 從而記錄了區塊鏈資料的完整歷史, 能夠提供區塊鏈資料的溯源和定位功能, 任意資料都可以通過此鏈式結構順藤摸瓜、追本溯源。
需要說明的是, 如果短時間內有兩個礦工同時“挖出” 兩個新的區塊加以連結的話, 區塊主鏈可能會出現暫時的“分叉”現象, 其解決方法是約定礦工總是選擇延長累計工作量證明最大的區塊鏈。

(3)時間戳

區塊鏈技術要求獲得記賬權的節點必須在當前資料區塊頭中加蓋時間戳, 表明區塊資料的寫入時間。因此, 主鏈上各區塊是按照時間順序依次排列的。

(4)雜湊函式

區塊鏈通常並不直接儲存原始資料或交易記錄, 而是儲存其雜湊函式值, 即將原始資料編碼為特定長度的由數字和字母組成的字串後記入區塊鏈。
雜湊函式(也稱雜湊函式) 具有諸多優良特點, 因而特別適合用於儲存區塊鏈資料。例如, 通過雜湊輸出幾乎不能反推輸入值(單向性), 不同長度輸入的雜湊過程消耗大約相同的時間(定時性) 且產生固定長度的輸出(定長性), 即使輸入僅相差一個位元組也會產生顯著不同的輸出值(隨機性) 等。

(5)Merkle樹

Merkle 樹是區塊鏈的重要資料結構, 其作用是快速歸納和校驗區塊資料的存在性和完整性。
Merkle 樹通常包含區塊體的底層(交易) 資料庫, 區塊頭的根雜湊值(即Merkle 根) 以及所有沿底層區塊資料到根雜湊的分支。
Merkle 樹運算過程一般是將區塊體的資料進行分組雜湊, 並將生成的新雜湊值插入到Merkle 樹中, 如此遞迴直到只剩最後一個根雜湊值並記為區塊頭的Merkle 根。

(6)非對稱加密

非對稱加密是為滿足安全性需求和所有權驗證需求而整合到區塊鏈中的加密技術。
非對稱加密通常在加密和解密過程中使用兩個非對稱的密碼, 分別稱為公鑰和私鑰。
非對稱金鑰對具有兩個特點, 首先是用其中一個金鑰(公鑰或私鑰) 加密資訊後, 只有另一個對應的金鑰才能解開; 其次是公鑰可向其他人公開、私鑰則保密, 其他人無法通過該公鑰推算出相應的私鑰。
非對稱加密技術在區塊鏈的應用場景主要包括資訊加密、數字簽名和登入認證等, 其中資訊加密場景主要是由資訊傳送者(記為A) 使用接受者(記為B) 的公鑰對資訊加密後再發送給B, B 利用自己的私鑰對資訊解密,比特幣交易的加密即屬於此場景; 數字簽名場景則是由傳送者A 採用自己的私鑰加密資訊後傳送給B, B 使用A 的公鑰對資訊解密,從而可確保資訊是由A 傳送的; 登入認證場景則是由客戶端使用私鑰加密登入資訊後傳送給伺服器, 後者接收後採用該客戶端的公鑰解密並認證登入資訊。

下圖是比特幣非對稱加密機制
比特幣非對稱加密機制
2、網路層

網路層封裝了區塊鏈系統的組網方式、訊息傳播協議和資料驗證機制等要素。結合實際應用需求,通過設計特定的傳播協議和資料驗證機制, 可使得區塊鏈系統中每一個節點都能參與區塊資料的校驗和記賬過程, 僅當區塊資料通過全網大部分節點驗證後, 才能記入區塊鏈。

(1)組網方式
區塊鏈系統的節點一般具有分散式、自治性、開放可自由進出等特性, 因而一般採用對等式網路(Peer-to-peer network, P2P 網路) 來組織散佈全球的參與資料驗證和記賬的節點。
按照節點儲存資料量的不同, 可以分為全節點和輕量級節點。前者儲存有從創世區塊到當前最新區塊為止的完整區塊鏈資料, 並通過實時參與區塊資料的校驗和記賬來動態更新主鏈。全節點的優勢在於不依賴任何其他節點而能夠獨立地實現任意區塊資料的校驗、查詢和更新, 劣勢則是維護全節點的空間成本較高。輕量級節點則是儲存一部分割槽塊鏈資料。
(2)資料傳播協議

任一區塊資料生成後, 將由生成該資料的節點廣播到全網其他所有的節點來加以驗證。
比特幣系統的交易資料傳播協議包括如下步驟:
①比特幣交易節點將新生成的交易資料向全網所有節點進行廣播;
②每個節點都將收集到的交易資料儲存到一個區塊中;
③每個節點基於自身算力在區塊中找到一個具有足夠難度的工作量證明;
④當節點找到區塊的工作量證明後, 就向全網所有節點廣播此區塊;
⑤僅當包含在區塊中的所有交易都是有效的且之前未存在過的, 其他節點才認同該區塊的有效性;
⑥其他節點接受該資料區塊, 並在該區塊的末尾製造新的區塊以延長該鏈條, 而將被接受區塊的隨機雜湊值視為先於新區塊的隨機雜湊值。
(3)資料驗證機制
P2P 網路中的每個節點都時刻監聽比特幣網路中廣播的資料與新區塊. 節點接收到鄰近節點發來的資料後, 將首先驗證該資料的有效性. 如果資料有效, 則按照接收順序為新資料建立儲存池以暫存尚未記入區塊的有效資料, 同時繼續向鄰近節點轉發; 如果資料無效, 則立即廢棄該資料, 從而保證無效資料不會在區塊鏈網路繼續傳播。

由網路層設計機理可見, 區塊鏈是典型的分散式大資料技術。全網資料同時儲存於去中心化系統的所有節點上, 即使部分節點失效, 只要仍存在一個正常執行的節點, 區塊鏈主鏈資料就可完全恢復而不會影響後續區塊資料的記錄與更新。這種高度分散化的區塊儲存模式與雲端儲存模式的區別在於,後者是基於中心化結構基礎上的多重儲存和多重資料備份模式, 即“多中心化” 模式;而前者則是完全“去中心化”的儲存模式, 具有更高的資料安全性。
3、共識層
早期的比特幣區塊鏈採用高度依賴節點算力的工作量證明(Proof of work, PoW) 機制來保證比特幣網路分散式記賬的一致性。隨著區塊鏈技術的發展和各種競爭幣的相繼湧現, 研究者提出多種不依賴算力而能夠達成共識的機制, 例如點點幣首創的權益證明(Proof of stake, PoS) 共識和位元股首創的授權股份證明機制(Delegated proof of stake,DPOS) 共識機制等。區塊鏈共識層即封裝了這些共識機制。
4、激勵層
區塊鏈共識過程通過匯聚大規模共識節點的算力資源來實現共享區塊鏈賬本的資料驗證和記賬工作, 因而其本質上是一種共識節點間的任務眾包過程。
以比特幣為例, 比特幣PoW 共識中的經濟激勵由新發行比特幣獎勵和交易流通過程中的手續費兩部分組成, 獎勵給PoW 共識過程中成功搜尋到該區塊的隨機數並記錄該區塊的節點。 因此, 只有當各節點通過合作共同構建共享和可信的區塊鏈歷史記錄、並維護比特幣系統的有效性, 其獲得的比特幣獎勵和交易手續費才會有價值。比特幣已經形成成熟的挖礦生態圈, 大量配備專業礦機裝置的礦工積極參與基於挖礦的PoW 共識過程, 其根本目的就是通過獲取比特幣獎勵並轉換為相應法幣來實現盈利。
(1)發行機制
比特幣系統中每個區塊發行比特幣的數量是隨著時間階梯性遞減的。創世區塊起的每個區塊將發行50 個比特幣獎勵給該區塊的記賬者, 此後每隔約4 年(21 萬個區塊) 每區塊發行比特幣的數量降低一半, 依此類推, 一直到比特幣的數量穩定在上限2 100 萬為止。比特幣交易過程中會產生手續費, 目前預設手續費是萬分之一個比特幣, 這部分費用也會記入區塊並獎勵給記賬者。這兩部分費用將會封裝在每個區塊的第一個交易(稱為Coinbase 交易) 中。雖然現在每個區塊的總手續費相對於新發行比特幣來說規模很小(通常不會超過1個比特幣), 但隨著未來比特幣發行數量的逐步減少甚至停止發行, 手續費將逐漸成為驅動節點共識和記賬的主要動力。同時, 手續費還可以防止大量微額交易對比特幣網路發起的\粉塵" 攻擊, 起到保障安全的作用。
(2)分配機制
比特幣系統中, 大量的小算力節點通常會選擇加入礦池, 通過相互合作彙集算力來提高“挖”到新區塊的概率, 並共享該區塊的比特幣和手續費獎勵。
5、合約層
合約層封裝區塊鏈系統的各類指令碼程式碼、演算法以及由此生成的更為複雜的智慧合約。如果說資料、網路和共識三個層次作為區塊鏈底層“虛擬機器”分別承擔資料表示、資料傳播和資料驗證功能的話, 合約層則是建立在區塊鏈虛擬機器之上的商業邏輯和演算法, 是實現區塊鏈系統靈活程式設計和操作資料的基礎。包括比特幣在內的數字加密貨幣大多采用非圖靈完備的簡單指令碼程式碼來程式設計控制交易過程, 這也是智慧合約的雛形。
比特幣採用一種簡單的、基於堆疊的、從左向右處理的指令碼語言, 而一個指令碼本質上是附著在比特幣交易上的一組指令的列表。比特幣交易依賴於兩類指令碼來加以驗證, 即鎖定指令碼和解鎖指令碼, 二者的不同組合可在比特幣交易中衍生出無限數量的控制條件。其中, 鎖定指令碼是附著在交易輸出值上的“障礙”, 規定以後花費這筆交易輸出的條件; 解鎖指令碼則是滿足被鎖定指令碼在一個輸出上設定的花費條件的指令碼, 同時它將允許輸出被消費。舉例來說,大多數比特幣交易均是採用接受者的公鑰加密和私鑰解密, 因而其對應的P2PKH (Pay to public keyhash) 標準交易指令碼中的鎖定指令碼即是使用接受者的公鑰實現阻止輸出功能, 而使用私鑰對應的數字簽名來加以解鎖。
智慧合約是區塊鏈的核心構成要素(合約層), 是由事件驅動的、具有狀態的、執行在可複製的共享區塊鏈資料賬本上的計算機程式, 能夠實現主動或被動的處理資料, 接受、儲存和傳送價值, 以及控制和管理各類鏈上智慧資產等功能。
智慧合約作為一種嵌入式程式化合約, 可以內建在任何區塊鏈資料、交易、有形或無形資產上, 形成可程式設計控制的軟體定義的系統、市場和資產。
6、區塊鏈的應用場景
區塊鏈目前的主要應用籠統地歸納為數字貨幣、資料儲存、資料鑑證、金融交易、資產管理和選舉投票共六個場景。
7、區塊鏈的現存問題
(1)安全問題
安全性威脅是區塊鏈迄今為止所面臨的最重要的問題。其中, 基於PoW 共識過程的區塊鏈主要面臨的是51% 攻擊問題, 即節點通過掌握全網超過51% 的算力就有能力成功篡改和偽造區塊鏈資料。以比特幣為例, 據統計中國大型礦池的算力已佔全網總算力的60% 以上, 理論上這些礦池可以通過合作實施51%攻擊, 從而實現比特幣的雙重支付。雖然實際系統中為掌握全網51%算力所需的成本投入遠超成功實施攻擊後的收益, 但51% 攻擊的安全性威脅始終存在。基於PoS 共識過程在一定程度上解決了51% 攻擊問題, 但同時也引入了區塊分叉時的[email protected] (Nothing at stake) 攻擊問題。研究者已經提出通過構造同時依賴高算力和高記憶體的PoW共識演算法來部分解決51% 攻擊問題, 更為安全和有效的共識機制尚有待於更加深入的研究和設計。
區塊鏈的非對稱加密機制也將隨著數學、密碼學和計算技術的發展而變的越來越脆弱。據估計, 以目前天河二號的算力來說, 產生比特幣SHA256 雜湊演算法的一個雜湊碰撞大約需要248年, 但隨著量子計算機等新計算技術的發展, 未來非對稱加密演算法具有一定的破解可能性, 這也是區塊鏈技術面臨的潛在安全威脅。
區塊鏈的隱私保護也存在安全性風險。區塊鏈系統內各節點並非完全匿名, 而是通過類似電子郵件地址的地址標識(例如比特幣公鑰地址)來實現資料傳輸. 雖然地址標識並未直接與真實世界的人物身份相關聯, 但區塊鏈資料是完全公開透明的, 隨著各類反匿名身份甄別技術的發展, 實現部分重點目標的定位和識別仍是有可能的。
(2)效率問題
區塊鏈效率也是制約其應用的重要因素。首先是區塊膨脹問題: 區塊鏈要求系統內每個節點儲存一份資料備份, 這對於日益增長的海量資料儲存來說是極為困難的。以比特幣為例, 完全同步自創世區塊至今的區塊資料需要約60GB儲存空間, 雖然輕量級節點可部分解決此問題, 但適用於更大規模的工業級解決方案仍有待研發。其次是交易效率問題: 比特幣區塊鏈目前每秒僅能處理7 筆交易,這極大地限制了區塊鏈在大多數金融系統高頻交易場景中的應用(例如VISA 信用卡每秒最多可處理10 000 筆交易);最後是交易確認時間問題: 比特幣區塊生成時間為10 分鐘, 因而交易確認時間一般為10 分鐘, 這在一定程度上限制了比特幣在小額交易和時間敏感交易中的應用。
(3)資源問題
PoW共識過程高度依賴區塊鏈網路節點貢獻的算力, 這些算力主要用於解決SHA256 雜湊和隨機數搜尋, 除此之外並不產生任何實際社會價值, 因而一般意義上認為這些算力資源是被“浪費”掉了,同時被浪費掉的還有大量的電力資源。隨著比特幣的日益普及和專業挖礦裝置的出現, 比特幣生態圈已經在資本和裝置方面呈現出明顯的軍備競賽態勢,逐漸成為高耗能的資本密集型行業, 進一步凸顯了資源消耗問題的重要性。因此, 如何能有效彙集分散式節點的網路算力來解決實際問題, 是區塊鏈技術需要解決的重要問題。研究者目前已經開始嘗試解決此問題, 例如Primecoin (質數幣) 要求各節點在共識過程中找到素數的最長鏈條(坎寧安鏈和雙向雙鏈) 而非無意義的SHA256 雜湊值。未來的潛在發展趨勢是設計行之有效的互動機制來匯聚和利用分散式共識節點的群體智慧, 以輔助解決大規模的實際問題。
(4)博弈問題
區塊鏈網路作為去中心化的分散式系統, 其各節點在互動過程中不可避免地會存在相互競爭與合作的博弈關係, 這在比特幣挖礦過程中尤為明顯。通常來說, 比特幣礦池間可以通過相互合作保持各自穩定的收益。然而, 礦池可以通過稱為區塊截留攻擊(Block withholding attacks) 的方式、通過偽裝為對手礦池的礦工、享受對手礦池的收益但不實際貢獻完整工作量證明來攻擊其他礦池, 從而降低對手礦池的收益。如果礦池相互攻擊, 則雙方獲得的收益均少於不攻擊對方的收益。當礦池收益函式滿足特定條件時, 這種攻擊和競爭將會造成“囚徒困境”。
8、基於區塊鏈的智慧合約
智慧合約概念最早在1994 年由學者Nick Sz-abo 提出, 最初被定義為一套以數字形式定義的承諾, 包括合約參與方可以在上面執行這些承諾的協議, 其設計初衷是希望通過將智慧合約內建到物理實體來創造各種靈活可控的智慧資產。由於計算手段的落後和應用場景的缺失, 智慧合約並未受到研究者的廣泛關注。
智慧合約是區塊鏈的核心構成要素(合約層), 是由事件驅動的、具有狀態的、執行在可複製的共享區塊鏈資料賬本上的計算機程式, 能夠實現主動或被動的處理資料, 接受、儲存和傳送價值, 以及控制和管理各類鏈上智慧資產等功能。
智慧合約作為一種嵌入式程式化合約, 可以內建在任何區塊鏈資料、交易、有形或無形資產上, 形成可程式設計控制的軟體定義的系統、市場和資產。
智慧合約的執行機理如下
在這裡插入圖片描述
通常情況下,智慧合約經各方簽署後, 以程式程式碼的形式附著在區塊鏈資料(例如一筆比特幣交易) 上, 經P2P 網路傳播和節點驗證後記入區塊鏈的特定區塊中。智慧合約封裝了預定義的若干狀態及轉換規則、觸發合約執行的情景(如到達特定時間或發生特定事件等)、特定情景下的應對行動等。區塊鏈可實時監控智慧合約的狀態, 並通過核查外部資料來源、確認滿足特定觸發條件後啟用並執行合約。

雙重支付問題

雙重支付問題又稱為“雙花”問題,即利用貨幣的數字特性用“同一筆錢”完成兩次或者多次支付。在傳統的金融和貨幣體系中,由於金錢貨幣是物理實體,具有客觀唯一存在的屬性,所以可以避免雙重支付的情況。但在其他的電子貨幣系統中,則需要可信的第三方管理機構提供保證。區塊鏈技術則在去中心化的系統中不借助任何第三方機構而只通過分散式節點之間的相互驗證和共識機制,有效地解決了雙重支付問題,在資訊傳輸的同時完成了價值轉移。區塊鏈技術通過區塊連結形成的時間戳技術加上驗證比特幣是否滿足UTXO(未花費交易)和數字簽名,有效避免了雙重支付的問題。如果有人用同一筆UTXO構造了兩筆付給不同交易方的交易,則比特幣客戶端只會轉發最先被偵聽到的那個。礦工會選擇將那筆交易包入未來區塊,當其中一筆交易所在的區塊後有5個連結的區塊,這筆交易已經得到了6次確認。在比特幣區塊鏈上,6次確認後可以基本上保證比特幣不被雙花。

拜占庭將軍問題

拜占庭將軍問題是分散式系統互動過程普遍面臨的難題, 即在缺少可信任的中央節點的情況下, 分散式節點如何達成共識和建立互信。區塊鏈通過數字加密技術和分散式共識演算法, 實現了在無需信任單個節點的情況下構建一個去中心化的可信任系統。
詳情請看新增連結描述