顧 欣 徐淑珍
1(工業(yè)和信息化部電子第五研究所 廣州 510610)2 (天訊瑞達通信技術有限公司 廣州 510623)
從2009年比特幣誕生到以太坊和開源項目Hyperledger Fabric等等,至今,許多區(qū)塊鏈技術架構或區(qū)塊鏈平臺不斷被開發(fā)出來,區(qū)塊鏈技術也發(fā)生著日新月異的變化.區(qū)塊鏈技術是多種底層技術的融合[1],主要包括:點對點網(wǎng)絡技術、密碼學技術、塊鏈式結構和共識算法等等.雖然智能合約并不是區(qū)塊鏈系統(tǒng)的必要組成部分,但由于區(qū)塊鏈具備不可篡改、規(guī)則透明、多方執(zhí)行等特性[2],使它可以很好地為智能合約提供可信的計算環(huán)境.因此,我們首先對4種典型區(qū)塊鏈技術框架進行介紹,然后從區(qū)塊數(shù)據(jù)結構、密碼學、共識機制、智能合約等方面進行對比,分析存在的安全問題.
比特幣(BitCoin)是最早也是全球最廣泛使用和真正意義的去中心化區(qū)塊鏈技術,因此其開源技術體系非常值得參考.
比特幣區(qū)塊鏈的核心技術框架采用C++語言開發(fā),共識算法采用PoW算法,即常說的挖礦,PoW機制需要爭奪記賬權,達成共識的效率低、能耗高,容錯率為50%,實現(xiàn)全網(wǎng)記賬.比特幣的交易其實是轉賬,而轉賬費用又相當高昂,這就阻止了用交易觸發(fā)來實現(xiàn)智能合約.
以太坊是一個圖靈完備的區(qū)塊鏈一站式開發(fā)平臺,采用多種編程語言實現(xiàn)協(xié)議,采用Go語言寫的Geth客戶端作為默認客戶端.基于以太坊平臺之上的應用是智能合約,這是以太坊的核心.智能合約配合友好的界面和外加一些額外的小支持,可以讓用戶基于合約搭建各種千變萬化的DAPP應用,這樣使得開發(fā)人員開發(fā)區(qū)塊鏈應用的門檻大大降低.
以太坊1.0版本采用的是PoW共識算法,目前以太坊運行的版本是1.5,采用類PoS的Casper算法,以使區(qū)塊鏈的確認速度相對于PoW的線性效率達到指數(shù)級,大幅降低資源消耗.
在規(guī)劃的以太坊2.0版本目標是從混合式系統(tǒng)開始,將PoS+PoW混合挖礦作為以太坊2.0升級的開端,預計在2017年底正式切換到PoS協(xié)議.
Hyperledger Fabric是一個帶有可插入各種功能模塊架構的區(qū)塊鏈實施方案,其目標是打造成一個由全社會來共同維護的一個超級賬本.
作為一個區(qū)塊鏈框架,F(xiàn)abric采用了松耦合的設計,將共識機制、身份驗證等組件模塊化,使之在應用過程中可以方便地根據(jù)應用場景來選擇相應的模塊.除此之外,F(xiàn)abric采用了docker技術,將智能合約代碼放在docker中運行,從而使得智能合約幾乎可以用任意的高級語言來編寫.
Fabric0.6版本架構結構簡單,采用“應用—成員管理—Peer”的三角形關系.主要業(yè)務功能全部集中于Peer節(jié)點,但由于Peer節(jié)點承擔了太多的功能,所以帶來擴展性、可維護性、安全性、業(yè)務隔離等方面的諸多問題.
目前,F(xiàn)abric1.0 alpha版本已發(fā)布,其特點是分拆Peer的功能,將區(qū)塊鏈的數(shù)據(jù)維護和共識服務進行分離,共識服務從Peer節(jié)點中完全分離出來,獨立為Orderer節(jié)點,提供共識服務;基于新的架構,實現(xiàn)多通道的結構,實現(xiàn)了更為靈活的業(yè)務適應性,支持更強的配置功能和策略管理功能.
Ripple是基于區(qū)塊連的點到點全球支付網(wǎng)絡.Ripple有2個重要概念:其一是推出瑞波幣,它作為Ripple網(wǎng)絡的基礎貨幣,就像比特幣一樣可以在整個網(wǎng)絡中流通,主要是燃料Gas的作用,每產(chǎn)生一筆交易就會消耗一些XRP;其二是引入網(wǎng)關系統(tǒng),它類似于貨幣兌換機構,允許人們把法定貨幣注入、抽離Ripple網(wǎng)絡,并可充當借、貸雙方的橋梁.
Ripple引入了一個共識機制RPCA,通過特殊節(jié)點的投票,在很短的時間內就能夠對交易進行驗證和確認.Ripple客戶端不需要下載區(qū)塊鏈,它在普通節(jié)點上舍棄掉已經(jīng)驗證過的總賬本鏈,只保留最近的已驗證總賬本和一個指向歷史總賬本的鏈接,因而同步和下載總賬本的工作量很小.
本節(jié)從區(qū)塊數(shù)據(jù)結構、密碼學應用、共識機制、智能合約等區(qū)塊鏈技術組成方面進行分析.
在區(qū)塊數(shù)據(jù)結構中,每個數(shù)據(jù)區(qū)塊一般包含區(qū)塊頭和區(qū)塊體2個主要部分,區(qū)塊頭封裝了當前版本號、前一區(qū)塊地址、當前區(qū)塊的目標哈希值、默克爾根以及時間戳等信息.典型區(qū)塊數(shù)據(jù)結構如下:
比特幣區(qū)塊結構包括區(qū)塊大小、區(qū)塊頭、交易計數(shù)器、交易.其中,區(qū)塊頭主要包括版本、父區(qū)塊頭哈希值、默克爾根、時間戳、難度目標、nonce等[3];
以太坊區(qū)塊結構包括區(qū)塊哈希(blockHash)、區(qū)塊號(blockNumber)、父哈希(parentHash)、時間戳(timestamp)、難度(nonce)、交易哈希、使用容量(gasUsed)、總容量(gasLimit)等;
Fabric區(qū)塊結構包括版本、前一區(qū)塊哈希(previousBlockHash)、區(qū)塊交易的默克爾根哈希(transactionsHash)、時間戳(timestamp)、世界狀態(tài)的默克爾根哈希(stateHash)等;
Ripple區(qū)塊結構包括區(qū)塊索引、區(qū)塊哈希(ledge_hash)、父哈希(Parent_hash)、賬戶哈希(account_hash)、時間戳(close_time)、總幣數(shù)(total_coins)、交易哈希等.
區(qū)塊使用哈希值作為區(qū)塊的唯一標識,每個區(qū)塊記錄了前一區(qū)塊或父區(qū)塊的哈希值,這樣就通過每個區(qū)塊鏈接到其父區(qū)塊的哈希值,形成了一條所有區(qū)塊的鏈狀數(shù)據(jù)結構.
區(qū)塊鏈技術中使用了哈希函數(shù)和非對稱加密算法.
哈希函數(shù):區(qū)塊鏈通常并不直接保存原始數(shù)據(jù)或交易記錄,而是保存其哈希函數(shù)值,即將原始數(shù)據(jù)編碼為特定長度的由數(shù)字和字母組成的字符串后記入?yún)^(qū)塊鏈.哈希函數(shù)(也稱散列函數(shù)) 具有諸多優(yōu)良特點,因而特別適合用于存儲區(qū)塊鏈數(shù)據(jù).
非對稱加密:非對稱加密是為滿足安全性需求和所有權驗證需求而集成到區(qū)塊鏈中的加密技術,常見算法包括RSA,Elgamal,Rabin,D-H,ECC(即橢圓曲線加密算法)等.非對稱加密通常在加密和解密過程中使用2個非對稱的密碼,分別稱為公鑰和私鑰.非對稱密鑰對具有2個特點:首先是用其中一個密鑰(公鑰或私鑰)加密信息后,只有另一個對應的密鑰才能解開;其次是公鑰可向其他人公開,私鑰則保密,其他人無法通過該公鑰推算出相應的私鑰.非對稱加密技術在區(qū)塊鏈的應用場景主要包括信息加密、數(shù)字簽名和登錄認證等.
比特幣、以太坊、Fabric、Ripple均使用美國國家標準技術研究所發(fā)布的安全哈希算法SHA,輸出256b,同時我們比較MD5,SHA1,SHA256算法與國密SM3哈希算法[4],其結果如表1所示:
表1 典型哈希算法比較
比特幣、以太坊、Ripple使用的是橢圓曲線數(shù)字簽名算法(ECDSA),其中,F(xiàn)abric支持使用Fabric CA進行數(shù)字簽名,F(xiàn)abric CA是Hyperledger Fabric的證書頒發(fā)機構,它提供的功能包括:1)身份的注冊,或連接到LDAP作為用戶注冊表;2)發(fā)放注冊證書(ECerts);3)發(fā)布交易證書(TCerts),在Hyperledger Fabric blockchain上進行交易時提供匿名性和不可鏈接性;4)證書更新和撤銷.
目前區(qū)塊鏈采用的哈希算法和數(shù)字簽名算法是相對安全的,區(qū)塊鏈的密碼學機制隨著數(shù)學、密碼學和計算技術的發(fā)展變得越來越脆弱,同時區(qū)塊鏈技術中私鑰是用戶生成并保管的,沒有第三方參與,私鑰的使用和保存狀況是一個重要的安全問題,而私鑰安全才能保證區(qū)塊鏈應用安全.
共識機制是區(qū)塊鏈技術框架的核心,數(shù)據(jù)分散在各個參與驗證的節(jié)點中,共識算法的作用是使數(shù)據(jù)保持一致性,否則系統(tǒng)將無法正常工作.
比特幣和以太坊1.0版采用了PoW機制來保證賬本數(shù)據(jù)的一致性.PoW通過經(jīng)濟激勵的方式來鼓勵節(jié)點參與區(qū)塊的構造過程,節(jié)點在構造區(qū)塊時需要窮舉一個隨機數(shù)以使得區(qū)塊符合規(guī)定的難度要求,為了維護區(qū)塊鏈,則需要全網(wǎng)具備較大算力支撐來保證網(wǎng)絡的安全性,否則賬本數(shù)據(jù)就有可能被篡改.此外,即使維持較大算力來保護網(wǎng)絡,PoW也無法從根本上保證交易的最終性,比如比特幣就經(jīng)常產(chǎn)生孤立區(qū)塊,而包含在孤立區(qū)塊中的交易就有可能被撤銷.因此比特幣通常要求用戶等待6個區(qū)塊的確認,即1 h左右的時間.而為了維護算力而支出的電力成本也相當可觀.
目前以太坊1.5版采用了類PoS的Casper算法.PoS主要思想是節(jié)點記賬權的獲得難度與節(jié)點持有的權益成反比,相對于PoW,一定程度減少了數(shù)學運算帶來的資源消耗,性能也得到了相應的提升,但依然是基于哈希運算競爭獲取記賬權的方式,可監(jiān)管性弱.該共識機制容錯性和PoW相同.總結來說,PoS是PoW的一種升級共識機制,根據(jù)每個節(jié)點所占代幣的比例和時間,等比例地降低挖礦難度,從而加快查找隨機數(shù)的速度.
Ripple引入了一個“RPCA”機制,通過特殊節(jié)點的投票,在很短時間內就能夠對交易進行驗證和確認.Ripple的交易確認過程可在幾秒鐘之內完成,當確認交易的節(jié)點百分比低于某一閾值時,交易未能通過一輪共識.每一輪都是一個迭代過程.在首輪投票開始時,至少50%的節(jié)點必須同意.達成共識的最后一個閾值是80%的節(jié)點同意.這些特定的值會發(fā)生變化.
Hyperledger則是采用類似Ripple共識機制,達成共識則是通過拜占庭容錯算法[5]機制.節(jié)點被分為普通節(jié)點和記賬節(jié)點(validating peer),只有記賬節(jié)點才會參與到區(qū)塊的構造過程,這種角色的分離使得算法的設計者有機會將運行共識算法的節(jié)點數(shù)量限定在一個可控的規(guī)模內.
相比較而言,工作量證明、權益證明機制提供了極高的靈活性和可用性,因為每個節(jié)點都獨立構造區(qū)塊而幾乎不需要其他節(jié)點的參與,節(jié)點可以隨時加入或者退出網(wǎng)絡,即使全網(wǎng)只剩下1個節(jié)點,網(wǎng)絡還是可以繼續(xù)工作,但是挖礦造成大量的資源浪費,共識達成的周期較長,不適合商業(yè)應用;而拜占庭容錯的機制則與之相反,犧牲了一定的靈活性和可用性,記賬節(jié)點必須在線提供服務而不能退出網(wǎng)絡,一旦出現(xiàn)13的記賬節(jié)點停機,那么網(wǎng)絡將變得不可用.
區(qū)塊鏈技術的智能合約是一組情景——應對型的程序化規(guī)則和邏輯,是部署在區(qū)塊鏈上的去中心化、可信息共享的程序代碼.簽署合約的各參與方就合約內容達成一致,以智能合約的形式部署在區(qū)塊鏈上,即可不依賴任何中心機構自動化地代表各簽署方執(zhí)行合約[6].智能合約具有自治、去中心化等特點,一旦啟動就會自動運行,不需要任何合約簽署方的干預.
智能合約可視作一段部署在區(qū)塊鏈上可自動運行的程序,是由事件驅動的、具有狀態(tài)的、獲得多方承認的、運行在一個可信共享的區(qū)塊鏈賬本上的、能根據(jù)預設條件自動處理賬本上資產(chǎn)的程序.其運行機理為:當一個預先編好的條件被觸發(fā)時,智能合約執(zhí)行相應的合同條款.其涵蓋的范圍包括編程語言、編譯器、虛擬機、事件、狀態(tài)機、容錯機制等.智能合約只是以計算機代碼程序這種方式與真實世界的資產(chǎn)進行交互,其致力于將已有的合約法律法規(guī)以及相關的商業(yè)實踐轉移到互聯(lián)網(wǎng)上,使得陌生人通過互聯(lián)網(wǎng)就可以實現(xiàn)以前在線下開展的商業(yè)活動,其優(yōu)勢是利用程序算法替代人仲裁和執(zhí)行合同,能夠高效地實時更新,同時合約能夠得到準確執(zhí)行,并且存在較低的人為干預風險.
從目前來看,雖然智能合約借助區(qū)塊鏈技術達到了前所未有的應用程度,但其仍舊存在安全隱患,在合約代碼實現(xiàn)中,存在非法操作、合約代碼未檢驗等安全性問題,導致合約無法終止.在作者對區(qū)塊鏈產(chǎn)品測試中,發(fā)現(xiàn)大部分產(chǎn)品實現(xiàn)的智能合約未進行合約代碼檢驗,導致合約代碼出現(xiàn)邊界值、死循環(huán)、內存溢出等安全問題,導致合約無法正常執(zhí)行.
一般情況下,針對上述問題,對于合約存在空值調用返回情況,應在合約規(guī)則中進行約束處理,避免此種情況造成合約調用不生效;為避免合約出現(xiàn)不可終止情況,智能合約可采取GAS消耗方法,即合約代碼中每執(zhí)行一步或每段代碼可消耗一定的數(shù)目代幣,以太坊、Ripple目前采用此種方法;同時可以控制合約運行時間以及限制合約可運行步驟數(shù)等3種方式來確保合約正常安全運行.
區(qū)塊鏈技術在賬戶、身份認證以及存儲方面也作了比較,結果如下:
關于賬戶方面,比特幣里沒有賬戶概念,所有余額均通過UTXO計算而得.而以太坊和Fabric里均有賬戶概念.以太坊的賬戶分為普通賬戶和合約賬戶,每個賬戶對應有永久存儲空間,存儲該賬戶的以太幣余額等.Fabric中賬戶即為chaincodeID,每個被部署的chaincode(Fabric中對智能合約的叫法)就是一個賬戶,每個賬戶也對應有永久存儲空間,存儲自定義的鍵值對.這樣,數(shù)據(jù)隱私就成為了一個問題,使用地址進行交易,具有匿名性,但交易記錄完全公開,一旦地址與真實身份聯(lián)系起來,數(shù)據(jù)隱私將會暴露出來.
關于身份認證,比特幣和以太坊基本沒有身份認證的設計,原因很簡單,因為這兩者的設計思想都是強調隱私和匿名,反對監(jiān)管和中心化,而身份認證就勢必要引入一些中心或者弱化的中心機構,F(xiàn)abric使用數(shù)字證書進行身份認證,Ripple主要面向金融結算,是一個半去中心化的區(qū)塊鏈,通過RippleTrade進行身份認證.
關于存儲,由于區(qū)塊鏈要記錄完整的數(shù)據(jù)信息,不能刪除或修改區(qū)塊記錄,所以區(qū)塊會不斷增加,存儲空間將受到威脅,比特幣提出了使用默克爾樹來存放交易哈希的方式,當需要回收硬盤空間時,只需將老舊的交易從默克爾樹中剔除即可.一個不含交易信息的區(qū)塊頭大小僅有80 B.按照比特幣區(qū)塊生成的速率為每10 min 1個,那么每1年產(chǎn)生的數(shù)據(jù)約為4.2 MB,即使將全部的區(qū)塊頭存儲于內存之中都不是問題.
本文從區(qū)塊數(shù)據(jù)結構、密碼學應用、共識機制、智能合約等方面對區(qū)塊鏈技術進行了分析,并列舉了典型區(qū)塊鏈架構實現(xiàn)的技術方式.從目前來看,區(qū)塊鏈技術在安全性方面仍存在諸多問題.
區(qū)塊鏈實現(xiàn)的智能合約在合約代碼安全性檢測方面仍面臨巨大風險,合約代碼未經(jīng)任何安全性檢測,可能存在邊界值未校驗、死循環(huán)、內存溢出等問題,導致合約無法正常執(zhí)行.
基于PoW共識算法的區(qū)塊鏈仍面臨51%攻擊問題,即如果攻擊者掌握全網(wǎng)超過51%算力,就有可能成功篡改和偽造區(qū)塊數(shù)據(jù),從而實現(xiàn)雙重支付[7],基于PoS共識算法的區(qū)塊鏈在一定程度上解決了51%攻擊問題[5],同時也引入了區(qū)塊分叉時的N@S攻擊問題[8],因此更為安全可靠的共識機制仍有待深入研究.
區(qū)塊鏈的非對稱加密機制也將隨著數(shù)學、密碼學和計算技術的發(fā)展而變得越來越脆弱,而且隨著量子計算等新科技的發(fā)展,未來非對稱加密算法有可能存在被破解的風險.
區(qū)塊鏈在私鑰使用和保存方面仍存在很大問題[9],長字節(jié)私鑰一般通過轉換,形成短字符長度形式的私鑰,但仍然不方便記憶,而有些區(qū)塊鏈是去中心化的,是沒有第三方參與的,那么如何安全可靠地保存私鑰仍是重要問題.