国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

區(qū)塊鏈原理及關(guān)鍵技術(shù)*

2020-10-15 01:44李馥娟王振力梁廣俊
計(jì)算機(jī)與生活 2020年10期
關(guān)鍵詞:以太哈希比特

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

江蘇警官學(xué)院計(jì)算機(jī)信息與網(wǎng)絡(luò)安全系,南京 210031

1 引言

數(shù)學(xué)為密碼學(xué)的研究奠定了堅(jiān)實(shí)的理論基礎(chǔ),數(shù)學(xué)領(lǐng)域的研究在推動(dòng)了密碼技術(shù)發(fā)展的同時(shí),密碼技術(shù)的應(yīng)用也使一些基礎(chǔ)數(shù)學(xué)問(wèn)題的研究取得了突破。與此同時(shí),密碼學(xué)及相關(guān)學(xué)科領(lǐng)域一些成熟的技術(shù)在隨著應(yīng)用環(huán)境和需求變化進(jìn)行深度融合后,摧生了一系列新的技術(shù)應(yīng)用,區(qū)塊鏈便是其中之一。

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

區(qū)塊鏈被定義為一種按時(shí)間順序來(lái)組織數(shù)據(jù)區(qū)塊,不同區(qū)塊之間按序形成鏈條狀連接的數(shù)據(jù)結(jié)構(gòu),借助這種數(shù)據(jù)結(jié)構(gòu)來(lái)構(gòu)建數(shù)字賬本[3]。賬本中存放的是交易信息,保存和運(yùn)行賬本的節(jié)點(diǎn)通過(guò)分布式網(wǎng)絡(luò)連接起來(lái),再通過(guò)數(shù)據(jù)加密、分布式共識(shí)、經(jīng)濟(jì)激勵(lì)等機(jī)制來(lái)保證在一個(gè)沒(méi)有中心化授權(quán)的開(kāi)放網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)賬本數(shù)據(jù)的安全共享。

在區(qū)塊鏈系統(tǒng)中,每個(gè)分布式節(jié)點(diǎn)都具有“存儲(chǔ)”功能,用于保存賬本數(shù)據(jù)和用戶(hù)交易等信息,每筆交易和結(jié)果需要通過(guò)“P2P(peer-to-peer)網(wǎng)絡(luò)”共享給其他節(jié)點(diǎn),節(jié)點(diǎn)在接收到數(shù)據(jù)后并不是直接保存下來(lái),而是通過(guò)“共識(shí)機(jī)制”對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,成功后保存到賬本中,一旦保存下來(lái)就“不可篡改”。賬本中的信息之所以不能修改,是因?yàn)槭褂昧恕凹用堋睓C(jī)制,通過(guò)哈希技術(shù)對(duì)區(qū)塊進(jìn)行串接,利用公鑰加密機(jī)制對(duì)賬本數(shù)據(jù)進(jìn)行加密處理和記賬。在公有鏈中,任何用戶(hù)在下載安裝了客戶(hù)端軟件后,就可以加入系統(tǒng),并通過(guò)“激勵(lì)”機(jī)制讓節(jié)點(diǎn)爭(zhēng)相維護(hù)這個(gè)系統(tǒng)。因此,分布式存儲(chǔ)、共識(shí)機(jī)制、不可篡改、數(shù)據(jù)加密和激勵(lì)機(jī)制構(gòu)成了區(qū)塊鏈的基本屬性。

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

區(qū)塊鏈可以按許可權(quán)限分為公有鏈和聯(lián)盟鏈(私有鏈?zhǔn)菓?yīng)用和管理上更為嚴(yán)格的聯(lián)盟鏈)兩大類(lèi)。其中,公有鏈?zhǔn)且粋€(gè)完全去中心化的區(qū)塊鏈系統(tǒng),任何人都可以通過(guò)下載安裝一個(gè)專(zhuān)用客戶(hù)端軟件加入系統(tǒng),并利用系統(tǒng)生成的一對(duì)非對(duì)稱(chēng)密鑰進(jìn)行數(shù)據(jù)讀取或發(fā)送交易,也可自由離開(kāi)系統(tǒng);聯(lián)盟鏈?zhǔn)且粋€(gè)部分去中心化或多中心化的區(qū)塊鏈系統(tǒng),一般由多個(gè)業(yè)務(wù)相關(guān)機(jī)構(gòu)(如銀行、證券公司等)協(xié)同創(chuàng)建和管理,參與機(jī)構(gòu)視具體需要確定一定數(shù)量的運(yùn)行節(jié)點(diǎn),并有限度地分配操作權(quán)限。公有鏈?zhǔn)菂^(qū)塊鏈應(yīng)用的拓荒者,各種復(fù)雜技術(shù)的解決和新技術(shù)、新功能的測(cè)試多是在公有鏈環(huán)境中完成,比特幣和以太坊是目前最有影響的公有鏈應(yīng)用;聯(lián)盟鏈?zhǔn)菂^(qū)塊鏈家族中未來(lái)應(yīng)用的主力軍,是企業(yè)應(yīng)用的重點(diǎn)和區(qū)塊鏈得以落地的關(guān)鍵,典型的聯(lián)盟鏈平臺(tái)有Hyperledger Fabric(超級(jí)賬本)、Ripple、BigchainDB、TrustSQL等。另外,根據(jù)新節(jié)點(diǎn)加入時(shí)是否需要進(jìn)行身份認(rèn)證和訪(fǎng)問(wèn)授權(quán)操作的不同,可以將區(qū)塊鏈系統(tǒng)分為許可鏈和非許可鏈兩類(lèi),其中公有鏈通常稱(chēng)為非許可鏈,而聯(lián)盟鏈一般稱(chēng)為許可鏈。

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

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

2 區(qū)塊鏈的基礎(chǔ)架構(gòu)

體系結(jié)構(gòu)和實(shí)現(xiàn)協(xié)議是網(wǎng)絡(luò)的兩大核心要素,分層結(jié)構(gòu)是計(jì)算機(jī)網(wǎng)絡(luò)中廣泛采用的關(guān)系模型,區(qū)塊鏈系統(tǒng)也采用了分層架構(gòu)。如圖1所示的是區(qū)塊鏈2.0采用的6層結(jié)構(gòu)[6],從下到上依次是數(shù)據(jù)層、網(wǎng)絡(luò)層、共識(shí)層、激勵(lì)層、合約層和應(yīng)用層。

Fig.1 Blockchain infrastructure圖1 區(qū)塊鏈基礎(chǔ)架構(gòu)

2.1 數(shù)據(jù)層

數(shù)據(jù)層位于整個(gè)體系結(jié)構(gòu)的最低層,負(fù)責(zé)將一段時(shí)間內(nèi)接收到的交易數(shù)據(jù)存入正在創(chuàng)建的數(shù)據(jù)區(qū)塊中,再通過(guò)特定的哈希函數(shù)和Merkle樹(shù)數(shù)據(jù)結(jié)構(gòu)將區(qū)塊中存入的交易數(shù)據(jù)進(jìn)行封裝,并在上層協(xié)議的協(xié)助下,生成一個(gè)符合算法約定的帶有時(shí)間戳的新區(qū)塊,再通過(guò)相應(yīng)的共識(shí)機(jī)制鏈接到主鏈上。在此過(guò)程中,數(shù)據(jù)層主要涉及到數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)模型和數(shù)據(jù)存儲(chǔ)等與分布式數(shù)據(jù)庫(kù)相關(guān)的內(nèi)容[7],主要包括數(shù)據(jù)區(qū)塊、哈希函數(shù)、鏈?zhǔn)浇Y(jié)構(gòu)、Merkle樹(shù)、時(shí)間戳、非對(duì)稱(chēng)加密等技術(shù)要素[8],確保區(qū)塊鏈分布式賬本中數(shù)據(jù)的可靠性和穩(wěn)定性。

2.2 網(wǎng)絡(luò)層

區(qū)塊鏈?zhǔn)且环N基于互聯(lián)網(wǎng)的創(chuàng)新應(yīng)用,不同節(jié)點(diǎn)之間的組織形式對(duì)區(qū)塊鏈系統(tǒng)的整體性能起著關(guān)鍵作用。區(qū)塊鏈網(wǎng)絡(luò)層采用不受任何權(quán)威節(jié)點(diǎn)控制或?qū)哟文P图s束的完全去中心化的P2P(對(duì)等網(wǎng))組網(wǎng)方式,以此來(lái)實(shí)現(xiàn)區(qū)塊鏈系統(tǒng)中各個(gè)節(jié)點(diǎn)之間的互聯(lián),為交易數(shù)據(jù)和新區(qū)塊創(chuàng)建信息在節(jié)點(diǎn)之間的快速傳輸及正確性驗(yàn)證提供通信保障,并為每個(gè)節(jié)點(diǎn)參與新區(qū)塊記賬權(quán)的競(jìng)爭(zhēng)提供公平的網(wǎng)絡(luò)環(huán)境。

與互聯(lián)網(wǎng)中廣泛采用的客戶(hù)機(jī)/服務(wù)器(client/server,C/S)通信與存儲(chǔ)架構(gòu)不同的是,在區(qū)塊鏈系統(tǒng)中,P2P網(wǎng)絡(luò)在組網(wǎng)結(jié)構(gòu)和通信機(jī)制方面具有獨(dú)特的應(yīng)用優(yōu)勢(shì):在組網(wǎng)方式上,每個(gè)節(jié)點(diǎn)既是資源的提供者又是資源的使用者,每個(gè)節(jié)點(diǎn)在網(wǎng)絡(luò)中的身份平等,這正是區(qū)塊鏈(尤其是公有鏈)去中心化應(yīng)用的突出特點(diǎn);在通信機(jī)制上,P2P為區(qū)塊鏈中各節(jié)點(diǎn)之間基于TCP/UDP協(xié)議的對(duì)等通信提供了服務(wù)保障,確保了節(jié)點(diǎn)間鏈路的可用性和通信的靈活性。

2.3 共識(shí)層

共識(shí)層借助于相關(guān)的共識(shí)機(jī)制,在一個(gè)由高度分散的節(jié)點(diǎn)參與的去中心化系統(tǒng)中就交易和數(shù)據(jù)的有效性快速達(dá)成共識(shí),確保整個(gè)系統(tǒng)所有節(jié)點(diǎn)記賬的一致性和有效性。其中,一致性是指所有節(jié)點(diǎn)中保存的區(qū)塊主鏈中已確認(rèn)的區(qū)塊完全相同,而有效性是指每個(gè)節(jié)點(diǎn)發(fā)送的交易數(shù)據(jù)都能夠被存放在新區(qū)塊中,同時(shí)節(jié)點(diǎn)新生成的區(qū)塊數(shù)據(jù)也能夠被鏈接到區(qū)塊鏈上。

在早期的比特幣系統(tǒng)中,設(shè)計(jì)者采用了高度依賴(lài)于節(jié)點(diǎn)算力競(jìng)爭(zhēng)的工作量證明(proof of work,PoW)機(jī)制[1],隨著區(qū)塊鏈應(yīng)用的發(fā)展,研究者又提出了一些符合不同區(qū)塊鏈應(yīng)用要求的共識(shí)機(jī)制,如應(yīng)用于點(diǎn)點(diǎn)幣(PPCoin)的權(quán)益證明(proof of stake,PoS)機(jī)制[9],應(yīng)用于比特股(Bitshares)的股份授權(quán)證明(delegated proof of stake,DPoS)機(jī)制[10]等。

2.4 激勵(lì)層

