999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

區塊鏈原理及關鍵技術*

2020-10-15 01:44:38李馥娟王振力梁廣俊
計算機與生活 2020年10期
關鍵詞:智能

王 群,李馥娟,王振力,梁廣俊,徐 杰

江蘇警官學院計算機信息與網絡安全系,南京 210031

1 引言

數學為密碼學的研究奠定了堅實的理論基礎,數學領域的研究在推動了密碼技術發展的同時,密碼技術的應用也使一些基礎數學問題的研究取得了突破。與此同時,密碼學及相關學科領域一些成熟的技術在隨著應用環境和需求變化進行深度融合后,摧生了一系列新的技術應用,區塊鏈便是其中之一。

2008年,中本聰(Satoshi Nakamoto)在其論文“Bitcoin:a peer-to-peer electronic cash system”[1]中首次提出了一種以區塊鏈(blockchain)為底層技術的比特幣(Bitcoin)數字貨幣,并實際運行了“挖礦”過程,以此證明了論文中提出的比特幣理論體系。比特幣開創了去中心化數字貨幣的先河,比特幣系統基于區塊鏈這一特殊類型的分布式數據庫,通過挖礦激勵機制與貨幣發行之間的關聯,再利用共識機制實現交易的確認和比特幣在數據庫上的安全轉移,在不借助任何第三方可信機構支持的前提下,實現了相互間不需要信任的人與人之間貨幣的交換。當區塊鏈技術在比特幣中取得了巨大成功后,Buterin于2013年12月在比特幣基礎上提出了以太坊(Ethereum)概念[2],將其定義為一個除繼承了比特幣中數字貨幣(在以太坊中稱為以太幣(Ether))功能外,還提供了圖靈完備(即能夠模擬任何圖靈機)的編程語言,將智能合約(smart contract)應用到區塊鏈系統。智能合約與區塊鏈的結合,一方面使區塊鏈借助智能合約的可編程性來簡化對分布式節點操作的復雜性,另一方面使智能合約借助區塊鏈的去中心化機制在非信任環境中得以有效實現。相比于比特幣,以太坊的設計是通過在區塊鏈中引入智能合約并優化相關的協議,為分布式應用程序和去中心化自治組織提供一個開發平臺。以太坊的出現,使區塊鏈應用開始從單一的金融走向電子政務、教育、醫療、物聯網等更加廣泛的領域。

區塊鏈被定義為一種按時間順序來組織數據區塊,不同區塊之間按序形成鏈條狀連接的數據結構,借助這種數據結構來構建數字賬本[3]。賬本中存放的是交易信息,保存和運行賬本的節點通過分布式網絡連接起來,再通過數據加密、分布式共識、經濟激勵等機制來保證在一個沒有中心化授權的開放網絡環境中實現賬本數據的安全共享。

在區塊鏈系統中,每個分布式節點都具有“存儲”功能,用于保存賬本數據和用戶交易等信息,每筆交易和結果需要通過“P2P(peer-to-peer)網絡”共享給其他節點,節點在接收到數據后并不是直接保存下來,而是通過“共識機制”對數據進行驗證,成功后保存到賬本中,一旦保存下來就“不可篡改”。賬本中的信息之所以不能修改,是因為使用了“加密”機制,通過哈希技術對區塊進行串接,利用公鑰加密機制對賬本數據進行加密處理和記賬。在公有鏈中,任何用戶在下載安裝了客戶端軟件后,就可以加入系統,并通過“激勵”機制讓節點爭相維護這個系統。因此,分布式存儲、共識機制、不可篡改、數據加密和激勵機制構成了區塊鏈的基本屬性。

區塊鏈中所涉及到的技術都不是最新的,例如分布式存儲在云計算中就已廣泛使用,很多年前的BitTorrent軟件就是基于P2P通信方式,哈希算法的使用就更加廣泛(如電子郵件加密、電子證據固定等),積分激勵機制早已被各大電商、移動運營商成功應用等。為此,可以將區塊鏈認為是綜合運用各項成熟技術的一種應用創新。

區塊鏈可以按許可權限分為公有鏈和聯盟鏈(私有鏈是應用和管理上更為嚴格的聯盟鏈)兩大類。其中,公有鏈是一個完全去中心化的區塊鏈系統,任何人都可以通過下載安裝一個專用客戶端軟件加入系統,并利用系統生成的一對非對稱密鑰進行數據讀取或發送交易,也可自由離開系統;聯盟鏈是一個部分去中心化或多中心化的區塊鏈系統,一般由多個業務相關機構(如銀行、證券公司等)協同創建和管理,參與機構視具體需要確定一定數量的運行節點,并有限度地分配操作權限。公有鏈是區塊鏈應用的拓荒者,各種復雜技術的解決和新技術、新功能的測試多是在公有鏈環境中完成,比特幣和以太坊是目前最有影響的公有鏈應用;聯盟鏈是區塊鏈家族中未來應用的主力軍,是企業應用的重點和區塊鏈得以落地的關鍵,典型的聯盟鏈平臺有Hyperledger Fabric(超級賬本)、Ripple、BigchainDB、TrustSQL等。另外,根據新節點加入時是否需要進行身份認證和訪問授權操作的不同,可以將區塊鏈系統分為許可鏈和非許可鏈兩類,其中公有鏈通常稱為非許可鏈,而聯盟鏈一般稱為許可鏈。

隨著應用領域的不斷拓展,區塊鏈技術得到不斷發展和完善:源于比特幣的區塊鏈技術構建了一個分布式的“全球賬本”,創造了區塊鏈1.0時代;以智能合約為標志的區塊鏈2.0實現了應用程序在區塊鏈上的上傳/下載和有效執行,將整個區塊鏈系統演進成一臺“全球計算機”;區塊鏈3.0的提出,使運行在企業操作系統(enterprise operation system,EOS)上的智能合約開發變得更加便捷。經濟學上的“三元悖論”(mundellian trilemma)原則也適合于區塊鏈系統,即在去中心化、安全與高效三者之間最多只能同時滿足兩個目標。其中,在公有鏈中實現了去中心化和安全,而無法實現運行的高效,例如比特幣系統中每10 min創建一個新區塊,其性能遠遠不能滿足一些時效性較強的跨區域甚至是全球性業務的要求;在聯盟鏈中提高了性能和安全性,但需要在去中心化上做出讓步,通過引入傳統的授權管理實現半中心化模式。

區塊鏈的特點概括為:(1)去中心化(decentralized)[4]。區塊鏈涉及到數據生成、驗證、記賬、傳輸、存儲和維護等環節,這些過程都沒有依賴任何第三方機構,而是通過相應的算法和協議來實現。(2)去信任(trustless)。整個區塊鏈系統中,參與數據交換的每個節點之間無需相互信任,整個系統的運行規則和結果公開透明,所有數據全部公開,在系統約定的規則和時間范圍內任何一個節點是不能也無法欺騙其他節點的。(3)集體維護(collectively maintain)。在比特幣、以太坊等公有鏈中,區塊鏈采用了經濟激勵機制去刺激系統中節點參與新區塊的生成(挖礦),并通過共識機制讓新區塊添加到區塊鏈上。(4)可靠數據庫(reliable database)。區塊鏈系統采用分布式數據形式,讓每一個參與節點都能夠獲得一份完整的數據庫備份。除非能夠同時控制整個系統中51%的節點,否則單個節點對數據庫的修改是無效的,也無法影響其他節點上的數據內容。因此,參與系統中的節點越多,算力越強,系統中的數據安全性也就越高。(5)可編程(programmable)。從以太坊開始,區塊鏈技術可提供圖靈完備的靈活的可編程功能,為區塊鏈技術與智能合約的結合提供了實現途徑,進而實現各類去中心化應用。(6)隱私保護(anonymity)[5]。由于節點之間是無需信任的,也就無需公開個人真實身份信息,因此系統中每個參與節點的隱私都得到了有效保護。

2 區塊鏈的基礎架構

體系結構和實現協議是網絡的兩大核心要素,分層結構是計算機網絡中廣泛采用的關系模型,區塊鏈系統也采用了分層架構。如圖1所示的是區塊鏈2.0采用的6層結構[6],從下到上依次是數據層、網絡層、共識層、激勵層、合約層和應用層。

Fig.1 Blockchain infrastructure圖1 區塊鏈基礎架構

2.1 數據層

數據層位于整個體系結構的最低層,負責將一段時間內接收到的交易數據存入正在創建的數據區塊中,再通過特定的哈希函數和Merkle樹數據結構將區塊中存入的交易數據進行封裝,并在上層協議的協助下,生成一個符合算法約定的帶有時間戳的新區塊,再通過相應的共識機制鏈接到主鏈上。在此過程中,數據層主要涉及到數據結構、數據模型和數據存儲等與分布式數據庫相關的內容[7],主要包括數據區塊、哈希函數、鏈式結構、Merkle樹、時間戳、非對稱加密等技術要素[8],確保區塊鏈分布式賬本中數據的可靠性和穩定性。

2.2 網絡層

區塊鏈是一種基于互聯網的創新應用,不同節點之間的組織形式對區塊鏈系統的整體性能起著關鍵作用。區塊鏈網絡層采用不受任何權威節點控制或層次模型約束的完全去中心化的P2P(對等網)組網方式,以此來實現區塊鏈系統中各個節點之間的互聯,為交易數據和新區塊創建信息在節點之間的快速傳輸及正確性驗證提供通信保障,并為每個節點參與新區塊記賬權的競爭提供公平的網絡環境。

與互聯網中廣泛采用的客戶機/服務器(client/server,C/S)通信與存儲架構不同的是,在區塊鏈系統中,P2P網絡在組網結構和通信機制方面具有獨特的應用優勢:在組網方式上,每個節點既是資源的提供者又是資源的使用者,每個節點在網絡中的身份平等,這正是區塊鏈(尤其是公有鏈)去中心化應用的突出特點;在通信機制上,P2P為區塊鏈中各節點之間基于TCP/UDP協議的對等通信提供了服務保障,確保了節點間鏈路的可用性和通信的靈活性。

2.3 共識層

共識層借助于相關的共識機制,在一個由高度分散的節點參與的去中心化系統中就交易和數據的有效性快速達成共識,確保整個系統所有節點記賬的一致性和有效性。其中,一致性是指所有節點中保存的區塊主鏈中已確認的區塊完全相同,而有效性是指每個節點發送的交易數據都能夠被存放在新區塊中,同時節點新生成的區塊數據也能夠被鏈接到區塊鏈上。

