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