激勵(lì)層主要通過(guò)提供激勵(lì)機(jī)制刺激網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)參與區(qū)塊鏈中新區(qū)塊的生成(挖礦)和驗(yàn)證工作,以保證去中心化區(qū)塊鏈系統(tǒng)的安全、有效和穩(wěn)定運(yùn)行。激勵(lì)層和共識(shí)層的運(yùn)行具有相同的機(jī)制,以比特幣為例,共識(shí)過(guò)程是趨利的,每個(gè)節(jié)點(diǎn)參與共識(shí)的目的是追求自身利益的最大化,激勵(lì)是對(duì)已達(dá)成共識(shí)的一種貨幣發(fā)行和分配機(jī)制。其中,比特幣系統(tǒng)每10 min生成一個(gè)新區(qū)塊,同時(shí)給生成該區(qū)塊的節(jié)點(diǎn)(礦工)獎(jiǎng)勵(lì)一定數(shù)量的比特幣,以此完成比特幣系統(tǒng)貨幣的發(fā)行過(guò)程。

從第一個(gè)區(qū)塊創(chuàng)世區(qū)塊(genesis block)產(chǎn)生后的4年中(大約產(chǎn)生了21萬(wàn)個(gè)區(qū)塊),每個(gè)區(qū)塊獲得50個(gè)比特幣的獎(jiǎng)勵(lì),在之后的4年中每個(gè)區(qū)塊獲得25個(gè)比特幣的獎(jiǎng)勵(lì),依次類(lèi)推。整個(gè)系統(tǒng)最后會(huì)產(chǎn)生2 100萬(wàn)個(gè)比特幣。另外,新區(qū)塊的創(chuàng)建者(礦工)還會(huì)從每筆交易中獲得相應(yīng)的交易費(fèi)用(手續(xù)費(fèi))。新建區(qū)塊的獎(jiǎng)勵(lì)和每筆交易的手續(xù)費(fèi)都會(huì)存入新建區(qū)塊的第1個(gè)交易位置(coinbase)中;根據(jù)區(qū)塊鏈的共識(shí)和激勵(lì)機(jī)制,節(jié)點(diǎn)的算力越大則“挖礦”成功的概率越高。為了提高“挖礦”的成功率,多個(gè)小算力節(jié)點(diǎn)會(huì)通過(guò)組建一個(gè)“礦池”將參與節(jié)點(diǎn)的算力匯合起來(lái),在挖到礦后再根據(jù)各自貢獻(xiàn)的算力大小來(lái)分得不同股份(share)的新建區(qū)塊獎(jiǎng)勵(lì)和交易手續(xù)費(fèi)。

2.5 合約層

智能合約是部署在區(qū)塊鏈上的用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)日常合同條款的內(nèi)容及執(zhí)行過(guò)程的協(xié)議。早在1994年,Szabo就在文獻(xiàn)[11]中提出了智能合約的概念,但直到比特幣的出現(xiàn),智能合約才借助區(qū)塊鏈技術(shù)引起了業(yè)界的關(guān)注。

由于比特幣中采用的是一種非圖靈完備、不具備復(fù)雜循環(huán)和流程控制、功能簡(jiǎn)單的腳本語(yǔ)言,其實(shí)質(zhì)是嵌入到比特幣交易上的一組指令,因此比特幣中的腳本只能算是智能合約的雛形。在以太坊中內(nèi)置了一套圖靈完備的編程語(yǔ)言,用戶(hù)可以根據(jù)需要在以太坊平臺(tái)上編寫(xiě)復(fù)雜的智能合約,實(shí)現(xiàn)各類(lèi)去中心化的應(yīng)用。智能合約的應(yīng)用,使區(qū)塊鏈技術(shù)不再局限于比特幣應(yīng)用,而成為一項(xiàng)具有普適性的底層技術(shù)框架。

2.6 應(yīng)用層

區(qū)塊鏈技術(shù)在公有鏈中的應(yīng)用最為成熟,其中,在比特幣中的應(yīng)用主要是實(shí)現(xiàn)去中心化的數(shù)字加密貨幣系統(tǒng),而在以太坊中除繼承了數(shù)字加密貨幣(以太幣)的功能外,還針對(duì)目前“一切皆Web”的現(xiàn)狀,借助智能合約的強(qiáng)大功能,區(qū)塊鏈技術(shù)開(kāi)始支持各類(lèi)去中心化應(yīng)用(decentralized application,DApp)[12]。DApp最常見(jiàn)的應(yīng)用情景是一個(gè)常規(guī)的Web前端應(yīng)用與一個(gè)或多個(gè)智能合約進(jìn)行交互。

聯(lián)盟鏈反映了區(qū)塊鏈應(yīng)用價(jià)值的多樣性和豐富性,提升了區(qū)塊鏈應(yīng)用的廣度和深度,可以使區(qū)塊鏈技術(shù)最大限度地得以落地生根。目前,聯(lián)盟鏈主要面向企業(yè)級(jí)的應(yīng)用,其中超級(jí)賬本Hyperledger是Linux基金會(huì)于2015年發(fā)起的開(kāi)源項(xiàng)目,包含多個(gè)并行的子項(xiàng)目,其中Fabric的成熟度較高。為了實(shí)現(xiàn)通過(guò)軟件開(kāi)發(fā)工具包(software development kit,SDK)訪(fǎng)問(wèn)區(qū)塊鏈系統(tǒng)中的賬本、交易、事件、權(quán)限管理等資源,F(xiàn)abric提供了gRPC API以及封裝應(yīng)用程序接口(application programming interface,API)的SDK,SDK提供了對(duì)Node.Js、Python、Java、Go等語(yǔ)言的支持,可通過(guò)對(duì)底層gRPC接口的調(diào)用與智能合約進(jìn)行通信,以構(gòu)建功能更加豐富的應(yīng)用場(chǎng)景。

3 區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)

Nicklaus Writh曾提出一個(gè)著名的公式:算法+數(shù)據(jù)結(jié)構(gòu)=程序。算法是程序的靈魂,數(shù)據(jù)結(jié)構(gòu)是程序的核心。在區(qū)塊鏈中,針對(duì)不同領(lǐng)域、不同場(chǎng)景開(kāi)發(fā)的程序是否能夠快速、高效、安全地實(shí)現(xiàn)預(yù)定任務(wù),在很大程度上取決于是否設(shè)計(jì)或選用了合適的數(shù)據(jù)結(jié)構(gòu)。區(qū)塊鏈?zhǔn)且环N分布式系統(tǒng),區(qū)塊結(jié)構(gòu)決定著交易信息的存儲(chǔ)形式,Merkle樹(shù)用于組織和管理交易數(shù)據(jù),鏈?zhǔn)浇Y(jié)構(gòu)發(fā)揮著串接區(qū)塊的功能,區(qū)塊鏈交易的數(shù)據(jù)結(jié)構(gòu)描述了比特幣和以太坊的交易形式以及交易地址的生成特點(diǎn),交易數(shù)據(jù)的存儲(chǔ)方式從宏觀(guān)角度分析區(qū)塊鏈底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)依據(jù)和發(fā)展趨勢(shì)。

3.1 區(qū)塊結(jié)構(gòu)

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

在區(qū)塊鏈頭部,“時(shí)間戳”字段在區(qū)塊鏈的形成和維護(hù)過(guò)程中發(fā)揮著極其重要的作用:一是不同區(qū)塊按照生成時(shí)間來(lái)確定前后關(guān)系;二是用于維護(hù)共識(shí)算法的最長(zhǎng)鏈規(guī)則,即當(dāng)一個(gè)節(jié)點(diǎn)通過(guò)共識(shí)算法產(chǎn)生了一個(gè)新區(qū)塊并將其廣播到全網(wǎng)后,其他節(jié)點(diǎn)在接收到該新區(qū)塊數(shù)據(jù)時(shí)必須立即停止當(dāng)前的共識(shí)運(yùn)算(挖礦),而對(duì)新區(qū)塊數(shù)據(jù)進(jìn)行驗(yàn)證。否則,即使通過(guò)共識(shí)運(yùn)算得到了新區(qū)塊,但由于生成時(shí)間晚(以時(shí)間戳為準(zhǔn)),也得不到其他節(jié)點(diǎn)的認(rèn)可。

Fig.2 Data block structure圖2 數(shù)據(jù)區(qū)塊結(jié)構(gòu)

Table 1 Description of Bitcoin block head structure function表1 比特幣區(qū)塊頭結(jié)構(gòu)功能描述

區(qū)塊體中存放的是已經(jīng)驗(yàn)證的一段時(shí)間內(nèi)產(chǎn)生的交易數(shù)量以及完整的交易記錄,這些信息構(gòu)成了區(qū)塊鏈中最為核心的數(shù)據(jù)結(jié)構(gòu),即交易的賬本。所有的交易記錄基于Merkle樹(shù)的哈希計(jì)算,最后生成Merkle根(最后的哈希值),并記入?yún)^(qū)塊頭部的“Merkle根”字段。

3.2 鏈?zhǔn)浇Y(jié)構(gòu)

區(qū)塊鏈的鏈?zhǔn)浇Y(jié)構(gòu)是一個(gè)以區(qū)塊為元素的鏈表,其中邏輯相鄰元素之間以時(shí)間作為關(guān)聯(lián)。鏈?zhǔn)浇Y(jié)構(gòu)的形成描述相鄰區(qū)塊之間關(guān)聯(lián)性的建立,而GHOST協(xié)議用于維護(hù)鏈?zhǔn)浇Y(jié)構(gòu)中主鏈的唯一性。

3.2.1 鏈?zhǔn)浇Y(jié)構(gòu)的形成

區(qū)塊鏈?zhǔn)且粋€(gè)將每一個(gè)區(qū)塊以生成時(shí)間為序鏈接而成的分布式數(shù)據(jù)庫(kù)。在區(qū)塊鏈結(jié)構(gòu)中,對(duì)區(qū)塊頭中的前一區(qū)塊哈希(Prev-block Hash)、隨機(jī)數(shù)(Nonce)和Merkle根等元數(shù)據(jù)進(jìn)行兩次SHA256運(yùn)算即可得到該區(qū)塊的哈希值。在圖2中,前一區(qū)塊哈希(Prevblock Hash)字段用于存放前一區(qū)塊的哈希值,所有區(qū)塊按照生成順序以Prev-block Hash字段為哈希指針鏈接在一起,就形成了一條區(qū)塊鏈表,即一個(gè)完整的賬本。鏈?zhǔn)浇Y(jié)構(gòu)中相鄰區(qū)塊之間的關(guān)系如圖3所示。

利用區(qū)塊頭中的“Merkle根”(Merkle-root)字段,可以通過(guò)哈希運(yùn)算驗(yàn)證區(qū)塊頭部和區(qū)塊體中的交易數(shù)據(jù)是否被篡改;利用區(qū)塊頭中的“前一區(qū)塊哈?!保≒rev-block Hash)字段,可以通過(guò)哈希運(yùn)算驗(yàn)證該區(qū)塊之前直至創(chuàng)世區(qū)塊的所有區(qū)塊是否被篡改;依靠Prev-block Hash字段,所有區(qū)塊之間依據(jù)創(chuàng)建時(shí)間環(huán)環(huán)相扣,如果其中任何一個(gè)區(qū)塊被篡改,都將會(huì)引發(fā)在其后生成的所有區(qū)塊的哈希值發(fā)生連鎖改變。利用鏈?zhǔn)浇Y(jié)構(gòu)的可驗(yàn)證性特點(diǎn),當(dāng)一個(gè)節(jié)點(diǎn)從不可信節(jié)點(diǎn)下載了某些區(qū)塊或整個(gè)區(qū)塊時(shí),可以通過(guò)哈希運(yùn)算驗(yàn)證每個(gè)區(qū)塊的正確性。

3.2.2 鏈?zhǔn)浇Y(jié)構(gòu)的維護(hù)

