劉 煒, 郭靈貝, 夏玉潔, 佘 維, 田 釗
(1.鄭州大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院 河南 鄭州 450002; 2.鄭州市區(qū)塊鏈與數(shù)據(jù)智能重點(diǎn)實(shí)驗室 河南 鄭州 450002; 3.鄭州大學(xué) 互聯(lián)網(wǎng)醫(yī)療與健康服務(wù)河南省協(xié)同創(chuàng)新中心 河南 鄭州 450007)
區(qū)塊鏈具有去中心化、時序數(shù)據(jù)、集體維護(hù)、不可篡改、可編程和安全可信等特點(diǎn)[1-2],在醫(yī)療[3]、人工智能[4]、大數(shù)據(jù)[5]、貨幣加密[6]等領(lǐng)域有著廣闊的應(yīng)用前景。而在實(shí)際應(yīng)用中,數(shù)據(jù)不僅需要從區(qū)塊鏈上獲取,還需要從鏈下的外部網(wǎng)絡(luò)獲取。來源于區(qū)塊鏈外部的數(shù)據(jù)會實(shí)時更新,但由于網(wǎng)絡(luò)延遲、節(jié)點(diǎn)處理速度等影響,每個節(jié)點(diǎn)獲取的并不是同一時刻的數(shù)據(jù),無法確保多個節(jié)點(diǎn)最終執(zhí)行結(jié)果的一致性[7]。為了保證區(qū)塊鏈系統(tǒng)中節(jié)點(diǎn)數(shù)據(jù)的一致性,其舍棄了外部動態(tài)數(shù)據(jù)獲取的需求,變成一個封閉的、確定性的沙箱環(huán)境。在這個環(huán)境中,鏈上的數(shù)據(jù)都是被動得到的(通過交易的形式輸入),智能合約本身無法主動獲取鏈外互聯(lián)網(wǎng)數(shù)據(jù)[8]。因此,使用預(yù)言機(jī)來連接區(qū)塊鏈與現(xiàn)實(shí)世界[9]。預(yù)言機(jī)的主要工作就是收集數(shù)據(jù)并向智能合約提供輸入,通過簽名引入關(guān)于外部世界狀態(tài)的信息,從而允許確定的智能合約對不確定的外部世界作出反應(yīng)。預(yù)言機(jī)具有不可篡改、服務(wù)穩(wěn)定、可審計等特點(diǎn),并具有經(jīng)濟(jì)激勵機(jī)制以保證運(yùn)行的動力[10]。
目前,國內(nèi)外學(xué)者對預(yù)言機(jī)如何解決區(qū)塊鏈內(nèi)外數(shù)據(jù)互通的問題展開了深入研究。文獻(xiàn)[11]提出的Chainlink是第一個去中心化的預(yù)言機(jī)解決方案,主要提供用于幫助智能合約訪問關(guān)鍵鏈外資源、網(wǎng)站API和傳統(tǒng)銀行賬戶支付的預(yù)言機(jī)服務(wù),但是這種預(yù)言機(jī)方案數(shù)據(jù)聚合成本高,可拓展性差。文獻(xiàn)[12]提出一種基于投票來決定查詢真假的去中心化預(yù)言機(jī)方案,用戶通過放置一定數(shù)量的金錢賭注來回答查詢,根據(jù)預(yù)言機(jī)的計算報告結(jié)果,評估用戶的行為進(jìn)行獎勵和懲罰,但是此方案復(fù)雜度高,且導(dǎo)致激勵機(jī)制分配不均。文獻(xiàn)[13]提出一種基于區(qū)塊鏈和可信預(yù)言機(jī)的物聯(lián)網(wǎng)數(shù)據(jù)分散訪問控制系統(tǒng),使用預(yù)言機(jī)作為遠(yuǎn)程用戶和物聯(lián)網(wǎng)數(shù)據(jù)主機(jī)的網(wǎng)關(guān),通過智能合約計算并記錄所有預(yù)言機(jī)的平均信譽(yù)分?jǐn)?shù),但是此方案通過信譽(yù)評分來選擇預(yù)言機(jī),容易產(chǎn)生高分預(yù)言機(jī)壟斷行為,并且數(shù)據(jù)的存儲成本較高。文獻(xiàn)[14]提出一種使用Intel推出的SGX指令集擴(kuò)展的分布式預(yù)言機(jī)方案,利用SGX和TLS來保證通信數(shù)據(jù)的完整性,該方案雖然使用了多個預(yù)言機(jī)來支持?jǐn)?shù)據(jù)的可靠性,但過于依賴對硬件的安全部署。文獻(xiàn)[15]提出基于應(yīng)用程序特定知識引擎的預(yù)言機(jī)實(shí)現(xiàn)方案,利用該引擎從多個權(quán)威網(wǎng)站智能地收集、清理和分析數(shù)據(jù),使得預(yù)言機(jī)獲取的信息來自多個數(shù)據(jù)源,但是不能為預(yù)言機(jī)返回的數(shù)據(jù)提供真實(shí)性證明,且不能確保信息的準(zhǔn)確性和隱私性。文獻(xiàn)[16]提出基于聚合簽名的區(qū)塊鏈預(yù)言機(jī)方案,采用多個預(yù)言機(jī)獲取數(shù)據(jù)來避免單點(diǎn)故障,并使用BLS聚合簽名降低存儲成本,但是預(yù)言機(jī)與智能合約之間的交互過程復(fù)雜且煩瑣,消耗大量的gas值。文獻(xiàn)[17]提出一個基于投票的區(qū)塊鏈互操作性預(yù)言機(jī)方案,使用基于BLS閾值簽名的鏈外聚合機(jī)制,將一個預(yù)言機(jī)節(jié)點(diǎn)劃分為一個聚合器和多個驗證器,并生成一個分布式私鑰來共同決定請求結(jié)果,此方案雖然降低了一定的gas成本消耗,但并沒有同時考慮時間效率的提升。
為了在節(jié)省成本的同時實(shí)現(xiàn)鏈上鏈下數(shù)據(jù)的快速準(zhǔn)確互通,本文提出一種基于門限聚合簽名的區(qū)塊鏈預(yù)言機(jī)數(shù)據(jù)傳輸模型,依據(jù)Schnorr門限聚合簽名耗時少、效率高的特點(diǎn),使用多個預(yù)言機(jī)從多種外部互聯(lián)網(wǎng)數(shù)據(jù)源收集信息,設(shè)置積分制選舉出可信預(yù)言機(jī)來聚合簽名和傳輸正確數(shù)據(jù)。結(jié)果表明,所提模型減少了數(shù)據(jù)上鏈所需要消耗的gas成本,采用Schnorr門限聚合簽名提高了簽名的時間效率,且保證了上鏈數(shù)據(jù)的正確性和可靠性。
Schnorr機(jī)制[18]是一種基于離散對數(shù)難題的知識證明機(jī)制。Schnorr簽名算法是線性的,可以進(jìn)行簽名累加,生成一個最終簽名,且只需要驗證一次。具體包括以下步驟。
1) 選擇素數(shù)p和q,使得q是p-1的素因子。
2) 選擇整數(shù)a,使aq=1(modp),a、p、q構(gòu)成全局公鑰參數(shù),在用戶組內(nèi)的每個用戶都可以取此值。
3) 選擇隨機(jī)整數(shù)sk,0 4) 計算v=a-sk(modp),作為用戶的公鑰。 5) 選擇隨機(jī)整數(shù)r,0 6) 將x附在消息后面一起計算Hash值e,e=H(M|x)。 7) 計算s=(r+sk*e)(modq),簽名值為(e,s)對。 利用Schnorr協(xié)議可以聚合的特性把多個預(yù)言機(jī)的簽名進(jìn)行聚合上鏈。 (k,n)門限秘密共享方案是把一個秘密分成若干秘密份額,分給n個參與者掌管,在這些參與者中,k個(k≤n)或k個以上的參與者所構(gòu)成的子集可以合作重構(gòu)這個秘密[19]。 1.2.1子密鑰生成 分享者隨機(jī)選取k-1個隨機(jī)數(shù),記為a1,a2,…,ak-1。構(gòu)造多項式 F(x)=[S+a1x1+a2x2+…+ak-1xk-1](modp), (1) 其中:S為密鑰;p為素數(shù)。分享者隨機(jī)選取n個互不相等的非零元素x,分別為x1,x2,…,xn(公開),計算出F(x1),F(x2),…,F(xn),將(xi,F(xi))分別分配給這n個參與者保管,xi是公開的,F(xi)作為子密鑰不公開。 1.2.2恢復(fù)密鑰 構(gòu)造多項式 (2) 其中:F(xi)為第i個人的子密鑰;xi為分享者隨機(jī)選取的n個不相等的x。取x=0,代入k組(xi,F(xi)),可以求解出F(0),也就是主密鑰S。式(2)的多項式為式(1)的變形。將門限秘密共享加入Schnorr簽名中,利用門限秘密共享原理從收到的每個預(yù)言機(jī)簽名中的子密鑰恢復(fù)出群體的私鑰。 預(yù)言機(jī)作為區(qū)塊鏈的一個獨(dú)立模塊或第三方服務(wù),與執(zhí)行引擎進(jìn)行交互,支持從外部源到區(qū)塊鏈系統(tǒng)的數(shù)據(jù)訪問、驗證和傳輸,同時也是基于區(qū)塊鏈架構(gòu)的重要組件[20]。預(yù)言機(jī)代理機(jī)制如圖1所示。 圖1 預(yù)言機(jī)代理機(jī)制Figure 1 Oracle agent mechanism 預(yù)言機(jī)只負(fù)責(zé)數(shù)據(jù)的可信獲取,不直接參與交易的執(zhí)行。用戶通過調(diào)用預(yù)言機(jī)服務(wù)接口,告知區(qū)塊鏈執(zhí)行引擎將要執(zhí)行一筆含預(yù)言機(jī)服務(wù)的交易。執(zhí)行引擎通過內(nèi)部通信組件,將用戶請求外部數(shù)據(jù)源的信息轉(zhuǎn)發(fā)給預(yù)言機(jī)模塊,如一個Web數(shù)據(jù)請求,包含HttpRequestHeader、HttpRequestBody等信息。預(yù)言機(jī)在收到服務(wù)請求后,向外部數(shù)據(jù)源發(fā)起數(shù)據(jù)獲取請求,拿到數(shù)據(jù)后利用交易生成器產(chǎn)生一筆新的內(nèi)部回調(diào)交易,對其進(jìn)行簽名,并將這筆回調(diào)交易發(fā)給區(qū)塊鏈智能合約。 區(qū)塊鏈?zhǔn)且粋€封閉的系統(tǒng)環(huán)境,部署預(yù)言機(jī)可以用來連接鏈上智能合約與鏈下數(shù)據(jù),使用戶能夠輕松獲取鏈下數(shù)據(jù)且能夠進(jìn)行通信和傳輸。其中,用戶是指區(qū)塊鏈上開發(fā)的DAPP中對鏈下實(shí)時數(shù)據(jù)的需求者。為了保證數(shù)據(jù)的正確性和可靠性,提高數(shù)據(jù)上鏈的時間效率,防止惡意預(yù)言機(jī)節(jié)點(diǎn)故意傳輸錯誤信息,提出一種基于門限聚合簽名的區(qū)塊鏈預(yù)言機(jī)數(shù)據(jù)傳輸模型。該模型采用多個預(yù)言機(jī)對鏈下多種互聯(lián)網(wǎng)數(shù)據(jù)源進(jìn)行數(shù)據(jù)采集,以防止只用一個預(yù)言機(jī)發(fā)生的宕機(jī)和作惡事件,每個預(yù)言機(jī)都可以從鏈下外部網(wǎng)絡(luò)中不同的數(shù)據(jù)源獲取數(shù)據(jù)。預(yù)言機(jī)獲取數(shù)據(jù)如圖2所示。 圖2 預(yù)言機(jī)獲取數(shù)據(jù)Figure 2 Oracle to obtain data 2.1.2密鑰生成 設(shè)sk作為群體的私鑰,群組O={Oracle1,Oracle2,…,Oraclen},群體大小為n,門限值為t(t f(x)=f0+f1x+f2x2+…+ft-1xt-1(modq), (3) 其中:f1,f2,…,ft-1表示隨機(jī)數(shù);q表示大素數(shù);f0=f(0)=sk作為群體私鑰被n個群組成員共享。x1,x2,…,xn表示n個互不相同的非零元素,分發(fā)者將(x1,f(x1)),(x2,f(x2)),…,(xn,f(xn))作為子秘密分發(fā)給群組中n個節(jié)點(diǎn)Oracle1,Oracle2,…,Oraclen,其中x1,x2,…,xn公開,f(xi)即為每個節(jié)點(diǎn)的私鑰ski。 2.1.3群體私鑰的恢復(fù) (t,n)門限群系統(tǒng)中想要恢復(fù)出群體私鑰sk,只需要任何t個簽名者O1,O2,…,On通過Lagrange內(nèi)插法重構(gòu)多項式, (4) 其中:f(xi)表示第i個預(yù)言機(jī)的私鑰ski;x1,x2,…,xn表示n個互不相同的非零元素;t表示門限值。由式(4)可得 2.1.4簽名過程 具體簽名過程如下。 1)Oraclei選隨機(jī)數(shù)ki,計算Wi=aki,公鑰Qi=a-ski(modp),并把Wi、Qi發(fā)送給簽名合成者。 3) 各簽名者有隨機(jī)數(shù)ki,并交換公鑰和隨機(jī)數(shù),計算出x=aki(modp),該過程和待簽名消息m無關(guān),將x附在數(shù)據(jù)信息后面一起計算Hash值e,e=H(m|x)。對數(shù)據(jù)信息m的簽名為 si=ki+skiβiH(m|x)(modq), (5) 其中:si表示簽名;ki表示隨機(jī)數(shù);ski表示簽名者的私鑰。將(m,si,e,IDi)發(fā)送給簽名合成者。 5) 鏈上智能合約收到簽名合成者發(fā)送的數(shù)據(jù)和簽名后,利用群體公鑰進(jìn)行簽名驗證, asQe=W, (6) 其中:a表示系統(tǒng)公開參數(shù);s,e表示群體簽名對;Q表示群體公鑰;W表示系統(tǒng)參數(shù)。等式成立則驗證通過,將正確數(shù)據(jù)和簽名傳送給用戶智能合約,然后對發(fā)送正確和錯誤數(shù)據(jù)的預(yù)言機(jī)進(jìn)行積分值的更新。對傳送正確數(shù)據(jù)信息的預(yù)言機(jī)積分值加1,傳送錯誤數(shù)據(jù)信息的預(yù)言機(jī)積分值減1,并對發(fā)送錯誤數(shù)據(jù)信息的預(yù)言機(jī)設(shè)置5 ms時間延遲包。 基于門限聚合簽名的預(yù)言機(jī)數(shù)據(jù)傳輸模型架構(gòu)如圖3所示。假設(shè)系統(tǒng)中惡意節(jié)點(diǎn)數(shù)f不超過群體總數(shù)的1/3,設(shè)門限值t=f+1。首先,用戶通過網(wǎng)絡(luò)請求用戶智能合約,調(diào)用鏈下的預(yù)言機(jī)獲取所需的外部數(shù)據(jù);其次,將積分值最高者選為簽名聚合預(yù)言機(jī),多個預(yù)言機(jī)通過鏈下API獲取外部數(shù)據(jù)源;最后,每個預(yù)言機(jī)收集所獲得的數(shù)據(jù)信息,并各自進(jìn)行簽名,發(fā)送收集到的數(shù)據(jù)和簽名給簽名聚合預(yù)言機(jī)。 簽名聚合預(yù)言機(jī)接收數(shù)據(jù)時首先對簽名進(jìn)行身份驗證,然后在收到t(t 模型的具體流程如下。 1) 用戶請求鏈下數(shù)據(jù)。鏈上用戶觸發(fā)用戶智能合約,請求獲取所需的鏈下實(shí)時數(shù)據(jù)。 2) 調(diào)用預(yù)言機(jī)獲取鏈下數(shù)據(jù)。用戶智能合約調(diào)用預(yù)言機(jī)接口發(fā)起查詢請求,收集用戶需要的鏈下數(shù)據(jù)。 3) 預(yù)言機(jī)獲取鏈下數(shù)據(jù)。每個預(yù)言機(jī)接收到用戶智能合約消息后,向多個外部數(shù)據(jù)源獲取數(shù)據(jù),并用私鑰ski對數(shù)據(jù)信息m進(jìn)行簽名,發(fā)給簽名聚合預(yù)言機(jī)。 圖3 基于門限聚合簽名的預(yù)言機(jī)數(shù)據(jù)傳輸模型架構(gòu)Figure 3 Oracle data transmission model architecture based on threshold aggregation signature 4) 預(yù)言機(jī)發(fā)送數(shù)據(jù)和簽名。每個預(yù)言機(jī)都設(shè)置積分?jǐn)?shù)值位,用來記錄節(jié)點(diǎn)的積分值(初始值為0,每發(fā)送一次正確數(shù)據(jù)積分值加1),選出積分值最高的節(jié)點(diǎn),讓它成為簽名聚合預(yù)言機(jī)。預(yù)言機(jī)將獲取到的鏈下數(shù)據(jù)和簽名(m,si,e,IDi)發(fā)送給簽名聚合預(yù)言機(jī)。 6) 預(yù)言機(jī)智能合約調(diào)用用戶智能合約。預(yù)言機(jī)智能合約對發(fā)送來的群體簽名和數(shù)據(jù)進(jìn)行驗證,若驗證正確,則發(fā)送正確數(shù)據(jù)和群體簽名給用戶智能合約。對發(fā)送正確數(shù)據(jù)的預(yù)言機(jī)積分值加1,對發(fā)送錯誤數(shù)據(jù)的預(yù)言機(jī)積分值減1并設(shè)置5 ms時間延時包,使惡意預(yù)言機(jī)發(fā)送數(shù)據(jù)的時間變長,以盡可能保證先接收到的數(shù)據(jù)是正常預(yù)言機(jī)發(fā)送的正確數(shù)據(jù),從而節(jié)約時間成本。 7) 用戶智能合約將數(shù)據(jù)返回給用戶。預(yù)言機(jī)智能合約觸發(fā)用戶智能合約后,用戶智能合約接收到數(shù)據(jù)和群體簽名,隨后將數(shù)據(jù)返回給用戶,用戶收到所需的鏈下實(shí)時數(shù)據(jù)。 驗證:e=H(m|x′)。 所以x′=x,H(m|x′)=H(m|x),說明當(dāng)e=H(m|x′),代表e=H(m|x),即簽名者的簽名是正確的。 3.1.2群體簽名驗證 在簽名合成者合成門限簽名后,將簽名和數(shù)據(jù)發(fā)送給智能合約,智能合約對門限簽名進(jìn)行驗證,確保數(shù)據(jù)的真實(shí)性和可靠性。 驗證:asQe=W。 所以asQe=asa-sk*e=as-sk*e=aK=W。又因a已知,W已知,公鑰Q已知,故驗證了asQe=W成立,證明群體門限簽名是正確的。 3.2.1實(shí)驗環(huán)境 智能合約在Remix上編譯,環(huán)境選擇Injected Web3鏈接metamask的賬戶,將智能合約在本地Ganache私有鏈上部署。使用Java語言對BLS和Schnorr簽名進(jìn)行模擬仿真,實(shí)驗環(huán)境為Intel I7-9300,內(nèi)存為16 GB,操作系統(tǒng)為window10,采用JDK1.8,實(shí)驗結(jié)果使用Matlab進(jìn)行數(shù)據(jù)處理與分析。 3.2.2與BLS聚合簽名的驗證時間對比分析 為了驗證本文提出的基于Schnorr的門限聚合簽名的可行性,設(shè)計了基于Schnorr的門限聚合簽名算法實(shí)驗,在同等硬件環(huán)境下與文獻(xiàn)[16]中提出的基于BLS聚合簽名的預(yù)言機(jī)方案進(jìn)行對比。在10個預(yù)言機(jī)節(jié)點(diǎn)的情況下,對輸入的32 B字符串?dāng)?shù)據(jù)進(jìn)行簽名,分別對BLS聚合簽名和Schnorr門限聚合簽名的驗證時間進(jìn)行15次測試,對比結(jié)果如表1所示。 表1 Schnorr門限聚合簽名與BLS聚合簽名的驗證時間對比Table 1 Comparison of verification time between Schnorr threshold aggregation signature and BLS aggregation signature 單位:ms 由表1可以計算得出,Schnorr門限聚合簽名的平均驗證時間為23.67 ms,而BLS聚合簽名的平均驗證時間為887.67 ms。因此,在同等實(shí)驗環(huán)境下,本文提出的基于Schnorr的門限聚合簽名效率更高,時間成本更低。這是由于BLS聚合簽名的雙線性映射構(gòu)造復(fù)雜,提升了計算成本,而Schnorr門限聚合簽名利用橢圓曲線上加法同態(tài)加密的思想,在計算性能上占有明顯的優(yōu)勢。 3.2.3加入門限機(jī)制前后的驗證時間的對比與分析 在群體中惡意節(jié)點(diǎn)數(shù)f不超過總數(shù)1/3的情況下,門限值設(shè)為n/3+1,即f+1為門限最小值,可還原出一致性數(shù)據(jù),當(dāng)有f+1個一致的數(shù)據(jù)即認(rèn)為是正確數(shù)據(jù)。同樣輸入32 B字符串?dāng)?shù)據(jù),根據(jù)不同的預(yù)言機(jī)節(jié)點(diǎn)數(shù)量,對Schnorr簽名有無加入門限機(jī)制的驗證時間進(jìn)行對比,結(jié)果如圖4所示。 圖4 加入門限機(jī)制前后的Schnorr簽名驗證時間對比Figure 4 Comparison of Schnorr signature verification time before and after adding threshold mechanism 從圖4可以看出,加入門限機(jī)制后簽名驗證時間相比沒有加入門限機(jī)制時減少約200 ms,且預(yù)言機(jī)節(jié)點(diǎn)數(shù)量越多,驗證時間減少得越多。 綜上所述,本文提出的基于門限聚合簽名的模型同時具有聚合與門限秘密共享能力,在傳輸數(shù)據(jù)和簽名時,可信任的簽名聚合預(yù)言機(jī)將多個簽名聚合為一個簽名,與鏈上智能合約只需要交互一次,而不需要多個預(yù)言機(jī)與鏈上智能合約依次交互,大大降低了將多個簽名和數(shù)據(jù)上鏈后區(qū)塊鏈的存儲空間,且只需消耗一次gas值。相比于未聚合到一個簽名聚合預(yù)言機(jī)的模型,所提模型既降低了區(qū)塊鏈上的存儲空間又節(jié)省大量的gas成本。 本文提出一種基于門限聚合簽名的區(qū)塊鏈預(yù)言機(jī)數(shù)據(jù)傳輸模型,將數(shù)據(jù)和簽名聚合到可信任的簽名聚合預(yù)言機(jī)上進(jìn)行上鏈,與鏈上智能合約進(jìn)行單次交互,減少了鏈上數(shù)據(jù)的存儲空間;在Schnorr聚合簽名中設(shè)置門限值,提高簽名驗證的時間效率;利用多個預(yù)言機(jī)來收集外部數(shù)據(jù)信息,通過積分制選舉出可信任的預(yù)言機(jī)進(jìn)行簽名聚合,防止惡意預(yù)言機(jī)發(fā)送錯誤信息。實(shí)驗結(jié)果表明,使用Schnorr門限聚合簽名比BLS聚合簽名和未加入門限機(jī)制的Schnorr聚合簽名驗證消耗的時間少,效率更高;相比未聚合的多個預(yù)言機(jī)數(shù)據(jù)傳輸方案,降低了區(qū)塊鏈上的存儲成本,減少了鏈上智能合約與多個鏈下預(yù)言機(jī)的交互次數(shù),消耗更少的gas值。但是,本模型中單一數(shù)據(jù)節(jié)點(diǎn)的可信任度還有待加強(qiáng)。在接下來的工作中,將研究如何增強(qiáng)預(yù)言機(jī)間的信任度和提高聚合簽名者對作惡預(yù)言機(jī)的辨識度。1.2 門限秘密共享
1.3 預(yù)言機(jī)
2 區(qū)塊鏈預(yù)言機(jī)數(shù)據(jù)傳輸模型
2.1 Schnorr門限聚合簽名
2.2 基于門限聚合簽名的預(yù)言機(jī)數(shù)據(jù)傳輸模型
3 實(shí)驗結(jié)果與分析
3.1 理論分析
3.2 實(shí)驗分析
4 結(jié)語