在早期的比特幣系統中,設計者采用了高度依賴于節點算力競爭的工作量證明(proof of work,PoW)機制[1],隨著區塊鏈應用的發展,研究者又提出了一些符合不同區塊鏈應用要求的共識機制,如應用于點點幣(PPCoin)的權益證明(proof of stake,PoS)機制[9],應用于比特股(Bitshares)的股份授權證明(delegated proof of stake,DPoS)機制[10]等。

2.4 激勵層

激勵層主要通過提供激勵機制刺激網絡中的每個節點參與區塊鏈中新區塊的生成(挖礦)和驗證工作,以保證去中心化區塊鏈系統的安全、有效和穩定運行。激勵層和共識層的運行具有相同的機制,以比特幣為例,共識過程是趨利的,每個節點參與共識的目的是追求自身利益的最大化,激勵是對已達成共識的一種貨幣發行和分配機制。其中,比特幣系統每10 min生成一個新區塊,同時給生成該區塊的節點(礦工)獎勵一定數量的比特幣,以此完成比特幣系統貨幣的發行過程。

從第一個區塊創世區塊(genesis block)產生后的4年中(大約產生了21萬個區塊),每個區塊獲得50個比特幣的獎勵,在之后的4年中每個區塊獲得25個比特幣的獎勵,依次類推。整個系統最后會產生2 100萬個比特幣。另外,新區塊的創建者(礦工)還會從每筆交易中獲得相應的交易費用(手續費)。新建區塊的獎勵和每筆交易的手續費都會存入新建區塊的第1個交易位置(coinbase)中;根據區塊鏈的共識和激勵機制,節點的算力越大則“挖礦”成功的概率越高。為了提高“挖礦”的成功率,多個小算力節點會通過組建一個“礦池”將參與節點的算力匯合起來,在挖到礦后再根據各自貢獻的算力大小來分得不同股份(share)的新建區塊獎勵和交易手續費。

2.5 合約層

智能合約是部署在區塊鏈上的用計算機程序來實現日常合同條款的內容及執行過程的協議。早在1994年,Szabo就在文獻[11]中提出了智能合約的概念,但直到比特幣的出現,智能合約才借助區塊鏈技術引起了業界的關注。

由于比特幣中采用的是一種非圖靈完備、不具備復雜循環和流程控制、功能簡單的腳本語言,其實質是嵌入到比特幣交易上的一組指令,因此比特幣中的腳本只能算是智能合約的雛形。在以太坊中內置了一套圖靈完備的編程語言,用戶可以根據需要在以太坊平臺上編寫復雜的智能合約,實現各類去中心化的應用。智能合約的應用,使區塊鏈技術不再局限于比特幣應用,而成為一項具有普適性的底層技術框架。

2.6 應用層

區塊鏈技術在公有鏈中的應用最為成熟,其中,在比特幣中的應用主要是實現去中心化的數字加密貨幣系統,而在以太坊中除繼承了數字加密貨幣(以太幣)的功能外,還針對目前“一切皆Web”的現狀,借助智能合約的強大功能,區塊鏈技術開始支持各類去中心化應用(decentralized application,DApp)[12]。DApp最常見的應用情景是一個常規的Web前端應用與一個或多個智能合約進行交互。

聯盟鏈反映了區塊鏈應用價值的多樣性和豐富性,提升了區塊鏈應用的廣度和深度,可以使區塊鏈技術最大限度地得以落地生根。目前,聯盟鏈主要面向企業級的應用,其中超級賬本Hyperledger是Linux基金會于2015年發起的開源項目,包含多個并行的子項目,其中Fabric的成熟度較高。為了實現通過軟件開發工具包(software development kit,SDK)訪問區塊鏈系統中的賬本、交易、事件、權限管理等資源,Fabric提供了gRPC API以及封裝應用程序接口(application programming interface,API)的SDK,SDK提供了對Node.Js、Python、Java、Go等語言的支持,可通過對底層gRPC接口的調用與智能合約進行通信,以構建功能更加豐富的應用場景。

3 區塊鏈數據結構

Nicklaus Writh曾提出一個著名的公式:算法+數據結構=程序。算法是程序的靈魂,數據結構是程序的核心。在區塊鏈中,針對不同領域、不同場景開發的程序是否能夠快速、高效、安全地實現預定任務,在很大程度上取決于是否設計或選用了合適的數據結構。區塊鏈是一種分布式系統,區塊結構決定著交易信息的存儲形式,Merkle樹用于組織和管理交易數據,鏈式結構發揮著串接區塊的功能,區塊鏈交易的數據結構描述了比特幣和以太坊的交易形式以及交易地址的生成特點,交易數據的存儲方式從宏觀角度分析區塊鏈底層數據結構的設計依據和發展趨勢。

3.1 區塊結構

不同區塊鏈平臺的數據結構在部分細節上雖然存在差異,但主體框架基本相同。以比特幣為例,每個區塊由區塊頭(Header)和區塊體(Body)兩部分組成[13],其結構如圖2所示。其中,區塊頭封裝了當前版本號(Version)、前一區塊哈希(Prev-block Hash)、用于當前區塊工作量證明的目標難度值(Bits)、用于工作量證明算法的隨機數(Nonce)、用于驗證區塊體交易哈希的Merkle根(Merkle-root)以及當前區塊的生成時間戳(Timestamp)等信息,具體描述如表1所示。

在區塊鏈頭部,“時間戳”字段在區塊鏈的形成和維護過程中發揮著極其重要的作用:一是不同區塊按照生成時間來確定前后關系;二是用于維護共識算法的最長鏈規則,即當一個節點通過共識算法產生了一個新區塊并將其廣播到全網后,其他節點在接收到該新區塊數據時必須立即停止當前的共識運算(挖礦),而對新區塊數據進行驗證。否則,即使通過共識運算得到了新區塊,但由于生成時間晚(以時間戳為準),也得不到其他節點的認可。

Fig.2 Data block structure圖2 數據區塊結構

Table 1 Description of Bitcoin block head structure function表1 比特幣區塊頭結構功能描述

區塊體中存放的是已經驗證的一段時間內產生的交易數量以及完整的交易記錄,這些信息構成了區塊鏈中最為核心的數據結構,即交易的賬本。所有的交易記錄基于Merkle樹的哈希計算,最后生成Merkle根(最后的哈希值),并記入區塊頭部的“Merkle根”字段。

3.2 鏈式結構

區塊鏈的鏈式結構是一個以區塊為元素的鏈表,其中邏輯相鄰元素之間以時間作為關聯。鏈式結構的形成描述相鄰區塊之間關聯性的建立,而GHOST協議用于維護鏈式結構中主鏈的唯一性。

3.2.1 鏈式結構的形成

區塊鏈是一個將每一個區塊以生成時間為序鏈接而成的分布式數據庫。在區塊鏈結構中,對區塊頭中的前一區塊哈希(Prev-block Hash)、隨機數(Nonce)和Merkle根等元數據進行兩次SHA256運算即可得到該區塊的哈希值。在圖2中,前一區塊哈希(Prevblock Hash)字段用于存放前一區塊的哈希值,所有區塊按照生成順序以Prev-block Hash字段為哈希指針鏈接在一起,就形成了一條區塊鏈表,即一個完整的賬本。鏈式結構中相鄰區塊之間的關系如圖3所示。

利用區塊頭中的“Merkle根”(Merkle-root)字段,可以通過哈希運算驗證區塊頭部和區塊體中的交易數據是否被篡改;利用區塊頭中的“前一區塊哈?!保≒rev-block Hash)字段,可以通過哈希運算驗證該區塊之前直至創世區塊的所有區塊是否被篡改;依靠Prev-block Hash字段,所有區塊之間依據創建時間環環相扣,如果其中任何一個區塊被篡改,都將會引發在其后生成的所有區塊的哈希值發生連鎖改變。利用鏈式結構的可驗證性特點,當一個節點從不可信節點下載了某些區塊或整個區塊時,可以通過哈希運算驗證每個區塊的正確性。

3.2.2 鏈式結構的維護

在區塊鏈中,由于所有節點在一個沒有可信第三方統一協調的環境中幾乎同時在同一個區塊上進行挖礦,這樣有可能出現多個節點同時挖出不同新區塊的現象,此現象稱為“分叉”,根據區塊鏈的工作機制,最終只允許其中一個區塊得到確認。當發生分叉時,花費了最多算力的鏈被確定為主鏈,主鏈是最長鏈,位于其他分支上的交易都將被引用或忽略。分叉不但影響了區塊鏈系統的穩定性,還容易引起“雙花”(雙重花費)攻擊[14]。當產生了分叉時,位于比特幣分支節點上的區塊稱為孤塊,并被丟棄,而以太坊引入了GHOST(greedy heaviest observed subtree)[15]協議來處理分叉。

由于比特幣的出塊(產生新區塊)時間為10 min,因此產生分叉的概率并不高,而以太坊的出塊時間為15 s,受區塊鏈共識算法和網絡運行機理等因素對網絡事件響應機制的制約,在15 s的時間內,當一個新區塊還沒來得及得到其他節點的驗證和接受之前,其他節點可能在相同的區塊位置上挖出了新的區塊,從而頻繁地產生分叉。為了體現以太坊挖礦的公平性,并保持以太坊系統穩定運行,以太坊采用了GHOST協議將產生的分叉盡快進行合并。

Fig.3 Relationship between adjacent blocks圖3 相鄰區塊之間的關系

GHOST協議是一種主鏈選擇算法,其思想是基于“利益均沾”的原則,讓挖出新區塊的節點都會受益。如圖4所示,假設節點A是一個在網絡位置、帶寬、算力等方面具有絕對優勢的礦池,當該節點開始從主鏈的某一區塊位置(假設圖4中的3號區塊)開始挖礦時,因其具有較高的出塊概率,所以理應擁有對新挖出區塊的記賬權,并從中獲得收益。但是,為了鼓勵區塊鏈網絡中其他節點都積極參與挖礦,協議規定節點A對在同一位置挖出新區塊的其他礦工將通過引用方式給予相應的獎勵(具體獎勵規則如圖4所示)。GHOST協議有效維護了主鏈的唯一性,防止出現永久分叉現象,同時也保持了區塊鏈系統的穩定運行。