在區(qū)塊鏈中,由于所有節(jié)點(diǎn)在一個(gè)沒(méi)有可信第三方統(tǒng)一協(xié)調(diào)的環(huán)境中幾乎同時(shí)在同一個(gè)區(qū)塊上進(jìn)行挖礦,這樣有可能出現(xiàn)多個(gè)節(jié)點(diǎn)同時(shí)挖出不同新區(qū)塊的現(xiàn)象,此現(xiàn)象稱(chēng)為“分叉”,根據(jù)區(qū)塊鏈的工作機(jī)制,最終只允許其中一個(gè)區(qū)塊得到確認(rèn)。當(dāng)發(fā)生分叉時(shí),花費(fèi)了最多算力的鏈被確定為主鏈,主鏈?zhǔn)亲铋L(zhǎng)鏈,位于其他分支上的交易都將被引用或忽略。分叉不但影響了區(qū)塊鏈系統(tǒng)的穩(wěn)定性,還容易引起“雙花”(雙重花費(fèi))攻擊[14]。當(dāng)產(chǎn)生了分叉時(shí),位于比特幣分支節(jié)點(diǎn)上的區(qū)塊稱(chēng)為孤塊,并被丟棄,而以太坊引入了GHOST(greedy heaviest observed subtree)[15]協(xié)議來(lái)處理分叉。

由于比特幣的出塊(產(chǎn)生新區(qū)塊)時(shí)間為10 min,因此產(chǎn)生分叉的概率并不高,而以太坊的出塊時(shí)間為15 s,受區(qū)塊鏈共識(shí)算法和網(wǎng)絡(luò)運(yùn)行機(jī)理等因素對(duì)網(wǎng)絡(luò)事件響應(yīng)機(jī)制的制約,在15 s的時(shí)間內(nèi),當(dāng)一個(gè)新區(qū)塊還沒(méi)來(lái)得及得到其他節(jié)點(diǎn)的驗(yàn)證和接受之前,其他節(jié)點(diǎn)可能在相同的區(qū)塊位置上挖出了新的區(qū)塊,從而頻繁地產(chǎn)生分叉。為了體現(xiàn)以太坊挖礦的公平性,并保持以太坊系統(tǒng)穩(wěn)定運(yùn)行,以太坊采用了GHOST協(xié)議將產(chǎn)生的分叉盡快進(jìn)行合并。

Fig.3 Relationship between adjacent blocks圖3 相鄰區(qū)塊之間的關(guān)系

GHOST協(xié)議是一種主鏈選擇算法,其思想是基于“利益均沾”的原則,讓挖出新區(qū)塊的節(jié)點(diǎn)都會(huì)受益。如圖4所示,假設(shè)節(jié)點(diǎn)A是一個(gè)在網(wǎng)絡(luò)位置、帶寬、算力等方面具有絕對(duì)優(yōu)勢(shì)的礦池,當(dāng)該節(jié)點(diǎn)開(kāi)始從主鏈的某一區(qū)塊位置(假設(shè)圖4中的3號(hào)區(qū)塊)開(kāi)始挖礦時(shí),因其具有較高的出塊概率,所以理應(yīng)擁有對(duì)新挖出區(qū)塊的記賬權(quán),并從中獲得收益。但是,為了鼓勵(lì)區(qū)塊鏈網(wǎng)絡(luò)中其他節(jié)點(diǎn)都積極參與挖礦,協(xié)議規(guī)定節(jié)點(diǎn)A對(duì)在同一位置挖出新區(qū)塊的其他礦工將通過(guò)引用方式給予相應(yīng)的獎(jiǎng)勵(lì)(具體獎(jiǎng)勵(lì)規(guī)則如圖4所示)。GHOST協(xié)議有效維護(hù)了主鏈的唯一性,防止出現(xiàn)永久分叉現(xiàn)象,同時(shí)也保持了區(qū)塊鏈系統(tǒng)的穩(wěn)定運(yùn)行。

分叉會(huì)帶來(lái)交易的不確定性和系統(tǒng)運(yùn)行的不穩(wěn)定性。目前,比特幣在連續(xù)產(chǎn)生6個(gè)區(qū)塊之后,當(dāng)前的交易確定為不可逆,因此其交易確認(rèn)時(shí)間為60 min;以太坊在連續(xù)產(chǎn)生12個(gè)區(qū)塊之后,交易已基本不可逆,因此其交易確認(rèn)時(shí)間為3 min。需要說(shuō)明的是,當(dāng)區(qū)塊間距離達(dá)到8時(shí),還未被引用的分叉上的叔塊將得不到獎(jiǎng)勵(lì),而自動(dòng)廢棄。另外,在叔塊上挖出來(lái)的區(qū)塊也得不到獎(jiǎng)勵(lì),以太坊這樣規(guī)定的目的是為了激勵(lì)節(jié)點(diǎn)在發(fā)現(xiàn)了最長(zhǎng)區(qū)塊鏈時(shí)盡快合并,而不是在自己的分支鏈上繼續(xù)進(jìn)行挖礦。

3.3 Merkle樹(shù)

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

(1)極大地提高了區(qū)塊鏈的運(yùn)行效率。Merkle樹(shù)的形成過(guò)程是一個(gè)頻繁的哈希過(guò)程,區(qū)塊鏈中使用的SHA256的運(yùn)行效率較高,對(duì)節(jié)點(diǎn)性能的要求較低。另外,區(qū)塊中所有的交易信息都遞歸到Merkle根,簡(jiǎn)化了對(duì)整個(gè)區(qū)塊鏈系統(tǒng)的管理。

(2)極大地提高了區(qū)塊鏈的可擴(kuò)展性。Merkle樹(shù)可以實(shí)現(xiàn)交易數(shù)據(jù)與哈希值的分離,在一些輕量級(jí)的應(yīng)用中只需包含Merkle根的哈希值,而不必封裝區(qū)塊體中的底層數(shù)據(jù),這使得區(qū)塊鏈技術(shù)可以高效地運(yùn)行在智能手機(jī)、物聯(lián)網(wǎng)等計(jì)算和存儲(chǔ)能力受限的設(shè)備上。

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

Fig.4 GHOST protocol principle圖4 GHOST協(xié)議的工作原理

為了提高區(qū)塊產(chǎn)生的效率和對(duì)節(jié)點(diǎn)中賬戶(hù)狀態(tài)數(shù)據(jù)的查找能力,以太坊在計(jì)算Merkle根時(shí)使用了Merkle Patricia樹(shù)[19]。以太坊和比特幣的區(qū)塊中雖然具有相同的交易數(shù)據(jù),但在以太坊中狀態(tài)數(shù)據(jù)經(jīng)常發(fā)生變化,且產(chǎn)生的數(shù)據(jù)量較大。為此,為了提高運(yùn)行效率,以太坊在創(chuàng)建新區(qū)塊時(shí),僅計(jì)算在新區(qū)塊中賬戶(hù)狀態(tài)發(fā)生了變化的分支,而未發(fā)生變化的分支將被直接引用。

3.4 區(qū)塊鏈交易的數(shù)據(jù)結(jié)構(gòu)

交易(transaction)是雙方或多方以貨幣為媒介的價(jià)值交換,其實(shí)質(zhì)是將比特幣從一個(gè)賬本轉(zhuǎn)移到另一個(gè)或多個(gè)賬本中。區(qū)塊鏈的交易與銀行的交易類(lèi)似,通常就是轉(zhuǎn)賬,具體到每一筆交易,同樣包括從哪兒來(lái)(交易輸入地址)、到哪里去(交易輸出地址)和發(fā)生了哪些變化(交易的數(shù)目)。通過(guò)交易過(guò)程,可實(shí)現(xiàn)數(shù)字貨幣資產(chǎn)的創(chuàng)建和轉(zhuǎn)移,也可以對(duì)每筆交易進(jìn)行溯源和找到所有的歷史記錄,直到挖礦所得的比特幣(coinbase)。

3.4.1 比特幣交易的數(shù)據(jù)結(jié)構(gòu)

Fig.5 Data structure of Bitcoin transaction圖5 比特幣交易的數(shù)據(jù)結(jié)構(gòu)

比特幣使用如圖5所示的基于交易模型的數(shù)據(jù)結(jié)構(gòu),每筆交易包括交易輸入(transaction input)和交易輸出(transaction output)兩部分,在某筆交易過(guò)程中可以將一個(gè)或多個(gè)賬戶(hù)中的比特幣作為輸入,轉(zhuǎn)入到另一個(gè)或多個(gè)賬戶(hù)中。為了完成交易過(guò)程,每筆交易還提供了當(dāng)前交易軟件的版本(Version)、用于將交易寫(xiě)入?yún)^(qū)塊的鎖定時(shí)間(Lock Time)以及交易的輸入數(shù)量(#vin)和輸出數(shù)量(#vout)等功能字段。

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

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

當(dāng)一筆交易的輸出沒(méi)有任何另一筆交易的輸入與之對(duì)應(yīng)時(shí),說(shuō)明該輸出中的比特幣未被花費(fèi)。對(duì)于某個(gè)比特幣地址來(lái)說(shuō),其UTXO的比特幣之和即為該賬戶(hù)的比特幣余額。另外,對(duì)于UTXO中的每筆輸出都需要使用鎖定腳本將比特幣鎖定在賬戶(hù)中,當(dāng)交易過(guò)程中需要引用UTXO中的輸出時(shí),需要使用該輸出賬戶(hù)的公鑰來(lái)驗(yàn)證簽名的正確性,通過(guò)解鎖腳本來(lái)解鎖引用賬戶(hù)地址中的比特幣。

3.4.2 以太坊交易的數(shù)據(jù)結(jié)構(gòu)

比特幣的數(shù)據(jù)結(jié)構(gòu)采用基于交易的模型,其特點(diǎn)是可以快速驗(yàn)證每筆交易,但缺點(diǎn)是無(wú)法對(duì)用戶(hù)余額進(jìn)行高效查詢(xún)。為了提高對(duì)交易狀態(tài)和余額的查詢(xún)效率,使區(qū)塊鏈平臺(tái)支持更加廣泛的應(yīng)用,以太坊提出了基于賬戶(hù)的模型。

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

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

Fig.6 Accounts in Ethereum圖6 以太坊中的賬戶(hù)

3.4.3 區(qū)塊鏈交易地址

現(xiàn)實(shí)生活中,當(dāng)人們需要進(jìn)行存錢(qián)、轉(zhuǎn)賬等一系列操作時(shí),首先要前往銀行開(kāi)個(gè)賬戶(hù),領(lǐng)取銀行分配的一串?dāng)?shù)字帳號(hào)(銀行卡號(hào)),帳號(hào)的密碼由用戶(hù)設(shè)定。而在區(qū)塊鏈系統(tǒng)中,賬戶(hù)不需要由中心機(jī)構(gòu)來(lái)開(kāi)設(shè),而是通過(guò)密碼學(xué)原理來(lái)產(chǎn)生。本小節(jié)以比特幣系統(tǒng)中的地址生成為例進(jìn)行介紹[21],以太坊的實(shí)現(xiàn)方法和過(guò)程與此基本相同。

地址針對(duì)的是具體的賬戶(hù),主要用于各類(lèi)交易。比特幣系統(tǒng)的地址生成過(guò)程如圖7所示,具體為:

(1)通過(guò)調(diào)用操作系統(tǒng)底層的偽隨機(jī)數(shù)生成器(pseudorandom number generator,PRNG)來(lái)生成一個(gè)256位的隨機(jī)數(shù)作為私鑰。

