戴俊杰,沈蘇彬
(南京郵電大學 計算機學院,南京 210023)
邊緣計算[1]作為一種對云計算的補充性方案,將云計算的功能擴展到更靠近數據產生源的網絡邊緣以減輕網絡傳輸負擔,同時也更能滿足部分應用,如物聯網應用對低延遲響應的需求。早期關于邊緣計算的研究,如移動云計算(Mobile Cloud Computing,MCC)[2]主要依賴云服務、Cloudlet[3]等微型數據中心,需要部署專用計算服務器作為移動終端設備和云之間的中間層,以提供更接近終端設備的計算服務。由Cisco[4]引入的霧計算(Fog Computing,FC)擴展了中間層的范圍,用戶可以通過從網絡邊緣到網絡核心的任何連接的設備上獲取霧計算服務。同時,霧節點部署的分散性使得設備既可以由自身充當霧節點提供服務也可以作為客戶端使用霧資源[5]。近年來,研究人員引入霧計算模型[6],其將計算進一步轉移到物聯網環境的極端邊緣。在該模型中,大量的異構移動設備和物聯網設備都能夠提供某種形式的服務,以減輕霧的負擔。通過以上研究可以發現,計算服務的形式正在從以往單一的、由龐大數據中心提供的集中式云計算服務轉向更加多元的、可以由各類可用的網絡閑散資源提供的分散式計算服務。針對基于對等網絡計算能力共享系統的研究,如加州伯克利大學的SETI@home項目[7]和BOINC項目[8],通過對等網絡共享節點間閑置的計算能力來達到執行復雜運算的目的。但是以上項目和研究多數具有專用性(如某項科學研究)且規模有限,所使用的計算資源也較為固定,一般是個人計算機所提供的閑置處理器資源。在嘗試將這種基于對等網絡的計算模式應用到數量更為龐大的、分散于網絡邊緣且異構的閑散資源時,如何對資源進行有效、可靠且可信的管理將是一個巨大的挑戰。本文著重關注于對位于網絡邊緣的、閑散的計算資源(下文稱為資源)進行可靠和可信的分配。
目前,大多相關研究采用分布式的資源管理和調度方案[9-10],使用一個相對具有較強性能的邊緣節點,如Cloudlet充當控制器,由其負責管理地理位置接近的一群邊緣設備,接受資源請求并對其分配可用的資源,這種方式從一定程度上提高了應對大量分散和異構的資源時的資源管理效率。另外,也有研究人員[11]為了提供參與者更加穩定的接口,在云中部署集中控制器,從全局上管理資源的可用性信息、接受資源請求并做出相應的資源分配的決策,再將具體的調度工作交由中間層節點完成,這種方法具有更穩定且靈活的表現。但是以上研究中所采用的方案本質上仍是傳統的中心化管理方法,需要由固定的、單一的實體作為控制中心進行統一管理。這種模式的明顯缺陷在于:面臨單點故障風險,即一旦控制節點發生故障,在其恢復之前無法正常進行計算服務;受制于傳統信任模式,控制節點具有較高權限,若被惡意使用將造成參與者的損失,如濫用資源或提供惡意服務;在面對數量龐大、分布分散且異構的資源來源時,這種集中式管理方法的效率較低。
區塊鏈[12]作為比特幣系統的底層技術,以其對交易數據存儲的不可篡改性、可追溯性和共識機制等特點近年來受到了人們廣泛的關注。同時,隨著對區塊鏈技術研究的開展,也出現很多有關區塊鏈在非數字貨幣領域的應用研究[13],旨在探索區塊鏈可用的更加廣泛的應用場景。針對上述計算資源分配方案中存在的問題,本文結合區塊鏈技術探討一種基于去中心化的、可信和高效的邊緣計算資源分配方法。梳理當前區塊鏈技術發展所面臨的問題,并對其提出改進思路,設計可行的實現方案。不同于中心化資源分配方案中以單一控制節點為中心的結構設計,本文在基于區塊鏈的、去中心化的方案中對資源管理的總體結構做出合理的調整和設計,確定涉及參與方進行交互以實現資源分配。為達到可信的資源分配的目的,利用區塊鏈公用賬本的本質,將用于資源分配中信任管理的關鍵數據記錄到賬本,使得用戶可以根據所記錄的數據進行操作。基于現有的以太坊區塊鏈平臺及其支持的智能合約技術,設計本文方法的實現方案。同時,針對目前區塊鏈技術的性能瓶頸問題,提出基于以太坊平臺的側鏈擴容方案,以提高系統運行效率。
區塊鏈技術最初是作為比特幣[14]的底層技術開始逐漸為人們所知。在比特幣系統中,區塊鏈技術被用于存儲在對等網絡中傳播的交易信息,而這些交易信息確定了系統中存在的數字貨幣的數量及其歸屬情況。礦工作為區塊鏈的維護者,可以由任何參與者擔任。這些礦工在網絡中收集并驗證交易,同時將通過驗證的交易信息組裝成區塊,并以Merkle樹形式組織交易信息,將Merkle樹根值作為交易信息的唯一標識放入區塊頭,任何對交易信息甚至是交易信息存儲順序的改動都將引起Merkle樹根值的變化,從而使得區塊內容不一致。每個區塊的區塊頭中都包含上一個區塊的區塊頭信息的哈希值,一個個區塊被有序地鏈接在一起,區塊鏈結構如圖1所示。

