肖堯 閆帥 蔣遂平
摘 要:區(qū)塊鏈技術(shù)在物聯(lián)網(wǎng)等大交易量場景中的應(yīng)用面臨的突出問題之一是可擴(kuò)展性。文中分析了區(qū)塊鏈可擴(kuò)展性問題的來源、影響與主要解決方案。針對區(qū)塊鏈的可擴(kuò)展性,引入?yún)^(qū)塊指針和狀態(tài)更新池的概念,提出了區(qū)塊數(shù)據(jù)的雙子鏈模型,并對雙子鏈模型解決可擴(kuò)展性問題的可能性和安全性進(jìn)行了討論。
關(guān)鍵詞:區(qū)塊鏈;可擴(kuò)展性;數(shù)據(jù)結(jié)構(gòu);數(shù)據(jù)庫
中圖分類號:TP39文獻(xiàn)標(biāo)識碼:A文章編號:2095-1302(2019)02-00-04
0 引 言
近年來,區(qū)塊鏈作為從比特幣[1]中提煉出來的技術(shù),引起了科技企業(yè)、資本市場、金融機(jī)構(gòu)及政府部門的巨大關(guān)
注[2]。作為最成功的區(qū)塊鏈應(yīng)用,比特幣在資本領(lǐng)域獲得了巨大成功,截至2018年8月,比特幣市場已達(dá)千億美元。目前,區(qū)塊鏈已經(jīng)從單純的數(shù)字貨幣應(yīng)用擴(kuò)展到物聯(lián)網(wǎng)、金融、醫(yī)療、保險等領(lǐng)域。
作為一種去中心化的分布式存儲技術(shù),區(qū)塊鏈擁有巨大的發(fā)展前景,但仍面臨著眾多挑戰(zhàn)[3-4]。其中一個突出問題是可擴(kuò)展性,尤其是在物聯(lián)網(wǎng)背景下,存在海量存儲和計算資源受限的小型節(jié)點,當(dāng)把感知數(shù)據(jù)作為一種資產(chǎn)進(jìn)行交易時,這些節(jié)點需要處理巨大的交易量,以區(qū)塊鏈規(guī)模為中心的可擴(kuò)展性問題尤其嚴(yán)峻。
本文首先分析了可擴(kuò)展性問題的原因及影響,介紹現(xiàn)有的相關(guān)工作,然后提出了新的解決方案模型,最后就模型的相關(guān)問題進(jìn)行討論。
1 可擴(kuò)展性問題分析
1.1 存在原因
可擴(kuò)展性問題的關(guān)鍵在于區(qū)塊鏈規(guī)模的不斷增長,區(qū)塊鏈規(guī)模不斷增長的根本原因在于區(qū)塊數(shù)據(jù)結(jié)構(gòu)和組鏈的方式。
區(qū)塊鏈中的數(shù)據(jù)以一個個區(qū)塊的形式存在,每個區(qū)塊包含區(qū)塊頭和區(qū)塊體兩部分。區(qū)塊頭封裝了前塊Hash、時間戳、隨機(jī)數(shù)、Merkle樹根值等信息,區(qū)塊體中則主要包含交易事務(wù)的完整信息。前塊Hash字段為前一區(qū)塊的摘要信息,可以防止前一區(qū)塊被任意篡改,并唯一指向了前一個區(qū)塊。通過前塊Hash字段,一個個獨(dú)立的區(qū)塊從邏輯上串聯(lián)成一條鏈,任何中間區(qū)塊的缺失或被篡改都會使后續(xù)區(qū)塊失效。
取得記賬權(quán)的節(jié)點需要利用所有歷史區(qū)塊的信息確認(rèn)收到的交易信息,以構(gòu)建新區(qū)塊,并通過前塊Hash字段鏈接到時間上最近的區(qū)塊,其他節(jié)點通過本地保有的完整區(qū)塊鏈對新區(qū)塊加以驗證,如果驗證成功就將其加入本地區(qū)塊鏈,形成新的區(qū)塊主鏈。從創(chuàng)世區(qū)塊(區(qū)塊鏈的第一個區(qū)塊)到當(dāng)前區(qū)塊形成的一條最長主鏈記錄了區(qū)塊鏈的完整歷史。作為一種分布式數(shù)據(jù)庫,區(qū)塊鏈網(wǎng)絡(luò)中的每個節(jié)點都保留一份完整的區(qū)塊鏈,并以此作為新區(qū)塊的接收依據(jù)。
由此,區(qū)塊鏈的規(guī)模不斷增長,越來越龐大。對區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點而言,如果丟失中間任意區(qū)塊,就難以進(jìn)行工作。由于節(jié)點需要保存完整的不斷增長的區(qū)塊鏈,因此導(dǎo)致了可擴(kuò)展性問題的出現(xiàn)。
1.2 可擴(kuò)展性問題影響
區(qū)塊鏈規(guī)模的增長速度與交易量密切相關(guān),在比特幣每秒只記錄7筆交易的小交易量條件下,目前完整的比特幣區(qū)塊鏈占用存儲空間已達(dá)到180 GB,并且還在不斷增長。在物聯(lián)網(wǎng)、證券、發(fā)電權(quán)管理、智慧城市等大交易量場景下,單個節(jié)點的區(qū)塊數(shù)據(jù)存儲量將很快達(dá)到TB級。
區(qū)塊鏈規(guī)模的不斷增長使得節(jié)點初始化下載數(shù)據(jù)耗時較長,新節(jié)點的加入極為困難。此外,節(jié)點在挖礦和執(zhí)行共識算法時也需要較多的算力與存儲能力,挖礦節(jié)點資源越來越多,導(dǎo)致算力分布愈加集中,威脅到系統(tǒng)的安全。對于大部分節(jié)點來說,保存業(yè)務(wù)上不需要的交易記錄會造成大量資源浪費(fèi)[5]。物聯(lián)網(wǎng)區(qū)塊鏈網(wǎng)絡(luò)中大部分節(jié)點的存儲、算力及能源受到較大限制,即使作為輕型節(jié)點,只處理傳統(tǒng)區(qū)塊鏈的一小部分工作都難以完成。
由于可擴(kuò)展性問題極大地影響了區(qū)塊鏈技術(shù)的應(yīng)用與發(fā)展,因此迫切需要一種切實可行的解決方案。
2 相關(guān)工作
目前針對可擴(kuò)展性問題,主要采用區(qū)塊鏈存儲優(yōu)化和重新設(shè)計區(qū)塊鏈等方法。
2.1 區(qū)塊鏈存儲優(yōu)化
2.1.1 全網(wǎng)節(jié)點放棄對全部歷史信息的保留
鑒于節(jié)點執(zhí)行完整賬本相關(guān)功能的難度不斷加大,Bruce提出一個小型鏈(mini-blockchain)加密貨幣體系[6],結(jié)點可以不斷移除或遺忘舊的交易記錄,并通過一個名為“賬戶樹”的本地數(shù)據(jù)庫保存所有非空賬戶的余額。這樣,交易無需永遠(yuǎn)存儲在區(qū)塊鏈中,只需要存儲最近的交易事務(wù)和賬戶樹即可。這種方法大大減少了區(qū)塊鏈網(wǎng)絡(luò)的存儲規(guī)模,大幅提高了可擴(kuò)展性,并在氪石幣中得到應(yīng)用。但是賬戶樹的更新較為復(fù)雜,節(jié)點間賬戶樹的同步同樣需要耗費(fèi)資源。
2.1.2 通過輕量級節(jié)點減輕部分節(jié)點的存儲、計算壓力
中本聰在比特幣白皮書中指出:輕型節(jié)點可以只保留區(qū)塊頭,通過簡單支付驗證(SPV)的方式工作。每個比特幣區(qū)塊頭部固定為80 B,一年總增長為4.2 MB,需要時再向完整節(jié)點獲取相應(yīng)的數(shù)據(jù),極大地降低了節(jié)點存儲要求。
Hooff等人提出一種名為VerSUM的輕量級客戶端[7]。VerSUM允許輕量級客戶端將過大的計算量外包給其他服務(wù)器,通過比較多個服務(wù)器返回的結(jié)果以保證計算結(jié)果的正確性。
這類方法的本質(zhì)是通過存儲或算力的外包,把負(fù)載轉(zhuǎn)移至其他節(jié)點。在這種模式下,擁有更多資源的節(jié)點會擁有更多話語權(quán),強(qiáng)化了區(qū)塊鏈網(wǎng)絡(luò)的中心化程度,背離了去中心化的初衷,增加了系統(tǒng)風(fēng)險。
2.1.3 通過鏈下離線交易來減輕網(wǎng)絡(luò)壓力
Lombrozo,Lau和Wuille提出見證隔離技術(shù)[8],將簽名數(shù)據(jù)從交易中分離出來,組成新的結(jié)構(gòu)另行存儲。Poon和Dryja提出閃電網(wǎng)絡(luò)方案[9],通過離鏈進(jìn)行頻繁的小額支付,以避免區(qū)塊鏈容量被大量小額交易占用。在此基礎(chǔ)上,文獻(xiàn)[10]提出雙向小額支付的通道協(xié)議,在保證安全的前提下,節(jié)點可以利用自建的離線通道實現(xiàn)無延遲實時支付。
以上利用鏈下離線交易來擴(kuò)容的主要思路是盡可能把更多的信息放到鏈下存儲,緩解單個區(qū)塊數(shù)據(jù)量不夠、數(shù)據(jù)冗余以及鏈上數(shù)據(jù)過多的問題。
2.2 重新設(shè)計區(qū)塊鏈
文獻(xiàn)[11]提出下一代比特幣(比特幣NG)的思想。比特幣NG將傳統(tǒng)區(qū)塊分解為兩部分:領(lǐng)導(dǎo)者選舉的關(guān)鍵區(qū)塊和存儲交易的微區(qū)塊。該協(xié)議將時間劃分為不同時段。 在每個時段,節(jié)點必須散列以生成關(guān)鍵區(qū)塊。一旦生成關(guān)鍵區(qū)塊,該節(jié)點就成為負(fù)責(zé)生成微區(qū)塊的領(lǐng)導(dǎo)者。比特幣NG還擴(kuò)展了最長鏈條策略,在這個策略中微區(qū)塊沒有權(quán)值。通過這種方式重新設(shè)計區(qū)塊鏈,并且已經(jīng)解決了塊大小和網(wǎng)絡(luò)安全性之間的權(quán)衡問題。
對于大交易量的場景,以上多數(shù)方案并不能很好地解決區(qū)塊鏈規(guī)模不斷增大的問題,沒有從根本上解決可擴(kuò)展性問題。文獻(xiàn)[6]把傳統(tǒng)的區(qū)塊鏈分為三個部分,但在更新賬戶樹時操作較為復(fù)雜,不易整體實現(xiàn)。
本文從數(shù)據(jù)層著手,改進(jìn)區(qū)塊數(shù)據(jù)結(jié)構(gòu),引入狀態(tài)更新池的概念,提出新的區(qū)塊鏈數(shù)據(jù)模型,提供一種能使區(qū)塊鏈系統(tǒng)保持特定規(guī)模的解決方案。
3 雙子鏈模型
3.1 區(qū)塊指針
區(qū)塊鏈規(guī)模不斷增長的根本原因在于數(shù)據(jù)層的區(qū)塊數(shù)據(jù)結(jié)構(gòu)和組鏈方式。僅有的前塊Hash字段使得區(qū)塊的組鏈方式較單一,只能抽象地組成一條拓?fù)浣Y(jié)構(gòu)簡單的區(qū)塊鏈,無法對區(qū)塊鏈本身進(jìn)行操作,區(qū)塊鏈系統(tǒng)只能不斷增大規(guī)模,最多以鏈下存儲和只保留區(qū)塊頭的方式緩解這一問題。
為解決這一問題,本文將前塊Hash字段改進(jìn)為區(qū)塊指針,如圖1所示。區(qū)塊指針包括指向區(qū)塊高度和指向區(qū)塊摘要兩個字段,分別表示區(qū)塊指針指向區(qū)塊的高度序號和哈希摘要。與傳統(tǒng)區(qū)塊鏈中的前塊Hash字段不同,區(qū)塊指針并不固定指向前一區(qū)塊,而是可以根據(jù)需要指向任意已存在的區(qū)塊。通過一個或多個區(qū)塊指針,區(qū)塊可組成更復(fù)雜的拓?fù)浣Y(jié)構(gòu),使得區(qū)塊鏈的結(jié)構(gòu)更加豐富、靈活。
3.2 狀態(tài)更新池
除了引入?yún)^(qū)塊指針外,還需要在區(qū)塊體中引入狀態(tài)更新池的概念,以便在業(yè)務(wù)邏輯上支持對新的區(qū)塊鏈結(jié)構(gòu)進(jìn)行相關(guān)操作,滿足新功能。
目前大部分區(qū)塊鏈系統(tǒng)的核心為交易數(shù)據(jù),每個區(qū)塊中包含了以地址賬戶為主體的交易信息,節(jié)點依靠所有歷史信息判斷每筆新的交易是否合法,是否存在雙花等問題。這種檢查實質(zhì)上是對輸出地址賬戶所持有通證(token)狀態(tài)的判定,即在時刻t相關(guān)賬戶的余額狀態(tài),在區(qū)塊鏈中,就是截至前一區(qū)塊該賬戶的余額狀態(tài)。只要能安全得到這一條件,該賬戶的歷史交易信息便可丟棄,達(dá)到減少區(qū)塊鏈數(shù)據(jù)量的目的。
為此,本文引入狀態(tài)更新池的相關(guān)概念,如圖2所示。區(qū)塊體內(nèi)加入?yún)^(qū)塊狀態(tài)更新子池,區(qū)塊頭部增加子池摘要,每份子池內(nèi)包含一定數(shù)量的賬戶狀態(tài)信息,一份完整的狀態(tài)更新池由若干個存在于連續(xù)不間斷區(qū)塊中的狀態(tài)更新子池組成。
如在區(qū)塊Bm至區(qū)塊Bn這一串連續(xù)有限區(qū)塊中,包含一份狀態(tài)更新池,每個區(qū)塊內(nèi)的子池均包含部分賬戶截至區(qū)塊Bm之前的狀態(tài)信息,整個狀態(tài)更新池中包含截至區(qū)塊Bm之前所有余額不為空的賬戶信息。這樣,區(qū)塊Bn之后節(jié)點驗證賬戶的余額只需要該狀態(tài)更新池和Bm到當(dāng)前的區(qū)塊即可,Bm之前的區(qū)塊可以丟棄。
3.3 雙子鏈模型工作原理
利用區(qū)塊指針和狀態(tài)更新池的概念,本文提出一種雙子鏈模型。
雙子鏈模型的區(qū)塊結(jié)構(gòu)如圖3(a)所示,區(qū)塊頭中加入兩個區(qū)塊指針和子池摘要,區(qū)塊體中加入狀態(tài)更新子池。簡單表示如圖3(b)所示。
雙子鏈模型的鏈結(jié)構(gòu)如圖4所示。
圖4中,每個區(qū)塊的區(qū)塊指針1同傳統(tǒng)區(qū)塊鏈中的前塊Hash字段一致,唯一標(biāo)定節(jié)點承認(rèn)的前一個區(qū)塊,通過指針1各區(qū)塊在邏輯上依然構(gòu)成一條傳統(tǒng)的不斷增長的鏈,如圖5所示。
通過區(qū)塊指針2,組成并維持雙子鏈結(jié)構(gòu)。每條子鏈第一個區(qū)塊的區(qū)塊指針2固定指向創(chuàng)世區(qū)塊,后面的區(qū)塊同指針1依次指向前一區(qū)塊,形成一條子鏈。當(dāng)子鏈達(dá)到約定長度后,則停止生長,新的區(qū)塊作為新子鏈第一個區(qū)塊連接向創(chuàng)世區(qū)塊,同時,丟棄最舊的子鏈,如圖6(a)所示。然后新的區(qū)塊在新子鏈上生長,如圖6(b)所示,直到新的子鏈到達(dá)最大高度,開始生成下一條子鏈。
這樣,區(qū)塊鏈網(wǎng)絡(luò)共同維護(hù)的數(shù)據(jù)規(guī)模不會超過創(chuàng)世區(qū)塊加兩條子鏈,從區(qū)塊拓?fù)浣Y(jié)構(gòu)上達(dá)到了控制總長度以及數(shù)據(jù)規(guī)模的目的。
為保證區(qū)塊鏈網(wǎng)絡(luò)的正常運(yùn)行,丟棄部分區(qū)塊前需要把必需的歷史信息留下來。在雙子鏈模型中,通過每條子鏈包含的狀態(tài)更新池來完成。狀態(tài)更新池中記錄所在子鏈之前所有非空賬戶的狀態(tài)結(jié)果。其生成過程如下:
假定當(dāng)前所在子鏈為C鏈,前一條子鏈為B鏈。遍歷B鏈中更新池信息交易信息,得到截至B鏈結(jié)束時存在的所有n個非空賬戶,即C鏈狀態(tài)更新池待記錄賬戶。約定C鏈長度為m,已存在t個有效區(qū)塊,其中已記錄更新s個非空賬戶的狀態(tài)。
節(jié)點生成新區(qū)塊,即C鏈上第t+1個、倒數(shù)第m-t個,B鏈中有n-s個賬戶需要被記錄。節(jié)點只需遍歷B鏈,從中找出未被記錄的前[(t-s)/(m-t)]個賬戶,計算得出B鏈結(jié)束時的狀態(tài),記錄在區(qū)塊子池中并計算子池摘要即可。
這樣,每條子鏈的狀態(tài)更新池可包括上一條子鏈所有賬戶的結(jié)果狀態(tài),子鏈上的交易信息則是本子鏈生成時間內(nèi)產(chǎn)生的新的交易。每筆交易在驗證時無需對歷史上所有區(qū)塊遍歷,只需遍歷上一條子鏈的狀態(tài)更新池和交易信息,以及當(dāng)前子鏈已產(chǎn)生的交易即可判斷賬戶的當(dāng)前狀態(tài)。另外,若當(dāng)前子鏈的狀態(tài)更新池中已更新賬戶狀態(tài),又可省去遍歷上一子鏈的過程。
4 討 論
4.1 雙子鏈模型的數(shù)據(jù)規(guī)模
雙子鏈模型為可擴(kuò)展性問題提供了一種解決方案,通過對數(shù)據(jù)結(jié)構(gòu)的改進(jìn)使得鏈上冗余信息被安全丟棄,將超過一定時間的歷史交易信息轉(zhuǎn)化為賬戶余額狀態(tài),最終達(dá)到最大限度控制數(shù)據(jù)規(guī)模的目的。
以比特幣為例,當(dāng)前的數(shù)據(jù)規(guī)模已達(dá)180 GB,共有3億多筆交易,而獨(dú)立地址賬戶只有40萬。因此,特定地址的所有歷史交易信息量遠(yuǎn)大于只記錄地址和余額。丟棄歷史信息可極大地降低節(jié)點的存儲負(fù)載,進(jìn)而解決區(qū)塊鏈的可擴(kuò)展性問題。
4.2 分叉、安全性
對雙子鏈結(jié)構(gòu)的組織和舊鏈的丟棄是節(jié)點基于區(qū)塊指針2視角的操作。從區(qū)塊指針1視角看,依然是傳統(tǒng)的單鏈結(jié)構(gòu),因此繼承了傳統(tǒng)區(qū)塊鏈結(jié)構(gòu)的相關(guān)特性。分叉時主鏈的選擇方法、安全性分析等可以繼續(xù)使用現(xiàn)有方法[12]。現(xiàn)行區(qū)塊鏈應(yīng)用中區(qū)塊確認(rèn)長度[1]通常不超過100,只要雙子鏈模型中子鏈的長度超過該確認(rèn)長度,即可認(rèn)為本模型擁有不低于普通區(qū)塊鏈的安全性。
5 結(jié) 語
本文從區(qū)塊鏈的數(shù)據(jù)層著手,引入?yún)^(qū)塊指針和狀態(tài)更新池的概念,提出區(qū)塊數(shù)據(jù)的雙子鏈模型,形成新的區(qū)塊數(shù)據(jù)結(jié)構(gòu)和組鏈形式,支持新的區(qū)塊間拓?fù)浣Y(jié)構(gòu),使得區(qū)塊鏈系統(tǒng)對區(qū)塊鏈的操作變得可行。由于雙子鏈模型限制了區(qū)塊鏈的規(guī)模,并允許安全丟棄歷史區(qū)塊,可以有效緩解區(qū)塊鏈的可擴(kuò)展性問題。
當(dāng)然,本文提出的模型也有其適用范圍,要求使用場景對歷史數(shù)據(jù)不全部保存,只需明確相關(guān)賬戶當(dāng)前狀態(tài),對于嚴(yán)格要求完整歷史信息的業(yè)務(wù)場景還需進(jìn)一步尋找可擴(kuò)展性問題的解決方案。
參 考 文 獻(xiàn)
[1] NAKAMOTO S. Bitcoin: A peer-to-peer electronic cash system[Z].Consulted,2008.
[2]何蒲,于戈,張巖峰,等.區(qū)塊鏈技術(shù)與應(yīng)用前瞻綜述[J].計算機(jī)科學(xué),2017,44(4):1-7.
[3] ZHENG Z,XIE S,DAI H,et al. An overview of blockchain technology: architecture,consensus,and future trends[C]// IEEE International Congress on Big Data.IEEE,2017.
[4]邵奇峰,金澈清,張召,等.區(qū)塊鏈技術(shù):架構(gòu)及進(jìn)展[J].計算機(jī)學(xué)報,2018,41(5):969-988.
[5] FERN?NDEZ-CARAM?S T M,F(xiàn)RAGA-LAMAS P. A review on the use of blockchain for the internet of things[J].IEEE access,2018(99):1.
[6] BRUCE J.The mini-blockchain scheme[EB/OL]. http://cryptonite.info/files/mbc-scheme-rev3.pdf.
[7] VAN DEN HOOFF J,KAASHOEK M F,ZELDOVICH N. Versum:verifiable computations over large public logs[C]// In Proceedings of the 2014 ACM SIGSAC Conference on Computer and Communications Security New York,NY,USA,2014:1304-1316.
[8] LOMBROZO E,LAU J,WUILLE P. BIP141:segregated witness(Consensus layer)[OL]. [2016-11-15]. https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki.
[9] POON J,DRYJA T. The bitcoin lightning network:scalable off-chain instant payments[OL].[2016-12-17]. https://lightning.network/lightning-network-paper.pdf.
[10] DECKER C,WATTENHOFER R. A fast and scalable payment network with bitcoin duplex micropayment channels[M].Stabilization,safety,and security of distributed systems. springer international publishing,2015:3-18.
[11] EYAL I,GENCER A E,SIRER E G,et al. Bitcoinng:a scalable block chain protocol[C]// In Proceedings of 13th USENIX Symposium on Networked Systems Design and Implementation (NSDI 16),Santa Clara,CA,USA,2016:45–59.
[12] GERVAIS A,KARAME G O,GLYKANTZIS V,et al. On the security and performance of proof of work blockchains[C]// ACM Sigsac Conference on Computer and Communications Security.ACM,2016:3-16.