(2)私鑰經(jīng)過(guò)橢圓曲線(xiàn)算法生成公鑰。比特幣和以太坊都使用Secp256k1橢圓曲線(xiàn)算法K=k×G(其中,K為公鑰,k為私鑰,G為一個(gè)生成點(diǎn)),由于生成點(diǎn)G是預(yù)定的,因此可以由一個(gè)確定的k來(lái)單向生成一個(gè)確定的K。

(3)通過(guò)A=RIPEMD160(SHA256(K))(其中,A為公鑰哈希值),對(duì)生成的公鑰進(jìn)行SHA256和RIPEMD160雙哈希運(yùn)算,生成一個(gè)20 Byte的摘要結(jié)果,即Hash160公鑰哈希。

(4)在生成的公鑰哈希的頭部添加一個(gè)軟件的版本號(hào)(比特幣主網(wǎng)絡(luò)版本號(hào)為“0×00”),然后進(jìn)行兩次SHA256運(yùn)算,取運(yùn)算結(jié)果的前4 Byte,將其添加到公鑰哈希的后面作為“檢驗(yàn)”(Checksum)值,將最后的結(jié)果通過(guò)Base58Check編碼后,就得到最終的比特幣的地址。

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

公鑰生成過(guò)程是不可逆的,即不能通過(guò)公鑰反推出私鑰。比特幣的私鑰通常保存在比特幣錢(qián)包文件中,丟失了私鑰就意味著丟失了對(duì)應(yīng)地址的全部比特幣資產(chǎn)。

3.5 交易數(shù)據(jù)的存儲(chǔ)方式

底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)直接決定著數(shù)據(jù)的讀寫(xiě)和查詢(xún)性能。與傳統(tǒng)的集中式管理的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)相比較,目前比特幣和以太坊對(duì)數(shù)據(jù)查詢(xún)的性能要求并不高,但對(duì)數(shù)據(jù)寫(xiě)入性能的要求較高,尤其區(qū)塊中交易數(shù)據(jù)和交易狀態(tài)數(shù)據(jù)需要頻繁寫(xiě)入。而且,作為一個(gè)完全去中心化的分布式系統(tǒng),比特幣和以太坊要求對(duì)數(shù)據(jù)庫(kù)的部署和應(yīng)用要盡可能簡(jiǎn)單和快捷,且不能占用較大的存儲(chǔ)空間和CPU資源,以鼓勵(lì)具有一般算力的節(jié)點(diǎn)加入其中。

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

4 共識(shí)機(jī)制

共識(shí)機(jī)制是分布式系統(tǒng)中實(shí)現(xiàn)去中心化信任的核心,它通過(guò)在互不信任的節(jié)點(diǎn)之間建立一套共同遵守的預(yù)設(shè)規(guī)則,實(shí)現(xiàn)節(jié)點(diǎn)之間的協(xié)作與配合,最終達(dá)到不同節(jié)點(diǎn)數(shù)據(jù)的一致性。由于區(qū)塊鏈的本質(zhì)是一個(gè)去中心化的分布式賬本數(shù)據(jù)庫(kù),因此區(qū)塊鏈中的共識(shí)機(jī)制既要體現(xiàn)分布式系統(tǒng)的基本要求,又要考慮區(qū)塊鏈中專(zhuān)門(mén)針對(duì)交易記錄、需要解決拜占庭容錯(cuò)以及可能存在的惡意節(jié)點(diǎn)篡改數(shù)據(jù)等安全問(wèn)題。因此,區(qū)塊鏈中的共識(shí)機(jī)制更具有針對(duì)性,可根據(jù)不同的區(qū)塊鏈應(yīng)用場(chǎng)景選擇符合不同運(yùn)行需求的共識(shí)機(jī)制。

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

4.1 PoW共識(shí)機(jī)制

1997年,26歲的英國(guó)埃克塞特大學(xué)博士亞當(dāng)·巴克(Adam Back)提出哈?,F(xiàn)金(Hashcash)的概念[30],其思想類(lèi)似于密碼學(xué)的RSA算法:計(jì)算兩個(gè)質(zhì)數(shù)之積是容易的,但分解兩個(gè)質(zhì)數(shù)之積是困難的。哈希現(xiàn)金的思想體現(xiàn)在一些數(shù)學(xué)結(jié)果很難發(fā)現(xiàn)但易于校驗(yàn)。基于這一數(shù)學(xué)特征,可以設(shè)計(jì)這樣的協(xié)議:提供一個(gè)有一定計(jì)算量的質(zhì)數(shù)之積,只要對(duì)方能夠?qū)⑵溥M(jìn)行分解,就允許建立連接。這一協(xié)議要求對(duì)方必須是誠(chéng)意的,而且為了表示此誠(chéng)意需要付出一定的算力來(lái)解決提出的問(wèn)題。例如,為了防止接收到垃圾郵件,郵件接收者可以在郵件的消息頭中增加一個(gè)哈希值,該值在生成時(shí)需要包括收件人地址、發(fā)送時(shí)間及鹽值(salt)等信息,可以對(duì)該哈希值設(shè)置一定的條件(如前10位必須是0),只有滿(mǎn)足該條件的郵件才被認(rèn)為是一個(gè)合法的郵件。郵件發(fā)送者只有經(jīng)過(guò)不斷嘗試(改變salt值),直到得到符合要求的哈希值為止,除此之外沒(méi)有任何捷徑。另外,生成該哈希值時(shí)的時(shí)間戳可以防止一次計(jì)算結(jié)果的重復(fù)使用,避免垃圾郵件制造者利用同一個(gè)哈希值來(lái)發(fā)送多份郵件。

Table 3 Comparison of PoW,PoS,DPoS and PBFT consensus mechanisms表3 PoW、PoS、DPoS和PBFT共識(shí)機(jī)制對(duì)比

哈?,F(xiàn)金的本質(zhì)是一種PoW系統(tǒng),即愿意并完成了一定計(jì)算工作量且提供了證明的節(jié)點(diǎn)被認(rèn)為是可信賴(lài)的。在比特幣區(qū)塊鏈中就采用了高度依賴(lài)于節(jié)點(diǎn)算力的PoW機(jī)制,每個(gè)參與共識(shí)的礦工基于各自的算力相互競(jìng)爭(zhēng)來(lái)共同解決一個(gè)求解復(fù)雜但驗(yàn)證容易的SHA256數(shù)學(xué)難題,最快解決該難題的節(jié)點(diǎn)將獲得區(qū)塊記賬權(quán)和系統(tǒng)給予的比特幣獎(jiǎng)勵(lì)。即在已預(yù)置區(qū)塊頭中工作量證明難度的前提下,節(jié)點(diǎn)通過(guò)不斷調(diào)整隨機(jī)數(shù)Nonce來(lái)計(jì)算區(qū)塊頭部元數(shù)據(jù)的雙SHA256哈希值以滿(mǎn)足以下條件:

其中,H為單向哈希函數(shù),比特幣使用SHA256;h為區(qū)塊頭部數(shù)據(jù),主要包含前一區(qū)塊哈希、Merkle根等內(nèi)容;d為當(dāng)前工作量證明難度。PoW在區(qū)塊鏈網(wǎng)絡(luò)中的共識(shí)流程如下:

(1)當(dāng)某一節(jié)點(diǎn)產(chǎn)生了一筆新交易時(shí),為了盡快完成交易過(guò)程并得到別人的認(rèn)可,交易及相關(guān)信息會(huì)立即廣播給區(qū)塊鏈網(wǎng)絡(luò)中的所有節(jié)點(diǎn)。節(jié)點(diǎn)在接收到該交易數(shù)據(jù)時(shí),為了能夠完成挖礦操作便將其按序添加到當(dāng)前區(qū)塊體中。

(2)根據(jù)Merkle根的生成規(guī)則,每個(gè)節(jié)點(diǎn)計(jì)算自前一次區(qū)塊生成以來(lái)已接收到的交易構(gòu)成的Merkle根,并填寫(xiě)區(qū)塊頭中各字段的元數(shù)據(jù),其中Nonce的初始值設(shè)置為0。

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

(4)當(dāng)某個(gè)節(jié)點(diǎn)找到了符合工作量證明要求的Nonce值后,為了獲得對(duì)該區(qū)塊的記賬權(quán)(獲得了記賬權(quán)就獲得了獎(jiǎng)勵(lì)),就需要盡快將該區(qū)塊以廣播形式向全網(wǎng)分發(fā)。

(5)其他節(jié)點(diǎn)在接收到新區(qū)塊后,為了盡快挖出下一個(gè)區(qū)塊,就會(huì)對(duì)接收到的區(qū)塊進(jìn)行驗(yàn)證,如果正確,便將該新區(qū)塊添加到主鏈上,并在該區(qū)塊的基礎(chǔ)上去競(jìng)爭(zhēng)下一個(gè)區(qū)塊。

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

PoW共識(shí)機(jī)制的特點(diǎn)是各參與節(jié)點(diǎn)緊緊依賴(lài)于自己的算力以獲得對(duì)新區(qū)塊的記賬權(quán),同時(shí)獲得相應(yīng)的獎(jiǎng)勵(lì)(該過(guò)程也實(shí)現(xiàn)了比特幣的發(fā)行),在此共識(shí)過(guò)程中引入了經(jīng)濟(jì)激勵(lì)機(jī)制,從而使更多的節(jié)點(diǎn)為了追求經(jīng)濟(jì)利益而愿意加入到挖礦過(guò)程中,這種獨(dú)特的共識(shí)機(jī)制不但有利于系統(tǒng)的長(zhǎng)久穩(wěn)定運(yùn)行,而且增強(qiáng)了網(wǎng)絡(luò)的可靠性與安全性。

PoW共識(shí)機(jī)制的優(yōu)勢(shì)是借助比特幣特有的價(jià)值屬性激勵(lì)節(jié)點(diǎn)參與挖礦,并在共識(shí)過(guò)程中通過(guò)競(jìng)爭(zhēng)區(qū)塊的記賬權(quán)實(shí)現(xiàn)了比特幣的貨幣發(fā)行和交易支付行為,采用的驗(yàn)證和競(jìng)爭(zhēng)機(jī)制保障了系統(tǒng)的安全性和去中心化。但PoW共識(shí)過(guò)程完全依賴(lài)各節(jié)點(diǎn)的算力,從而引起大量資源的浪費(fèi),與當(dāng)前綠色發(fā)展的理念格格不入。同時(shí),長(zhǎng)達(dá)10 min的出塊時(shí)間,使PoW機(jī)制不適合于額度小、交易量大的商業(yè)應(yīng)用,其可擴(kuò)展性受到了限制。

4.2 PoS共識(shí)機(jī)制

PoS共識(shí)機(jī)制是PoW的替代方案,是為解決PoW共識(shí)機(jī)制中一直被詬病的資源浪費(fèi)以及為了滿(mǎn)足更高要求的安全性而提出來(lái)的。PoS設(shè)置的記賬規(guī)則與PoW算法類(lèi)似,即所有礦工基于算力競(jìng)爭(zhēng)滿(mǎn)足特定條件的哈希值,最先成功求得解的礦工便擁有記賬權(quán)。兩種算法的不同之處在于,PoW共識(shí)是基于節(jié)點(diǎn)的算力來(lái)求解符合條件的哈希值,而PoS則是尋找最高權(quán)益的節(jié)點(diǎn),即PoS通過(guò)權(quán)益證明來(lái)替代PoW中的基于節(jié)點(diǎn)哈希算力的證明來(lái)競(jìng)爭(zhēng)新區(qū)塊的記賬權(quán)。

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