圖1 區塊鏈結構Fig.1 Blockchain structure
為保證“鏈”內容的一致性,區塊鏈技術使用了分布式共識機制,如比特幣使用的工作量證明(Proof of Work,PoW)的共識機制。每個區塊通過在區塊頭中放入一個一次性數,使得區塊頭的哈希值不大于某個目標值,從而成為一個合法區塊。為此,競爭者不斷嘗試不同的一次性數,而這往往需要巨大的算力資源來實現,這使得成功篡改某個區塊中的內容的難度隨著塊數量的增加而呈指數級上升。從本質上講,共識機制的作用即在于將用于保證區塊鏈這個公共賬本的內容的一致性而進行的一致性投票與現實行為或者物質資源聯系起來,其最初的目的是為了防御女巫攻擊(Sybil Attack)。
隨著區塊鏈的發展,出現了更多成熟且擁有不同用途的區塊鏈系統。針對不同的區塊鏈系統,研究人員提出了更多不同的應用于區塊鏈系統的共識機制,如權益證明(Proof of Stake,PoS)機制以及各類拜占庭容錯(Byzantine Fault Tolerance,BFT)機制[15]等。以太坊[16]是一個總體上類似于比特幣系統的區塊鏈系統,其最大的不同在于其支持更加復雜的可執行腳本,一般被稱為“智能合約”,支持由圖靈完備的編程語言編寫。使用智能合約將一些簡單的業務邏輯以合約形式部署到區塊鏈,由以太坊交易觸發執行。另外一個較為流行的平臺是超級賬本(Hyperledger)的Fabric[17],它是聯盟鏈中的典型代表,多用于企業間的項目,其同樣支持類似于智能合約的可執行腳本,稱為鏈碼(Chain Code)。
但是,就目前區塊鏈的研究現狀而言,要真正實現廣泛而實際的應用,仍面臨諸多關鍵挑戰和技術瓶頸。其中,最為突出的就是區塊鏈的交易吞吐量和交易速率問題,在業內也被稱為“可擴展性”問題[18]。該問題的核心指標通常使用每秒交易數(Transaction Per Second,TPS)來表示。一般地,比特幣的TPS可以達到7,以太坊在經過幾次性能提升后這一數值范圍可以達到30~40。這些性能表現與Visa等目前主流的中心化支付系統仍無法相比。對于可擴展性問題,其最大的成因來自于目前區塊鏈技術對共識機制所持的保守和謹慎的態度。尤其是在比特幣和以太坊這一類涉及大數額資金轉移的數字貨幣系統中,一個強共識機制被看作是保證系統正常運轉的核心要素。因此,在該類系統中,每一筆交易都需要經過較長時間的驗證和確認后才會被視為合法有效。
目前,有較多研究團隊都在積極探索并提出相應的解決方案[19],以應對區塊鏈的可擴展性問題。這些解決方案一般可以分為兩類,第1類是通過直接修改區塊鏈設計的鏈上解決方案,簡單的如此前比特幣系統出現的硬分叉,就是因為一部分用戶決定上調區塊大小限制而導致的,其目的為增加比特幣交易的吞吐量。還有如康奈爾大學團隊針對比特幣系統提出的比特幣-NG[20],通過升級比特幣使用的PoW算法,縮短挖礦和確認區塊的時間,另外還有以太坊社區所提出的分片技術[21],其將整個以太坊網絡分割成多個“宇宙”,其中所包含的交易可以由不同驗證者同時進行處理。第2類則是鏈下解決方案,在不改變現有主鏈設計的前提下,在其外實現擴容,如比特幣中的閃電網絡[22]和側鏈[23]技術以及以太坊所提出的狀態通道[24]。這一類解決方案的核心思想主要是在不改變主鏈設計的前提下,通過其他渠道快速進行交易,通過定時向主鏈同步交易數據,在享受底層區塊鏈帶來安全性的同時,提高交易吞吐量。
基于以上對區塊鏈技術的分析,不難發現區塊鏈本質上是一個公用賬本,通過參與者對賬本內容的共同維護來實現去中心化的信任管理。本文利用區塊鏈實現一種去中心化、可信的邊緣計算資源分配方法。同時,針對區塊鏈目前仍存在的可擴展性問題,提出面向資源分配的側鏈解決方案。基于以太坊平臺以及利用智能合約對分配方法進行實現,并且使用以太坊的私有鏈網進行仿真實驗。
目前,研究人員正著力于探索區塊鏈技術在去中心化計算資源管理上的潛力。其中最為突出的基于區塊鏈的、去中心化的計算服務平臺,如iExec[25]和Golem[26],旨在通過使用基于區塊鏈的資源管理和財務激勵,將一切可能的用戶設備包括個人電腦、私人服務器甚至是整個數據中心在一個邏輯層面協同工作,以提供較強的計算能力來滿足用戶處理復雜計算任務和應用的需求。另外,還有文獻[27]提出的SmartEdge,即基于以太坊的邊緣計算智能合約,提供低成本、低開銷的計算資源管理,使物聯網設備可以與邊緣計算節點自動交易以請求計算卸載服務。EdgeChain[28]是一種基于區塊鏈的邊緣計算架構,其建立了一個成本和定價模型,以優化跨多個移動網絡運營商的應用程序布局,使得提供服務的移動網絡運營者可以得到報酬以激勵其繼續提供計算能力。
上述大部分利用區塊鏈技術管理分散計算資源的方案,本質上仍是利用了基于區塊鏈的虛擬貨幣系統作為結算手段來激勵資源共享行為,但對于如何利用區塊鏈技術實現去中心化的可信資源分配,未進行深入和具體的研究和設計。另外,以上研究大多基于以太坊平臺,本質上是運行在以太坊平臺上的去中心化應用(Decentralized Application,DApp),缺少獨立于現有區塊鏈平臺的、系統性研究的支撐。本文旨在設計一種獨立于現有平臺的、基于區塊鏈的、去中心化的可信邊緣計算資源分配方法。
對于邊緣計算資源分配方法的總體結構設計,不同于圖2(a)所示的一般中心化方案結構,其中所涉及工作都由單一的控制實體負責,雖然可能會設置中間層來負責與底層終端設備的直接交互工作,但是本質上仍是中心化的管理方案,不能避免上文提到的有關中心化方案所面臨的問題。在本文方法的設計中,如圖2(b)所示,所有參與者都通過對等網絡,以點對點通信的方式進行交互來完成資源分配工作。為了保證工作的順利進行和可信資源的分配,需要由網絡中所有的參與者共同維護一個賬本。賬本用于記錄有關資源分配的關鍵信息,記賬的工作由系統中的管理節點負責,而管理員本身可以由任何有能力的參與者擔任,其記賬權根據共識協議而非其固有身份屬性決定。因此,本文方法是完全的去中心化的方法。