分叉會帶來交易的不確定性和系統運行的不穩定性。目前,比特幣在連續產生6個區塊之后,當前的交易確定為不可逆,因此其交易確認時間為60 min;以太坊在連續產生12個區塊之后,交易已基本不可逆,因此其交易確認時間為3 min。需要說明的是,當區塊間距離達到8時,還未被引用的分叉上的叔塊將得不到獎勵,而自動廢棄。另外,在叔塊上挖出來的區塊也得不到獎勵,以太坊這樣規定的目的是為了激勵節點在發現了最長區塊鏈時盡快合并,而不是在自己的分支鏈上繼續進行挖礦。

3.3 Merkle樹

1989年,密碼學家Merkle提出了Merkle樹的概念[16],它是一種典型的二叉樹。Merkle樹是區塊鏈中最重要的數據結構,在區塊鏈中使用它來組織交易數據[17]。比特幣使用了最簡單的二叉Merkle樹,每個區塊都擁有一個獨立的Merkle樹,樹的一個葉子節點就是一個交易哈希(比特幣使用雙SHA256哈希)。葉子節點的數量必須是雙數,否則就復制最后一個葉子節點的數據。從下而上,同層的節點兩兩成對進行哈希運算,形成上一層的節點值。重復該過程,直到最后一個節點(樹根)。根的哈希值成為區塊中所有交易的唯一標識,并將它保存到區塊頭部的“Merkle根”字段中,用于工作量證明。Merkle樹具有以下優點:

(1)極大地提高了區塊鏈的運行效率。Merkle樹的形成過程是一個頻繁的哈希過程,區塊鏈中使用的SHA256的運行效率較高,對節點性能的要求較低。另外,區塊中所有的交易信息都遞歸到Merkle根,簡化了對整個區塊鏈系統的管理。

(2)極大地提高了區塊鏈的可擴展性。Merkle樹可以實現交易數據與哈希值的分離,在一些輕量級的應用中只需包含Merkle根的哈希值,而不必封裝區塊體中的底層數據,這使得區塊鏈技術可以高效地運行在智能手機、物聯網等計算和存儲能力受限的設備上。

(3)可支持“簡化支付驗證”(simplified payment verification,SPV)協議[18]。SPV協議的設計思想是將區塊鏈節點變成一個輕量級節點,即在不需要同步下載整個區塊鏈的數據的情況下,僅依靠本區塊中某一交易節點到Merkle根的路徑信息,就可以對“交易”進行驗證。例如,僅需圖2中的節點Hash 7、Hash 56和Hash 5678即可驗證“交易8”的存在性和正確性。從區塊鏈的運行機制來看,要驗證一筆交易,需要遍歷所有的區塊找到與該筆交易相關的所有交易并進行逐個驗證,才能知道交易支付的可靠性。但SPV簡化了此過程,極大地降低區塊鏈運行所需的帶寬和驗證時間,并使得僅保存部分相關區塊鏈數據的輕量級客戶端成為可能。

Fig.4 GHOST protocol principle圖4 GHOST協議的工作原理

為了提高區塊產生的效率和對節點中賬戶狀態數據的查找能力,以太坊在計算Merkle根時使用了Merkle Patricia樹[19]。以太坊和比特幣的區塊中雖然具有相同的交易數據,但在以太坊中狀態數據經常發生變化,且產生的數據量較大。為此,為了提高運行效率,以太坊在創建新區塊時,僅計算在新區塊中賬戶狀態發生了變化的分支,而未發生變化的分支將被直接引用。

3.4 區塊鏈交易的數據結構

交易(transaction)是雙方或多方以貨幣為媒介的價值交換,其實質是將比特幣從一個賬本轉移到另一個或多個賬本中。區塊鏈的交易與銀行的交易類似,通常就是轉賬,具體到每一筆交易,同樣包括從哪兒來(交易輸入地址)、到哪里去(交易輸出地址)和發生了哪些變化(交易的數目)。通過交易過程,可實現數字貨幣資產的創建和轉移,也可以對每筆交易進行溯源和找到所有的歷史記錄,直到挖礦所得的比特幣(coinbase)。

3.4.1 比特幣交易的數據結構

Fig.5 Data structure of Bitcoin transaction圖5 比特幣交易的數據結構