與PoW算法相比,PoS算法擁有一些明顯的優(yōu)點(diǎn),如放棄單純的算力競(jìng)爭(zhēng)而節(jié)約了能源,采用清零機(jī)制解決了算力過(guò)于集中,限制只有在線(xiàn)用戶(hù)才能獲得收益從而解決“公地悲劇”(tragedy of the commons)的發(fā)生等。但PoS更容易出現(xiàn)分叉,安全性和容錯(cuò)性相對(duì)較低,某些擁有權(quán)益的節(jié)點(diǎn)無(wú)意全力投入到記賬競(jìng)爭(zhēng)中等。

4.3 DPoS共識(shí)機(jī)制

為了有效解決PoS共識(shí)機(jī)制存在的不足,2014年4月,Larimer等在PoS的基礎(chǔ)上提出了DPoS共識(shí)算法[33],以提高持幣者參與挖礦的積極性和主動(dòng)性。DPoS共識(shí)機(jī)制也稱(chēng)為股份授權(quán)證明算法,即每個(gè)節(jié)點(diǎn)相當(dāng)于一個(gè)股東,所有股東選擇一定數(shù)量的代表作為共同信任的委托人,由該委托人來(lái)幫助大家記賬。DPoS共識(shí)機(jī)制與PoS的最大區(qū)別表現(xiàn)為:

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

(2)激勵(lì)與懲罰。根據(jù)系統(tǒng)約定,每個(gè)委托人在規(guī)定的時(shí)間范圍內(nèi)輪流負(fù)責(zé)新區(qū)塊的生成、轉(zhuǎn)發(fā)和驗(yàn)證,并可以從每筆交易中獲得一定數(shù)額的交易費(fèi)(transaction fees)。為了防止委托人不作為,系統(tǒng)規(guī)定每個(gè)委托人必須事先繳納金額相當(dāng)于獲得一個(gè)新區(qū)塊記賬權(quán)獎(jiǎng)勵(lì)100倍的保證金,如果某個(gè)委托人沒(méi)有在規(guī)定的時(shí)間內(nèi)完成新區(qū)塊的創(chuàng)建工作,股東將會(huì)收回選票,并將該委托人降為普通股東,同時(shí)保證金也會(huì)被沒(méi)收[34]。這樣,委托人為了能夠獲益,必須保持永久在線(xiàn)。

基于DPoS共識(shí)機(jī)制的區(qū)塊鏈系統(tǒng)是一個(gè)中心化(針對(duì)委托人)和去中心化(針對(duì)所有股東)的混合體,每個(gè)節(jié)點(diǎn)都能夠通過(guò)投票決定自己的委托人,有限的委托人輪流記賬,大幅度減少了參與記賬競(jìng)爭(zhēng)的節(jié)點(diǎn)數(shù),提高了共識(shí)驗(yàn)證的效率。而且每一個(gè)委托人的工作狀態(tài)都受到投票者的監(jiān)督,在確保節(jié)點(diǎn)真實(shí)性的同時(shí),也能夠使那些雖然擁有較少資源(算力)但具有較強(qiáng)責(zé)任心的節(jié)點(diǎn)有機(jī)會(huì)成為委托人而獲益。

4.4 PBFT共識(shí)機(jī)制

與PoW、PoS和DPoS不同的是,拜占庭容錯(cuò)(Byzantine fault tolerance,BFT)[35]機(jī)制無(wú)需通過(guò)競(jìng)爭(zhēng)來(lái)確定記賬者,而是讓系統(tǒng)中的節(jié)點(diǎn)以投票方式來(lái)產(chǎn)生新區(qū)塊,并實(shí)現(xiàn)系統(tǒng)中共識(shí)結(jié)果的一致性,而且不會(huì)出現(xiàn)分叉現(xiàn)象。根據(jù)分布式系統(tǒng)的CAP理論,任何一個(gè)系統(tǒng)在C(consistency,一致性)、A(availability,可用性)和P(partition tolerance,分區(qū)容錯(cuò)性)三者中最多能夠同時(shí)實(shí)現(xiàn)兩項(xiàng),這就使得BFT在滿(mǎn)足一致性和可用性的前提下,只能弱化分區(qū)容錯(cuò)性。由于BFT機(jī)制具有強(qiáng)一致性(這是共識(shí)機(jī)制的前提),因此各種基于BFT的衍生算法廣泛應(yīng)用于區(qū)塊鏈網(wǎng)絡(luò),如超級(jí)賬本和Antshares等多個(gè)區(qū)塊鏈系統(tǒng)都使用了PBFT共識(shí)機(jī)制。

PBFT通過(guò)優(yōu)化算法將計(jì)算復(fù)雜度從指數(shù)級(jí)降到多項(xiàng)式級(jí),解決了BFT運(yùn)行效率低的不足。PBFT共識(shí)機(jī)制主要包括共識(shí)達(dá)成、檢查點(diǎn)協(xié)議(check point)和視圖轉(zhuǎn)換(view-change)3個(gè)部分。其中,PBFT共識(shí)達(dá)成分為以下5個(gè)過(guò)程(如圖8所示):

(1)請(qǐng)求(propose)。當(dāng)客戶(hù)端(client)向主節(jié)點(diǎn)發(fā)起一個(gè)請(qǐng)求時(shí),便產(chǎn)生一個(gè)新的視圖(view)。其中,PBFT中的節(jié)點(diǎn)分為主節(jié)點(diǎn)(primary)和副本節(jié)點(diǎn)(replica)兩種類(lèi)型,1個(gè)PBFT區(qū)塊鏈網(wǎng)絡(luò)中的主節(jié)點(diǎn)只有1個(gè),其他節(jié)點(diǎn)都是副本節(jié)點(diǎn);視圖表示當(dāng)前所有節(jié)點(diǎn)身份的狀態(tài)信息,當(dāng)視圖轉(zhuǎn)換協(xié)議更換了一個(gè)主節(jié)點(diǎn)時(shí),視圖也會(huì)隨之發(fā)生變化。

(2)預(yù)準(zhǔn)備(pre-prepare)。主節(jié)點(diǎn)在收到客戶(hù)端的請(qǐng)求消息后,首先對(duì)其進(jìn)行編號(hào),然后將計(jì)算得到的預(yù)準(zhǔn)備消息發(fā)給所有的副本節(jié)點(diǎn)。在此過(guò)程中,用到了哈希算法、數(shù)字簽名等方式。

(3)準(zhǔn)備(prepare)。副本節(jié)點(diǎn)在收到主節(jié)點(diǎn)發(fā)送的預(yù)準(zhǔn)備消息后,驗(yàn)證消息的合法性。驗(yàn)證通過(guò)后,副本節(jié)點(diǎn)分別計(jì)算準(zhǔn)備消息,然后將結(jié)果發(fā)送給其他節(jié)點(diǎn)。與此同時(shí),各節(jié)點(diǎn)對(duì)自己收到的準(zhǔn)備消息進(jìn)行驗(yàn)證,當(dāng)通過(guò)驗(yàn)證的合法準(zhǔn)備消息數(shù)量大于等于2f+1(f為惡意節(jié)點(diǎn)數(shù))時(shí),將預(yù)準(zhǔn)備消息和準(zhǔn)備消息寫(xiě)入日志,并向其他節(jié)點(diǎn)發(fā)送確認(rèn)消息。

(4)確認(rèn)(commit)。節(jié)點(diǎn)接收到確認(rèn)消息,并驗(yàn)證其合法性。如果通過(guò)驗(yàn)證的合法確認(rèn)消息的數(shù)量大于等于2f+1,將完成消息的證明,并將證明結(jié)果發(fā)送給客戶(hù)端。

(5)回復(fù)(reply)??蛻?hù)端對(duì)接收到的由各節(jié)點(diǎn)回復(fù)的證明消息進(jìn)行驗(yàn)證,當(dāng)通過(guò)驗(yàn)證的消息數(shù)量大于等于2f+1時(shí),客戶(hù)端確認(rèn)完成請(qǐng)求。否則,客戶(hù)端需要重新發(fā)起一輪全新的請(qǐng)求過(guò)程。

Fig.8 PBFT consensus building process圖8 PBFT共識(shí)達(dá)成過(guò)程

在采用PBFT共識(shí)機(jī)制的區(qū)塊鏈網(wǎng)絡(luò)中,主節(jié)點(diǎn)代表獲得記賬權(quán)的節(jié)點(diǎn),而客戶(hù)端請(qǐng)求代表交易信息。

在PBFT共識(shí)過(guò)程中,還用到了檢查點(diǎn)協(xié)議和視圖轉(zhuǎn)換協(xié)議[36-37]。其中,檢查點(diǎn)協(xié)議的功能是實(shí)現(xiàn)節(jié)點(diǎn)狀態(tài)的一致性。當(dāng)某個(gè)節(jié)點(diǎn)因網(wǎng)絡(luò)延時(shí)或中斷等原因?qū)е聫哪骋痪幪?hào)開(kāi)始的請(qǐng)求消息沒(méi)有執(zhí)行時(shí),檢查點(diǎn)協(xié)議通過(guò)周期性地執(zhí)行同步操作,將系統(tǒng)中的節(jié)點(diǎn)同步到某一個(gè)相同的狀態(tài),并定期刪除指定時(shí)間點(diǎn)之前的日志數(shù)據(jù),以節(jié)約節(jié)點(diǎn)存儲(chǔ)空間;視圖轉(zhuǎn)換協(xié)議的功能是在主節(jié)點(diǎn)不能正常工作時(shí),重新從現(xiàn)有的副本節(jié)點(diǎn)中選出一個(gè)新的節(jié)點(diǎn)作為主節(jié)點(diǎn),繼續(xù)PBFT共識(shí)過(guò)程。

由于PBFT共識(shí)中可以生成新區(qū)塊的節(jié)點(diǎn)(primary節(jié)點(diǎn))是唯一的,因此不會(huì)存在分叉現(xiàn)象[38]。但由于每個(gè)節(jié)點(diǎn)都需要頻繁地接收從其他節(jié)點(diǎn)發(fā)送過(guò)來(lái)的交易數(shù)據(jù),同時(shí)也要將本節(jié)點(diǎn)的交易數(shù)據(jù)盡快發(fā)送出去,因此網(wǎng)絡(luò)的開(kāi)銷(xiāo)較大,導(dǎo)致基于PBFT共識(shí)機(jī)制的區(qū)塊鏈的系統(tǒng)性能不高,只能滿(mǎn)足規(guī)模不大的聯(lián)盟鏈應(yīng)用場(chǎng)景。

5 智能合約

5.1 區(qū)塊鏈中的智能合約

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

廣義的智能合約是指運(yùn)行在區(qū)塊鏈上的計(jì)算機(jī)程序。狹義的智能合約可以認(rèn)為是運(yùn)行在區(qū)塊鏈基礎(chǔ)架構(gòu)上,基于約定規(guī)則,由事件驅(qū)動(dòng),具有狀態(tài),能夠保存賬本上資產(chǎn),利用程序代碼來(lái)封裝和驗(yàn)證復(fù)雜交易行為,實(shí)現(xiàn)信息交換、價(jià)值轉(zhuǎn)移和資產(chǎn)管理,可自動(dòng)執(zhí)行的計(jì)算機(jī)程序。目前,根據(jù)所使用的編程語(yǔ)言和運(yùn)行環(huán)境的不同,將比特幣中的智能合約稱(chēng)為腳本型智能合約,將主要運(yùn)行在以太坊和超級(jí)賬本中的智能合約稱(chēng)為圖靈完備型智能合約,而將正在研發(fā)中的kadena項(xiàng)目[39]中的智能合約稱(chēng)為可驗(yàn)證合約型智能合約[40]。

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