圖2 邊緣計算資源分配方法的總體結構Fig.2 Overall structure of edge computing resource allocation method
本文方法中的參與者主要包括3種角色,分別是資源提供者、資源請求者和管理員,其中,資源提供者是指擁有空閑計算資源的邊緣設備,其參與目的在于貢獻空閑資源。為此,其根據自身資源情況向網絡中廣播資源發布消息(Resource Announcement Message),消息描述了資源的可用性信息;資源請求者一般指擁有無法獨立完成的計算任務的邊緣設備,參與的目的在于為計算任務的順利執行而請求資源協助。為此,其通過網絡收集上述資源信息,并合法地對可用資源發出請求,即資源請求消息(Resource Request Message);管理員類似于比特幣系統中的“礦工”,負責收集和驗證網絡中的資源請求消息,而資源請求消息則類似于比特幣系統中的“交易”,通過驗證的“交易”被打包成區塊并發布到網絡中,接受其他節點的驗證。當區塊被其他節點接受并加入到最新區塊鏈的末端,即代表全網根據其中所包含的“交易”內容達成共識,實現資源分配。記錄的“交易”信息指示了資源分配關系,各參與者將根據這些信息進行下一步操作。
關于參與者的身份驗證,本文引入一般區塊鏈系統所普遍采用的非對稱加密體系,為每個加入到網絡的參與者分配公/私密鑰對,公鑰用作身份標識,私鑰生成數字簽名用于驗證身份的真實性。
如2.1節所述,在本文方法的設計中,“交易”本質上為在網絡中傳播的資源請求消息,當這類“交易”信息經管理員驗證并記錄到區塊鏈中時,意味著資源分配的完成,而“交易”信息指示了資源分配關系。具體地,資源請求消息由資源請求者對帶有資源提供者簽名的資源發布消息及其欲請求的資源量信息再次簽名來完成。其中資源發布消息由資源提供者簽名并發布,消息包含了資源的可用性信息,具體如下:
Provider:資源提供者身份標識;
Volume:資源提供者可以提供的資源總量;
startTime:資源可用開始時間;
endTime:資源可用結束時間;
Timestamp:消息發布時間戳;
Sign:數字簽名,用于確認提供者身份。
當資源請求者在網絡中收集到這一類資源發布消息時,其根據自身所需,針對指定的資源發出資源請求消息,即本文方法中的“交易”,具體包含:
resourceInfo:所請求資源信息,即上文中由資源提供者發布的完整的資源發布消息,這里簡單使用一條字段代指;
Requester:資源請求者身份標識;
Volume:請求者所請求的資源量;
Timestamp:交易發布時間戳;
Sign:數字簽名,用于確認請求者身份。
如上所述,資源請求消息作為“交易”由資源請求者發布并在網絡中傳播。與此同時,管理員在網絡中收集并驗證這一類“交易”,其驗證工作具體如下:
1)通過請求者的簽名驗證消息內容的真實性;
2)通過消息中資源信息部分所包含的資源提供者的簽名驗證所請求資源的真實性;
3)回溯區塊鏈,檢查是否已有包含此消息的區塊存在,避免重復打包;
4)根據消息發布時間戳和所請求資源的可用時間范圍信息,判斷該請求的有效性,資源提供者無法在時間限制范圍之外的時間提供資源;
5)回溯區塊鏈,遍歷所有以往對資源發出的其他請求信息,計算并判斷其目前剩余的可用資源總量是否仍滿足本次交易中請求者所請求的資源量,避免資源的過度分配。
對于通過驗證的資源請求,管理員將其加入正在組裝的區塊中,根據共識協議,一旦獲得出塊權便將區塊發布到網絡。具體的區塊的構造如圖3所示,基本與比特幣系統中對區塊的構造類似。

