曹迪迪 陳偉
摘 要:針對以太坊平臺提供的數(shù)據(jù)管理功能簡單且存在低吞吐率和高延遲的問題,提出一種基于智能合約的以太坊可信存證機(jī)制。首先針對以太坊平臺暴露的數(shù)據(jù)管理問題提出一個(gè)基于智能合約的以太坊可信存證框架,然后通過集中化數(shù)據(jù)統(tǒng)一處理、認(rèn)證數(shù)據(jù)分布式存儲以及高效動態(tài)取證這幾個(gè)方面闡述所提機(jī)制的框架和實(shí)現(xiàn),最后通過基于智能合約的系統(tǒng)開發(fā)表明了該機(jī)制的可實(shí)現(xiàn)性。實(shí)驗(yàn)及分析結(jié)果表明,該方法與傳統(tǒng)關(guān)系數(shù)據(jù)庫存證相比,增加了處理可信性、存儲可信性和訪問可信性;與區(qū)塊鏈存證相比,豐富了數(shù)據(jù)管理功能、降低了區(qū)塊存儲成本、提高了存證效率。
關(guān)鍵詞:以太坊;智能合約;區(qū)塊鏈;可信存證
中圖分類號:TP311; TP393.08
文獻(xiàn)標(biāo)志碼:A
文章編號:1001-9081(2019)04-1073-08
Abstract: Aiming at the problem that Ethereum platporm has simple data management function and poor performance of low throughput and high latency, a trusted storage mechanism based on smart contract in Ethereum was proposed. Firstly, a framework of trusted storage based on smart contract was proposed for solving data management problem exposed in Ethereum. Secondly, the framework and implementation of the proposed mechanism were expounded from the aspects of centralized data processing, authenticated data distributed storage and dynamic forensics. Finally, the feasibility of the mechanism was proved by the system development based on smart contract. The experimental and analysis results show that compared with the traditional relational database storage, the proposed method increases processing credibility, storage credibility and access credibility; compared with blockchain storage, it enriches data management function, reduces the cost of block storage and improves the efficiency of storage.
Key words: Ethereum; smart contract; blockchain; trusted storage
0?引言
區(qū)塊鏈(Blockchain)是一種基于數(shù)據(jù)加密、時(shí)間戳、分布式共識等機(jī)制實(shí)現(xiàn)去中心化的分布式數(shù)據(jù)管理技術(shù),具有不可篡改、可追溯、高可信和高可用的特點(diǎn)。區(qū)塊鏈的概念最早是在中本聰提出的比特幣(Bitcoin)這一虛擬貨幣中體現(xiàn),并隨著比特幣的快速發(fā)展得到了應(yīng)用[1]。隨后,以太坊(Ethereum)區(qū)塊鏈平臺以創(chuàng)建一個(gè)永不停止、無審查、自動維護(hù)的去中心化的世界計(jì)算機(jī)為愿景而被提出[2],不僅支持加密貨幣交易,即內(nèi)置了類似于比特幣的以太幣(Ether),而且提供了圖靈完備的編程環(huán)境,因而可以通過智能合約(Smart Contract)實(shí)現(xiàn)去中心化應(yīng)用程序(Decentralized APP, DAPP)。目前以太坊已擁有超過4200萬個(gè)賬戶,部署了超過60萬個(gè)智能合約,基于以太坊的DAPP也已經(jīng)超過1000例[3]。以太坊平臺提供了相對完善的區(qū)塊鏈開發(fā)與應(yīng)用基礎(chǔ),也推動了新問題的發(fā)現(xiàn)與研究。
中本聰最早設(shè)計(jì)區(qū)塊鏈?zhǔn)菫榱藢?shí)現(xiàn)虛擬加密貨幣的交易,區(qū)別于傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng),它只能提供有限的數(shù)據(jù)管理服務(wù)[4];同時(shí),區(qū)塊鏈中使用的共識機(jī)制是基于工作量證明(Proof-of-Work, PoW)的,高度依賴節(jié)點(diǎn)算力,復(fù)雜度與消耗成本較高,導(dǎo)致系統(tǒng)吞吐率較低、延遲較長[5]。因此,如何提供豐富的數(shù)據(jù)處理、存證和取證功能,實(shí)現(xiàn)高性能的數(shù)據(jù)管理系統(tǒng),成為了當(dāng)前區(qū)塊鏈領(lǐng)域研究的熱點(diǎn)問題之一。
本文結(jié)合以太坊平臺的特征,構(gòu)建一種基于智能合約的可信存證機(jī)制,主要包括集中化數(shù)據(jù)統(tǒng)一處理、認(rèn)證數(shù)據(jù)分布式存儲與高效動態(tài)取證等內(nèi)容,以實(shí)現(xiàn)電子數(shù)據(jù)在以太坊上的存證交易與還原驗(yàn)證,保證數(shù)據(jù)的真實(shí)唯一、可溯源與防篡改。從數(shù)據(jù)存證角度來看,區(qū)塊鏈的本質(zhì)是一個(gè)構(gòu)建在對等網(wǎng)絡(luò)(Peer-to-Peer Network)上的分布式賬本,能夠保證存證數(shù)據(jù)的原始性、真實(shí)性和完整性,適合應(yīng)用于司法鑒定、審計(jì)、公證、仲裁等權(quán)威機(jī)構(gòu),一旦產(chǎn)生糾紛,權(quán)威機(jī)構(gòu)可直接從節(jié)點(diǎn)中取證、核證,更有利于司法落地。
1?相關(guān)研究
已有的區(qū)塊鏈研究多圍繞加密貨幣[6]、協(xié)議[7]、架構(gòu)[8]、安全[9]和發(fā)展前景[10]角度進(jìn)行探討,而本文從可信存證的角度疏通以太坊平臺與數(shù)據(jù)管理功能之間的聯(lián)系渠道,實(shí)現(xiàn)以智能合約為數(shù)據(jù)存儲方式的可信存證機(jī)制,并分析數(shù)據(jù)的存儲編碼過程,提供兩種取證方式及核證還原方法,聚焦于系統(tǒng)的處理可信性、存儲可信性和訪問可信性。
處理可信性是指數(shù)據(jù)處理的正確性,要求事務(wù)的并發(fā)控制,系統(tǒng)需要保存數(shù)據(jù)的最終狀態(tài)。傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)有諸多的基本要求,其中之一就是處理可信性,但是傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)在某種程度上是集中式地保持事務(wù)的原子性、一致性、隔離性和耐久性,關(guān)于這方面已有成熟并相對高效的技術(shù)[11-12]。在數(shù)據(jù)管理方面雖然已有較多的關(guān)于分布式系統(tǒng)中共識機(jī)制的研究[13-14],但是受制于性能,共識機(jī)制通常只應(yīng)用于主控節(jié)點(diǎn)的選擇上,一般情況下不會直接應(yīng)用于事務(wù)處理[15]。因此,如何確保數(shù)據(jù)的處理可信性,同時(shí)兼顧事務(wù)處理的高效性,是以太坊這一去中心化對等網(wǎng)絡(luò)平臺亟須解決的問題之一。
存儲可信性是指數(shù)據(jù)在存儲前后應(yīng)保持一致性,數(shù)據(jù)處理過程中不會發(fā)生數(shù)據(jù)丟失或被篡改的情況。這就要求系統(tǒng)一方面既要保證在傳統(tǒng)數(shù)據(jù)庫管理系統(tǒng)[11]和事務(wù)處理[12]中所要求的事務(wù)持久性,另一方面又要在系統(tǒng)發(fā)生故障或被惡意攻擊時(shí),仍能保證數(shù)據(jù)在存儲前后的一致性和正確性。目前基于區(qū)塊鏈技術(shù)的可信存證方案大多是在原有的存證機(jī)制上引入?yún)^(qū)塊鏈思想,Zhang等[16]提出了一個(gè)基于區(qū)塊鏈的云取證流程源,將云系統(tǒng)的存在證明記錄通過區(qū)塊鏈技術(shù)進(jìn)行加密簽名,增強(qiáng)云取證的可信度。Bahga等[17]基于工業(yè)物聯(lián)網(wǎng)(Internet of Things, IoT)平臺向云計(jì)算制造引入?yún)^(qū)塊鏈理念,使得不受信任的對等網(wǎng)絡(luò)不需要可信第三方,用戶能夠按需訪問制造資源。但該類文獻(xiàn)中沒有涉及在以太坊平臺上通過智能合約進(jìn)行可信存證,且缺少對數(shù)據(jù)的取證與驗(yàn)證環(huán)節(jié)。
訪問可信性是指數(shù)據(jù)存證后的可審計(jì)及可追溯。在分布式對等網(wǎng)絡(luò)環(huán)境中,為了確保數(shù)據(jù)被訪問時(shí)是準(zhǔn)確可靠的,需要在驗(yàn)證數(shù)據(jù)的歷史狀態(tài)時(shí),進(jìn)行一些查詢和事務(wù)的相關(guān)處理[18]。在傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)中,數(shù)據(jù)的當(dāng)前狀態(tài)存儲于數(shù)據(jù)庫當(dāng)中,而數(shù)據(jù)庫日志通常記錄的是數(shù)據(jù)的存儲過程和歷史數(shù)據(jù),僅用于發(fā)生故障時(shí)恢復(fù)系統(tǒng),但不能直接提供查詢服務(wù)[11],因此,傳統(tǒng)的數(shù)據(jù)管理技術(shù)無法直接應(yīng)用于這一場景。數(shù)據(jù)溯源在科學(xué)數(shù)據(jù)管理中有著廣泛的應(yīng)用,例如集中式數(shù)據(jù)庫或?qū)Φ鹊姆植际江h(huán)境[19],但不能直接應(yīng)用于以太坊的平臺場景。
2?以太坊基礎(chǔ)
2.1?區(qū)塊數(shù)據(jù)結(jié)構(gòu)
區(qū)塊鏈的兩大應(yīng)用:一是比特幣,二是引入了智能合約的以太坊。二者在數(shù)據(jù)結(jié)構(gòu)的具體細(xì)節(jié)上雖有差異,但整體上基本相同,都是以區(qū)塊為單位的鏈?zhǔn)浇Y(jié)構(gòu),分為區(qū)塊間的鏈?zhǔn)浇Y(jié)構(gòu)與區(qū)塊內(nèi)的數(shù)據(jù)結(jié)構(gòu)[20]。如圖1所示,每個(gè)區(qū)塊由區(qū)塊頭和區(qū)塊體兩部分組成,頭信息是區(qū)塊的元數(shù)據(jù),用于驗(yàn)證區(qū)塊,并與其父區(qū)塊和子區(qū)塊建立關(guān)聯(lián)。通常,區(qū)塊頭中存放了父區(qū)塊哈希(Parent Block Hash)、時(shí)間戳(Timestamp)、隨機(jī)數(shù)(Nonce)、難度目標(biāo)(Difficulty)、Merkle根(Merkle Root)等。體信息則是交易的序列,存放了自前一區(qū)塊之后發(fā)生的多筆交易(Transaction)。
區(qū)塊鏈的兩個(gè)哈希結(jié)構(gòu)保障了數(shù)據(jù)的不可篡改性,即區(qū)塊鏈表和Merkle樹。區(qū)塊鏈表基于父區(qū)塊哈希、隨機(jī)數(shù)、難度目標(biāo)等數(shù)值,通過雙SHA256哈希運(yùn)算得到區(qū)塊哈希值[21],這就保證了區(qū)塊之間的環(huán)環(huán)相扣。Merkle樹是一種樹形數(shù)據(jù)結(jié)構(gòu),其非葉子節(jié)點(diǎn)是所有子節(jié)點(diǎn)的哈希值,葉子節(jié)點(diǎn)是區(qū)塊的交易哈希,數(shù)量為偶數(shù)。Merkle樹節(jié)點(diǎn)從下往上,兩兩成對,將組合哈希值作為新的哈希值,即新的樹節(jié)點(diǎn)。重復(fù)該過程,直到僅存在一個(gè)節(jié)點(diǎn),也就是根節(jié)點(diǎn),而根節(jié)點(diǎn)的哈希值就認(rèn)為是整棵Merkle樹的簽名值。以太坊不同于比特幣的地方在于以太坊擁有針對交易哈希的交易Merkle根,以及針對賬戶狀態(tài)數(shù)據(jù)的狀態(tài)Merkle根(State Root)[20]。除此之外,以太坊塊頭還含有收據(jù)Merkle根(Receipts Root),用于交易執(zhí)行日志。以太坊是使用MPT(Merkle Patricia Tree)來計(jì)算Merkle根的,其本質(zhì)是Merkle樹與前綴樹的結(jié)合,提供查找能力,查找路徑為以太坊的賬戶地址,從其樹根向下查找到葉子節(jié)點(diǎn)中賬戶的狀態(tài)數(shù)據(jù)。
2.2?以太坊賬戶與交易
以太坊是基于賬戶的模型,能夠針對狀態(tài)數(shù)據(jù)處理復(fù)雜的業(yè)務(wù)邏輯。以太坊賬戶由一個(gè)20字節(jié)的地址構(gòu)成,包含四個(gè)部分,即:用于確定每筆交易只能被處理一次的隨機(jī)數(shù),賬戶當(dāng)前的以太幣余額,賬戶的合約代碼,以及默認(rèn)為空的賬戶存儲。其中以太幣是以太坊內(nèi)部的加密燃料,用于支付交易或以太坊虛擬機(jī)(Ethereum Virtual Machine, EVM)中的計(jì)算服務(wù)費(fèi)用,目前市值已達(dá)570美元[3]。
一般而言,以太坊賬戶分為兩種類型:一是外部賬戶(External Owned Account, EOA),二是合約賬戶(Contract Account)。兩者區(qū)別在于外部賬戶由用戶控制,而合約賬戶由可執(zhí)行代碼,即合約代碼控制。以太坊的賬戶包含四個(gè)部分,分別是Nonce、Balance、StorageRoot和CodeHash。Nonce是確定每筆交易只能被處理一次的隨機(jī)數(shù),用于防范區(qū)塊鏈的重放攻擊,區(qū)別在于外部賬戶的Nonce表示從該賬戶地址發(fā)送的交易序號,合約賬戶的Nonce表示該賬戶創(chuàng)建的合約序號;Balance代表的是賬戶的以太幣余額;StorageRoot是Merkle樹的根節(jié)點(diǎn)哈希值,默認(rèn)為空;CodeHash表示賬戶EVM代碼的哈希值,區(qū)別在于外部賬戶的CodeHash是一個(gè)空字符串的哈希值,合約賬戶的CodeHash就是合約代碼的哈希值。
以太坊交易被定義為存儲從EOA發(fā)出的消息的簽名數(shù)據(jù)包,包含三種類型,即以太幣轉(zhuǎn)賬交易、部署智能合約與調(diào)用智能合約。其中,當(dāng)且僅當(dāng)合約變量值發(fā)生改變時(shí),調(diào)用合約才屬于交易。以太坊交易包含七個(gè)參數(shù),分別是To、Value、gasLimit、gasPrice、Nonce、Data及Signature。To代表了20字節(jié)的交易接收方地址,如果交易屬于部署智能合約,則To為空;Value表示支付交易的以太幣費(fèi)用,單位是Wei;gasLimit指Gas限制額,用于防止代碼的指數(shù)型爆炸和無限循環(huán);gasPrice是每一計(jì)算步驟需要支付礦工的費(fèi)用;Nonce是用于確定每筆交易只能被處理一次的計(jì)數(shù)器,防止重放攻擊;Data是調(diào)用智能合約時(shí)的消息數(shù)據(jù),或者是智能合約的二進(jìn)制代碼;Signature是確認(rèn)發(fā)送者的橢圓曲線數(shù)字簽名算法(Elliptic Curve Digital Signature Algorithm, ECDSA)哈希值。
2.3?智能合約
智能合約是定位于以太坊其中一個(gè)特定地址上的代碼(其功能)和數(shù)據(jù)(其狀態(tài))的集合[2],是一段計(jì)算機(jī)程序,通過調(diào)用智能合約,依照合約內(nèi)部規(guī)則執(zhí)行交易,訪問合約狀態(tài)數(shù)據(jù),從而實(shí)現(xiàn)DAPP。因此智能合約的存在擴(kuò)展了區(qū)塊鏈的功能,豐富了區(qū)塊鏈的上層應(yīng)用[22]。
智能合約首先由以太坊自定義的Solidity、Serpent等圖靈完備的腳本語言編寫,編譯為以太坊特有的二進(jìn)制格式以太坊虛擬機(jī)字節(jié)碼后,可將部署后的合約存放在區(qū)塊鏈上,廣播至區(qū)塊鏈的其他網(wǎng)絡(luò)節(jié)點(diǎn)上,之后合約每次被調(diào)用時(shí)才被EVM加載運(yùn)行。智能合約內(nèi)部包含了表示“賬戶地址”的address數(shù)據(jù)類型,相應(yīng)地,外部賬戶的賬戶地址常被用來進(jìn)行虛擬貨幣的交易,合約賬戶的賬戶地址常用于調(diào)用合約。智能合約的Gas消耗是根據(jù)執(zhí)行時(shí)所占用的CPU和內(nèi)存來計(jì)算的,Gas一旦耗盡,合約自動停止執(zhí)行,從而有效避免了合約死循環(huán)與無效交易的發(fā)生[20]。
一個(gè)智能合約可以由外部賬戶來部署,也可以由合約賬戶來部署,部署成功后,以太坊上的任何用戶都可以調(diào)用該合約進(jìn)行交易。從數(shù)據(jù)的可信性角度來看,賬戶調(diào)用智能合約的歷史操作將被記錄在區(qū)塊中的交易信息中,調(diào)用過程和結(jié)果可審計(jì)、可追溯。
3?基于智能合約的可信存證
由于區(qū)塊鏈技術(shù)所能提供的數(shù)據(jù)管理功能較為簡單,且其共識機(jī)制的計(jì)算量耗費(fèi)巨大,本文通過結(jié)合智能合約的方法來達(dá)到更好的系統(tǒng)性能。如圖2所示的系統(tǒng)架構(gòu),本文提出的基于智能合約的可信存證系統(tǒng)可分為三大部分:1)集中式數(shù)據(jù)統(tǒng)一處理。為提高系統(tǒng)的處理可信性,本文對需要存證的電子數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化和集中化的收集與處理,靈活、高效快速、一致地處理數(shù)據(jù)有助于訪問和使用數(shù)據(jù)來開展以太坊存放交易與應(yīng)用。
2)認(rèn)證數(shù)據(jù)分布式存儲。本文在以太坊平臺上,通過智能合約定義交易邏輯及訪問狀態(tài)數(shù)據(jù)的業(yè)務(wù)規(guī)則,將存證數(shù)據(jù)封存在以太坊交易屬性信息中,在區(qū)塊鏈中不僅記錄了交易結(jié)果,而且保存了智能合約本身。隨著區(qū)塊鏈各個(gè)節(jié)點(diǎn)間的同步,確保了不同節(jié)點(diǎn)下智能合約的一致性與正確性,也保證了系統(tǒng)的存儲可信性。
3)動態(tài)數(shù)據(jù)取證。引入復(fù)雜的智能合約后,以太坊平臺所管理的數(shù)據(jù)隨著規(guī)模擴(kuò)大而越來越多,基于區(qū)塊內(nèi)的事務(wù)之間的Merkle樹結(jié)構(gòu)以及智能合約方法來實(shí)現(xiàn)數(shù)據(jù)的取證查詢,與此同時(shí)可以與原數(shù)據(jù)的處理結(jié)果進(jìn)行比對,保證數(shù)據(jù)存證前后的一致性以及系統(tǒng)的訪問可信性。
3.1?集中式數(shù)據(jù)統(tǒng)一處理
通常需要進(jìn)行可信存證的數(shù)據(jù)多為具有法律效益或其他重要用途的文件,包括但不限于醫(yī)療行業(yè)的電子病歷、健康檔案、問診記錄、知情同意書,金融行業(yè)的證券基金交易,旅游行業(yè)的出游人信息、出游合同,家政行業(yè)的簽約合同、服務(wù)照片,產(chǎn)權(quán)行業(yè)的版權(quán)證明、品牌保護(hù)、打假維權(quán),等等。數(shù)據(jù)類型包括但不限于辦公文件(doc、txt、 pdf、 ppt、xls、rtf)、圖片(bmp、 jpg、 png、gif)、音頻(wav、mp3、midi)、視頻(avi、rmvb、mov、wmv)等。因此,這就涉及到了對不同文件格式數(shù)據(jù)的統(tǒng)一處理。
以太坊的區(qū)塊鏈與索引是以Key-Value數(shù)據(jù)組織形式存儲在內(nèi)部的LevelDB數(shù)據(jù)庫[5],如果直接將以太坊作為數(shù)據(jù)庫來使用,這樣可以保證數(shù)據(jù)從一個(gè)以太坊節(jié)點(diǎn)傳送到另一個(gè)節(jié)點(diǎn)時(shí),傳送的數(shù)據(jù)、發(fā)送者、接收者和傳送時(shí)間戳能夠永久保存,且永久不可變。但是這種方式有明顯的缺陷:一是無法處理不同文件格式的數(shù)據(jù);二是無法提供查詢功能;三是區(qū)塊鏈作為數(shù)據(jù)庫來使用效率很低,存儲成本也很昂貴,系統(tǒng)吞吐率極低,單個(gè)確認(rèn)寫入所產(chǎn)生的延遲時(shí)間卻足足有十幾分鐘,容量更是達(dá)到幾十GB[11]。此外,隨著節(jié)點(diǎn)數(shù)量的增加,工作量、延遲時(shí)間以及容量上都無法與傳統(tǒng)關(guān)系數(shù)據(jù)庫系統(tǒng)相比。
因此,本文考慮在基于智能合約進(jìn)行存證之前,先對不同文件格式的數(shù)據(jù)進(jìn)行集中式統(tǒng)一處理,利用傳統(tǒng)數(shù)據(jù)庫統(tǒng)一最小化數(shù)據(jù),將數(shù)據(jù)的標(biāo)識符散列存儲至智能合約的存儲區(qū)。這種方式能夠最大限度地降低了區(qū)塊鏈存證成本,提高了系統(tǒng)效率,既保證了數(shù)據(jù)永久抗干擾,又補(bǔ)充了以太坊存證的查詢功能。
本文選用MongoDB數(shù)據(jù)庫進(jìn)行集中式數(shù)據(jù)統(tǒng)一處理。與其他分布式數(shù)據(jù)庫相比,MongoDB具有文檔型存儲的優(yōu)勢,任何文件格式的數(shù)據(jù)都會以二進(jìn)制的Json格式Bson存儲[23],既解決了文件格式不同的問題,又能夠最大限度上減少文件所占用的空間,提高數(shù)據(jù)傳輸效率,也便于后臺服務(wù)器與前端的交互。對于文件存儲驅(qū)動,本文選擇的是GridFS,將上傳的文件按照256kb的大小分割塊,塊集合存儲于fs.chunks,文件元數(shù)據(jù)存儲于fs.files。如圖2所示的系統(tǒng)架構(gòu),原始文件經(jīng)過MongoDB統(tǒng)一處理后會得到很多屬性信息,例如表1給出的一個(gè)圖片證據(jù)的處理結(jié)果,而需要存儲進(jìn)區(qū)塊鏈中的數(shù)據(jù)僅為文件ID與MD5值,大幅地降低了存證成本,更易于訪問和使用數(shù)據(jù)。
類似地,BigchainDB[24]項(xiàng)目也是使用MongoDB處理數(shù)據(jù),但它的查詢功能大部分直接使用MongoDB的API來完成,這種方式對黑客來說無疑是一種入侵通道。相比較而言,本文的數(shù)據(jù)查詢功能依賴于智能合約,保證了系統(tǒng)的可信性與安全性。
3.2?認(rèn)證數(shù)據(jù)分布式存儲
以太坊的智能合約使網(wǎng)絡(luò)在功能上類似計(jì)算平臺,系統(tǒng)借助以太坊建立對等網(wǎng)絡(luò),合約一旦被共識節(jié)點(diǎn)執(zhí)行,則以太坊中的節(jié)點(diǎn)都會遵循相應(yīng)的規(guī)則,可以實(shí)現(xiàn)認(rèn)證數(shù)據(jù)的分布式存儲,同時(shí)確保存儲可信性。具體地,認(rèn)證數(shù)據(jù)分布式存儲的步驟可以分為三步:以太坊賬戶的創(chuàng)建、智能合約的部署交易和智能合約的調(diào)用。
3.2.1?創(chuàng)建以太坊賬戶
對于以太坊集成開發(fā)環(huán)境(Integrated Development Environment, IDE),本文選擇的是Geth(Go ethereum),它是以太坊基金會提供的運(yùn)行以太坊節(jié)點(diǎn)的Go語言客戶端程序[25],可與智能合約交互開發(fā)DAPP,擴(kuò)展區(qū)塊鏈功能。由2.2節(jié)可知以太坊具有外部賬戶和內(nèi)部賬戶,這里的創(chuàng)建是指在以太坊客戶端上創(chuàng)建外部賬戶,而內(nèi)部賬戶的創(chuàng)建是通過智能合約的部署來實(shí)現(xiàn)。在Geth中本文設(shè)置gasLimit、Difficulty、Nonce等參數(shù)創(chuàng)建創(chuàng)世區(qū)塊,在當(dāng)前節(jié)點(diǎn)創(chuàng)建數(shù)據(jù)存放地址,ChainData存放區(qū)塊信息,KeyStore存放當(dāng)前節(jié)點(diǎn)下的所有賬戶文件,設(shè)置網(wǎng)絡(luò)監(jiān)聽端口及用于區(qū)分不同網(wǎng)絡(luò)的唯一標(biāo)識ID后即可啟動以太坊節(jié)點(diǎn),通過personal.newAccount命令創(chuàng)建以太坊的外部賬戶。
3.2.2?部署智能合約
由2.2節(jié)可知,部署智能合約屬于以太坊交易,由外部賬戶來部署,部署成功會返回合約地址與合約賬戶,實(shí)現(xiàn)合約賬戶的創(chuàng)建。具體地,部署智能合約在本文中包括以下4個(gè)步驟:步驟1?使用Solidity編寫可信存證合約代碼。本文在智能合約中使用一個(gè)非固定大小字符串類型的狀態(tài)變量來聲明進(jìn)行過集中式統(tǒng)一處理的存證數(shù)據(jù),聲明存證函數(shù)用來存儲變量值,輸入為字符串變量,交易執(zhí)行成功后返回交易哈希。再聲明取證函數(shù)用來獲取變量值,輸出為存證函數(shù)的輸入,返回區(qū)塊中最新存儲的數(shù)據(jù)。該合約允許所有人在合約中存儲非固定大小的字符串,該數(shù)據(jù)可以被所有人訪問,且沒有可行的方法阻止用戶發(fā)布。所有人也可以再次調(diào)用存證函數(shù),傳入不同的數(shù)據(jù)覆蓋原字符串,但是之前的數(shù)據(jù)仍會存儲在區(qū)塊鏈的歷史區(qū)塊中,無法篡改或抹去。如果想添加訪問限制,可以設(shè)置合約函數(shù)確保只有特定用戶可以訪問存證函數(shù)。
步驟2?編譯智能合約。本文使用Remix在線編譯器將智能合約編譯為EVM字節(jié)碼,獲取合約二進(jìn)制碼和應(yīng)用程序二進(jìn)制接口(Application Binary Interface, ABI)。ABI描述了合約函數(shù)的調(diào)用簽名和返回值,是智能合約進(jìn)行交互的標(biāo)準(zhǔn)方法,包括區(qū)塊鏈外部與合約之間的交互和以太坊已存在合約之間的交互。
步驟3?啟動以太坊節(jié)點(diǎn)。
步驟4?部署智能合約。創(chuàng)建合約對象,聲明EVM字節(jié)碼,部署交易來創(chuàng)建合約賬戶。該筆交易包含了外部賬戶地址、智能合約內(nèi)容、合約賬戶地址這三個(gè)關(guān)鍵信息,其中合約賬戶的生成是由部署者外部賬戶和發(fā)送的交易數(shù)作為隨機(jī)數(shù)輸入,通過Kecca-256加密算法創(chuàng)建產(chǎn)生的。外部賬戶交易會經(jīng)歷5個(gè)步驟,即設(shè)置礦工賬戶、解鎖賬戶、發(fā)送交易、啟動挖礦及查看賬戶,其中發(fā)送交易后交易池中會顯示正在等待被打包的交易次數(shù),礦工消耗一定Gas挖礦成功后生成一個(gè)新區(qū)塊,交易信息存儲在新區(qū)塊中,字節(jié)碼通過Geth的遠(yuǎn)程過程調(diào)用(Remote Precedure Call, RPC)發(fā)送至以太坊網(wǎng)絡(luò),經(jīng)過全網(wǎng)驗(yàn)證后,寫入到Geth管理的區(qū)塊鏈中。
3.2.3?調(diào)用智能合約
智能合約的調(diào)用方法有三種,以本文合約的存證方法SetData為例,分別是:SetData.sendTransaction、SetData.call和SetData()。三種調(diào)用方法的區(qū)別在于:第一種會創(chuàng)建新交易,交易被打包后返回一個(gè)交易哈希值廣播至網(wǎng)絡(luò)中,會造成Gas的消耗;第二種方法本質(zhì)是一個(gè)本地調(diào)用,不會向區(qū)塊鏈網(wǎng)絡(luò)廣播任何消息,它的返回值取決于合約中函數(shù)的具體代碼,不會消耗Gas;第三種是若合約函數(shù)的代碼有constant標(biāo)識,則執(zhí)行call的本地調(diào)用操作,若沒有constant標(biāo)識,則執(zhí)行sendTransaction操作。本文調(diào)用智能合約的方法使用的是第三種,且代碼中沒有設(shè)置constant標(biāo)識,完整的部署與調(diào)用流程如圖3所示。
由2.2節(jié)可知,調(diào)用智能合約時(shí)如果合約狀態(tài)值發(fā)生了更改,那么該次調(diào)用事屬于交易,需要礦工消耗Gas進(jìn)行挖礦打包交易。在以太坊平臺上聲明智能合約ABI,獲得合約實(shí)例,此時(shí)輸入合約名稱可返回在代碼中定義的合約規(guī)則,調(diào)用SetData()方法,參數(shù)添加進(jìn)行過集中式統(tǒng)一處理的存證數(shù)據(jù),交易完成后將返回交易哈希值,用于后文定位區(qū)塊及查詢訪問存證數(shù)據(jù)。
3.3?動態(tài)數(shù)據(jù)取證
本文提供兩種查詢?nèi)∽C方式:一是利用智能合約中定義的取證函數(shù),返回最新存入?yún)^(qū)塊的數(shù)據(jù);二是借助智能合約的存儲編碼規(guī)則,遍歷以太坊的區(qū)塊信息和交易信息,逆向解碼分析展示數(shù)據(jù)。
對于第一種取證方式,合約中聲明的取證函數(shù)返回值是存證函數(shù)的輸入,沒有更改合約狀態(tài)值,所以這種智能合約調(diào)用不屬于交易,不會消耗Gas,在以太坊平臺上調(diào)用取證函數(shù)即可獲取到最新存入?yún)^(qū)塊的數(shù)據(jù),但是這種方式無法獲取其他區(qū)塊中的數(shù)據(jù),因此本文提出第二種取證方式。
第二種取證方式基于以太坊內(nèi)部的存儲編碼規(guī)則。由2.1節(jié)可知,以太坊計(jì)算Merkle根使用的是MPT,它是以太坊用來將Key-Value進(jìn)行緊湊編碼的一種數(shù)據(jù)組織形式,任何存儲數(shù)據(jù)的細(xì)微變化都會導(dǎo)致MPT的根節(jié)點(diǎn)發(fā)生變更,因此可以校驗(yàn)數(shù)據(jù)的一致性。MPT包含3種節(jié)點(diǎn)類型[26],即葉子節(jié)點(diǎn)、擴(kuò)展節(jié)點(diǎn)和分支節(jié)點(diǎn)。葉子節(jié)點(diǎn)用于數(shù)據(jù)的存儲,其Key對應(yīng)數(shù)據(jù)的16進(jìn)制編碼,Value存儲的是數(shù)據(jù)的遞歸長度前綴(Recursive Length Prefix, RLP)編碼[27];擴(kuò)展節(jié)點(diǎn)處理具有共同前綴的數(shù)據(jù),Key為共同前綴的16進(jìn)制邊,Value為擴(kuò)展出的分支節(jié)點(diǎn)的哈希值;分支節(jié)點(diǎn)處理沒有共同前綴的數(shù)據(jù),Key為分叉節(jié)點(diǎn)哈希值數(shù)據(jù),Value一般為空,否則為終止擴(kuò)展節(jié)點(diǎn)的Value值。其中,RLP編碼是以太坊中數(shù)據(jù)序列化的一個(gè)主要編碼方式,可以將任意的嵌套二進(jìn)制數(shù)據(jù)進(jìn)行序列化,具有5個(gè)規(guī)則,如表2所示。
以太坊以Key-Value形式來存儲數(shù)據(jù),賬戶以哈希散列和RLP數(shù)據(jù)編碼為基礎(chǔ),結(jié)合智能合約對數(shù)據(jù)對象進(jìn)行映射和轉(zhuǎn)換,將數(shù)據(jù)按照編碼規(guī)則映射為MPT,所有節(jié)點(diǎn)的Key和Value構(gòu)建為一個(gè)RLP列表,計(jì)算根節(jié)點(diǎn)唯一證明并保存于以太坊賬戶中。綜上,以太坊采用如下5個(gè)編碼規(guī)則來將智能合約數(shù)據(jù)結(jié)構(gòu)映射為Key-Value形式:規(guī)則1?智能合約中所有數(shù)據(jù)結(jié)構(gòu)都會被映射為Key-Value的形式,其中Key和Value均是無符號32字節(jié)的數(shù)據(jù)。
規(guī)則2?存儲成員依照定義位置從零開始索引編排,每次累加數(shù)值一,作為對應(yīng)的Key值存儲。
規(guī)則3?對于固定長度的數(shù)據(jù)類型,例如enum、uint8、uint16、uint32等,Value值按照32字節(jié)右對齊的規(guī)律存儲具體的成員屬性值。如果長度不滿足32字節(jié),則將相鄰的存儲成員進(jìn)行壓縮合并存儲Value值。
規(guī)則4?對于可變長度的數(shù)據(jù)類型,例如string、bytes等,Value值按照32字節(jié)左對齊的規(guī)律存儲;
規(guī)則5?如果可變長度類型變量的數(shù)據(jù)長度大于31字節(jié),則拆分為多條記錄來存儲,第一條記錄的Key值為其索引編號,Value值為數(shù)據(jù)長度再累加1,數(shù)據(jù)內(nèi)容按照32字節(jié)大小拆分為多條記錄,每條記錄的Key值為第一個(gè)Key值的SHA3哈希值再累加1,Value值對應(yīng)拆分的數(shù)據(jù)內(nèi)容。
基于上述編碼規(guī)則,以太坊將智能合約的數(shù)據(jù)對象映射轉(zhuǎn)換為Key-Value
形式封存在交易區(qū)塊當(dāng)中,能夠標(biāo)識區(qū)塊中是否含有交易信息的字段是transaction.length,若不為0,則該區(qū)塊存有交易,此時(shí)以區(qū)塊信息中的交易哈希值為索引可獲取區(qū)塊體中的交易序列。區(qū)塊體中的交易信息包含6個(gè)字段,分別是區(qū)塊號、區(qū)塊哈希值、交易哈希值、交易發(fā)送者、交易接收者以及Input字段。
Input字段包含合約的函數(shù)選擇器與參數(shù)編碼,記錄了編碼后的存證數(shù)據(jù)。Input的前4個(gè)字節(jié)指定了函數(shù)選擇器,是合約函數(shù)的KECCAK256算法哈希值[28];接下來的32個(gè)字節(jié)為參數(shù)編碼的第一個(gè)參數(shù),表示非固定大小字符串的字節(jié)偏移量;再接著32個(gè)字節(jié)為參數(shù)編碼的第二個(gè)參數(shù),是存證數(shù)據(jù)的字符串長度的十六進(jìn)制編碼;參數(shù)編碼的第三個(gè)參數(shù)所占字節(jié)是32的倍數(shù),左對齊輸出,若數(shù)據(jù)長度不足32字節(jié)的倍數(shù),則在數(shù)據(jù)右邊補(bǔ)0擴(kuò)展到32字節(jié)的倍數(shù)。此時(shí)對Input字段參數(shù)編碼的第三個(gè)參數(shù)進(jìn)行ASCII解碼獲取到的就是該交易信息中存儲的合約信息,即存證數(shù)據(jù)。
為辨別存有存證數(shù)據(jù)的區(qū)塊,本文在與用戶操作交互的應(yīng)用層,采用B/S架構(gòu)通過Node.js的Express框架將用戶與以太坊可信存證系統(tǒng)相互連接,建立前后端交互,后端與Geth、MongoDB相連,前端循環(huán)遍歷以表格形式輸出當(dāng)前以太坊節(jié)點(diǎn)中的所有區(qū)塊信息,提供可交互式用戶界面。對區(qū)塊體的交易序列添加索引輸出自前一區(qū)塊之后發(fā)生的多筆交易。例如表3給出了一個(gè)圖片證據(jù)存儲在以太坊中的交易信息,該交易位于實(shí)驗(yàn)節(jié)點(diǎn)中第323個(gè)區(qū)塊上,Input字段記錄了經(jīng)過集中式統(tǒng)一處理后得到的文件ID與MD5值。
解碼得到的文件ID與MD5值后,通過MongoDB使用GridFS以file_id為索引查詢文件,查詢成功返回文件名稱,再通過mongofiles的get命令下載文件到本地,完成對原始數(shù)據(jù)的還原。而以太坊中保存的MD5值可與數(shù)據(jù)庫中存儲的MD5值作比較,驗(yàn)證訪問可信性,驗(yàn)證數(shù)據(jù)在存證前后的真實(shí)唯一、未篡改。
綜上,本節(jié)實(shí)現(xiàn)了集中式數(shù)據(jù)統(tǒng)一處理、智能合約存證、以太坊取證及核證的過程,基于智能合約的可信存證相對于傳統(tǒng)的關(guān)系數(shù)據(jù)庫存證具有三大優(yōu)勢:1)分布式完整。傳統(tǒng)數(shù)據(jù)庫存證只是將電子數(shù)據(jù)以備份的形式存放在服務(wù)器上,傳輸過程中數(shù)據(jù)易破損、易斷點(diǎn)、易篡改,而基于智能合約的可信存證采取區(qū)塊鏈技術(shù),數(shù)據(jù)全鏈條每個(gè)節(jié)點(diǎn)都有存證,保證了存證信息的完整性和真實(shí)性,實(shí)現(xiàn)了分布式存證服務(wù)。
2)不可篡改。傳統(tǒng)數(shù)據(jù)庫中的電子數(shù)據(jù)因服務(wù)器問題或機(jī)制不完全容易被篡改,而基于智能合約的可信存證在數(shù)據(jù)固定前采用哈希算法進(jìn)行了校驗(yàn)值計(jì)算,數(shù)據(jù)固定過程中運(yùn)用了時(shí)間戳機(jī)制、加密機(jī)制及分布式共識機(jī)制,數(shù)據(jù)一經(jīng)存儲,任何一方也無法篡改。
3)安全可信。傳統(tǒng)數(shù)據(jù)庫存證是第三方本地保存的電子數(shù)據(jù),屬于自證證據(jù),數(shù)據(jù)的法律效力容易遭到質(zhì)疑,而在以太坊平臺上基于智能合約的可信存證適用于司法仲裁機(jī)構(gòu),數(shù)據(jù)全鏈條每個(gè)節(jié)點(diǎn)都有存證,數(shù)據(jù)安全可信,權(quán)威機(jī)構(gòu)可直接從節(jié)點(diǎn)中獲取驗(yàn)證證據(jù),將存證數(shù)據(jù)視為直接證據(jù),不需要第三方機(jī)構(gòu)再出具證明。
4?可信性分析
本文在以太坊平臺上基于智能合約進(jìn)行可信存證,指出所有的數(shù)據(jù)及操作都被永久地記錄在區(qū)塊鏈數(shù)據(jù)區(qū)塊供用戶訪問。這些存證數(shù)據(jù)所在的數(shù)據(jù)區(qū)塊被同步存儲在系統(tǒng)的每一個(gè)參與運(yùn)算的節(jié)點(diǎn)中,所有這些節(jié)點(diǎn)構(gòu)成了可信存證系統(tǒng)及其堅(jiān)韌的分布式數(shù)據(jù)管理系統(tǒng),任何一個(gè)節(jié)點(diǎn)上的數(shù)據(jù)被破壞可以通過同步節(jié)點(diǎn)或訪問其他哈希節(jié)點(diǎn)來驗(yàn)證確認(rèn);同時(shí),任何一個(gè)節(jié)點(diǎn)上如果數(shù)據(jù)區(qū)塊被惡意篡改或刪除,都不會影響整個(gè)可信存證系統(tǒng)的正常運(yùn)轉(zhuǎn)。因此,本文提出的基于智能合約的可信存證系統(tǒng)很好地解決了區(qū)塊鏈上數(shù)據(jù)管理效率低延遲長的問題,豐富了數(shù)據(jù)處理、存證和取證功能,下面對系統(tǒng)的可信性進(jìn)行分析。
4.1?處理可信性
處理可信性是指數(shù)據(jù)處理的正確性,系統(tǒng)需要保存數(shù)據(jù)的最終狀態(tài)。在傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)中,用戶通過提交事務(wù)來處理數(shù)據(jù),事務(wù)常由過程型語言與SQL語句組合共同構(gòu)成,事務(wù)執(zhí)行的過程或結(jié)果通過日志進(jìn)行記錄。區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫管理系統(tǒng)中的日志在邏輯功能上有所相似,但不同之處在于,比特幣區(qū)塊鏈僅支持挖礦與轉(zhuǎn)賬功能,功能上更傾向于數(shù)字貨幣的交易,對于數(shù)據(jù)的處理具有很大的局限性。
以太坊的智能合約提供了區(qū)塊鏈中的數(shù)據(jù)處理功能,但如果直接將以太坊作為傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)來處理數(shù)據(jù),會有無法處理不同文件格式、無法提供查詢功能及存儲成本昂貴效率低下的缺陷。
因此,本文借助MongoDB數(shù)據(jù)庫對存證數(shù)據(jù)進(jìn)行集中式統(tǒng)一處理,將任意文件格式的數(shù)據(jù)分割為塊,塊集合存儲于fs.chunks,文件元數(shù)據(jù)存儲于fs.files,提取數(shù)據(jù)的ID和MD5值進(jìn)行后續(xù)的分布式智能合約存儲。MD5算法具有壓縮性、容易計(jì)算、抗修改性、弱抗碰撞和強(qiáng)抗碰撞的特點(diǎn),如果在分布式存儲的過程中數(shù)據(jù)被某些人作了改動,那么得到的MD5值將有很大變化。此外,原始文件經(jīng)過MD5加密后為32位的字符串,能夠給定固定大小的空間存儲、傳輸和驗(yàn)證,大幅地降低了存證成本,也提供了通道驗(yàn)證數(shù)據(jù)的完整性,確保系統(tǒng)的處理可信性。
4.2?存儲可信性
存儲可信性是指數(shù)據(jù)存儲的正確性,即使系統(tǒng)在存儲、通信過程中發(fā)生故障,甚至被惡意攻擊時(shí),只要數(shù)據(jù)處理結(jié)果被確認(rèn),存儲的數(shù)據(jù)就不被篡改或者丟失。
以太坊平臺整體上可劃分為五個(gè)層次,依次為網(wǎng)絡(luò)層、共識層、數(shù)據(jù)層、智能合約層和應(yīng)用層[4]。在網(wǎng)絡(luò)層,以太坊平臺的網(wǎng)絡(luò)傳輸協(xié)議為完全分布且可容忍單點(diǎn)故障的P2P協(xié)議,協(xié)議用于節(jié)點(diǎn)間傳輸交易數(shù)據(jù)和區(qū)塊數(shù)據(jù)[5]。節(jié)點(diǎn)之間以扁平拓?fù)浣Y(jié)構(gòu)相互連通,不存在中心化節(jié)點(diǎn),具有平等、自治、分布等特性。在數(shù)據(jù)傳輸過程中,當(dāng)相鄰節(jié)點(diǎn)監(jiān)聽到新交易和新區(qū)塊時(shí),節(jié)點(diǎn)首先會通過工作量證明共識機(jī)制或者數(shù)字簽名哈希運(yùn)算等來驗(yàn)證交易和區(qū)塊的有效性,只有驗(yàn)證順利通過,新交易才能被記錄到正在構(gòu)建的區(qū)塊當(dāng)中,隨著新區(qū)塊的成功構(gòu)建,也就確保了數(shù)據(jù)的有效性與可信性。
在共識層,以太坊依賴于工作量證明機(jī)制來解決區(qū)塊的容錯一致問題。PoW機(jī)制能夠保證全網(wǎng)數(shù)據(jù)的一致性和安全性,它依賴的是節(jié)點(diǎn)間的算力競爭,要求每個(gè)節(jié)點(diǎn)基于自身算力來求解SHA256運(yùn)算,該運(yùn)算是一個(gè)求解復(fù)雜但驗(yàn)證簡單的計(jì)算難題,目的是尋找一個(gè)能夠滿足哈希結(jié)果小于區(qū)塊設(shè)定的難度目標(biāo)的隨機(jī)數(shù)值[29]。任何一個(gè)節(jié)點(diǎn)上,如果有人想要惡意篡改某一數(shù)據(jù)區(qū)塊,需要對該區(qū)塊及其后續(xù)所有區(qū)塊重新進(jìn)行哈希運(yùn)算,計(jì)算出合適的隨機(jī)數(shù),構(gòu)建出一條比當(dāng)前被公認(rèn)的區(qū)塊鏈主鏈更長的鏈,這個(gè)惡意過程所需要消耗的算力超過了整個(gè)區(qū)塊鏈中正在進(jìn)行正常挖礦運(yùn)算的算力總和,因此惡意攻擊的難度和成本很高。PoW機(jī)制融合了經(jīng)濟(jì)激勵政策與共識算法,使得以太坊中更多的節(jié)點(diǎn)能夠參與到挖礦運(yùn)算當(dāng)中,主動性的增強(qiáng)了平臺的可靠性與安全性。
在數(shù)據(jù)層,以太坊中每個(gè)區(qū)塊都包含區(qū)塊體和區(qū)塊頭兩個(gè)部分。區(qū)塊體存放了當(dāng)前區(qū)塊的所有交易信息,區(qū)塊頭記錄父區(qū)塊哈希、時(shí)間戳、Merkle根等數(shù)據(jù),其中父區(qū)塊哈希構(gòu)建了區(qū)塊鏈以區(qū)塊為單位的鏈?zhǔn)浇Y(jié)構(gòu),保證了數(shù)據(jù)數(shù)據(jù)的不可篡改性,時(shí)間戳是該區(qū)塊的生成時(shí)間,基于交易哈希生成的Merkle根確保了區(qū)塊內(nèi)交易數(shù)據(jù)的完整性與可信性。因此,區(qū)塊鏈特殊的數(shù)據(jù)結(jié)構(gòu)保證了所有區(qū)塊以鏈相連、環(huán)環(huán)相扣,其中任何一個(gè)區(qū)塊被篡改,都會引起該區(qū)塊后面的所有區(qū)塊的連環(huán)變化。
在智能合約層,以太坊實(shí)現(xiàn)了Casper共識[30]。從前所述,PoW犧牲性能來換取數(shù)據(jù)的一致性和安全性,針對PoW機(jī)制低效耗能的缺陷,以太坊平臺引入權(quán)益證明(Proof-of-Stake, PoS)機(jī)制[30-31],根據(jù)礦工在區(qū)塊鏈中擁有的股權(quán)來決定其挖礦的難度,當(dāng)?shù)V工擁有越多的以太幣,越容易找到合適的隨機(jī)數(shù),挖礦的整體難度就會越低。以太坊又基于PoS機(jī)制提出Casper共識,要求節(jié)點(diǎn)必須先鎖定保證金,才可以參與出塊和共識形成,礦工使用保證金對共識結(jié)果進(jìn)行下注,如果投注正確,則可以獲得區(qū)塊的記賬權(quán)和經(jīng)濟(jì)獎勵。Casper共識通過對保證金的直接控制來約束礦工的行為,具體來說,如果一個(gè)礦工做出了任何系統(tǒng)認(rèn)為是無效甚至是惡意的行為,其預(yù)繳的保證金將會沒收,同時(shí)也將失去出塊和參與共識的權(quán)利。因此,共識機(jī)制的存在既提高了以太坊平臺的性能,又保障了數(shù)據(jù)的一致性和安全性。
4.3?訪問可信性
訪問可信性是指數(shù)據(jù)存證后的可審計(jì)及可追溯。本文提供了兩種訪問方式:一是調(diào)用智能合約方法, 二是依據(jù)智能合約的編碼規(guī)則對交易信息進(jìn)行解碼,兩種方式都保證了數(shù)據(jù)被訪問時(shí)的正確性。
在數(shù)據(jù)層,以太坊以Key-Value數(shù)據(jù)庫存儲索引數(shù)據(jù)與狀態(tài)數(shù)據(jù),使得系統(tǒng)可以通過哈希鍵值檢索數(shù)據(jù)。這與傳統(tǒng)數(shù)據(jù)庫的預(yù)寫式日志非常類似,區(qū)塊數(shù)據(jù)按照日志文件格式存儲,以追加形式寫入,支持?jǐn)?shù)據(jù)重放,維護(hù)了所有的歷史操作記錄。另外,Merkle樹的結(jié)構(gòu)維護(hù)一個(gè)區(qū)塊內(nèi)的事務(wù)之間的關(guān)系,以太坊區(qū)塊數(shù)據(jù)具備了預(yù)寫式日志不具備的不可篡改性和可追溯性。
在智能合約層,本文系統(tǒng)中的合約方法提供了查詢操作,無需共識,也不會更改合約狀態(tài)值,調(diào)用取證函數(shù)則就獲取到最新存入?yún)^(qū)塊的數(shù)據(jù)。此外,本文依據(jù)智能合約的編碼規(guī)則還原數(shù)據(jù)的存儲過程,基于區(qū)塊哈希檢索區(qū)塊數(shù)據(jù),又基于區(qū)塊數(shù)據(jù)中的交易哈希檢索交易數(shù)據(jù),通過解碼交易數(shù)據(jù)中的Input字段來還原存證數(shù)據(jù)。
在應(yīng)用層,以太坊除了基于以太幣的數(shù)字貨幣交易,還支持去中心化應(yīng)用,本文基于Node.js語言構(gòu)建Web前端應(yīng)用界面,通過JSON-RPC請求對以太坊節(jié)點(diǎn)上的智能合約進(jìn)行部署和調(diào)用,支持訪問可信的區(qū)塊數(shù)據(jù)、交易數(shù)據(jù)和狀態(tài)數(shù)據(jù),使應(yīng)用程序擁有良好交互性的用戶界面。
5?結(jié)語
本文區(qū)別于傳統(tǒng)關(guān)系數(shù)據(jù)庫存證,提出了一種在以太坊平臺上基于智能合約的可信存證系統(tǒng)。存證后數(shù)據(jù)全鏈條每個(gè)節(jié)點(diǎn)都有存證,數(shù)據(jù)分布式完整、不可篡改、安全可信,適合應(yīng)用于司法鑒定、審計(jì)、公證、仲裁等權(quán)威機(jī)構(gòu),可直接從運(yùn)維的節(jié)點(diǎn)中獲取和驗(yàn)證數(shù)據(jù),把存證數(shù)據(jù)視為直接證據(jù),不再需要第三方機(jī)構(gòu)出具證明。
首先,因?yàn)閰^(qū)塊鏈存儲成本較大,為提高存證效率,節(jié)省計(jì)算費(fèi)用,本文通過MongoDB的GridFS對數(shù)據(jù)進(jìn)行集中式統(tǒng)一處理,提高系統(tǒng)的處理可信性;其次,通過部署和調(diào)用智能合約對認(rèn)證數(shù)據(jù)進(jìn)行分布式存儲,確保系統(tǒng)的存儲可信性;最后,通過兩種動態(tài)數(shù)據(jù)取證方法提取文件ID與MD5值來進(jìn)行數(shù)據(jù)核證,一是調(diào)用智能合約方法,二是根據(jù)以太坊數(shù)據(jù)編碼規(guī)則逆向分析交易信息,保證系統(tǒng)的訪問可信性。
在未來的工作中,本研究考慮在智能合約中增加訪問限制,只有特定用戶可以調(diào)用合約方法,但仍然允許任何人訪問合約,確??尚糯孀C系統(tǒng)的公開公正。
參考文獻(xiàn)(References)
[1] NAKAMOTO S. Bitcoin: a peer-to-peer electronic cash system [EB/OL]. [2018-05-10]. http://www.academia.edu/download/54517945/Bitcoin_paper_Original_2.pdf.
[2] BUTERIN V. A next-generation smart contract and decentralized application platform [EB/OL]. [2018-05-10]. https://cryptorating.eu/whitepapers/Ethereum/Ethereum_white_paper.pdf.
[3] Etherscan. Ethereum unique address growth chart [EB/OL]. [2018-09-02]. https://etherscan.io/chart/address/.
[4] 錢衛(wèi)寧, 邵奇峰, 朱燕超, 等.區(qū)塊鏈與可信數(shù)據(jù)管理: 問題與方法[J]. 軟件學(xué)報(bào), 2018, 29(1): 150-159. (QIAN W N, SHAO Q F, ZHU Y C, et al. Research problems and methods in blockchain and trusted data management [J]. Journal of Software, 2018, 29(1): 150-159.)
[5] 袁勇, 王飛躍.區(qū)塊鏈技術(shù)發(fā)展現(xiàn)狀與展望[J]. 自動化學(xué)報(bào), 2016, 42(4): 481-494. (YUAN Y, WANG F Y. Blockchain: the state of the art and future trends [J]. Acta Automatica Sinica, 2016, 42(4): 481-494.)
[6] TSCHORSCH F, SCHEUERMANN B. Bitcoin and beyond: a technical survey on decentralized digital currencies [J]. IEEE Communications Surveys & Tutorials, 2016, 18(3): 2084-2123.
[7] PASS R, SEEMAN L, SHELAT A. Analysis of the blockchain protocol in asynchronous networks [C]// Proceedings of the 2017 Annual International Conference on the Theory and Applications of Cryptographic Techniques. Berlin: Springer, 2017: 643-673.
[8] GERVAIS A, KARAME G O, WUST K, et al. On the security and performance of proof of work blockchains [C]// Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM, 2016: 3-16.
[9] ATZEI N, BARTOLETTI M, CIMOLI T. A survey of attacks on Ethereum smart contracts (SoK) [C]// Proceedings of the 2017 International Conference on Principles of Security and Trust. Berlin: Springer, 2017: 164-186.
[10] LIN I C, LIAO T C. A survey of blockchain security issues and challenges [J]. International Journal of Network Security, 2017, 19(5): 653-659.
[11] GARCIA-MOLINA H. Database Systems: the Complete Book [M]. New Delhi: Pearson Education India, 2008: 555-615.
[12] GRAY J, REUTER A. Transaction Processing: Concepts and Techniques [M]. Amsterdam: Elsevier, 1992: 22-40.
[13] TSENG L. Recent results on fault-tolerant consensus in message-passing networks [C]// Proceedings of the 2016 International Colloquium on Structural Information and Communication Complexity. Berlin: Springer, 2016: 92-108.
[14] LYNCH N A. Distributed Algorithms [M]. Amsterdam: Elsevier, 1996: 53-73.
[15] BAILIS P, FEKETE A, FRANKLIN M J, et al. Coordination avoidance in database systems [J]. Proceedings of the VLDB Endowment, 2014, 8(3): 185-196.
[16] ZHANG Y, WU S, JIN B, et al. A blockchain-based process provenance for cloud forensics [C]// Proceedings of the 2017 3rd IEEE International Conference on Computer and Communications. Piscataway, NJ: IEEE, 2017: 2470-2473.
[17] BAHGA A, MADISETTI V K. Blockchain platform for industrial Internet of things [J]. Journal of Software Engineering and Applications, 2016, 9(10): 533-546.
[18] VU Q H, LUPU M, OOI B C. Peer-to-Peer Computing: Principles and Applications [M]. Berlin: Springer, 2009: 229-277.
[19] CHENEY J, CHITICARIU L, TAN W C. Provenance in databases: why, how, and where [J]. Foundations and Trends in Databases, 2009, 1(4): 379-474.
[20] 邵奇峰, 金澈清, 張召, 等.區(qū)塊鏈技術(shù): 架構(gòu)及進(jìn)展[J]. 計(jì)算機(jī)學(xué)報(bào), 2018, 41(5): 969-988. (SHAO Q F, JIN C Q, ZHANG Z, et al. Blockchain: architecture and research progress [J]. Chinese Journal of Computers, 2018, 41(5): 969-988.)
[21] MERKLE R C. A digital signature based on a conventional encryption function [C]// Proceedings of the 1987 Conference on the Theory and Application of Cryptographic Techniques. Berlin: Springer, 1987: 369-378.
[22] LUU L, CHU D H, OLICKEL H, et al. Making smart contracts smarter [C]// Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. New York: ACM, 2016: 254-269.
[23] MongoDB. What is MongoDB? [EB/OL]. [2018-09-05]. https://www.mongodb.com/what-is-mongodb/.
[24] BigchainDB. Meet BigchainDB, the blockchain database [EB/OL]. [2018-09-05]. https://www.bigchaindb.com/.
[25] Github. Go Ethereum [EB/OL]. [2018-08-08]. https://github.com/ethereum/go-ethereum/wiki/.
[26] BONNEAU J. EthIKS: using Ethereum to audit a CONIKS key transparency log [C]// Proceedings of the 2016 International Conference on Financial Cryptography and Data Security. Berlin: Springer, 2016: 95-105.
[27] Github. RLP encoding of Ethereum [EB/OL]. [2018-09-08]. https://github.com/ethereum/wiki/wiki/RLP/.
[28] BERTONI G, DAEMEN J, PEETERS M, et al. Keccak sponge function family main document [EB/OL]. [2018-05-10]. https://pdfs.semanticscholar.org/0978/de0c295f158cd5afe3a145a 2e1fe6497eec7.pdf.
[29] EYAL I, SIRER E G. Majority is not enough: bitcoin mining is vulnerable [J]. Communications of the ACM, 2018, 61(7): 95-102.
[30] 楊保華, 陳昌.區(qū)塊鏈原理, 設(shè)計(jì)與應(yīng)用[M]. 北京: 機(jī)械工業(yè)出版社, 2017: 93-97. (YANG B H, CHEN C. Principle, Programming and Applications of Blockchain[M]. Beijing: China Machine Press, 2017: 93-97.)
[31] 申屠青春.區(qū)塊鏈開發(fā)指南[M]. 北京: 機(jī)械工業(yè)出版社, 2017: 109-146. (SHENTU Q C. Development Guide of Blockchain[M]. Beijing: China Machine Press, 2017: 109-146.)