(2)圖靈完備型智能合約。腳本語(yǔ)言被設(shè)計(jì)成為僅在有限范圍內(nèi)執(zhí)行有限功能的簡(jiǎn)單執(zhí)行語(yǔ)言,是非圖靈完備的語(yǔ)言。使用腳本語(yǔ)言編寫(xiě)的交易指令雖然能夠滿(mǎn)足比特幣應(yīng)用,但無(wú)法適應(yīng)以太坊平臺(tái)的開(kāi)發(fā)需求。目前,以太坊主要使用Solidity[41]和Serpent[42]兩種智能合約開(kāi)發(fā)語(yǔ)言。其中,Solidity是一種語(yǔ)法上類(lèi)似于JavaScript的專(zhuān)門(mén)針對(duì)運(yùn)行在以太坊虛擬機(jī)(environment virtual machine,EVM)上的智能合約開(kāi)發(fā)而設(shè)計(jì)的高級(jí)編程語(yǔ)言,也是以太坊平臺(tái)主推的智能合約開(kāi)發(fā)語(yǔ)言;Serpent語(yǔ)言的設(shè)計(jì)類(lèi)似于Python,具有高效易用的編程風(fēng)格,是專(zhuān)門(mén)針對(duì)智能合約的特征而開(kāi)發(fā)的高級(jí)語(yǔ)言。在Hyperledger Fabric中采用GO、Java等通用語(yǔ)言編寫(xiě)運(yùn)行在Docker容器中的智能合約,GO和Java都是通用性較強(qiáng)的圖靈完備語(yǔ)言,能夠?qū)崿F(xiàn)基于聯(lián)盟鏈智能合約開(kāi)發(fā)中所需要的應(yīng)用邏輯。

(3)可驗(yàn)證合約型智能合約??沈?yàn)證語(yǔ)言Pact的語(yǔ)法類(lèi)似于LISP語(yǔ)言,用于編寫(xiě)運(yùn)行在區(qū)塊鏈Kadena上的智能合約,可實(shí)現(xiàn)合約的數(shù)據(jù)存儲(chǔ)和授權(quán)驗(yàn)證等功能。Pact語(yǔ)言采用非圖靈完備設(shè)計(jì),不支持循環(huán)和遞歸,以防止在復(fù)雜合約的編程過(guò)程中可能存在的安全漏洞以及因此而帶來(lái)的風(fēng)險(xiǎn)。用Pact語(yǔ)言編寫(xiě)的智能合約代碼直接嵌入在區(qū)塊鏈上運(yùn)行,不需要事先編譯成為運(yùn)行在特定環(huán)境(如以太坊EVM)的機(jī)器代碼。

5.2 區(qū)塊鏈智能合約運(yùn)行機(jī)制

由于區(qū)塊鏈應(yīng)用的多樣性,在不同平臺(tái)上使用的智能合約的運(yùn)行機(jī)制也不盡相同。本節(jié)主要選擇目前最具代表性的以太坊開(kāi)發(fā)平臺(tái),介紹智能合約的運(yùn)行機(jī)制(如圖9所示),主要包括以下階段:

(1)智能合約代碼的生成。在合約各方就傳統(tǒng)意義上的合同內(nèi)容達(dá)成一致的基礎(chǔ)上,通過(guò)評(píng)估確定該合同是可以通過(guò)智能合約實(shí)現(xiàn)的(是可編程的),然后由程序員利用合適的開(kāi)發(fā)語(yǔ)言將以自然語(yǔ)言描述的合同內(nèi)容編碼成為可執(zhí)行的機(jī)器語(yǔ)言。

(2)編譯。利用開(kāi)發(fā)語(yǔ)言編寫(xiě)的智能合約代碼一般不能直接在區(qū)塊鏈上運(yùn)行,而需要在特定的沙箱環(huán)境(以太坊為EVM,超級(jí)賬本為Docker容器)中執(zhí)行,因此在將合約文件上傳到區(qū)塊鏈之前需要利用編譯器對(duì)原代碼進(jìn)行編譯,生成符合沙箱環(huán)境運(yùn)行要求的字節(jié)碼。

(3)提交。智能合約的提交和調(diào)用是通過(guò)“交易”(transaction,Txn)來(lái)完成。當(dāng)用戶(hù)以交易形式發(fā)起提交合約文件后,通過(guò)P2P網(wǎng)絡(luò)進(jìn)行全網(wǎng)廣播,各節(jié)點(diǎn)在進(jìn)行驗(yàn)證后存儲(chǔ)在區(qū)塊中。

Fig.9 Smart contract operation mechanism圖9 智能合約運(yùn)行機(jī)制

(4)確認(rèn)。被驗(yàn)證后的有效交易被打包進(jìn)新區(qū)塊,經(jīng)過(guò)共識(shí)機(jī)制,新區(qū)塊添加到區(qū)塊鏈的主鏈。根據(jù)交易生成智能合約的賬戶(hù)地址,之后可以利用該賬戶(hù)地址通過(guò)發(fā)起交易來(lái)調(diào)用合約,節(jié)點(diǎn)對(duì)經(jīng)驗(yàn)證有效的交易進(jìn)行處理,被調(diào)用的合約在沙箱中執(zhí)行。

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

5.3 區(qū)塊鏈智能合約的實(shí)現(xiàn)技術(shù)

根據(jù)運(yùn)行環(huán)境的不同,目前智能合約主要集中在比特幣、以太坊和超級(jí)賬本3類(lèi)應(yīng)用場(chǎng)景中。

5.3.1 比特幣中智能合約的實(shí)現(xiàn)技術(shù)

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

5.3.2 以太坊中智能合約的實(shí)現(xiàn)技術(shù)

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

不同于標(biāo)準(zhǔn)的存儲(chǔ)器結(jié)構(gòu),EVM中的程序代碼并沒(méi)有存放在常規(guī)的RAM(random access memory)和外部存儲(chǔ)介質(zhì)中,而是保存在虛擬的ROM(readonly memory)中。為了滿(mǎn)足SHA256算法和橢圓曲線(xiàn)加密算法的運(yùn)行要求,EVM提供了大小為256位的簡(jiǎn)單棧式結(jié)構(gòu)。EVM部署在以太坊節(jié)點(diǎn)上,負(fù)責(zé)合約的執(zhí)行。當(dāng)合約在EVM中初始化時(shí),將創(chuàng)建新的合約賬戶(hù)信息,包括賬戶(hù)地址、存儲(chǔ)空間和主體代碼等內(nèi)容。

為了防止因人為或設(shè)計(jì)缺陷導(dǎo)致的區(qū)塊鏈資源消耗,以太坊智能合約引入了gas計(jì)費(fèi)機(jī)制。合約創(chuàng)建與調(diào)用、賬戶(hù)中存儲(chǔ)數(shù)據(jù)的訪(fǎng)問(wèn)、在EVM上運(yùn)行操作碼等涉及到合約創(chuàng)建和運(yùn)行的過(guò)程,都需要按相應(yīng)標(biāo)準(zhǔn)支付相應(yīng)數(shù)量的gas。當(dāng)EVM代碼創(chuàng)建過(guò)程中所需的gas數(shù)量大于賬戶(hù)的gas余量時(shí),不但新的合約無(wú)法創(chuàng)建,而且賬戶(hù)中剩余的gas將被清零。gas計(jì)費(fèi)機(jī)制為智能合約的運(yùn)行提供了有效保障。

5.3.3 超級(jí)賬本中智能合約的實(shí)現(xiàn)技術(shù)

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

(1)打包(package)。將chaincode安裝在Peer節(jié)點(diǎn),包括創(chuàng)建包和對(duì)包簽名。具體是指將用開(kāi)發(fā)語(yǔ)言(多使用GO語(yǔ)言)編寫(xiě)的源代碼按照chaincode部署規(guī)范(chaincode deployment spec,CDS)重新定義,并通過(guò)簽名來(lái)檢查和確認(rèn)chaincode的所有者。如果要讓chaincode擁有多個(gè)所有者,首先需要?jiǎng)?chuàng)建一個(gè)被簽名的chaincode包(SignedCDS包),然后讓這個(gè)包依次被每個(gè)所有者進(jìn)行簽名。

(2)安裝(install)。將CDS規(guī)定格式的chaincode安裝在一個(gè)將要運(yùn)行該合約的Peer節(jié)點(diǎn)上。chaincode只被安裝在合約所有者的背書(shū)節(jié)點(diǎn)上,安裝的實(shí)質(zhì)是代碼的編譯過(guò)程。

(3)實(shí)例化(instantiate)。調(diào)用生命周期系統(tǒng)chaincode(lifecycle system chaincode,LSCC),在channel[44](即基于交易規(guī)則將區(qū)塊鏈網(wǎng)絡(luò)劃分后形成的邏輯單元)上啟動(dòng)一個(gè)Docker容器,實(shí)現(xiàn)合約與channel的綁定。實(shí)例化過(guò)程,會(huì)生成對(duì)應(yīng)channel的Docker鏡像和Docker容器,可以指定背書(shū)策略。在成功進(jìn)行了實(shí)例化后,處于激活狀態(tài)的chaincode將監(jiān)聽(tīng)并接收交易請(qǐng)求。

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

(5)刪除(delete)。刪除chaincode對(duì)應(yīng)的Docker容器以及每個(gè)安裝合約的背書(shū)節(jié)點(diǎn)上的SignedCDS包。在正在開(kāi)發(fā)的版本中,將用stop和start交易的指令來(lái)停止或重啟chaincode,而不需要直接將其刪除。

超級(jí)賬本中的智能合約基于模塊化的可擴(kuò)展架構(gòu),將共識(shí)服務(wù)從背書(shū)節(jié)點(diǎn)分離開(kāi)來(lái),形成獨(dú)立的功能模塊,可擴(kuò)展性強(qiáng),共識(shí)效率高,作為聯(lián)盟鏈應(yīng)用,適合于供應(yīng)鏈、銀行、證券機(jī)構(gòu)等行業(yè)的應(yīng)用場(chǎng)景。

6 區(qū)塊鏈應(yīng)用現(xiàn)狀和存在的挑戰(zhàn)

6.1 區(qū)塊鏈應(yīng)用現(xiàn)狀

與傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)相比,區(qū)塊鏈在去中心化、數(shù)據(jù)按時(shí)序存儲(chǔ)及防篡改、交易的可溯源與不可否認(rèn)、自動(dòng)執(zhí)行的智能合約等方面具有絕對(duì)的優(yōu)勢(shì),這使得區(qū)塊鏈技術(shù)不僅在數(shù)字加密貨幣領(lǐng)域彰顯了獨(dú)有的優(yōu)勢(shì),同時(shí)在社會(huì)管理、金融、經(jīng)濟(jì)等眾多領(lǐng)域具有廣泛的應(yīng)用場(chǎng)景。而且,區(qū)塊鏈在技術(shù)迭代過(guò)程中其功能得到不斷豐富和完善,更顯示出迅猛的發(fā)展勢(shì)頭。本節(jié)以區(qū)塊鏈1.0、區(qū)塊鏈2.0和區(qū)塊鏈3.0發(fā)展為脈絡(luò),分析區(qū)塊鏈技術(shù)的應(yīng)用現(xiàn)狀。

6.1.1 基于區(qū)塊鏈1.0的數(shù)字貨幣

區(qū)塊鏈最初的應(yīng)用是比特幣,但隨著比特幣在全球的興起,區(qū)塊鏈潛在的價(jià)值開(kāi)始引起大家的普遍關(guān)注。區(qū)塊鏈1.0對(duì)應(yīng)的是以比特幣為代表的數(shù)字貨幣,主要功能集中在貨幣的發(fā)行和轉(zhuǎn)移。比特幣的關(guān)鍵技術(shù)是使用一種全新的分布式記賬方式實(shí)現(xiàn)交易過(guò)程的去中心化。2009年,比特幣作為開(kāi)源軟件發(fā)布,之后基于比特幣平臺(tái),直接在區(qū)塊鏈賬本內(nèi)部或利用分叉機(jī)制來(lái)創(chuàng)建新的代幣。

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

