王啟河
(華北電力大學控制與計算機工程學院,河北 保定 071003)
區塊鏈技術在2008年中本聰發表比特幣白皮書《比特幣:一種點對點電子現金系統》后引起社各界廣泛關注。文中提到構建比特幣系統的基礎技術是區塊鏈技術,區塊鏈中記錄著所有元數據和加密交易信息,從而建立了一個通過點對點技術實現的電子現金系統,使得在線支付的雙方不用通過第三方金融機構直接進行交易。區塊鏈技術避免了傳統中心化系統中高度依賴中央權威機構,信任成本高,可靠性和安全性較低等問題。區塊鏈技術有去中心化、不可篡改、安全性高、可溯源等特點,這些特點使得互聯網向價值互聯網的轉變成為可能。
2014年Vitalik Buterin發表以太坊白皮書《下一代智能合約和去中心化應用平臺》,文中指出了比特幣在智能合約上的不足,并提出了在以太坊上虛擬機上運行的一種圖靈完備的智能合約。智能合約的不斷完善使得區塊鏈的使用不再僅僅局限于虛擬貨幣的交易,在醫療、供應鏈、司法、農業、能源等社會各行各業都起到了關鍵作用。
從2008年首次進入大眾視野以來,區塊鏈技術的各個方面都得到了較為迅速的發展。以區塊鏈的應用范圍和發展演化來看,區塊鏈經歷了區塊鏈1.0、區塊鏈2.0和區塊鏈3.0三個階段。
區塊鏈1.0階段實現了無需第三方機構或組織進行監督或驗證的交易方式,使得跨國交易或跨行交易更容易進行,同時使得交易的隱私性更高。在這個階段主要有比特幣和萊特幣兩種數字貨幣,萊特幣是比特幣的一種代幣。與比特幣相比萊特幣技術原理上與比特幣基本相同,但萊特幣更輕量,使得普通人無專業設備挖礦也成為可能。此階段下,大多數人關注區塊鏈主要是為了對數字貨幣進行投資,并沒有注意到區塊鏈技術的價值。
區塊鏈2.0階段實現了可編程金融系統。受比特幣交易的啟發,人們開始嘗試將區塊鏈應用到包括股票、清算、私募股權等其他的金融領域。區塊鏈2.0的與區塊鏈1.0最大的區別就是智能合約的實現程度不同。在太坊智能合約技術支持下,區塊鏈技術在金融系統方面的應用越來越廣。由Linux基金會在2015年12月主導發起的項目超級賬本Hyperledger Febric也是區塊鏈2.0時代的區塊鏈代表之一。
區塊鏈3.0階段實現了可編程社會。隨著區塊鏈技術的發展,人們對區塊鏈技術的應用不再局限于金融領域,而是向社會各個方面擴展。區塊鏈3.0幾乎會影響到我們生活的方方面面,所以有人說區塊鏈是自從蒸汽機以來人類最偉大的技術。這可能是較為夸張的說法,但不可否認的是,區塊鏈技術將不可避免地對未來的互聯網以及社會各方面產生巨大影響。
區塊鏈的共識機制需要在不同場景下完成共識,不同場景下區塊鏈中的節點數不同,各節點的權限也可能不同。基于節點權限分類,區塊鏈則可以分為公有鏈,私有鏈和聯盟鏈。
公有鏈又稱非許可鏈,是高度去中心化的系統。公有鏈的特點是無需許可任何個人或組織都能自由地進出系統,并且對區塊鏈的讀寫權限都一樣,沒有中心化管理組織;私有鏈通常是單位或組織內部使用的區塊鏈,寫入權限僅限于組織內部,讀取權限有限制地對外開放;聯盟連也叫許可鏈,去中心化程度介于公有鏈和私有鏈之間,采用的是“部分去中心化”結構,一般是有多個機構或組織共同創建的。因為完全的去中心化或完全的中心化系統對于商業系統來說都是不太可行的,聯盟鏈部分去中心化的特點更加符合商業系統所需的提高合作效率的需求。所以聯盟鏈未來在商業領域將會得到更快的發展。
區塊鏈經歷了十幾年的發展,雖然目前沒有一種標準化的開發形式,但我們任然可以根據現有區塊鏈平臺的工作模式的相同點將區塊鏈分為數據層、網絡層、共識層、合約層和應用層五層架構,如圖1所示。