圖3 區塊組成Fig.3 Block composition
以假設使用類似于比特幣工作量證明的共識機制為例,管理員在收集和驗證網絡中的交易信息的同時,將通過驗證的交易組裝成區塊,并不斷嘗試一次性數(Nonce),一旦包含該一次性數的區塊頭的哈希值小于規定目標值(Target),管理員將該區塊廣播。其他管理員接收并對區塊進行如下驗證:1)檢查區塊引用的上一個區塊是否有效;2)檢查區塊的時間戳是否比上一個區塊大;3)檢查區塊的工作量證明是否有效;4)檢查區塊所包含的交易的合法性。
若驗證通過,則管理員將接受該區塊,將其加入本地區塊鏈并在其后嘗試制造新塊,即視該塊的區塊頭哈希值為新區塊應包含的父區塊哈希值。至此,區塊中所包含的請求信息成功被記錄到區塊鏈并且被認為是可信的,這意味著資源分配的實現。根據鏈上所記錄信息,當資源請求者向資源提供者發出資源訪問請求時,后者可以根據前者所提供的鏈上信息索引及其身份標識驗證該訪問請求的合法性。若為合法訪問,則資源提供者必須響應,并提供相應的計算資源。本文方法的研究范圍為:從參與者發布資源和請求消息,到管理員驗證并將合法的請求消息作為“交易”記錄到區塊鏈,最后資源提供者根據鏈上信息對來自資源請求者的資源訪問進行合法性驗證為止。至于具體的資源訪問過程及其后一系列操作屬于訪問控制和其他研究領域,暫不在本文方法的研究范圍之內。在本文方法的仿真實現中,僅需簡單模擬相關的驗證過程以證明所設計方法的可行性和正確性即可。
本文方法擺脫中心化模式的做法,將資源分配的工作分散,由參與者自行通過對等網絡互相通信來完成,以此擺脫傳統信任模式和單點故障所帶來的不利影響。同時使用區塊鏈技術,記錄有關資源分配的關鍵信息,保證了資源分配的可信和可靠。
在本文方法中,所有資源請求及其中所包含的資源信息都必須通過其他節點的驗證后記錄到區塊并得到全網共識,區塊隨時間不斷累加且有序鏈接,對其中任何一個區塊內的任何數據任何修改都會影響該區塊以及鏈接在其后的所有區塊內容的變化。因此,區塊鏈技術保證了資源分配過程中相關信息的可信和安全存儲。
在保證資源分配有關信息的可信存儲的基礎上,資源提供者可以根據區塊鏈上記錄的相關信息,驗證來自其他參與者資源訪問請求的合法性。以此,可以避免參與者對資源的非法訪問和過度使用。
由于多數參與者都為資源受限的邊緣設備,管理員為了驗證、記錄并維護資源請求消息,需要保存完整的區塊信息,而其余參與者只是利用了查詢功能獲取鏈上數據來進行一些驗證工作。因此,在本文方法中,除了管理員作為全節點需要保存完整的區塊內容外,其他的參與者只需運行輕節點,即僅存儲區塊頭信息。如當一個輕節點用戶想要驗證某個資源請求的合法性時,其可以從任意一個管理員處獲取Merkle Proof來進行驗證,而無需保存完整的區塊鏈副本。以圖3的區塊結構為例,其中的第1個資源請求(編號為0)的Merkle Proof即為“哈希值1”和“哈希值23”。具體驗證方法如下:
1)根據該資源請求消息記錄計算出其哈希值(哈希值0)。
2)將哈希值0與Merkle Proof(哈希值1)拼接并算出新的哈希值(哈希值01)。
3)將哈希值01與Merkle Proof(哈希值23)拼接算出最終的根哈希值。
4)將算出的根哈希值與自己保存的塊頭信息中的根哈希比對來判斷其真實性。
因此,這種簡單驗證的方法可以增強本文方法的可行性。
為實現本文基于區塊鏈的邊緣計算資源分配方法,需要解決3個問題。首先,如何實現底層區塊鏈網絡的問題;其次,如何實現參與者對于資源和資源請求信息的發布及其有效存儲的問題;最后,為了提高系統的可用性,使其滿足實際應用的要求,如何提高資源請求處理的效率,提高系統吞吐量。針對上述問題,本文設計了基于以太坊平臺及其所支持側鏈技術的實現方案。該方案主要實現了3個功能,分別為資源和資源請求信息的發布、對資源請求的驗證和存儲以及基于鏈上所存儲信息的相關驗證功能,并且配以可視化的前端頁面設計,方便用戶使用以上功能。具體的系統參與者操作過程如圖4所示。