6.1.2 基于區(qū)塊鏈2.0的智能合約

基于區(qū)塊鏈2.0的智能合約主導(dǎo)的去中心化應(yīng)用,雖然豐富了區(qū)塊鏈的應(yīng)用場(chǎng)景,但整體上仍然延續(xù)了比特幣在數(shù)字貨幣上的優(yōu)勢(shì)和應(yīng)用慣性。區(qū)塊鏈的本質(zhì)是由多方共同維護(hù)的分布式數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)中記錄的是用戶(hù)的交易數(shù)據(jù),則這個(gè)數(shù)據(jù)庫(kù)就是一個(gè)分布式賬本;如果記錄的內(nèi)容更加復(fù)雜(如學(xué)生學(xué)籍、公民身份證、護(hù)照等信息,或物聯(lián)網(wǎng)中智能節(jié)點(diǎn)產(chǎn)生的感知數(shù)據(jù)等),則該數(shù)據(jù)庫(kù)將會(huì)應(yīng)用于更加廣泛的場(chǎng)景,如學(xué)生學(xué)籍管理、公民身份信息管理、醫(yī)療信息管理、物聯(lián)網(wǎng)應(yīng)用等;如果能夠?qū)⒂涗浀絽^(qū)塊鏈中的內(nèi)容從靜態(tài)數(shù)據(jù)擴(kuò)展為可執(zhí)行代碼,并允許存在“if…then…”和“what…if…”循環(huán)判斷語(yǔ)句,則可以通過(guò)預(yù)置合約條款的相應(yīng)觸發(fā)場(chǎng)景和判斷規(guī)則,使區(qū)塊鏈能夠處理涉及復(fù)雜邏輯的交易過(guò)程,即實(shí)現(xiàn)智能合約。

以以太坊為代表的區(qū)塊鏈2.0實(shí)現(xiàn)了智能合約功能,智能合約是一類(lèi)以合約為交易數(shù)據(jù)的分布式數(shù)據(jù)庫(kù),被代碼化的合約記錄在區(qū)塊鏈中,用戶(hù)以發(fā)起交易的方式來(lái)觸發(fā)合約狀態(tài)的改變,當(dāng)合約條款的觸發(fā)條件滿(mǎn)足時(shí),預(yù)置的代碼邏輯將自動(dòng)執(zhí)行,并將執(zhí)行結(jié)果打包后保存在區(qū)塊中,且經(jīng)共識(shí)機(jī)制驗(yàn)證后將不能更改。

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

超級(jí)賬本是為了解決以太坊在安全性和性能方面存在的不足,使區(qū)塊鏈滿(mǎn)足商業(yè)應(yīng)用的需求而建立的開(kāi)源規(guī)范和標(biāo)準(zhǔn)。超級(jí)賬本中的智能合約通過(guò)構(gòu)建聯(lián)盟鏈為參與合作方建立一個(gè)透明、公開(kāi)、半中心化的開(kāi)發(fā)平臺(tái)。聯(lián)盟鏈中的典型代表Hyperledger Fabric由身份認(rèn)證服務(wù)、賬本服務(wù)和合約鏈碼服務(wù)3個(gè)核心組件構(gòu)成[44],其中身份認(rèn)證服務(wù)提供對(duì)區(qū)塊鏈網(wǎng)絡(luò)接入節(jié)點(diǎn)和用戶(hù)的認(rèn)證,賬本服務(wù)主要為交易數(shù)據(jù)的存儲(chǔ)、賬本及全局狀態(tài)數(shù)據(jù)的更新等提供服務(wù),合約鏈碼服務(wù)作為賬本服務(wù)的擴(kuò)展,以Docker容器方式為運(yùn)行復(fù)雜應(yīng)用業(yè)務(wù)邏輯提供服務(wù)。

6.1.3 基于區(qū)塊鏈3.0的EOS

雖然以太坊和超級(jí)賬本通過(guò)增加智能合約層實(shí)現(xiàn)了區(qū)塊鏈技術(shù)在復(fù)雜場(chǎng)景中的應(yīng)用,但以太坊平臺(tái)只能在并發(fā)訪(fǎng)問(wèn)數(shù)有限的環(huán)境中實(shí)現(xiàn)運(yùn)行功能相對(duì)單一的智能合約,超級(jí)賬本對(duì)復(fù)雜合約的運(yùn)行也有限。

企業(yè)操作系統(tǒng)(EOS)[45]是專(zhuān)門(mén)為區(qū)塊鏈應(yīng)用開(kāi)發(fā)的一款操作系統(tǒng),具體在合約層下方創(chuàng)建一個(gè)功能等同于計(jì)算機(jī)操作系統(tǒng)的功能層,為企業(yè)用戶(hù)開(kāi)發(fā)更多基于區(qū)塊鏈智能合約的應(yīng)用場(chǎng)景,以實(shí)現(xiàn)更加復(fù)雜的去中心化應(yīng)用(DApp)[46]提供操作系統(tǒng)級(jí)的支撐和服務(wù)。DApp基于區(qū)塊鏈技術(shù),將程序代碼和運(yùn)行結(jié)果全部保存在區(qū)塊中,保證了程序運(yùn)行的可靠性和數(shù)據(jù)的可信性,因此DApp可以看作是智能合約應(yīng)用功能的擴(kuò)展。在EOS中將參與挖礦的節(jié)點(diǎn)資源用來(lái)部署DApp,采用DPoS共識(shí)機(jī)制,通過(guò)見(jiàn)證人生成新區(qū)塊。

DApp的出現(xiàn),可以使開(kāi)發(fā)者在開(kāi)發(fā)區(qū)塊鏈應(yīng)用程序時(shí),不需要像以太坊、超級(jí)賬本那樣還要關(guān)注底層的區(qū)塊鏈技術(shù),而是專(zhuān)注于構(gòu)建能夠運(yùn)行在區(qū)塊鏈上的DApp應(yīng)用程序的開(kāi)發(fā)上,DApp與區(qū)塊鏈之間的信息交互由EOS負(fù)責(zé)完成。

6.2 區(qū)塊鏈的功能擴(kuò)展

區(qū)塊鏈技術(shù)在持續(xù)揚(yáng)棄中不斷發(fā)展,實(shí)現(xiàn)了以需求為導(dǎo)向的應(yīng)用創(chuàng)新。例如,針對(duì)PoW共識(shí)被詬病的能源浪費(fèi)問(wèn)題,適時(shí)提出了PoS、DPoS、PBFT等一系列共識(shí)機(jī)制,在能耗、出塊速度、一致性、安全性、是否存在代幣等方面提供了差異化的服務(wù)功能,以滿(mǎn)足不同應(yīng)用場(chǎng)景的需求。再如,在可擴(kuò)展性方面,區(qū)塊鏈技術(shù)為了應(yīng)對(duì)全網(wǎng)所有節(jié)點(diǎn)使用完全相同的交易數(shù)據(jù)帶來(lái)的效率和安全問(wèn)題,在以太坊中提出了分片(sharding)[47]技術(shù),在Hyperledger Fabric1.0中應(yīng)用了多通道(multichannel)[48]解決方案。

6.2.1 分片技術(shù)

分片技術(shù)基于以太坊賬戶(hù)地址,將全網(wǎng)劃分成多個(gè)地址域,每個(gè)相對(duì)獨(dú)立的地址域稱(chēng)為一個(gè)分片,每個(gè)分片中維護(hù)著一條獨(dú)立的子鏈。位于分片中的節(jié)點(diǎn)(一個(gè)節(jié)點(diǎn)可同時(shí)加入多個(gè)分片)在該分片內(nèi)進(jìn)行交易,并存儲(chǔ)該分片中的交易數(shù)據(jù)。當(dāng)需要訪(fǎng)問(wèn)的交易數(shù)據(jù)不在本分片內(nèi)時(shí),可以通過(guò)輕客戶(hù)端技術(shù)從位于其他分片的節(jié)點(diǎn)上讀取。

利用分片技術(shù),單一節(jié)點(diǎn)不需要存儲(chǔ)和處理全網(wǎng)的交易數(shù)據(jù),同時(shí)整個(gè)區(qū)塊鏈的處理能力不會(huì)受限于某一節(jié)點(diǎn)的計(jì)算能力[49]。

6.2.2 多通道技術(shù)

多通道技術(shù)基于交易規(guī)則,將整個(gè)區(qū)塊鏈網(wǎng)絡(luò)劃分成為多個(gè)通道(一個(gè)節(jié)點(diǎn)可以同時(shí)加入多個(gè)通道,如圖10所示),每個(gè)通道與關(guān)聯(lián)的配置和數(shù)據(jù)(包括交易、賬本、chaincode及成員身份等)共同構(gòu)成一條完整的邏輯上的子鏈,每個(gè)節(jié)點(diǎn)可同時(shí)在多條子鏈上參與共識(shí),每條子鏈上的交易具有獨(dú)立性。

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

6.3 區(qū)塊鏈存在的挑戰(zhàn)

Fig.10 Multichannel mechanism of Hyperledger Fabric圖10 Hyperledger Fabric的多通道機(jī)制

區(qū)塊鏈給社會(huì)發(fā)展的貢獻(xiàn)不僅僅是技術(shù)方面,更在于人們對(duì)傳統(tǒng)社會(huì)管理在理念的轉(zhuǎn)變和方法的創(chuàng)新。僅就技術(shù)層面來(lái)講,區(qū)塊鏈雖然在近年來(lái)得到了迅猛發(fā)展,但與整個(gè)社會(huì)發(fā)展的預(yù)期之間仍然存在著較大距離??蓮牟煌囊暯欠治鰠^(qū)塊鏈存在的問(wèn)題和挑戰(zhàn),得出不同的結(jié)論。因本文主要基于體系結(jié)構(gòu)和實(shí)現(xiàn)協(xié)議來(lái)分析區(qū)塊鏈系統(tǒng)的基礎(chǔ)架構(gòu),所以選擇了與之直接關(guān)聯(lián)的安全、隱私、漏洞和效率進(jìn)行分析。需要說(shuō)明的是:漏洞屬于安全的范疇,但由于區(qū)塊鏈技術(shù)發(fā)展迅速,應(yīng)用場(chǎng)景豐富,對(duì)社會(huì)各領(lǐng)域產(chǎn)生的創(chuàng)新和變革力度大,系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)中有意預(yù)設(shè)和無(wú)意留下的漏洞成為攻擊者尋找的目標(biāo)和可利用的資源,借助各類(lèi)安全漏洞的攻擊威脅日益突出。為此,本節(jié)將漏洞單列出來(lái)進(jìn)行分析。

6.3.1 安全挑戰(zhàn)

數(shù)據(jù)冗余不僅是傳統(tǒng)網(wǎng)絡(luò)的安全手段,也是區(qū)塊鏈的安全依賴(lài)。作惡節(jié)點(diǎn)如果通過(guò)偽造和篡改數(shù)據(jù)對(duì)區(qū)塊鏈網(wǎng)絡(luò)實(shí)施攻擊,雖然在理論上是可行的,但實(shí)際上是很難實(shí)現(xiàn)的。然而,區(qū)塊鏈并非一個(gè)物理隔離的系統(tǒng),而是通過(guò)相關(guān)協(xié)議、規(guī)范與機(jī)制構(gòu)建在互聯(lián)網(wǎng)上的服務(wù)系統(tǒng),攻擊者將基于互聯(lián)網(wǎng)結(jié)構(gòu)和協(xié)議實(shí)現(xiàn)中存在的漏洞,間接地對(duì)區(qū)塊鏈實(shí)施攻擊,或?qū)⒐粜袨檗D(zhuǎn)移到區(qū)塊鏈系統(tǒng),直接破壞區(qū)塊鏈的安全性和穩(wěn)定性。