圖1 區塊鏈架構圖
數據層是區塊鏈平臺的最底層,這一層主要是使用默克爾樹以及MPT等數據結構對區塊鏈中數據進行組織管理,以及使用哈希函數和非對稱加密等技術來保證區塊鏈數據的完整性和安全性。
哈希函數也叫散列函數,此函數的功能是將任意長的字符文件轉化成一個固定長的二進制值。一個哈希函數需要滿足快速性、單向性、無碰撞三個特性。哈希函數在區塊鏈中應用十分廣泛,在區塊鏈鏈接指針、數據組織、共識機制中都有所應用。
默克爾樹是一種使用哈希指針構建的組織數據的數據結構。在比特幣中,交易數據在區塊體中被構建成一棵二叉默克爾樹,葉子為交易數據的哈希值,非葉子節點的值為兩個子節點哈希值之和的哈希值。如圖2所示。

圖2 比特幣區塊結構示意圖
以默克爾樹組織交易的目的是可以很快地驗證出所有的交易是否被篡改過,若任意一個交易被篡改,則最后得到的默克爾根都會不同,這是由哈希函數的無碰撞特性保證的。同時,默克爾樹的組織方式可以給出任意一個交易是經過共識驗證的證明路徑,即由樹根到對應交易葉子節點的路徑。默克爾樹在區塊鏈上的使用使得各節點能快速地歸納和校驗區塊中交易數據的完整性和存在性。
區塊鏈采取了點對點(P2P)方式進行組網,消息直接在節點之間傳播。每個節點都具有相同的功能以及地位,不存在中心化設備。每個節點都要承擔路由,區塊數據驗證,區塊數據傳播,交易信息打包,發現新節點等功能。P2P的組網方式下,任何一個節點宕機系統仍能正常運行。
區塊鏈網絡的工作原理如圖3所示,在比特幣中網絡的傳播機制有如下6步:

圖3 區塊鏈網絡工作原理示意圖
(1)節點產生交易,將交易數據向全網廣播;
(2)礦工節點把在一段時間內收集到的所有交易打包,產生一個新區塊;
(3)礦工節點對產生的新區塊進行工作量證明;
(4)當礦工節點完成工作量證明,立即向全網廣播此新區塊;
(5)所有節點對新區塊進行驗證,如果驗證通過就接收此新區塊;
(6)所有區塊以此新區塊的哈希值作為父區塊哈希值進行新一輪的區塊生成。
在一區塊鏈分布式的系統中,使互相不信任的節點如何在規定時間內對某一數據或提案達成一致的機制就叫做共識機制。區塊鏈對共識機制提出“不可能三角”的評價標準,即去中心化,可擴展性和安全性三個特性不可能同時滿足。不同類型的區塊鏈由于去中心化程度和參與共識節點數量不同,所以使用的共識機制也不相同。公有鏈中參與共識的節點數量巨大,并且去中心化程度較高,一般使用PoW、PoS和DPoS等共識機制;私有鏈中節點數量少,且去中心化程度低,一般使用Paxos和Raft等共識機制;聯盟鏈中節點數量少,有“部分去中心化”的特點,一般使用的是PBFT共識機制。本文在第3節對各種共識機制有詳細的說明。
區塊鏈中的智能合約是在區塊鏈中一段當觸發一定條件后可自動執行的代碼。智能合約在比特幣上的支持程度并不高,原因是比特幣在設計時并沒有考慮到智能合約的其他用途,編寫智能合約使用的語言是腳本語言,只能做一些簡單的驗證和交易控制。在以太坊出現后,在區塊鏈中增加了一種圖靈完備的語言對智能合約進行編寫,擴展了智能合約的應用范圍,使區塊鏈進入了區塊鏈2.0階段。智能合約在保留了區塊鏈去中心化,不可篡改等特性的基礎上又增加了可編程的特點,增強了區塊鏈的可擴展性。本文在第4節對智能合約有更詳細的說明。
目前,區塊鏈逐步進入區塊鏈3.0階段,各種基于區塊鏈技術的應用正在逐步發展。區塊鏈最初產生的數字貨幣應用在現在仍廣受人們關注,一些人對數字貨幣投資的熱情依舊很高。區塊鏈在醫療共享、供應鏈溯源、物流溯源、司法存證等方面都有較多的應用。除了使用區塊鏈技術開發獨立應用的方向以外,對區塊鏈底層技術進行集成,構建供底層技術服務的平臺也是區塊鏈技術的應用。比如以太坊和Hyperledger Febric等平臺。
區塊鏈中的核心問題就是共識問題,要保證所有節點能在規定時間內達成共識。區塊鏈中的共識機制需要考慮去中心化程度、安全性、擴展性、資源消耗、交易確認時間、吞吐量和一致性等性能。
PoW的使用最早是在1993年,由Cynthia等首先提出PoW并應用于解決垃圾郵件的問題上。而在區塊鏈中,PoW被應用于決定哪個節點能夠獲取記賬權,以達到對區塊的共識目的。所有節點在打包好一個區塊后,需要根據難度值產生一個隨機數,使得整個區塊頭的哈希值在難度值所規定的范圍內。率先完成隨機數尋找的區塊立即向全網廣播此區塊,其余節點驗證通過后以此區塊作為父區塊開始尋找下一個區塊的隨機數即表示接收了此區塊。
PoW共識機制的去中心化程度很高,沒有任何中心化組織或機構,所有節點獲取記賬權的機會都是按照算力分配,即“一CPU一票”。但在區塊鏈實際運行過程中,出現了許多節點合作挖礦的現象,產生了大量礦場或礦池這樣的集中挖礦機構。各礦場礦池之間的算力競爭使得區塊鏈中算力大幅上漲,導致出塊速度變快。為了避免出塊速度過快或過慢比特幣中設置了一個難度值,難度值的大小是區塊頭的哈希值的十六進制前面連續為0的個數。難度值越大,滿足條件的哈希值就越少,搜尋難度越高。比特幣中規定在產生2016個區塊后就需要對難度值調整,使出塊速度維持在10分鐘左右。調整公式為:

其中target為調整后的目標難度值;target為當前難度值;time為當前難度值下產生2016個區塊所用的時間;time為期望產生2016個區塊所用的時間,即20 160分鐘。
PoW共識機制在能量消耗上非常大。有研究表明,僅中國在比特幣挖礦上的消耗將在2024年達到達到296.59 Twh的峰值,并相應地產生1.305億噸的碳排放量。這相當于捷克共和國和卡塔爾的年化溫室氣體排放總量。
PoS在2012年由點點幣(PPcoin)首次采用了PoS機制作為全網對區塊的共識機制。PoS機制中提出了幣零的概念:假設一個用戶擁有10個貨幣,且在90天內該用戶一直未使用這10個貨幣,那么該用戶的幣齡為90×10,即900。一旦用戶使用了這10個貨幣,那么該用戶的幣齡就變為0了。幣齡的作用是在礦工挖礦時可以使用自己的幣齡來降低挖礦難度,使用的幣齡越多,挖礦難度越低。在成功出塊后,所使用幣的幣齡將會被清空并且這部分幣將會被鎖定一段時間不能進行挖礦,以此確保系統的相對公平。
在PoS機制下,節點之間競爭記賬權不再僅僅只依靠算力,對節點擁有代幣的數量也有了比拼。一定程度上降低了在算力上的能源消耗,但因其本質上還是在通過哈希計算尋找隨機數進行共識,對能源仍有較大需求。對于PoS機制的安全性,主要是累積權益攻擊危害較大,但幣齡清齡機制使得累積權益攻擊的代價也會很大,作惡者將以大量代幣的代價進行一次攻擊,收益可能小于投入消耗。所以PoS機制是對攻擊者進行利益綁定來保障系統的安全性。
DPoS共識機制的原理是通過投票推選出若干個代理人節點,這些代理人節點進行區塊的驗證和上鏈。類似于“董事會決策”的方式進行,即每個股東以其所持有的股票進行選舉投票自己的代理人節點,由得票數多的若干節點作為組成董事會進行決策,且在規定時間后重新進行投票。因為選舉的過程并沒有大量的計算,所以DPoS的能源消耗遠低于PoW機制和PoS機制。
DPoS機制在共識速度上相對于PoW機制和PoS機制也有較大的提升,同時在安全性上也有較為安全的保障。即便惡意節點發動合謀攻擊,共同選舉一個惡意節點作為代理人節點,由于大部分節點選取的是誠實代理人,這個惡意代理人也無法左右共識結果。DPoS機制中還存在部分節點投票積極性不高,甚至從未參與投票;沒有快速剔除惡意節點等問題。目前,有許多研究人員針對這些問題對DPoS通過增加獎懲機制、熔斷機制、信譽機制等方式進行了改進。
Paxos共識機制是分布式共識機制的起源,許多共識機制都是由其發展而來。Paxos機制在區塊鏈中一般只作為部分私有鏈的共識機制。Paxos共識機制能源計算消耗小,去中心化程度較高,但其應用范圍小,僅適用于具有較高容錯性的系統之中。
Paxos將系統中的角色分為提議者(Proposer),決策者(Acceptor),和最終決策學習者(Learner)三類。Proposer負責提出提案同時也參與決策;Acceptor負責參與決策;Learner不參與決策,只對最終的決策結果進行接收。Paxos共識算法流程如圖4所示,共識流程主要分為了三個階段:

圖4 Paxos共識流程示意圖
(1)Prepare階段:Proposer對收到的Prepare請求進行編碼為n,并向所有Acceptor轉發Prepare;Acceptor收到Prepare后檢查是否響應過編碼大于等于n的提案,若沒有則向Proposer回復一個Promise,保證不再接受提案編碼小于等于n的提案;
(2)Accept階段:Proposer收到超過半數的Promise后,向所有Acceptor發送Propose請求;Acceptor收到Propose后如果接受請求則向Proposer響應Accept;
(3)Learn階段:Proposer收到超過半數的Accept后,表示對編號為n的提案已經達成共識,Proposer向所有Learner發送形成的提案決議。
PBFT共識算法由Miguel Castro等人在BFT基礎上改進提出,PBFT將BFT算法復雜度由指數級降到多項式級別,使得拜占庭容錯問題得到實踐上的解決。PBFT共識效率高,能耗低,但由于消耗和共識速度都與參與節點數量相關,所以一般使用PBFT機制的系統中不能容納過多的節點。
PBFT機制將節點分為客戶端節點,主節點和備份節點三類,其中主節點和備份節點統稱為副本節點。PBFT共識流程如圖5所示。

圖5 PBFT共識流程示意圖
共識流程主要有以下5個階段:
(1)Request階段:客戶端節點向主節點發送請求;
(2)Pre-Prepare階段:主節點向所有備份節點轉播請求;
(3)Prepare階段:所有副本節點對收到的請求進行驗證,驗證成功后向所有備份節點發送準備信息;
(4)Commit階段:當副本節點收到2+1個驗證通過的準備信息后(為允許容納的最大拜占庭節點數量)向其余副本節點發送一條確認信息;
(5)Reply階段:當副本節點收到驗證通過的2+1條確認信息后,向客戶端節點發送一條響應信息,客戶端節點收到+1條響應信息則表示成功對提案達成共識。
基于PBFT算法,目前出現了許多相關的改進算法。文獻[22]提出一種K-PBFT聚類算法,通過聚類分組減少參與共識節點,從而減少通信量;文獻[23]提出一種IPBFT算法,引入節點的自證機制,使得在長期共識過程中的共識效率提高,是一種優化共識過程的算法。
智能合約最初的定義是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議。在比特幣系統中,實現智能合約的方法是使用一種棧式編程環境,即比特幣腳本語言進行編程。主要目的是完成一些交易的控制以及轉賬的驗證等操作。比特幣腳本語言并不是圖靈完備的語言,僅僅只有不到200種命令,很難完成一些較為復雜的操作。以太坊中使用的智能合約語言則為Solidity語言和Serpent語言,都是圖靈完備的語言。Solidity語言還是一種面向對象的語言,能夠對智能合約進行復雜的邏輯處理,并且具有很強的合約表達能力。這使得以太坊平臺有很好的可擴展性,近年來基于以太坊平臺的應用也越來越多。
智能合約的生命周期分為為協商、開發、部署、運行、銷毀5個階段。其中協商和開發兩個階段完成的是智能合約的產生,部署階段完成的是智能合約的發布,運行和銷毀則是完成智能合約的執行。為了能夠安全執行,智能合約不能直接運行在節點的外部環境,而是運行在一種與外界隔離的沙箱環境中,如容器和虛擬機。目前,Hyperledger Febric使用的是一種輕量級的Docker容器作為智能合約的沙箱,而以太坊使用的沙箱是EVM虛擬機技術。
隨著區塊鏈的不斷發展,區塊鏈的應用領域越來越廣泛,區塊鏈所承擔的價值不斷增加,同時安全風險也不斷增加,也受到了較為廣泛的關注。
區塊鏈分叉是指在同一區塊鏈上從某個節點開始出現了不止一條并行的鏈。區塊鏈中由于網絡延遲,可能會出現兩個或多個礦工同時挖出區塊,此時這幾個新區塊都為合法最長鏈的區塊。但這種情況不能一直維持下去,當下一個區塊被發現追加到某一個區塊后面,其他區塊就成為非法區塊被拋棄。
區塊鏈系統協議的更新也會造成分叉。當舊系統協議認可新系統協議時:由于新系統區塊不認可舊系統區塊,會導致短暫的分叉,但新協議鏈最后一定會成為最長鏈,這種分叉叫做軟分叉;當舊系統協議不認可新系統協議時:新舊系統區塊互相不認可,會成分叉成兩條并行的鏈,這種分叉叫做硬分叉。2016年以太坊中的The DAO項目籌集了超過1 150萬個以太幣,但由于其智能合約中的漏洞遭到黑客攻擊,黑客盜取了約360萬個以太幣。以太坊對此投票決定是否回撤區塊,最終85%的人支持回撤,進行了硬分叉。但舊鏈并沒有因此消亡,至今仍在運行,被稱為經典以太坊。
雙花攻擊又叫雙重支付,指攻擊者將同一貨幣進行兩次不同的交易,是數字貨幣必須要解決的問題。在區塊鏈中,避免雙花攻擊的方式是通過交易驗證貨幣的來源是否合法,回溯該貨幣的所有交易,直到回溯到最初產生該貨幣的區塊為止。雖然隨著區塊鏈的增長,回溯一筆交易的花費也隨之增加,甚至可能需要回溯到創始區塊,但對于保障區塊鏈安全來說,這些消耗也是值得的。
51%攻擊是指區塊鏈系統中某個節點擁有全網超過51%的算力,可以通過在主鏈上分叉對區塊鏈中已經確認的交易回撤,以達到雙重支付的目的。原理是區塊鏈中認定最長鏈為合法鏈,攻擊者以某個已經確認的區塊為起點發起分叉,因為擁有超過51%的算力,所以最后一定能成為最長鏈,而原本主鏈上起點區塊之后的所有區塊都成為非法區塊,里面的交易也被回撤了。在實際系統中,某個節點想要達到51%算力幾乎是不可能的,但一些礦場和礦池進行算力集中化,使得區塊鏈的安全性也受到了一定威脅。
區塊鏈的未來需要考慮到區塊鏈平臺的可擴展性和多平臺的可交互性,多鏈技術、側鏈技術、跨連技術這三種技術有望完成區塊鏈這一目標。
多鏈技術是使在同一個區塊鏈平臺上存在多條并行的鏈,且這些鏈之間的交易互不影響的技術。實現多鏈的方法有分片,即對區塊鏈進行區域分片。不同區域在不同的鏈上進行交易,以達到并發執行,提高交易吞吐量的目的。多鏈技術還需要解決在各個并行鏈之間通信,跨區域交易等問題。
側鏈技術是指在主鏈之外還存在一條獨立的鏈,這條鏈上擁有自己的共識機制、智能合約、交易類型、賬本等,通過雙向定錨的方式使得數字資產能在主鏈和側鏈之間相互轉移。側鏈技術的實現有單一托管模式、聯盟模式、SPV模式、驅動模式和混合模式五種模式。
跨鏈技術能將各個獨立區塊鏈平臺連接起來,起到區塊鏈平臺之間橋梁的作用。跨鏈技術有公證人機制、側鏈/中繼、哈希鎖定和分布式私鑰控制四種技術。跨鏈技術如果運用成功對區塊鏈技術有巨大價值,完成多平臺之間交互是實現價值互聯網的關鍵一步。
本文對區塊鏈數據層、網絡層、共識層、合約層和應用層五層架構進行了逐一介紹,并重點闡述了共識機制和智能合約,最后對區塊鏈的安全和未來發展方向進行了介紹。隨著區塊鏈的發展,將會有更多基于區塊鏈的應用會進入我們生活的各方面,是未來實現價值互聯網的重要手段,值得對其進行深入研究。區塊鏈技術對共識機制、安全性和可擴展性的要求將會越來越高,所以目前應該對共識機制的改進、區塊鏈安全和區塊鏈平臺交互等方面進行著重研究。