比特幣使用如圖5所示的基于交易模型的數據結構,每筆交易包括交易輸入(transaction input)和交易輸出(transaction output)兩部分,在某筆交易過程中可以將一個或多個賬戶中的比特幣作為輸入,轉入到另一個或多個賬戶中。為了完成交易過程,每筆交易還提供了當前交易軟件的版本(Version)、用于將交易寫入區塊的鎖定時間(Lock Time)以及交易的輸入數量(#vin)和輸出數量(#vout)等功能字段。

每筆交易輸入主要由上筆交易的哈希(Prev-tx Hash)、上筆交易的輸出索引(Index)、輸入腳本(Script Sig)、輸入腳本長度(Script Sig Len)和交易輸入序列號(Sequence)組成;每筆交易的輸出主要包括轉賬金額(Value)、輸出腳本(Script-PubKey)和輸出腳本的長度(Script-PubKey Len)。解鎖腳本(輸入腳本)與輸入引用到的輸出中的鎖定腳本(輸出腳本)的執行過程同步進行,用于驗證本筆交易是否有效,當解鎖腳本滿足鎖定腳本的條件時,則輸入有效。比特幣系統中的腳本語言是一種基于堆棧的執行語言,主要有P2PKH、P2PK、MS(僅限15個密鑰)、P2SH和OP_Return等[20]。交易中每個字段的功能描述如表2所示。

比特幣使用交易輸入和交易輸出進行支付操作。具體到某筆交易輸出來說,在該交易中的錢還沒有花出去之前,它就是一筆還沒有被花費掉的交易輸出,即未花費的交易輸出(unspent transaction outputs,UTXO)。與現金支付不同的是,現金支付的找零是由收款人負責,而UTXO模型中找零是發起者自己進行設置;現金支付的面值是固定的,而UTXO中的面值不固定,是根據不同的交易而定的。因此,在UTXO模型的交易過程中,支付方不僅要指出接收方的地址,還要指明找零地址,找零地址可以是支付方的地址,也可以由支付方指定一個地址。

當一筆交易的輸出沒有任何另一筆交易的輸入與之對應時,說明該輸出中的比特幣未被花費。對于某個比特幣地址來說,其UTXO的比特幣之和即為該賬戶的比特幣余額。另外,對于UTXO中的每筆輸出都需要使用鎖定腳本將比特幣鎖定在賬戶中,當交易過程中需要引用UTXO中的輸出時,需要使用該輸出賬戶的公鑰來驗證簽名的正確性,通過解鎖腳本來解鎖引用賬戶地址中的比特幣。

3.4.2 以太坊交易的數據結構

比特幣的數據結構采用基于交易的模型,其特點是可以快速驗證每筆交易,但缺點是無法對用戶余額進行高效查詢。為了提高對交易狀態和余額的查詢效率,使區塊鏈平臺支持更加廣泛的應用,以太坊提出了基于賬戶的模型。

針對某一賬戶來說,不同時刻可能存在不同的狀態,反映了賬戶中各屬性值(如以太幣余額、從該賬戶地址發出去的交易數、合約狀態數據的Merkle Patricia樹根、合約代碼的哈希值等)隨時間的變化情況,一旦發生了某筆交易,涉及該交易的賬戶狀態將會發生變化。以太坊的最大特點是在區塊鏈中使用了智能合約,因此以太坊中的賬戶分為外部賬戶(externally owned account,EOA)和合約賬戶(contract account,CA)兩種類型,其中EOA一般指分配給自然人并用其私鑰進行保護且不存在任何代碼與之關聯的賬戶,而CA是分配給智能合約的被合約代碼控制的賬戶。

區塊鏈中的賬戶是地址的抽象描述,EOA和CA也是地址的兩種不同表現形式,兩類賬戶都共用同一個地址空間,即采用相同的數據結構。其中,EOA的地址由其公鑰加密后生成,其獲取較為容易,在以太坊錢包的客戶端可以創建,而CA的地址是在創建合約時由創建者的地址和該地址發生過的交易數量計算得到。兩類賬戶都可以實現對以太幣的持有、余額查詢、交易發送等管理功能,但由于CA是通過功能豐富的腳本程序控制,因此可以實現更多的個性化管理功能,如查看賬戶的接收記錄、生成多簽名的錢包等。區塊鏈中的交易(如轉移以太幣)由EOA發起,而CA可以觸發執行合約代碼。以太坊中的EOA和CA的應用特點如圖6所示。

Fig.6 Accounts in Ethereum圖6 以太坊中的賬戶

3.4.3 區塊鏈交易地址

現實生活中,當人們需要進行存錢、轉賬等一系列操作時,首先要前往銀行開個賬戶,領取銀行分配的一串數字帳號(銀行卡號),帳號的密碼由用戶設定。而在區塊鏈系統中,賬戶不需要由中心機構來開設,而是通過密碼學原理來產生。本小節以比特幣系統中的地址生成為例進行介紹[21],以太坊的實現方法和過程與此基本相同。

地址針對的是具體的賬戶,主要用于各類交易。比特幣系統的地址生成過程如圖7所示,具體為:

(1)通過調用操作系統底層的偽隨機數生成器(pseudorandom number generator,PRNG)來生成一個256位的隨機數作為私鑰。

(2)私鑰經過橢圓曲線算法生成公鑰。比特幣和以太坊都使用Secp256k1橢圓曲線算法K=k×G(其中,K為公鑰,k為私鑰,G為一個生成點),由于生成點G是預定的,因此可以由一個確定的k來單向生成一個確定的K。

(3)通過A=RIPEMD160(SHA256(K))(其中,A為公鑰哈希值),對生成的公鑰進行SHA256和RIPEMD160雙哈希運算,生成一個20 Byte的摘要結果,即Hash160公鑰哈希。

(4)在生成的公鑰哈希的頭部添加一個軟件的版本號(比特幣主網絡版本號為“0×00”),然后進行兩次SHA256運算,取運算結果的前4 Byte,將其添加到公鑰哈希的后面作為“檢驗”(Checksum)值,將最后的結果通過Base58Check編碼后,就得到最終的比特幣的地址。

Fig.7 Bitcoin transaction address formation process圖7 比特幣交易地址的形成過程

公鑰生成過程是不可逆的,即不能通過公鑰反推出私鑰。比特幣的私鑰通常保存在比特幣錢包文件中,丟失了私鑰就意味著丟失了對應地址的全部比特幣資產。

3.5 交易數據的存儲方式

底層數據結構的設計直接決定著數據的讀寫和查詢性能。與傳統的集中式管理的關系數據庫系統相比較,目前比特幣和以太坊對數據查詢的性能要求并不高,但對數據寫入性能的要求較高,尤其區塊中交易數據和交易狀態數據需要頻繁寫入。而且,作為一個完全去中心化的分布式系統,比特幣和以太坊要求對數據庫的部署和應用要盡可能簡單和快捷,且不能占用較大的存儲空間和CPU資源,以鼓勵具有一般算力的節點加入其中。

早期比特幣版本中使用的數據庫是Berkeley DB[22],從2012年后開始轉向使用LevelDB[23]。由于以太坊和超級賬本推出時間相對較晚,因此直接使用了LevelDB作為底層數據庫。聯盟鏈中的Hyperledge在fabric0.6版本之前使用的底層數據存儲系統為levelDB,但從fabric1.0版本開始同時提供了對levelDB和CouchDB[24]的支持。目前,區塊鏈系統的數據存儲大多使用levelDB。LevelDB是由Google開發的針對寫操作進行了優化的新一代分布式數據存儲系統,其底層存儲采用了基于日志排序合并樹(log structured merge tree,LSM-tree)結構的Key-Value單機數據庫。在區塊鏈中,當內存中的數據需要持久寫入磁盤時,首先通過遞歸長度管理前綴(recursive length prefix,RLP)編碼將JSON格式數據轉化成字符串(Value),然后計算Value的數字簽名(Key),最后將<Keyi,Valuei>對存儲在levelDB中。LevelDB具有較高的隨機寫和順序讀/寫性能,非常適合于查詢操作較少但寫操作頻繁的區塊鏈應用場景。

4 共識機制

共識機制是分布式系統中實現去中心化信任的核心,它通過在互不信任的節點之間建立一套共同遵守的預設規則,實現節點之間的協作與配合,最終達到不同節點數據的一致性。由于區塊鏈的本質是一個去中心化的分布式賬本數據庫,因此區塊鏈中的共識機制既要體現分布式系統的基本要求,又要考慮區塊鏈中專門針對交易記錄、需要解決拜占庭容錯以及可能存在的惡意節點篡改數據等安全問題。因此,區塊鏈中的共識機制更具有針對性,可根據不同的區塊鏈應用場景選擇符合不同運行需求的共識機制。

自從1982年Lamport等學者在文獻[25]中提出“拜占庭將軍問題”以來,有關共識算法的大量研究集中在理論探討方面。但從2008年比特幣進入人們的視線以來,各類共識機制開始從理論步入實踐,并隨著比特幣自身的迭代、以太坊平臺的發展以及智能合約和超級賬本等基于區塊鏈應用的豐富,已有的共識算法在實踐中得到完善,同時伴隨新應用場景的不斷出現,符合相應需求的共識機制相繼得到應用。本章主要介紹目前在區塊鏈中具有代表性的共識機制和算法:早期比特幣中高度依賴節點算力的工作量證明(PoW)機制[26]、點點幣中區塊生成與節點所占有股權成反比的權益證明(PoS)機制[27]、比特股中按既定時間段輪流產生區塊的授權股份證明機制(DPoS)[28]和在Hyperledger(超級賬本)和Antshares(小蟻)中基于實用拜占庭容錯(practical Byzantine fault tolerance,PBFT)機制[29]等,表3對各算法的主要特性進行了對比。

4.1 PoW共識機制

1997年,26歲的英國??巳卮髮W博士亞當·巴克(Adam Back)提出哈?,F金(Hashcash)的概念[30],其思想類似于密碼學的RSA算法:計算兩個質數之積是容易的,但分解兩個質數之積是困難的。哈希現金的思想體現在一些數學結果很難發現但易于校驗?;谶@一數學特征,可以設計這樣的協議:提供一個有一定計算量的質數之積,只要對方能夠將其進行分解,就允許建立連接。這一協議要求對方必須是誠意的,而且為了表示此誠意需要付出一定的算力來解決提出的問題。例如,為了防止接收到垃圾郵件,郵件接收者可以在郵件的消息頭中增加一個哈希值,該值在生成時需要包括收件人地址、發送時間及鹽值(salt)等信息,可以對該哈希值設置一定的條件(如前10位必須是0),只有滿足該條件的郵件才被認為是一個合法的郵件。郵件發送者只有經過不斷嘗試(改變salt值),直到得到符合要求的哈希值為止,除此之外沒有任何捷徑。另外,生成該哈希值時的時間戳可以防止一次計算結果的重復使用,避免垃圾郵件制造者利用同一個哈希值來發送多份郵件。

Table 3 Comparison of PoW,PoS,DPoS and PBFT consensus mechanisms表3 PoW、PoS、DPoS和PBFT共識機制對比

哈?,F金的本質是一種PoW系統,即愿意并完成了一定計算工作量且提供了證明的節點被認為是可信賴的。在比特幣區塊鏈中就采用了高度依賴于節點算力的PoW機制,每個參與共識的礦工基于各自的算力相互競爭來共同解決一個求解復雜但驗證容易的SHA256數學難題,最快解決該難題的節點將獲得區塊記賬權和系統給予的比特幣獎勵。即在已預置區塊頭中工作量證明難度的前提下,節點通過不斷調整隨機數Nonce來計算區塊頭部元數據的雙SHA256哈希值以滿足以下條件:

其中,H為單向哈希函數,比特幣使用SHA256;h為區塊頭部數據,主要包含前一區塊哈希、Merkle根等內容;d為當前工作量證明難度。PoW在區塊鏈網絡中的共識流程如下:

(1)當某一節點產生了一筆新交易時,為了盡快完成交易過程并得到別人的認可,交易及相關信息會立即廣播給區塊鏈網絡中的所有節點。節點在接收到該交易數據時,為了能夠完成挖礦操作便將其按序添加到當前區塊體中。

(2)根據Merkle根的生成規則,每個節點計算自前一次區塊生成以來已接收到的交易構成的Merkle根,并填寫區塊頭中各字段的元數據,其中Nonce的初始值設置為0。

(3)從0開始將Nonce每次按1遞增,依次計算區塊頭的雙SHA256值,直到該值小于或等于工作量證明難度的設定值時,該Nonce就是工作量證明的解。

(4)當某個節點找到了符合工作量證明要求的Nonce值后,為了獲得對該區塊的記賬權(獲得了記賬權就獲得了獎勵),就需要盡快將該區塊以廣播形式向全網分發。

(5)其他節點在接收到新區塊后,為了盡快挖出下一個區塊,就會對接收到的區塊進行驗證,如果正確,便將該新區塊添加到主鏈上,并在該區塊的基礎上去競爭下一個區塊。

挖礦的實質是所有參與節點集中各自算力去尋找由多個前導0構成的區塊頭哈希值,工作量證明難度d的設定值越小,區塊頭哈希值的前導0就越多,尋找到合適隨機數的概率越低,挖礦的難度就越大。為了適應硬件技術的快速發展及計算能力的不斷提升,比特幣每2 016塊就會調整一次工作量證明難度,以控制區塊的平均生成時間(10 min)始終保持不變。

PoW共識機制的特點是各參與節點緊緊依賴于自己的算力以獲得對新區塊的記賬權,同時獲得相應的獎勵(該過程也實現了比特幣的發行),在此共識過程中引入了經濟激勵機制,從而使更多的節點為了追求經濟利益而愿意加入到挖礦過程中,這種獨特的共識機制不但有利于系統的長久穩定運行,而且增強了網絡的可靠性與安全性。

PoW共識機制的優勢是借助比特幣特有的價值屬性激勵節點參與挖礦,并在共識過程中通過競爭區塊的記賬權實現了比特幣的貨幣發行和交易支付行為,采用的驗證和競爭機制保障了系統的安全性和去中心化。但PoW共識過程完全依賴各節點的算力,從而引起大量資源的浪費,與當前綠色發展的理念格格不入。同時,長達10 min的出塊時間,使PoW機制不適合于額度小、交易量大的商業應用,其可擴展性受到了限制。

4.2 PoS共識機制

PoS共識機制是PoW的替代方案,是為解決PoW共識機制中一直被詬病的資源浪費以及為了滿足更高要求的安全性而提出來的。PoS設置的記賬規則與PoW算法類似,即所有礦工基于算力競爭滿足特定條件的哈希值,最先成功求得解的礦工便擁有記賬權。兩種算法的不同之處在于,PoW共識是基于節點的算力來求解符合條件的哈希值,而PoS則是尋找最高權益的節點,即PoS通過權益證明來替代PoW中的基于節點哈希算力的證明來競爭新區塊的記賬權。

PoS算法中的權益可以概括為節點擁有的資產,誰擁有資產越多,誰將會更有可能在下一個區塊記賬權的競爭中勝出。在不同的應用場景中,資產所表示的含義有所不同。PPCoin中的資產為“幣齡”,即節點擁有數字貨幣的數量與持有時間的乘積,其值越大節點獲得新區塊記賬權的概率也就越大。為了避免PoW算法中因算力過于集中帶來的問題,在PoS算法中,如果某一節點獲得了記賬權,則其“幣齡”將會自動清零。基于“幣齡”的算法設計非常類似于現實生活現象,即某人擁有代幣的數量越多、時間越長,就越希望維護幣值穩定,也越愿意維護系統的正常運行;基于可驗證秘密共享(verifiable secret sharing,VSS)的G.O.D coin tossing算法[31]中的資產為“代幣”,持有代幣越多的節點將有更高的概率被選中作為新區塊記賬者;為了防止節點在離線狀態下累積“幣齡”,黑幣(Blackcoin)[32]在其2014年6月發布的PoS2.0白皮書中,用“余額”作為資產來鼓勵節點盡可能保持在線,以提高系統的安全性和系統運行的穩定性;為了解決PoW算法在挖礦過程中產生的能源消耗問題,以太坊將從早期的使用PoW的共識機制向著PoW和PoS混合,再到最后實現單一的PoS共識機制過渡。

與PoW算法相比,PoS算法擁有一些明顯的優點,如放棄單純的算力競爭而節約了能源,采用清零機制解決了算力過于集中,限制只有在線用戶才能獲得收益從而解決“公地悲劇”(tragedy of the commons)的發生等。但PoS更容易出現分叉,安全性和容錯性相對較低,某些擁有權益的節點無意全力投入到記賬競爭中等。

4.3 DPoS共識機制

為了有效解決PoS共識機制存在的不足,2014年4月,Larimer等在PoS的基礎上提出了DPoS共識算法[33],以提高持幣者參與挖礦的積極性和主動性。DPoS共識機制也稱為股份授權證明算法,即每個節點相當于一個股東,所有股東選擇一定數量的代表作為共同信任的委托人,由該委托人來幫助大家記賬。DPoS共識機制與PoS的最大區別表現為:

(1)委托人的選擇。委托人必須是大家信任的股東節點,每個股東節點將其持有股份的數量作為選票多少投給自己信任的某個節點,在規定的時間內獲得選票最多且有意愿為大家服務的股東節點將作為委托人(總共101個)。

(2)激勵與懲罰。根據系統約定,每個委托人在規定的時間范圍內輪流負責新區塊的生成、轉發和驗證,并可以從每筆交易中獲得一定數額的交易費(transaction fees)。為了防止委托人不作為,系統規定每個委托人必須事先繳納金額相當于獲得一個新區塊記賬權獎勵100倍的保證金,如果某個委托人沒有在規定的時間內完成新區塊的創建工作,股東將會收回選票,并將該委托人降為普通股東,同時保證金也會被沒收[34]。這樣,委托人為了能夠獲益,必須保持永久在線。

基于DPoS共識機制的區塊鏈系統是一個中心化(針對委托人)和去中心化(針對所有股東)的混合體,每個節點都能夠通過投票決定自己的委托人,有限的委托人輪流記賬,大幅度減少了參與記賬競爭的節點數,提高了共識驗證的效率。而且每一個委托人的工作狀態都受到投票者的監督,在確保節點真實性的同時,也能夠使那些雖然擁有較少資源(算力)但具有較強責任心的節點有機會成為委托人而獲益。

4.4 PBFT共識機制

與PoW、PoS和DPoS不同的是,拜占庭容錯(Byzantine fault tolerance,BFT)[35]機制無需通過競爭來確定記賬者,而是讓系統中的節點以投票方式來產生新區塊,并實現系統中共識結果的一致性,而且不會出現分叉現象。根據分布式系統的CAP理論,任何一個系統在C(consistency,一致性)、A(availability,可用性)和P(partition tolerance,分區容錯性)三者中最多能夠同時實現兩項,這就使得BFT在滿足一致性和可用性的前提下,只能弱化分區容錯性。由于BFT機制具有強一致性(這是共識機制的前提),因此各種基于BFT的衍生算法廣泛應用于區塊鏈網絡,如超級賬本和Antshares等多個區塊鏈系統都使用了PBFT共識機制。

PBFT通過優化算法將計算復雜度從指數級降到多項式級,解決了BFT運行效率低的不足。PBFT共識機制主要包括共識達成、檢查點協議(check point)和視圖轉換(view-change)3個部分。其中,PBFT共識達成分為以下5個過程(如圖8所示):

(1)請求(propose)。當客戶端(client)向主節點發起一個請求時,便產生一個新的視圖(view)。其中,PBFT中的節點分為主節點(primary)和副本節點(replica)兩種類型,1個PBFT區塊鏈網絡中的主節點只有1個,其他節點都是副本節點;視圖表示當前所有節點身份的狀態信息,當視圖轉換協議更換了一個主節點時,視圖也會隨之發生變化。

(2)預準備(pre-prepare)。主節點在收到客戶端的請求消息后,首先對其進行編號,然后將計算得到的預準備消息發給所有的副本節點。在此過程中,用到了哈希算法、數字簽名等方式。

(3)準備(prepare)。副本節點在收到主節點發送的預準備消息后,驗證消息的合法性。驗證通過后,副本節點分別計算準備消息,然后將結果發送給其他節點。與此同時,各節點對自己收到的準備消息進行驗證,當通過驗證的合法準備消息數量大于等于2f+1(f為惡意節點數)時,將預準備消息和準備消息寫入日志,并向其他節點發送確認消息。

(4)確認(commit)。節點接收到確認消息,并驗證其合法性。如果通過驗證的合法確認消息的數量大于等于2f+1,將完成消息的證明,并將證明結果發送給客戶端。

(5)回復(reply)。客戶端對接收到的由各節點回復的證明消息進行驗證,當通過驗證的消息數量大于等于2f+1時,客戶端確認完成請求。否則,客戶端需要重新發起一輪全新的請求過程。

Fig.8 PBFT consensus building process圖8 PBFT共識達成過程

在采用PBFT共識機制的區塊鏈網絡中,主節點代表獲得記賬權的節點,而客戶端請求代表交易信息。

在PBFT共識過程中,還用到了檢查點協議和視圖轉換協議[36-37]。其中,檢查點協議的功能是實現節點狀態的一致性。當某個節點因網絡延時或中斷等原因導致從某一編號開始的請求消息沒有執行時,檢查點協議通過周期性地執行同步操作,將系統中的節點同步到某一個相同的狀態,并定期刪除指定時間點之前的日志數據,以節約節點存儲空間;視圖轉換協議的功能是在主節點不能正常工作時,重新從現有的副本節點中選出一個新的節點作為主節點,繼續PBFT共識過程。

由于PBFT共識中可以生成新區塊的節點(primary節點)是唯一的,因此不會存在分叉現象[38]。但由于每個節點都需要頻繁地接收從其他節點發送過來的交易數據,同時也要將本節點的交易數據盡快發送出去,因此網絡的開銷較大,導致基于PBFT共識機制的區塊鏈的系統性能不高,只能滿足規模不大的聯盟鏈應用場景。

5 智能合約

5.1 區塊鏈中的智能合約

傳統意義上的合約(或合同)是指雙方當事人基于意思表示合致而成立的法律行為。1994年,美國計算機科學家Nick Szabo提出了智能合約(smart contract)的概念:一套以程序代碼指定的承諾以及執行這些承諾的協議。智能合約的設計初衷是在沒有任何第三方可信權威參與和控制的情況下,借助計算機程序,編寫能夠自動執行合約條款的程序代碼,并將代碼嵌入到具有價值的信息化物理實體,將其作為合約各方共同信任的執行者代為履行合約規定的條款,并按合約約定創建相應的智能資產。伴隨著區塊鏈應用從比特幣發展到以太坊和超級賬本,智能合約也發生了一次華麗蛻變,尤其是借助區塊鏈的去中心化基礎架構,使得智能合約得以在去信任的可執行環境中實現。區塊鏈觸發了智能合約的生機和活力,智能合約摧生了區塊鏈技術更加廣泛的應用場景。

廣義的智能合約是指運行在區塊鏈上的計算機程序。狹義的智能合約可以認為是運行在區塊鏈基礎架構上,基于約定規則,由事件驅動,具有狀態,能夠保存賬本上資產,利用程序代碼來封裝和驗證復雜交易行為,實現信息交換、價值轉移和資產管理,可自動執行的計算機程序。目前,根據所使用的編程語言和運行環境的不同,將比特幣中的智能合約稱為腳本型智能合約,將主要運行在以太坊和超級賬本中的智能合約稱為圖靈完備型智能合約,而將正在研發中的kadena項目[39]中的智能合約稱為可驗證合約型智能合約[40]。

(1)腳本型智能合約。由于比特幣中的腳本僅包含指令和數據兩部分,其中涉及到的腳本指令(也稱為“操作碼”,Opcode)只需要完成有限的交易邏輯,如編寫比特幣中UTXO的鎖定腳本和解鎖腳本,不需要復雜的循環、條件判斷和跳轉操作,因此比特幣中的腳本型智能合約是一種基于堆棧的功能有限且編寫相對容易的簡單執行程序,支持的指令不到200條。

(2)圖靈完備型智能合約。腳本語言被設計成為僅在有限范圍內執行有限功能的簡單執行語言,是非圖靈完備的語言。使用腳本語言編寫的交易指令雖然能夠滿足比特幣應用,但無法適應以太坊平臺的開發需求。目前,以太坊主要使用Solidity[41]和Serpent[42]兩種智能合約開發語言。其中,Solidity是一種語法上類似于JavaScript的專門針對運行在以太坊虛擬機(environment virtual machine,EVM)上的智能合約開發而設計的高級編程語言,也是以太坊平臺主推的智能合約開發語言;Serpent語言的設計類似于Python,具有高效易用的編程風格,是專門針對智能合約的特征而開發的高級語言。在Hyperledger Fabric中采用GO、Java等通用語言編寫運行在Docker容器中的智能合約,GO和Java都是通用性較強的圖靈完備語言,能夠實現基于聯盟鏈智能合約開發中所需要的應用邏輯。

(3)可驗證合約型智能合約??沈炞C語言Pact的語法類似于LISP語言,用于編寫運行在區塊鏈Kadena上的智能合約,可實現合約的數據存儲和授權驗證等功能。Pact語言采用非圖靈完備設計,不支持循環和遞歸,以防止在復雜合約的編程過程中可能存在的安全漏洞以及因此而帶來的風險。用Pact語言編寫的智能合約代碼直接嵌入在區塊鏈上運行,不需要事先編譯成為運行在特定環境(如以太坊EVM)的機器代碼。

5.2 區塊鏈智能合約運行機制

由于區塊鏈應用的多樣性,在不同平臺上使用的智能合約的運行機制也不盡相同。本節主要選擇目前最具代表性的以太坊開發平臺,介紹智能合約的運行機制(如圖9所示),主要包括以下階段:

(1)智能合約代碼的生成。在合約各方就傳統意義上的合同內容達成一致的基礎上,通過評估確定該合同是可以通過智能合約實現的(是可編程的),然后由程序員利用合適的開發語言將以自然語言描述的合同內容編碼成為可執行的機器語言。

(2)編譯。利用開發語言編寫的智能合約代碼一般不能直接在區塊鏈上運行,而需要在特定的沙箱環境(以太坊為EVM,超級賬本為Docker容器)中執行,因此在將合約文件上傳到區塊鏈之前需要利用編譯器對原代碼進行編譯,生成符合沙箱環境運行要求的字節碼。

(3)提交。智能合約的提交和調用是通過“交易”(transaction,Txn)來完成。當用戶以交易形式發起提交合約文件后,通過P2P網絡進行全網廣播,各節點在進行驗證后存儲在區塊中。

Fig.9 Smart contract operation mechanism圖9 智能合約運行機制

(4)確認。被驗證后的有效交易被打包進新區塊,經過共識機制,新區塊添加到區塊鏈的主鏈。根據交易生成智能合約的賬戶地址,之后可以利用該賬戶地址通過發起交易來調用合約,節點對經驗證有效的交易進行處理,被調用的合約在沙箱中執行。

另外,主要出于對安全、效率和可擴展性的考慮,一些智能合約在運行時需要區塊鏈以外信息的支撐,這些鏈外信息的提供,從源頭上必須保證是可靠、可信的。

5.3 區塊鏈智能合約的實現技術

根據運行環境的不同,目前智能合約主要集中在比特幣、以太坊和超級賬本3類應用場景中。

5.3.1 比特幣中智能合約的實現技術

比特幣是基于交易的密碼貨幣,它不像基于賬戶的密碼貨幣(如以太幣)那樣可以直接查詢賬戶的余額,而需要通過UTXO來計算交易地址的余額。比特幣的每筆交易由多個交易輸入和多個交易輸出組成,交易輸入中包含著UTXO和解鎖腳本,交易輸出中包含著比特幣的數量和鎖定腳本。當發生一筆交易時,每個UTXO的解鎖腳本和鎖定腳本同時執行,并根據結果決定是否能夠完成本筆交易。腳本直接嵌入在區塊鏈的核心代碼中,由比特幣錢包(bitcoin core)生成并執行。另外,Kadena的智能合約也采用嵌入到區塊鏈中并與區塊鏈代碼一起執行的運行方式。

5.3.2 以太坊中智能合約的實現技術

由于以太坊中的智能合約使用了圖靈完備語言,因此合約編寫過程中容易產生可能被非法利用的安全漏洞和惡意代碼,將直接威脅到區塊鏈運行的安全性,并可能導致無法挽回的后果,如2016年6月發生的著名的The DOA事件[43]。如果以太坊中的智能合約使用比特幣中的非圖靈完備語言,其功能將會受到極大限制;如果讓智能合約不加控制地直接在區塊鏈上運行,則面臨巨大的安全隱患。為此,以太坊中的智能合約運行在EVM沙箱中,通過沙箱環境限制合約代碼的運行。沙箱(Sandboxie)是一種通過預置的安全策略來限制程序運行行為的執行環境,運行在EVM中的合約與區塊鏈宿主之間以及不同合約之間被沙箱隔離,互不干擾,限制了合約的執行和影響范圍。

不同于標準的存儲器結構,EVM中的程序代碼并沒有存放在常規的RAM(random access memory)和外部存儲介質中,而是保存在虛擬的ROM(readonly memory)中。為了滿足SHA256算法和橢圓曲線加密算法的運行要求,EVM提供了大小為256位的簡單棧式結構。EVM部署在以太坊節點上,負責合約的執行。當合約在EVM中初始化時,將創建新的合約賬戶信息,包括賬戶地址、存儲空間和主體代碼等內容。

為了防止因人為或設計缺陷導致的區塊鏈資源消耗,以太坊智能合約引入了gas計費機制。合約創建與調用、賬戶中存儲數據的訪問、在EVM上運行操作碼等涉及到合約創建和運行的過程,都需要按相應標準支付相應數量的gas。當EVM代碼創建過程中所需的gas數量大于賬戶的gas余量時,不但新的合約無法創建,而且賬戶中剩余的gas將被清零。gas計費機制為智能合約的運行提供了有效保障。

5.3.3 超級賬本中智能合約的實現技術

Docker容器是一個使用廣泛的、開源的沙箱環境,Hyperledger Fabric中的智能合約chaincode(鏈碼)就運行在輕量級的Docker容器中,并通過gRPC協議與相應的Peer節點(即存儲賬本、chaincode等關鍵數據,并執行背書及chaincode代碼等特定程序的物理節點)進行交互?;贒ocker容器具有的安全隔離功能,避免了區塊鏈宿主程序遭受容器中惡意合約的攻擊,同時防止運行在不同容器中的合約之間的相互干擾。chaincode的運行過程主要包括:

(1)打包(package)。將chaincode安裝在Peer節點,包括創建包和對包簽名。具體是指將用開發語言(多使用GO語言)編寫的源代碼按照chaincode部署規范(chaincode deployment spec,CDS)重新定義,并通過簽名來檢查和確認chaincode的所有者。如果要讓chaincode擁有多個所有者,首先需要創建一個被簽名的chaincode包(SignedCDS包),然后讓這個包依次被每個所有者進行簽名。

(2)安裝(install)。將CDS規定格式的chaincode安裝在一個將要運行該合約的Peer節點上。chaincode只被安裝在合約所有者的背書節點上,安裝的實質是代碼的編譯過程。

(3)實例化(instantiate)。調用生命周期系統chaincode(lifecycle system chaincode,LSCC),在channel[44](即基于交易規則將區塊鏈網絡劃分后形成的邏輯單元)上啟動一個Docker容器,實現合約與channel的綁定。實例化過程,會生成對應channel的Docker鏡像和Docker容器,可以指定背書策略。在成功進行了實例化后,處于激活狀態的chaincode將監聽并接收交易請求。

(4)更新(upgrade)。更新是一個類似于實例化的交易,即將新版本的chaincode與channel綁定。更新后其他與舊版本綁定的channel仍舊運行舊版本的chaincode。

(5)刪除(delete)。刪除chaincode對應的Docker容器以及每個安裝合約的背書節點上的SignedCDS包。在正在開發的版本中,將用stop和start交易的指令來停止或重啟chaincode,而不需要直接將其刪除。

超級賬本中的智能合約基于模塊化的可擴展架構,將共識服務從背書節點分離開來,形成獨立的功能模塊,可擴展性強,共識效率高,作為聯盟鏈應用,適合于供應鏈、銀行、證券機構等行業的應用場景。

6 區塊鏈應用現狀和存在的挑戰

6.1 區塊鏈應用現狀

與傳統的數據庫系統相比,區塊鏈在去中心化、數據按時序存儲及防篡改、交易的可溯源與不可否認、自動執行的智能合約等方面具有絕對的優勢,這使得區塊鏈技術不僅在數字加密貨幣領域彰顯了獨有的優勢,同時在社會管理、金融、經濟等眾多領域具有廣泛的應用場景。而且,區塊鏈在技術迭代過程中其功能得到不斷豐富和完善,更顯示出迅猛的發展勢頭。本節以區塊鏈1.0、區塊鏈2.0和區塊鏈3.0發展為脈絡,分析區塊鏈技術的應用現狀。

6.1.1 基于區塊鏈1.0的數字貨幣

區塊鏈最初的應用是比特幣,但隨著比特幣在全球的興起,區塊鏈潛在的價值開始引起大家的普遍關注。區塊鏈1.0對應的是以比特幣為代表的數字貨幣,主要功能集中在貨幣的發行和轉移。比特幣的關鍵技術是使用一種全新的分布式記賬方式實現交易過程的去中心化。2009年,比特幣作為開源軟件發布,之后基于比特幣平臺,直接在區塊鏈賬本內部或利用分叉機制來創建新的代幣。

2011年推出的菜特幣(Litecoin,LTC)與比特幣具有相同的技術原理,但在交易確認、對硬件性能的依賴等方面都較比特幣有了更大的改進,性能得到提升;瑞波幣(XRP)是Ripple網絡中唯一的通用貨幣,而Ripple是開源P2P網絡,基于共享數據庫(數據庫中記錄著賬戶和余額信息)和一致性賬本技術的全球支付網絡,可實現任意貨幣(法幣和數字貨幣)之間的結算,具有較大的應用價值和發展潛力。例如,利用Ripple網絡,甲方可以用美元直接實現與乙方歐元之間的結算,結算過程中使用XRP支付手續費。嚴格地講,Ripple是一種允許各方使用任意一種貨幣進行支付的互聯網交易協議,XRP雖然也是一種數字貨幣,但其主要功能是協助Ripple支付網絡中貨幣的流通;達世幣(DASH)是在比特幣基礎上開發的具有良好的匿名性和去中心化特征、以保護用戶隱私為目的的數字貨幣,與比特幣相比,達世幣的交易速度有了較大提升;未來幣(Nextcoin,NXT)采用PoS共識機制,是全新設計和開發的第二代虛擬貨幣。未來幣使用“透明鍛造”方式產生新的區塊,即通過賬戶的現有余額去“鍛造”新區塊,并給予新區塊的“鍛造者”獎勵一定的交易費用。對于惡意鍛造者其賬戶將被清零,以此作為懲罰。

6.1.2 基于區塊鏈2.0的智能合約

基于區塊鏈2.0的智能合約主導的去中心化應用,雖然豐富了區塊鏈的應用場景,但整體上仍然延續了比特幣在數字貨幣上的優勢和應用慣性。區塊鏈的本質是由多方共同維護的分布式數據庫,如果數據庫中記錄的是用戶的交易數據,則這個數據庫就是一個分布式賬本;如果記錄的內容更加復雜(如學生學籍、公民身份證、護照等信息,或物聯網中智能節點產生的感知數據等),則該數據庫將會應用于更加廣泛的場景,如學生學籍管理、公民身份信息管理、醫療信息管理、物聯網應用等;如果能夠將記錄到區塊鏈中的內容從靜態數據擴展為可執行代碼,并允許存在“if…then…”和“what…if…”循環判斷語句,則可以通過預置合約條款的相應觸發場景和判斷規則,使區塊鏈能夠處理涉及復雜邏輯的交易過程,即實現智能合約。

以以太坊為代表的區塊鏈2.0實現了智能合約功能,智能合約是一類以合約為交易數據的分布式數據庫,被代碼化的合約記錄在區塊鏈中,用戶以發起交易的方式來觸發合約狀態的改變,當合約條款的觸發條件滿足時,預置的代碼邏輯將自動執行,并將執行結果打包后保存在區塊中,且經共識機制驗證后將不能更改。

以太坊是以交易為對象的狀態轉移系統。以太坊賬本中同時記錄著交易數據和全局狀態(world state)數據。其中,全局狀態是以太坊賬本當前的狀態,賬本中不僅記錄了余額,還有合約的數據。以太坊的賬戶分為外部賬戶和合約賬戶兩種類型,兩者的狀態變化都通過具體的交易觸發,通常情況下,當一筆交易觸發了外部賬戶時,將會使賬戶的余額發生變化,當一筆交易觸發的是合約賬戶時,則會產生代碼的執行。任何一類賬戶狀態的變化,都需要在經過節點驗證后才能夠被記錄。其中,外部賬戶狀態的變化需要節點對交易進行驗證,而合約賬戶狀態的變化需要節點在EVM上進行驗證。合約賬戶的存在,使區塊鏈應用從貨幣領域向金融、管理、物聯網等領域拓展。如果將區塊鏈看作是通信子網,那么智能合約則是接入網絡的主機,互聯網應用的多樣性和內容的豐富性由主機上運行的不同程序決定。同樣,基于以太坊平臺,可以通過智能合約開發各類去中心化應用,解決不同場景中的應用需求。

超級賬本是為了解決以太坊在安全性和性能方面存在的不足,使區塊鏈滿足商業應用的需求而建立的開源規范和標準。超級賬本中的智能合約通過構建聯盟鏈為參與合作方建立一個透明、公開、半中心化的開發平臺。聯盟鏈中的典型代表Hyperledger Fabric由身份認證服務、賬本服務和合約鏈碼服務3個核心組件構成[44],其中身份認證服務提供對區塊鏈網絡接入節點和用戶的認證,賬本服務主要為交易數據的存儲、賬本及全局狀態數據的更新等提供服務,合約鏈碼服務作為賬本服務的擴展,以Docker容器方式為運行復雜應用業務邏輯提供服務。

6.1.3 基于區塊鏈3.0的EOS

雖然以太坊和超級賬本通過增加智能合約層實現了區塊鏈技術在復雜場景中的應用,但以太坊平臺只能在并發訪問數有限的環境中實現運行功能相對單一的智能合約,超級賬本對復雜合約的運行也有限。

企業操作系統(EOS)[45]是專門為區塊鏈應用開發的一款操作系統,具體在合約層下方創建一個功能等同于計算機操作系統的功能層,為企業用戶開發更多基于區塊鏈智能合約的應用場景,以實現更加復雜的去中心化應用(DApp)[46]提供操作系統級的支撐和服務。DApp基于區塊鏈技術,將程序代碼和運行結果全部保存在區塊中,保證了程序運行的可靠性和數據的可信性,因此DApp可以看作是智能合約應用功能的擴展。在EOS中將參與挖礦的節點資源用來部署DApp,采用DPoS共識機制,通過見證人生成新區塊。

DApp的出現,可以使開發者在開發區塊鏈應用程序時,不需要像以太坊、超級賬本那樣還要關注底層的區塊鏈技術,而是專注于構建能夠運行在區塊鏈上的DApp應用程序的開發上,DApp與區塊鏈之間的信息交互由EOS負責完成。

6.2 區塊鏈的功能擴展

區塊鏈技術在持續揚棄中不斷發展,實現了以需求為導向的應用創新。例如,針對PoW共識被詬病的能源浪費問題,適時提出了PoS、DPoS、PBFT等一系列共識機制,在能耗、出塊速度、一致性、安全性、是否存在代幣等方面提供了差異化的服務功能,以滿足不同應用場景的需求。再如,在可擴展性方面,區塊鏈技術為了應對全網所有節點使用完全相同的交易數據帶來的效率和安全問題,在以太坊中提出了分片(sharding)[47]技術,在Hyperledger Fabric1.0中應用了多通道(multichannel)[48]解決方案。

6.2.1 分片技術

分片技術基于以太坊賬戶地址,將全網劃分成多個地址域,每個相對獨立的地址域稱為一個分片,每個分片中維護著一條獨立的子鏈。位于分片中的節點(一個節點可同時加入多個分片)在該分片內進行交易,并存儲該分片中的交易數據。當需要訪問的交易數據不在本分片內時,可以通過輕客戶端技術從位于其他分片的節點上讀取。

利用分片技術,單一節點不需要存儲和處理全網的交易數據,同時整個區塊鏈的處理能力不會受限于某一節點的計算能力[49]。

6.2.2 多通道技術

多通道技術基于交易規則,將整個區塊鏈網絡劃分成為多個通道(一個節點可以同時加入多個通道,如圖10所示),每個通道與關聯的配置和數據(包括交易、賬本、chaincode及成員身份等)共同構成一條完整的邏輯上的子鏈,每個節點可同時在多條子鏈上參與共識,每條子鏈上的交易具有獨立性。

多通道機制將原來的單鏈結構演化成為多鏈(multi-chain)模式,不同的應用可根據需要生成不同的子鏈,不同的交易在各自不同的子鏈上并行處理,子鏈所在的通道之間相互隔離,避免了單鏈結構中處理能力存在的木桶效應。

6.3 區塊鏈存在的挑戰

Fig.10 Multichannel mechanism of Hyperledger Fabric圖10 Hyperledger Fabric的多通道機制

區塊鏈給社會發展的貢獻不僅僅是技術方面,更在于人們對傳統社會管理在理念的轉變和方法的創新。僅就技術層面來講,區塊鏈雖然在近年來得到了迅猛發展,但與整個社會發展的預期之間仍然存在著較大距離??蓮牟煌囊暯欠治鰠^塊鏈存在的問題和挑戰,得出不同的結論。因本文主要基于體系結構和實現協議來分析區塊鏈系統的基礎架構,所以選擇了與之直接關聯的安全、隱私、漏洞和效率進行分析。需要說明的是:漏洞屬于安全的范疇,但由于區塊鏈技術發展迅速,應用場景豐富,對社會各領域產生的創新和變革力度大,系統設計和實現中有意預設和無意留下的漏洞成為攻擊者尋找的目標和可利用的資源,借助各類安全漏洞的攻擊威脅日益突出。為此,本節將漏洞單列出來進行分析。

6.3.1 安全挑戰

數據冗余不僅是傳統網絡的安全手段,也是區塊鏈的安全依賴。作惡節點如果通過偽造和篡改數據對區塊鏈網絡實施攻擊,雖然在理論上是可行的,但實際上是很難實現的。然而,區塊鏈并非一個物理隔離的系統,而是通過相關協議、規范與機制構建在互聯網上的服務系統,攻擊者將基于互聯網結構和協議實現中存在的漏洞,間接地對區塊鏈實施攻擊,或將攻擊行為轉移到區塊鏈系統,直接破壞區塊鏈的安全性和穩定性。

區塊鏈涉及到身份認證、共識機制、激勵機制、智能合約等關鍵技術,每項技術又存在自身的實現細節,如此復雜的結構在尚未對安全性進行整體評估的前提下,無論是代碼級的漏洞,還是系統配置上的不當,都潛在著安全隱患和可能發生的攻擊行為。另外,與認證和控制機制相對完善的C/S結構相比,區塊鏈采用的P2P網絡傳輸模式在抵御網絡入侵和攻擊等方面存在著不足。

區塊鏈應用具有廣泛性,已涉及到數字貨幣、金融資產交易結算、數字政務、數據服務等眾多領域,然而受技術和制度(例如,有些國家不承認數字貨幣的合法性)影響,在對區塊鏈系統攻擊行為的追責和取證等方面存在著困難。為此,由于區塊鏈具有的不可篡改性,攻擊者借助制度和技術上的漏洞一旦成功實施了攻擊,其損失將無法挽回。例如,2016年發生的The DAO事件,攻擊者利用智能合約存在的重大缺陷對以太坊成功實施了攻擊,最終迫使以太坊分成兩條鏈(硬分叉),一條為原鏈(即以太坊經典(Ethereum classic,ETC)),另一條為新的分叉鏈(即ETH,Ethereum的簡稱)。

SHA256算法和P2P協議是區塊鏈系統中最基本的技術支撐和功能保障。由于SHA256算法在各類安全應用中扮演著重要的角色,因此針對SHA256散列吞吐量的提高成為散列算法一個研究方向[50]。用戶為了獲得更大利益,出現了針對SHA256算法的專用集成電路(application specific integrated circuit,ASIC)礦機和礦池,嚴重破壞了比特幣等加密數字貨幣的正常運行機制,并使51%攻擊難度變小。針對此類問題,設計并應用不利于并行計算的SHA256成為當務之急。目前,應用于萊特幣的scrypt算法和達世幣的X11算法通過增加內存消耗來提高ASIC開發的難度,可有效解決這一問題。

由于P2P網絡沒有提供身份認證、數據驗證等安全機制,攻擊者可以通過采用廣播非法內容、傳播惡意代碼、實施DDoS攻擊等手段,使信息傳輸延時,進而導致區塊鏈產生分叉[51],或通過控制區塊鏈節點的挖礦來實現自身利益的最大化[52]。處理P2P網絡的安全問題是一個系統工程。針對公有鏈網絡,Fadhil等[53]通過創建超級節點來降低網絡的波動,以此來保證區塊鏈節點免受外部因素的影響,并利用比特幣網絡的真實測量數據對提出的基于事件仿真的網絡模型的有效性進行了驗證;針對聯盟鏈應用,Henry等[54]利用洋蔥路由(the onion router,Tor)技術,在實現對接入節點身份的合法性進行有效驗證的同時,通過節點之間的層層加密機制來保護數據的安全性及節點身份信息的匿名性。

6.3.2 隱私挑戰

隱私即與用戶相關但不愿公開的信息。區塊鏈中的隱私信息主要包括用戶身份信息和交易信息。其中,用戶身份信息涉及到區塊鏈中用戶的公鑰、所在節點的物理地址(MAC地址)和邏輯地址(IP地址)等內容,這些信息是公開的,即使是通過網絡監聽、流量分析等手段得到了詳細的信息,但由于它們之間不存在相關性,因此無法通過信息之間的關聯得知用戶的隱私;比特幣中的交易金額、交易內容、輸入/輸出地址等都屬于交易信息,這些信息都是通過加密技術受保護的。另外,為了加強區塊鏈的隱私保護,還采用了混幣原理(CoinJoin)[55]、環簽名[56]、同態加密[57]、零知識證明等安全措施。

然而,區塊鏈(公有鏈)中節點的加入和離開是不受限制的,也無需身份驗證。再加上每個節點都可以獲得完整的數據備份,雖然通過隔斷交易信息之間的關聯來達到匿名目的,但這樣的保護效果是有限的,攻擊者通過觀察和跟蹤區塊鏈的信息,通過節點的MAC地址、IP地址和用戶的公鑰等信息,還是可以追蹤到賬戶和交易之間的關聯性,并通過數據分析窺探用戶的隱私。同時,在大數據和人工智能技術的輔助下,現有區塊鏈中采取的隱私保護機制存在的脆弱性也逐漸暴露出來。再加上量子計算在信息安全中的應用,傳統密碼技術的安全性也受到了威脅。因此,加強區塊鏈隱私的保護,需要不斷地更新已有技術和完善相關的機制(如共識機制、激勵機制等)。

在區塊鏈隱私保護研究方面,祝烈煌等人[58]基于分層思想,從網絡層、交易層和應用層分別提出了區塊鏈隱私保護面臨的主要威脅和相應的保護方法;張奧和白曉穎[59]對區塊鏈隱私保護進行了綜述,將隱私劃分為交易內容隱私、賬戶地址隱私、用戶身份隱私、節點隱私和通信隱私5類,給出了相應的隱私保護內容和隱私威脅攻擊方式,并結合應用分析了相關的隱私保護技術;針對交易隱私威脅,閃電網絡(lightning network)[60]通過在用戶之間提供“外鏈”快速支付通道,將大量交易放在區塊鏈之外結算和存儲,以此來隱藏不在線用戶之間的交易關系,達到對交易隱私進行保護的目的;針對用戶身份隱私威脅,基于大蒜路由的I2P(invisible Internet project)網絡[61]通過不斷更新本地Net DB發現節點,來取代Tor網絡中用目錄服務器來管理節點的方法,同時I2P網絡中針對同一節點發送信息和返回信息分別使用不同的鏈路,保持了流量的單向傳輸,更好地隱藏了節點的真實身份信息,可提升區塊鏈地址的匿名性,增強了用戶身份隱私的安全。

6.3.3 漏洞挑戰

任何一個系統都存在漏洞,區塊鏈也不例外。漏洞(vulnerability)是信息技術、產品及系統在需求分析、設計開發及配置等過程中有意或無意產生的缺陷(bug),這些缺陷一旦被利用,將會對系統造成嚴重損害。引起漏洞的因素很多,其中由針對區塊鏈腳本語言的不嚴謹性和執行機制的不完善性引起的安全漏洞尤為突出。綜合分析,具體反映在以下幾個方面[62-63]:

(1)交易依賴性(transaction ordering dependence,TOD)。智能合約中賬戶狀態信息的改變由交易觸發、交易過程的先后次序決定了狀態改變的過程和結果。尤其是引起合約賬戶狀態改變的合約代碼的執行,不同的執行次序將會產生截然不同或錯誤的結果。這種緊緊依賴交易順序的智能合約容易引起作惡節點通過偽造交易及執行順序來操控合約的執行。

(2)時間戳依賴(timestamp dependence)。時間戳是一段完整的、可驗證的數據,它用于證明某一數據產生于某一特定的時間點。區塊鏈中區塊的先后順序基于時間戳來確定,智能合約中一些合約的執行需要依賴時間戳。但受網絡時鐘影響,很難使所有節點的時鐘都保持高度一致。時間戳在不同節點上存在的偏差為攻擊者通過設置區塊產生的時間戳來操控合約執行提供了可能的條件。

(3)可重入性弱點(reentrancy vulnerability)。當合約之間存在調用關系時,調用者進程會停下來等待被調用進程結束后再繼續執行,攻擊者利用調用進程的暫停時間段重復調用合約,實施可重入攻擊。

(4)處理異常(mishandled exceptions)。當合約之間存在調用關系時,如果沒有對被調用合約的狀態和調用結果的正確性進行驗證,有意或無意產生的不正確的結果將會影響智能合約的執行。

另外,以太坊在交易過程中會消耗gas,在合約執行前首先要計算賬戶余額是否能夠支付交易所需的gas,如果發起交易用于觸發合約執行的賬戶余額低于執行合約所需的gas,不但合約無法成功執行,而且賬戶余額將被清零。攻擊者在獲取了賬戶信息后,可以發起虛假交易來耗盡賬戶余額。此外,如果攻擊者向合法用戶的合約注入虛假的數據,用戶也將被迫為這些垃圾數據的處理支付費用。

系統漏洞(尤其是可被利用的安全漏洞)的檢測是一個難題,智能合約更不例外。針對智能合約存在的漏洞,可以借鑒對傳統系統的漏洞檢測方法,發現并修補合約中存在的引起gas消耗的代碼。其中,智能合約的形式化驗證可基于數學模型,通過相應的分析工具對合約從設計、開發和運行進行全過程驗證,以規范合約的生成和執行,提高合約的可靠性[64]。

6.3.4 效率挑戰

影響區塊鏈效率的因素很多,主要包括廣播機制、數據加解密、交易驗證、共識機制等,具體可以分為以下幾類:

(1)共識機制。共識機制用于在不存在信任的節點之間達成共識,確保數據的正確性和唯一性。然而,共識結果的達成是需要參與節點付出代價的,就像彩票一樣,要想中獎就需要花錢購買彩票。共識過程需要消耗算力和時間,這在很大程度上影響了區塊鏈的出塊速度。

(2)交易效率。交易效率由出塊速度來決定,目前比特幣、以太坊和Hyperledger Fabric的出塊速度分別為7 TPS(即每秒處理7筆交易)、25 TPS和2 000 TPS,較低的出塊速度與區塊鏈系統采用的共識機制有關,而在現有的共識機制下,較低的出塊速度限制了區塊鏈在金融行業等需要快速、小額交易場景中的應用。

(3)確認時間。目前,比特幣的區塊生成時間為10 min,由于在連續產生6個區塊之后交易才不可逆,因此其交易確認時間為60 min;以太坊在連續產生12個區塊之后交易不可逆,其交易確認時間為3 min。較長的確認時間限制了區塊鏈在小額交易和時效性較強的場景中的應用。

(4)狀態爆炸。從創世區塊開始,比特幣所有區塊的大小從0增長到3 GB用了10年時間,以太坊從0增長到10 GB用了4年時間,區塊鏈歷史和狀態數據的快速增長,呈現狀態爆炸現象。Archive(歸檔)模式和Default(默認)模式是以太坊節點同步數據時采用的兩種模式。其中,在Archive模式下所有歷史數據(包括歷史交易和歷史狀態)和當前狀態數據都會保存下來,所有數據當前約為2 TB;在Default模式下,歷史狀態數據會被刪除,本地只保留歷史交易和當前狀態數據,共約170 GB。因為每個節點都要保存一份數據備份,這對于快速增長的存儲空間要求帶來了挑戰。

針對區塊鏈的效率問題,學者們提出了多種有效的解決方案。例如,Eyal等[65]針對比特幣在區塊大小、出塊時間及穩定性等方面存在的不足,提出了一種可擴展的區塊鏈協議,可根據需要將區塊分割成微塊和宏塊;Dickerson等[66]針對現行的區塊鏈系統單位時間內可執行的合約數受限問題,提出了一種允許不同合約在互不沖突的前提下并行執行的框架等。

7 結束語

就像智能手機出現時那樣,今天的區塊鏈正在改變著這個世界。隨著區塊鏈越來越多地應用到不同的場景,區塊鏈技術的影響力也將從數字加密貨幣擴展到不同社會領域,在改變甚至顛覆著越來越多的行業。區塊鏈在沒有任何第三方權威機構介入的情況下,在不存在信任基礎的節點之間達成了彼此之間的共識,實現了去中心化、不可篡改、不可否認、可溯源的價值傳輸,進而使其應用從數字加密貨幣迅速擴展到整個社會系統,正在為人類社會處于的大發展大變革大調整的過程注入動力。然而,整個區塊鏈技術和應用尚處于起步階段,大量涉及到的基礎理論和技術研究還需要結合學科及產業發展進一步跟進。

猜你喜歡
智能
智能與自主
讓紙變得智能
一種智能微耕機的研發
智能制造 反思與期望
智能前沿
文苑(2018年23期)2018-12-14 01:06:06
智能前沿
文苑(2018年19期)2018-11-09 01:30:14
智能前沿
文苑(2018年17期)2018-11-09 01:29:26
智能前沿
文苑(2018年21期)2018-11-09 01:22:32
智能制造·AI未來
商周刊(2018年18期)2018-09-21 09:14:46
爭渡智能石化
能源(2018年4期)2018-05-19 01:53:44
主站蜘蛛池模板: 国产日韩久久久久无码精品| 欧美一级一级做性视频| 91无码网站| 激情爆乳一区二区| 囯产av无码片毛片一级| 亚洲无码高清一区二区| 美女黄网十八禁免费看| 无码中文字幕精品推荐| 久无码久无码av无码| 亚洲精选无码久久久| 国产极品嫩模在线观看91| 亚洲人成网7777777国产| 国产亚洲现在一区二区中文| 国产欧美日韩资源在线观看| 亚欧乱色视频网站大全| 在线播放国产一区| 国产亚洲精品yxsp| 久久黄色视频影| 日韩av高清无码一区二区三区| 成人av专区精品无码国产| 国产xx在线观看| 久久黄色一级视频| 无码粉嫩虎白一线天在线观看| 99久久免费精品特色大片| 国产一二视频| 中文字幕永久在线看| 亚洲九九视频| 免费在线成人网| 欧美国产日韩一区二区三区精品影视 | 久久超级碰| 99热这里只有精品国产99| 国产欧美日韩专区发布| 婷婷色狠狠干| 9966国产精品视频| 一级爆乳无码av| 久久久久久久蜜桃| 蜜臀AVWWW国产天堂| 日韩A级毛片一区二区三区| 亚洲热线99精品视频| 国产在线自揄拍揄视频网站| 国产精品女人呻吟在线观看| 欧美成人二区| 18禁不卡免费网站| 中文字幕亚洲另类天堂| 国产乱子伦手机在线| 久久久久青草大香线综合精品 | 国产一区二区三区免费观看| 国产成人禁片在线观看| 喷潮白浆直流在线播放| 亚洲欧美一级一级a| 国产极品美女在线播放| 伊人欧美在线| 亚洲成AV人手机在线观看网站| 亚洲成肉网| 国产美女无遮挡免费视频网站| 国产高清在线观看| 国产日韩久久久久无码精品| 日韩AV无码一区| 69av免费视频| 国产毛片基地| 亚洲国产天堂久久综合226114| 中文字幕久久亚洲一区| 亚洲第一黄色网| 亚洲一区二区无码视频| 色噜噜综合网| 亚洲成人网在线观看| 久久久久亚洲AV成人人电影软件| 日韩久草视频| 国产三级国产精品国产普男人| 91麻豆国产在线| 一本大道东京热无码av| 国产综合在线观看视频| 久久夜色精品| 久久这里只精品热免费99| 91亚洲免费| 一级毛片免费播放视频| 亚洲第一页在线观看| 国产一区二区三区免费观看| 毛片免费网址| 亚洲第一页在线观看| 国产人人乐人人爱| 日本成人精品视频|