區(qū)塊鏈涉及到身份認(rèn)證、共識(shí)機(jī)制、激勵(lì)機(jī)制、智能合約等關(guān)鍵技術(shù),每項(xiàng)技術(shù)又存在自身的實(shí)現(xiàn)細(xì)節(jié),如此復(fù)雜的結(jié)構(gòu)在尚未對(duì)安全性進(jìn)行整體評(píng)估的前提下,無(wú)論是代碼級(jí)的漏洞,還是系統(tǒng)配置上的不當(dāng),都潛在著安全隱患和可能發(fā)生的攻擊行為。另外,與認(rèn)證和控制機(jī)制相對(duì)完善的C/S結(jié)構(gòu)相比,區(qū)塊鏈采用的P2P網(wǎng)絡(luò)傳輸模式在抵御網(wǎng)絡(luò)入侵和攻擊等方面存在著不足。

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

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

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

6.3.2 隱私挑戰(zhàn)

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

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

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

6.3.3 漏洞挑戰(zhàn)

任何一個(gè)系統(tǒng)都存在漏洞,區(qū)塊鏈也不例外。漏洞(vulnerability)是信息技術(shù)、產(chǎn)品及系統(tǒng)在需求分析、設(shè)計(jì)開(kāi)發(fā)及配置等過(guò)程中有意或無(wú)意產(chǎn)生的缺陷(bug),這些缺陷一旦被利用,將會(huì)對(duì)系統(tǒng)造成嚴(yán)重?fù)p害。引起漏洞的因素很多,其中由針對(duì)區(qū)塊鏈腳本語(yǔ)言的不嚴(yán)謹(jǐn)性和執(zhí)行機(jī)制的不完善性引起的安全漏洞尤為突出。綜合分析,具體反映在以下幾個(gè)方面[62-63]:

(1)交易依賴(lài)性(transaction ordering dependence,TOD)。智能合約中賬戶(hù)狀態(tài)信息的改變由交易觸發(fā)、交易過(guò)程的先后次序決定了狀態(tài)改變的過(guò)程和結(jié)果。尤其是引起合約賬戶(hù)狀態(tài)改變的合約代碼的執(zhí)行,不同的執(zhí)行次序?qū)?huì)產(chǎn)生截然不同或錯(cuò)誤的結(jié)果。這種緊緊依賴(lài)交易順序的智能合約容易引起作惡節(jié)點(diǎn)通過(guò)偽造交易及執(zhí)行順序來(lái)操控合約的執(zhí)行。

(2)時(shí)間戳依賴(lài)(timestamp dependence)。時(shí)間戳是一段完整的、可驗(yàn)證的數(shù)據(jù),它用于證明某一數(shù)據(jù)產(chǎn)生于某一特定的時(shí)間點(diǎn)。區(qū)塊鏈中區(qū)塊的先后順序基于時(shí)間戳來(lái)確定,智能合約中一些合約的執(zhí)行需要依賴(lài)時(shí)間戳。但受網(wǎng)絡(luò)時(shí)鐘影響,很難使所有節(jié)點(diǎn)的時(shí)鐘都保持高度一致。時(shí)間戳在不同節(jié)點(diǎn)上存在的偏差為攻擊者通過(guò)設(shè)置區(qū)塊產(chǎn)生的時(shí)間戳來(lái)操控合約執(zhí)行提供了可能的條件。

(3)可重入性弱點(diǎn)(reentrancy vulnerability)。當(dāng)合約之間存在調(diào)用關(guān)系時(shí),調(diào)用者進(jìn)程會(huì)停下來(lái)等待被調(diào)用進(jìn)程結(jié)束后再繼續(xù)執(zhí)行,攻擊者利用調(diào)用進(jìn)程的暫停時(shí)間段重復(fù)調(diào)用合約,實(shí)施可重入攻擊。

(4)處理異常(mishandled exceptions)。當(dāng)合約之間存在調(diào)用關(guān)系時(shí),如果沒(méi)有對(duì)被調(diào)用合約的狀態(tài)和調(diào)用結(jié)果的正確性進(jìn)行驗(yàn)證,有意或無(wú)意產(chǎn)生的不正確的結(jié)果將會(huì)影響智能合約的執(zhí)行。

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

系統(tǒng)漏洞(尤其是可被利用的安全漏洞)的檢測(cè)是一個(gè)難題,智能合約更不例外。針對(duì)智能合約存在的漏洞,可以借鑒對(duì)傳統(tǒng)系統(tǒng)的漏洞檢測(cè)方法,發(fā)現(xiàn)并修補(bǔ)合約中存在的引起gas消耗的代碼。其中,智能合約的形式化驗(yàn)證可基于數(shù)學(xué)模型,通過(guò)相應(yīng)的分析工具對(duì)合約從設(shè)計(jì)、開(kāi)發(fā)和運(yùn)行進(jìn)行全過(guò)程驗(yàn)證,以規(guī)范合約的生成和執(zhí)行,提高合約的可靠性[64]。

6.3.4 效率挑戰(zhàn)

影響區(qū)塊鏈效率的因素很多,主要包括廣播機(jī)制、數(shù)據(jù)加解密、交易驗(yàn)證、共識(shí)機(jī)制等,具體可以分為以下幾類(lèi):

(1)共識(shí)機(jī)制。共識(shí)機(jī)制用于在不存在信任的節(jié)點(diǎn)之間達(dá)成共識(shí),確保數(shù)據(jù)的正確性和唯一性。然而,共識(shí)結(jié)果的達(dá)成是需要參與節(jié)點(diǎn)付出代價(jià)的,就像彩票一樣,要想中獎(jiǎng)就需要花錢(qián)購(gòu)買(mǎi)彩票。共識(shí)過(guò)程需要消耗算力和時(shí)間,這在很大程度上影響了區(qū)塊鏈的出塊速度。

(2)交易效率。交易效率由出塊速度來(lái)決定,目前比特幣、以太坊和Hyperledger Fabric的出塊速度分別為7 TPS(即每秒處理7筆交易)、25 TPS和2 000 TPS,較低的出塊速度與區(qū)塊鏈系統(tǒng)采用的共識(shí)機(jī)制有關(guān),而在現(xiàn)有的共識(shí)機(jī)制下,較低的出塊速度限制了區(qū)塊鏈在金融行業(yè)等需要快速、小額交易場(chǎng)景中的應(yīng)用。

(3)確認(rèn)時(shí)間。目前,比特幣的區(qū)塊生成時(shí)間為10 min,由于在連續(xù)產(chǎn)生6個(gè)區(qū)塊之后交易才不可逆,因此其交易確認(rèn)時(shí)間為60 min;以太坊在連續(xù)產(chǎn)生12個(gè)區(qū)塊之后交易不可逆,其交易確認(rèn)時(shí)間為3 min。較長(zhǎng)的確認(rèn)時(shí)間限制了區(qū)塊鏈在小額交易和時(shí)效性較強(qiáng)的場(chǎng)景中的應(yīng)用。

(4)狀態(tài)爆炸。從創(chuàng)世區(qū)塊開(kāi)始,比特幣所有區(qū)塊的大小從0增長(zhǎng)到3 GB用了10年時(shí)間,以太坊從0增長(zhǎng)到10 GB用了4年時(shí)間,區(qū)塊鏈歷史和狀態(tài)數(shù)據(jù)的快速增長(zhǎng),呈現(xiàn)狀態(tài)爆炸現(xiàn)象。Archive(歸檔)模式和Default(默認(rèn))模式是以太坊節(jié)點(diǎn)同步數(shù)據(jù)時(shí)采用的兩種模式。其中,在Archive模式下所有歷史數(shù)據(jù)(包括歷史交易和歷史狀態(tài))和當(dāng)前狀態(tài)數(shù)據(jù)都會(huì)保存下來(lái),所有數(shù)據(jù)當(dāng)前約為2 TB;在Default模式下,歷史狀態(tài)數(shù)據(jù)會(huì)被刪除,本地只保留歷史交易和當(dāng)前狀態(tài)數(shù)據(jù),共約170 GB。因?yàn)槊總€(gè)節(jié)點(diǎn)都要保存一份數(shù)據(jù)備份,這對(duì)于快速增長(zhǎng)的存儲(chǔ)空間要求帶來(lái)了挑戰(zhàn)。

針對(duì)區(qū)塊鏈的效率問(wèn)題,學(xué)者們提出了多種有效的解決方案。例如,Eyal等[65]針對(duì)比特幣在區(qū)塊大小、出塊時(shí)間及穩(wěn)定性等方面存在的不足,提出了一種可擴(kuò)展的區(qū)塊鏈協(xié)議,可根據(jù)需要將區(qū)塊分割成微塊和宏塊;Dickerson等[66]針對(duì)現(xiàn)行的區(qū)塊鏈系統(tǒng)單位時(shí)間內(nèi)可執(zhí)行的合約數(shù)受限問(wèn)題,提出了一種允許不同合約在互不沖突的前提下并行執(zhí)行的框架等。

7 結(jié)束語(yǔ)

就像智能手機(jī)出現(xiàn)時(shí)那樣,今天的區(qū)塊鏈正在改變著這個(gè)世界。隨著區(qū)塊鏈越來(lái)越多地應(yīng)用到不同的場(chǎng)景,區(qū)塊鏈技術(shù)的影響力也將從數(shù)字加密貨幣擴(kuò)展到不同社會(huì)領(lǐng)域,在改變甚至顛覆著越來(lái)越多的行業(yè)。區(qū)塊鏈在沒(méi)有任何第三方權(quán)威機(jī)構(gòu)介入的情況下,在不存在信任基礎(chǔ)的節(jié)點(diǎn)之間達(dá)成了彼此之間的共識(shí),實(shí)現(xiàn)了去中心化、不可篡改、不可否認(rèn)、可溯源的價(jià)值傳輸,進(jìn)而使其應(yīng)用從數(shù)字加密貨幣迅速擴(kuò)展到整個(gè)社會(huì)系統(tǒng),正在為人類(lèi)社會(huì)處于的大發(fā)展大變革大調(diào)整的過(guò)程注入動(dòng)力。然而,整個(gè)區(qū)塊鏈技術(shù)和應(yīng)用尚處于起步階段,大量涉及到的基礎(chǔ)理論和技術(shù)研究還需要結(jié)合學(xué)科及產(chǎn)業(yè)發(fā)展進(jìn)一步跟進(jìn)。

猜你喜歡
以太哈希比特
基于特征選擇的局部敏感哈希位選擇算法
哈希值處理 功能全面更易用
文件哈希值處理一條龍
基于活躍節(jié)點(diǎn)庫(kù)的以太坊加密流量識(shí)別方法
以太萬(wàn)物理論概述
車(chē)易鏈:做汽車(chē)業(yè)的“以太坊”
比特幣還能投資嗎
比特幣分裂
比特幣一年漲135%重回5530元
巧用哈希數(shù)值傳遞文件
女性| 应城市| 无锡市| 沁阳市| 福清市| 中宁县| 太湖县| 东乌| 光山县| 叶城县| 淮滨县| 县级市| 清河县| 萍乡市| 滨州市| 水城县| 西乡县| 辛集市| 饶阳县| 昌江| 伊吾县| 阳江市| 珲春市| 兰西县| 榆社县| 开远市| 宣恩县| 苏尼特左旗| 栖霞市| 化隆| 罗甸县| 庄河市| 辰溪县| 安多县| 昔阳县| 洪泽县| 兴宁市| 洛浦县| 隆化县| 津南区| 江北区|