圖4 系統參與者操作過程Fig.4 Operation process of system participant
在實際部署和使用智能合約時,利用側鏈技術將所設計智能合約部署在以太坊主鏈之外,即在側鏈上運行智能合約,以擺脫以太坊主鏈對使用效率的限制,大幅提高系統吞吐量,并且可以有效降低成本。實現架構主要由以太坊主鏈網絡、以太坊側鏈網絡、智能合約和應用程序前端組成,如圖5所示。

圖5 實現架構Fig.5 Implementation architecture
首先依賴以太坊平臺可以實現底層區塊鏈網絡的搭建,各參與節點可以通過以太坊客戶端(如Go-ethereum,Get)參與到網絡中,實現對各項功能的操作,并參與到區塊鏈網絡的維護中。
其次以太坊支持圖靈完備語言編程的智能合約(一種持久性的自動執行腳本)。使用智能合約,一方面可以將所涉及的操作流程以代碼形式寫入智能合約,用戶通過以太坊交易觸發智能合約執行,實現對各種功能的操作,在此過程中,管理員的關鍵工作在于負責合約的具體執行以及維護合約作為以太坊內部賬戶的賬戶狀態;另一方面,利用智能合約的存儲功能可以存儲由用戶發布的資源及資源請求信息,即關于資源分配的“交易”信息,內容的存儲同樣以Merkle樹的形式進行(具體為以太坊獨有的改進的Merkle Patricia Tree結構),任何對其內容的改變都會影響合約賬戶的存儲根值(Storage Root),進而影響合約賬戶的賬戶狀態并最終影響整個以太坊的狀態。因此,通過智能合約同樣可以保證所記錄信息的難以篡改性。
最后為了避免直接在以太坊網絡上部署智能合約可能會面臨的性能瓶頸問題,在本文實現方案中,智能合約被部署到側鏈,而在主鏈部署一個對應的側鏈合約,作為側鏈與主鏈之間的橋梁。本文方法所涉及參與方主要依靠側鏈實現交互,所產生的資源和資源請求等業務數據在側鏈上被處理并記錄在系統賬戶中。同時,通過與主鏈上的側鏈合約(賬戶)的連接和交互,定期地將側鏈上更新的數據同步至主鏈(為保證性能,僅上傳側鏈中區塊數據的Merkle根值,如圖6所示,其可以唯一標識區塊中所包含的所有更新的用戶狀態),以充分利用以太坊主網絡帶來的強大安全性保證。當發現異常時,側鏈上的用戶可以向主鏈發出驗證查詢和挑戰。

圖6 側鏈數據存證Fig.6 Deposit of side-chain data
在區塊鏈網絡運行正常、合約部署成功且被正常執行的情況下,參與方可以基于前端頁面實現資源和資源請求信息的發布以及相關的驗證工作。
根據以上分析,基于以太坊區塊鏈平臺的邊緣計算資源分配的實現流程如下:
采用XRF法[15]檢測樣品(NaCl、城市固體廢棄物模擬組分和廚余沼渣)中的Cl含量;取約3 g樣品,分別將硼酸和樣品用壓片機(10 MPa下恒壓30 s)壓制成片放入 XRF儀器中,測定其中的 Cl含量。
1)參與各方需要注冊成為以太坊區塊鏈平臺用戶,注冊可以獲取一個公/私密鑰對,公鑰作為用戶的身份標識,私鑰可以生成數字簽名用于身份驗證。
2)參與各方通過約定共同制定一份智能合約,合約中規定了發布和存儲資源及資源請求信息的執行邏輯。寫好的合約將被部署到側鏈,一旦合約成功部署,便不可更改。具體的側鏈實現方法則采用以太坊所支持的Loom Network(LN)。使用Loom SDK部署智能合約,其將為合約單獨創建一條專用的DApp鏈,參與者將在該專用鏈上通過合約實現相關功能的操作,而避免與主鏈上的用戶競爭資源,大幅提高系統效率。
3)合約一旦部署成功,參與者通過前端頁面輸入相關數據,可以向目標智能合約發送資源發布消息和資源請求消息,這些消息本質上具有參數(資源信息和資源請求信息)的交易。
4)管理員收集網絡中的相關交易,并執行交易所觸發的智能合約。新的資源和資源請求信息由此存儲到了智能合約中,這將導致合約狀態發生變化。通過運行共識機制,管理員以區塊形式將更新后的合約狀態發布出去,其他管理員驗證合約的執行并同步合約的最新狀態。當全網的合約狀態達成一致,即代表新的資源和資源請求信息成功存儲至區塊鏈,資源分配工作完成。
5)DApp鏈定期與以太坊主鏈進行數據同步,將一段時間內智能合約中更新的數據上傳至主鏈進行存證。具體是通過以太坊交易的形式,將側鏈中更新的區塊的哈希值存入主鏈中的DApp合約賬戶中進行鎖定。數據的可信存儲由以太坊底層網絡及其共識協議保證。側鏈用戶可以通過查詢主鏈鎖定數據進行相關驗證工作。
6)以上操作包括資源請求者可以對指定資源提供者發出資源訪問請求,以及資源提供者可以根據鏈上信息驗證來自各方的資源訪問請求的合法性,皆可通過前端頁面完成可視化操作。
為了評估本文所提出的方法的正確性和可行性,本文建立以太坊私有鏈網絡來模擬真實應用環境。通過基于Solidity語言的智能合約編寫以及基于NodeJS的前端開發,并使用Loom Network將合約部署到專用的DApp鏈,實現對主鏈計算工作的卸載。
在完成Loom安裝后,首先使用Loom init和Loom run命令初始化DApp側鏈。然后使用Truffle unbox webpack命令從Truffle官網獲取空項目。合約的編寫使用Solidity語言,合約源碼存放于以.sol為擴展名的文件中,文件放置于contract文件夾中。合約編寫完成后使用truffle compile命令編譯代碼,編譯生成以.json為擴展名的字節碼文件存放于新生成的build文件夾中。為了使Truffle連接到側鏈,首先需要通過npm install loom-truffle-provider-save命令安裝一個Loom Truffle Provider,然后修改truffle.js進行相應的配置。成功配置后,使用truffle migrate-network loom_dapp_chain命令將合約部署至側鏈,這一過程將消耗燃氣值(以太幣)。
資源信息的發布如圖7所示。用戶通過輸入資源總量信息(簡單用數字表示)以及資源可用的開始時間和結束時間,點擊確定按鈕生成資源發布消息,消息的其他數據如時間戳和簽名等由系統自動生成。消息將觸發智能合約,執行的結果是將消息包含的資源信息存儲到智能合約中,并且系統會自動計算出一個資源ID以唯一地標識資源,ID具體由資源提供者身份標識和消息發布時間戳計算哈希得到,具體后臺數據如圖8所示。

圖7 資源信息的發布Fig.7 Announce of resource information

圖8 資源信息記錄Fig.8 Records of resource information
對于發布資源請求信息,過程與發布資源信息類似,如圖9所示,用戶通過前端頁面輸入所要請求的資源的ID以及所需資源量,點擊確定按鈕生成資源請求消息。系統將通過資源ID檢索到對應資源信息(如果存在),并且判斷其剩余資源量是否能滿足該請求以及請求發出時間是否在資源的可用時間范圍內。合法的資源請求將被記錄到智能合約中,即實現數據的“上鏈”,具體后臺數據如圖10所示。在本文方法的設計和實驗中,假設用戶可以以某種方式獲取到已發布的包括資源ID在內的資源信息,則應著重關注于針對已獲取到的資源的請求及請求信息的存儲。

圖9 資源請求信息的發布Fig.9 Announce of resource request information

圖10 資源請求信息記錄Fig.10 Records of resource requests information
當資源請求通過驗證成功記錄到區塊鏈上時,資源請求者可以憑借相應的資源請求記錄的ID信息向指定的資源提供者發出資源訪問請求。根據到達的訪問請求以及區塊鏈上的資源請求信息,資源提供者可以對訪問請求的合法性進行驗證,即通過請求者身份標識信息以及資源請求ID信息,查詢并驗證是否存在這樣一個資源請求,其中的請求者身份與當前訪問請求者的身份相符。若驗證通過,資源提供者將向其開放部分資源。若請求者身份信息有誤或者根本沒有這樣一條資源請求信息的記錄,則驗證不通過,資源提供者將拒絕該請求。
上述實驗說明了本文所提出的資源分配方法可以以去中心化方式順利進行資源分配,確保有關資源分配的關鍵信息的可信存儲,以此有效防止對資源的錯用和濫用,實現可信的計算資源分配。本文實驗基于本地測試網絡進行,在正式應用時需要根據真實網絡環境進行相應的調整。
本文針對傳統中心化方案的單點故障及信任問題,提出一種基于區塊鏈的去中心化資源分配方法。以去中心化手段對資源分配過程中所涉及的關鍵信息進行驗證及存儲,達到以可信方式去中心化控制分配過程的目的。同時,使用以太坊及其所支持的智能合約技術對本文方法進行實現,并運用側鏈技術對以太坊擴容。下一步將針對現有主流共識機制進行研究,改進工作量證明共識機制,以更加完善本文去中心化的資源分配方法。