張展鵬 李可欣 闞海斌
1(復旦大學計算機科學技術學院 上海 200433)
2(上海市區塊鏈工程技術研究中心(復旦大學)上海 200433)
3(上海市智能信息處理重點實驗室(復旦大學)上海 200433)
(20210240045@fudan.edu.cn)
隨著區塊鏈相關研究與應用在最近十余年的快速發展,區塊鏈已不限于一種電子現金系統[1],成為了去中心化應用(decentralized application,DApp)的基礎設施[2-3]與可編程社會的基礎技術[4].區塊鏈憑借數據可信、可溯源的優勢,在多種場景下承擔了越來越核心的角色.
在近5 年,隨著依賴智能合約[5]的DApp 快速發展,以以太坊[3]為代表的區塊鏈2.0 形成了豐富的生態.在滿足定制化需求的場景下,區塊鏈成為了越來越多異質化服務的提供者[6].定制化的區塊鏈服務通常不關心來源于其他區塊鏈或鏈下數據庫的數據,且將外界數據直接寫入區塊鏈的原生途徑是不存在的[3],因此區塊鏈可被視為“數據孤島”.
解決區塊鏈“數據孤島”問題的關鍵是在源鏈與目的數據之間構建可信的信息中繼機制[7],區塊鏈預言機是將區塊鏈外部信息寫入區塊鏈的機制[8].當這些信息來源于其他區塊鏈時,這樣的數據獲取機制即為跨鏈[9],跨鏈問題是區塊鏈預言機相關研究熱點之一[10-12].除此之外,解決資產報價等即時數據可用性問題也是區塊鏈預言機相關研究熱點之一[13],此類區塊鏈預言機通常由鏈下分布式節點將價格數值等離散化信息提交到智能合約,由智能合約計算并廣播最終結果數值.
為避免單點故障,區塊鏈預言機在應用中通常是分布式的.如何可信地聚合多點提交的數據,是當前區塊鏈預言機研究面臨的顯著挑戰之一[8,10].在此問題背景下,分布式區塊鏈預言機描述了一種安全多方計算場景,需要保證數據的機密性、完整性與可用性,且正確的數據獲取結果不能被少數參與方篡改.此外,區塊鏈預言機鏈上、鏈下兩部分存在業務耦合,且當前在以太坊等公有鏈上執行計算與存儲操作的成本較高[14],因此通過優化設計與實現節省鏈上部分運行成本也是需要予以討論的問題,否則這將限制區塊鏈預言機的應用.
區塊鏈預言機是區塊鏈2.0 中炙手可熱的技術,相關研究主要關注區塊鏈預言機在多種應用場景下提供數據可用性服務.本文認為,從分布式相關理論出發,對區塊鏈預言機所做的討論相對缺乏.隨著所承載業務越來越復雜,區塊鏈預言機在研究與應用中將遵循越來越規范的范式,例如在資源可訪問的要求下實現透明性、開放性、可拓展性等分布式系統的目標[15].
目前,區塊鏈預言機在多數應用案例中[16-18]是開放的,即支持節點加入與退出.在海外相關研究中,節點通常依賴抵押虛擬貨幣為身份擔保[10,19],且節點將因誠實行為被退還一些虛擬貨幣作為激勵,本文將此類方案總結為基于虛擬貨幣抵押與激勵的節點身份方案.基于虛擬貨幣抵押與激勵的節點身份方案在國內很可能受到合法性與合規性的挑戰,因此為開放區塊鏈預言機項目設計與實現不將虛擬貨幣作為經濟門檻的節點身份方案將有助于國內相關項目的發展.
本文的主要工作包括4 個方面:
1)在現有區塊鏈預言機研究的基礎上,基于目的數據確定性與數據聚合方法之間的關系,作為對區塊鏈預言機分類的方法,相比同類研究,此分類方法更貼近區塊鏈預言機運行多點電子投票的業務實質;
2)基于雙線性群與分布式密鑰生成經典算法,本文實現了去中心化、適合可拓展區塊鏈預言機的密碼學方案,節省了鏈上運行成本;
3)探索了將非同質化通證[20]應用為區塊鏈預言機節點身份標識的方案并驗證了可行性,基于公開標準簡潔地實現了節點生命周期管理;
4)基于分布式哈希表(distributed Hash table,DHT),本文為大型分布式區塊鏈預言機設計了命名系統,連通了鏈上與鏈下部分的節點身份標識,從分布式系統的角度討論了區塊鏈預言機承載的數據可用性業務.
本文的研究對象是區塊鏈預言機,密碼學方案基于門限簽名與秘密分享,此節將介紹相關研究現狀.
區塊鏈預言機是將外界信息可信地寫入區塊鏈的機制.當外界信息來源于區塊鏈時,此問題即為跨鏈問題,跨鏈的目標是實現區塊鏈之間的互操作性[15].互操作性是不同分布式系統依賴各自公開聲明的服務標準實現共存與協同工作,因此,區塊鏈之間實現互操作的機制需要彼此支持共識協議并能讀寫數據.目前,跨鏈問題相關研究主要關注側鏈/中繼[21-24].除了商業項目[16-18]中和數字資產相關的場景,區塊鏈預言機相關研究也關注了區塊鏈預言機在跨鏈場景下解決數據驗證問題[10-12];在存儲、計算與網絡受限的邊緣計算場景下[25]解決物聯網設備和區塊鏈之間的信息中繼問題[26-27];在海量數據存儲場景下解決數據獲取與治理問題[28].針對區塊鏈預言機的可靠性分析,Lo 等人[29]分析了目前區塊鏈預言機的成功案例,提出區塊鏈預言機的鏈下部分更容易成為系統可靠性的故障點.Al-Breiki 等人[7]從鏈上智能合約開發、鏈上與鏈下部分之間數據傳輸的安全性與隱私性、鏈下數據治理與系統設計等角度討論了區塊鏈預言機項目在信任問題上遇到的挑戰.
目前,相比區塊鏈可伸縮性的相關研究[30-32],針對分布式區塊鏈預言機可伸縮性的研究較少.Hess等人[33]在區塊鏈預言機應用了狀態通道將共識機制做平行拓展.Sheng 等人[34]基于主、側鏈對數據可用性服務分片,減輕了鏈上通信開銷.相關研究主要關注區塊鏈預言機鏈上部分的可拓展性,以及減輕鏈上部分計算、存儲與通信開銷,未對優化鏈下部分設計與實現給予足夠關注.
門限簽名允許不小于門限值個成員構造聚合簽名代表全體成員,這些成員可以構造全局公鑰驗證聚合簽名.Desmedt 等人[35]在1989 年提出了門限簽名概念,并在1991 年提出了基于RSA 的門限簽名方案[36].1998 年,Wang 等人[37]提出了基于離散對數的門限簽名方案.2004 年,Boneh 等人[38]提出了基于雙線性群的門限簽名方案,即BLS 簽名,BLS 簽名系統可拓展、帶寬開銷低、證書鏈更短,因此至今仍被廣泛應用.2022 年,Jalil 等人[39]基于BLS 簽名實現了適用于公有云存儲的安全審計系統,楊坤偉等人[40]應用了BLS 簽名長度短的特性,提出了適用于低帶寬群智網絡環境的有序聚合簽名方案.
分布式密鑰生成(distributed key generation,DKG)是指分布式系統各方協作,生成各自公私鑰的過程;DKG 一般以秘密分享(secret sharing,SS)作為密碼學原語.
1979 年,Shamir[41]提出了基于多項式的秘密分享方案Shamir-SS.1985 年,Chor 等人[42]引入了秘密分片的可驗證性,這樣的秘密分享被稱為可驗證秘密分享(verifiable secret sharing,VSS).1987 年,Feldman[43]基于Shamir-SS,在私有信道上設計了一種可驗證秘密分享方案Feldman-VSS,此方案允許秘密分片持有者對秘密分片的正確性做非交互零知識證明.1991 年,Pedersen[44]基于Shamir-SS 提出了一種可驗證秘密分享方案Pedersen-VSS,相比Feldman-VSS,Pedersen-VSS 方案保證了被分享的秘密是不可泄露的.此外,秘密分享方案也可基于中國剩余定理構造.1983 年,Asmuth 等人[45]提出了一種具有代表性的、基于中國剩余定理的秘密分享方案.
在秘密分享研究基礎上,1991 年,Pedersen[46]提出了一種分布式密鑰生成方案Pedersen-DKG,此方案令每個參與方并行運行Feldman-VSS,實現了去中心化,不依賴于可信第三方.目前,基于Feldman-VSS與Pedersen-VSS 的DKG 方案被廣泛應用,相關研究關注在實際應用中如何減輕通信開銷,在分布式計算實例之間實現高效傳輸.2004 年,Canny 等人[47]指出,在基于Shamir-SS 的DKG 方案包含大規模參與方時,各方的通信開銷將非常大,因此提出了基于稀疏矩陣的DKG 方案,使各方無需跟全體其他參與方通信.2020 年,Kokoris Kogias 等人[48]提出了計算安全的異步DKG 方案.2022 年,Das 等人[49]在跨地域分布式云計算實例上應用了一種低通信開銷的異步DKG 方案.
本文歸納了區塊鏈預言機目的數據確定性和數據聚合方法之間的關系,應用了BLS 簽名與Pedersen-DKG.
區塊鏈預言機智能合約根據區塊鏈外界實際事件自動和被獲取的數據執行相關邏輯.除了在跨鏈場景下獲取來自其他區塊鏈的數據,區塊鏈預言機還能獲取的數據包括:來自物理過程的隨機數或熵、資本市場數據、天氣信息等[50].
相關研究[8, 10]提出,區塊鏈預言機獲取數據的過程通常是多點提交,可被看成電子投票[51]過程,這也是區塊鏈預言機的業務實質.基于數據獲取節點的投票內容是否被要求全體或多數一致,區塊鏈預言機可以被分成強投票協議預言機與弱投票協議預言機.
定義1.強投票協議預言機.在這類投票協議下,各節點提交的結果被要求多數或全體一致,否則無法聚合最終結果.例如,區塊鏈預言機在跨鏈場景驗證交易合法性,合法的結果有且僅有“是”或“非”,當其中一種結果足夠多時,跨鏈預言機聚合并返回此結果.這類區塊鏈預言機適用于獲取確定性數據,也方便應用聚合簽名方案對各數據獲取結果的數字簽名做聚合.
定義2.弱投票協議預言機.在這類投票協議下,各節點提交的結果是彼此獨立的,能否聚合最終結果跟各節點提交的結果是否達成了多數或全體一致無關.例如,數字資產報價預言機從若干節點獲取價格數值,這些數值并非被要求達成全體或多數一致,容忍存在數值偏差,且聚合過程是對各節點提交的結果求算術平均、加權平均或中位數等返回最終結果數值.這類區塊鏈預言機適用于獲取非確定性的、動態變化的實時數據,一般需要在智能合約驗證簽名并計算最終結果.
圖1 是著名區塊鏈預言機項目Chainlink 實現的跨鏈互操作性協議[16]示意圖,這是強投票協議預言機,不同預言機節點基于數字簽名對跨鏈傳輸消息的正確性與完整性做驗證,調用合約函數將被驗證的消息從源鏈傳輸到目的鏈.在強投票協議中,節點驗證的合法消息內容保持一致,聚合過程對消息字符串一致性做驗證.

Fig.1 Illustration of cross-chain interoperability oracle[16]圖1 跨鏈互操作性預言機示意圖[16]
圖2[13]是著名區塊鏈預言機項目MakerDAO[18]的體系結構,這是弱投票協議預言機,各預言機節點將交易對報價數據提交到智能合約做聚合,智能合約將聚合結果廣播到下游;交易對報價數據可以是不一致的,聚合計算僅關注數值.

Fig.2 Software architecture of MakerDAO[13,18]圖2 MakerDAO 軟件架構[13,18]
除目的數據確定性這一特征外,弱投票協議預言機的規模通常更大,所支持數據源更多.例如交易對報價預言機通常作為公共服務,計算并廣播多種交易對價格,預言機節點運行面向各種交易對、基于各種指標(例如近期交易、流動性)的算法,計算價格并提交到智能合約.相比而言,強投票協議預言機通常面向單一數據源,例如在跨鏈場景下,僅討論“源鏈X,目的鏈Y”的模式[10-12],原因之一是鏈下節點之間存在相互通信,過大的節點規模、過于復雜的業務將導致性能下降.
同類研究將區塊鏈預言機根據節點數目分成集中式或分布式;根據設計模式分成發布—訂閱/請求—響應等分類方法也可應用于其他數據可用性服務、分布式系統等.本文的分類方法特異性更好,更接近業務實質.
BLS 簽名是基于雙線性群的系統.簽名者選擇雙線性群 (p,G1,G2,GT,e),其中 G2的階是p,生成元是g,以及抗碰撞的散列函數H:(0,1)*→G1.簽名者隨機選擇私鑰sk∈Zp,并計算公鑰pk=gsk.
BLS 簽名構造方法基于橢圓曲線群的加運算,簽名者將消息m映射成 G1的一個元素H(m),構造簽名σ=H(m)sk.
BLS 簽名驗證方法基于雙線性群的雙線性,驗證者驗證式(1)是否成立:
Pedersen-DKG 是一種去中心化的DKG 方案,基于Shamir-SS 與Feldman-VSS.考慮參與方集合P={P1,P2,…,Pn}試圖構造滿足 (t,n)門限性質的分布式密鑰,一種基本的Pedersen-DKG 方法包含初始化、廣播、驗證3 個階段.
在初始化階段,P商定一個p階群 G,以及一個q階元素g∈G,其中q|(p-1) .每一參與方Pi輸入一個秘密數ki∈Zq,并隨機選擇t-1個系數ai,j∈Zq,構造多項式:
在廣播階段,Pi為其他每一參與方Pj構造秘密分片si,j=fi(j)modq并通過私有信道發送到Pj;為多項式系數構造承諾ci,j=gai,jmodp,其中ci,0=gkimodp,并將全體承諾在全體參與方廣播.
在驗證階段,Pj可根據公開的承諾驗證秘密分片的合法性,即驗證式(3)是否成立:
此后,Pi可構造自己的分布式私鑰:
全局公鑰可被任意參與方構造:
根據文獻[46],Pedersen-DKG 滿足:1)計算安全.基于離散對數問題難解假設.2)抗共謀.根據拉格朗日插值法,任意小于t個參與方都無法重建秘密數或私鑰.3)去中心化.參與方是平等的,每一參與方的分布式私鑰由其他參與方所輸入的秘密數共同決定.
Wang 等人[52]在2018 年設想用染色代幣在比特幣系統上表示真實世界資產.這些真實世界資產通常是大量存在的同類事物,不可再分、不可合并,彼此之間存在差別、不可互換.非同質化通證(nonfungible token,NFT)是在以太坊上對染色代幣的成功實現,至少支持在以太坊上表示2128個同類資產.“非同質”的含義是:每個NFT 都嚴格聲明了所有者并被賦予了全局唯一ID,因此任意2 個同類NFT 都是不等同的.
NFT 方案在第721 號以太坊改進提案[20]上通過.跟NFT 相對的概念是同質化通證.以太幣是最典型的同質化通證,考慮到合法性與合規性,本文將僅應用非同質化通證解決非商業問題,不對相關案例展開討論.
如表1 所示,將同質化通證跟非同質化通證作比較,非同質化通證不僅可表示真實世界資產,而且能作為海量真實世界個體的身份映射,且繼承區塊鏈去中心化、不可篡改的性質.

Table 1 Comparison of Fungible Token and Non-Fungible Token表1 同質化通證與非同質化通證對比
本節將基于BLS 簽名與Pedersen-DKG 為區塊鏈預言機節點設計電子投票方案,并基于智能合約注冊與管理全局公鑰.本節內容將為區塊鏈預言機設計安全、去中心化的密碼學方案,并討論鏈下部分的可拓展性,作為后續對開放性展開討論的基礎.
在密鑰生成階段,考慮參與方集合P={P1,P2,…,Pn},P 選擇雙線性群 (p,G1,G2,GT,e),其中 G1與 G2是橢圓曲線群,P 在 G2上運行Pedersen-DKG.為更好地描述簽名階段,本節還將指出:1)全局私鑰表示方法;2)任意分布式私鑰對應的分布式公鑰可被任意參與方構造.
當i=0時,式(4)可寫成:
全局私鑰sk0的構造方法是隱式的,即不能被任何參與方基于接收與廣播的信息構造.
根據式(5),每一參與方掌握全局公鑰pk0,為橢圓曲線上一點.將式(5)外推,記:
值得注意的是,當i>0 時,ski對應的分布式公鑰并非pki,而是:
在密鑰生成階段完成后,每一參與方都掌握了自己的分布式私鑰ski、全局公鑰pk0以及全體分布式公鑰gski.密鑰生成方案運行了參與方之間的全量通信,因此通信復雜度是O(n2).
在簽名階段,任意t個參與方 Pt={P1,P2,…,Pt}都能對相同消息構造聚合簽名,并被全局公鑰驗證.在此過程中,聚合簽名的參與方可通過分布式選舉產生;不失一般性,設P1構造聚合簽名,其他參與方驗證聚合簽名.
設 ?Pi∈Pt,將消息mi散列到 G1,構造簽名份額:
Pi將H(mi)與 Σi發送到P1.根據式(8),P1掌握了任意參與方的分布式公鑰,因此可根據式(1)驗證 Σi.此過程即區塊鏈預言機電子投票的投票過程.
在收到t個簽名份額后,P1構造一系列點(1,Σ1),(2,Σ2),…,(t,Σt),并構造拉格朗日插值多項式:
當 Pt對相同消息簽名,即m0=m1=m2=…=mt時,等價于sk0對m0的簽名,即聚合簽名.此過程即區塊鏈預言機電子投票的計票過程.
在3.1 節與3.2 節的基礎上,本節構造全局公鑰關于邏輯時鐘的遞推關系實現參與方受控加入DKG,在智能合約注冊與管理全局公鑰.本節所做工作是實現區塊鏈預言機鏈下部分可拓展的密碼學基礎.
設參與方運行了同步化邏輯時鐘[15],即在時刻T,參與方集合為 P(T)={P1,P2,…,Pn(T)},待加入的參與方集合為 ΔP(T)={Pn(T)+1,Pn(T)+2,…,Pn(T)+Δn(T)},其中ΔP(T)的規模和時刻T門限值滿足:
此方案等價于在保持 P(T)輸入的秘密數不變的情況下,在時刻T與T+1分別隨機構造了多項式,即多項式關于邏輯時鐘的遞推關系為:
因此,全局公鑰關于邏輯時鐘的遞推關系為:
智能合約存儲的信息是公開、不可篡改的,因此挑戰過程是公開的.式(18)中pk0,actual在時刻T+1更新,pk0,expected在時刻T即時更新,因此式(18)是否成立可區分待加入參與方是否已實際運行DKG 加入,掌握分布式私鑰與其他參與方的分布式公鑰,區分此狀態是對區塊鏈預言機節點做生命周期管理的根據之一.
本節設計區塊鏈預言機的主要業務流程,包含基于去中心化身份的節點加入與退出流程、基于DHT 的數據獲取與驗證流程.在節點加入與退出流程中,新節點無需抵押虛擬貨幣即可受控加入與退出區塊鏈預言機;在數據獲取與驗證流程中,數據流與節點身份標識相關,智能合約單次驗證滿足門限性質的聚合簽名,保證了數據獲取業務可信.本節內容將在密碼學方案的基礎上,討論節點身份方案的開放性以及數據可用性業務的去中心化程度.
為使新節點受控加入區塊鏈預言機,區塊鏈預言機所有者校驗新節點的鏈下身份,并基于NFT 對新節點的加入操作授信.新節點之所以被要求受控加入,是因為在基于公有鏈的開放項目中,用戶能匿名創建多個鏈上身份,因此敵手能藉此批量創建鏈上身份并試圖控制電子投票過程.此方案替代了海外相關研究中要求新節點抵押保證金以加入公有鏈項目的一般方法[10,13],適合在國內全面禁止虛擬貨幣交易的環境中得到應用.
設待加入的新節點為P0,鏈上身份是addr0,鏈下身份是user,即user 掌握了以太坊地址addr0的私鑰.區塊鏈預言機所有者有權控制節點加入與移除,鏈上身份是addrOfOracleOwner,鏈下身份是ownerOfOracle.
首先,user 在鏈下跟ownerOfOracle 交互,要求加入區塊鏈預言機并公開以太坊地址addr0;ownerOfOracle如果批準,則將addr0對應的以太坊公鑰散列到DHT的標識符空間 Zh,即公開P0所對應標識符h0∈Zh,此標識符是全局唯一的.此步驟的本質是ownerOfOracle聲明映射關系:f:h0→ addr0.值得說明的是,此方案將公鑰散列成地址的做法源于以太坊公鑰與地址的關系.
此后,ownerOfOracle 將鑄造(mint[20])一個NFT,此NFT 的ID 是h0;所有者(owner[20])是addr0,此過程被定義為NFT 生命階段1.此NFT 是公開的,有且僅有以太坊地址addr0能操作此NFT,因此新節點能通過操作此NFT 證明自己的鏈上身份,此NFT 也可被視為新節點的去中心化身份憑證.
在此之后,P0將對區塊鏈預言機節點組 P廣播,聲明自己掌握了addr0的以太坊私鑰.?Pi∈P,Pi將向P0的鏈上身份發起挑戰,P0將通過將ID 為h0的NFT轉移到addrOfOracleOwner 證明自己的身份.此步驟本質上是由新節點聲明并證明映射關系g: addr0→P0.此后,NFT 進入生命階段2,所有者是addrOfOracleOwner.新節點的身份也被映射關系確定:g°f:h0→ addr0→P0.
當 P運行DKG,使新節點加入后,屬于 P 的節點將可以調用合約函數,公開地更新或挑戰 P 的全局公鑰.智能合約也能通過驗證式(18)是否成立確認全局公鑰被正確更新.當 P的全局公鑰被更新并接收后,addrOfOracleOwner 將批準(approve[20])addr0轉移或銷毀NFT,此步驟可被視為:P0在加入 P后,對應的身份憑證被解鎖,可自由退出;也可因不誠實行為受到挑戰,被ownerOfOracle 移除.值得特別說明的是,被批準者(approved[20])也是NFT 的重要字段,在本文方案中,批準和被批準者這2 個字段不僅控制了NFT 的操作權限,而且能夠表示NFT 處于生命周期的哪一階段[4].此后,NFT 進入生命階段3,所有者仍然是addrOfOracleOwner,被批準者是addr0.
最后,考慮節點自由退出或被ownerOfOracle 移除,此過程可基于NFT 銷毀操作實現,銷毀本質是將NFT 轉移給零地址.以太坊的零地址是創世地址,被叫做“黑洞地址”,無人掌握它的私鑰,因此將通證轉移給零地址是銷毀通證的通常做法.在區塊鏈預言機鏈下部分,P可在運行下一輪密鑰生成算法時,將此節點排除在外;在鏈上部分,已退出節點對應的NFT 將被銷毀,注銷身份.NFT 生命階段4 表示NFT被銷毀的狀態,此時所有者與被批準者字段都是零地址.
綜上,在節點加入與退出流程中,NFT 的所有者與被批準者字段表示了所處生命周期的階段,對應了節點加入與退出的狀態.NFT 的字段是公開的,且存儲在以太坊上,繼承了去中心化、公開與不可篡改的特性,良好地解決了數據公開與信任問題.
表2 是NFT 生命周期與節點狀態的對應關系.

Table 2 Node Status Corresponding to NFT Life Cycle表2 NFT 生命周期對應的節點狀態
圖3 是節點加入與退出區塊鏈預言機的時序模型,右手邊的泳道表示NFT 的生命周期,跟節點狀態對應.序號1~12 表示加入流程;序號a~e 是退出的一般流程.

Fig.3 Sequence diagram of node identity system圖3 節點身份系統時序圖
綜上,節點身份方案基于NFT 實現,將節點的以太坊地址跟NFT 的ID 通過區塊鏈的交易構建了映射關系,并實現了節點跟NFT 生命周期的映射,使節點狀態公開、可跟蹤.區塊鏈預言機是開放的,節點加入過程是基于3.3 節提出的節點加入方案,有可拓展的特性;節點退出是自由的,僅需銷毀NFT 即可.
考慮在大規模節點實施DKG,無論是構造聚合簽名還是節點加入與退出時重新運行DKG,越來越大的節點規模都意味著越來越高的通信復雜度.本質上,這跟區塊鏈預言機鏈下部分拓撲有關,直接在全體節點運行DKG 要求任何節點跟其他每一個節點通信才能構造分布式私鑰、聚合簽名等.
為解決這一問題,本節使連通矩陣更稀疏,將大規模區塊鏈預言機鏈下部分分成若干個節點組,任何節點在密鑰生成階段與簽名階段,僅需跟一部分節點通信即可完成.從鏈下部分拓撲看,節點仍然是連通的,數據獲取請求仍可在節點組之間轉發與認領.
圖4 是基于DHT 的區塊鏈預言機模型.區塊鏈預言機被分成鏈上與鏈下2 部分,鏈上部分被部署為智能合約,負責跟用戶交互、調度與管理鏈下分布式區塊鏈預言機節點、驗證數據獲取結果;鏈下部分被部署為一系列執行實際數據獲取業務的分布式節點,分組執行數據獲取業務并對結果投票與聚合.

Fig.4 Blockchain oracle model based on distributed Hash table圖4 基于DHT 的區塊鏈預言機模型
在圖4 表示的區塊鏈預言機鏈下部分,相同形狀的節點屬于同一組,按照P(組ID,節點ID)編號.除4.1節提出的節點加入與退出業務外,區塊鏈預言機還承載了數據獲取業務.數據獲取由用戶和智能合約交互發起并被廣播到鏈下,鏈下部分拓撲是DHT,節點標識符跟NFT 的ID一致,在多節點合作完成請求后,最終由某節點調用智能合約響應數據獲取結果,并由用戶回調函數完成數據獲取業務.
在開始數據獲取業務前,區塊鏈預言機鏈下部分全體節點商定抗碰撞的散列函數Hc: {0,1}*→ Zh、請求轉發的跳數閾值hopmax與分布式投票的完成時限timeout.數據獲取步驟如下:
1)業務發起.用戶調用區塊鏈預言機合約的函數,發起數據獲取請求;智能合約記錄用戶地址addr,并賦予此請求一個自增ID,記為qid,記錄映射:qid→addr.
2)請求廣播.智能合約確認用戶的數據獲取請求可用后觸發合約事件,廣播字符串格式的查詢參數表,包括qid、函數名funcName 以及參數表funcArgs、最近回調函數結束查詢的用戶地址addrOfLatestCallback等.廣播addrOfLatestCallback 是為了增強區塊鏈預言機鏈下部分的認領過程對用戶的透明性,為請求認領步驟引入隨機性.
3)請求認領.區塊鏈預言機鏈下部分全體節點都保持監聽區塊鏈,因此它們都將收到數據獲取請求廣播,它們對上述請求的關鍵信息計算摘要h′=Hc(qid||addrOfLatestCallback).在結構化點對點體系結構中,節點的標識符hi,j是全局確定的,因此hi,j≥h′且hi,j最小的節點將認領請求.當發起數據獲取請求的用戶足夠多、業務足夠高頻時,發起請求的用戶將難以預測當自己的請求被廣播到鏈下時,最近回調函數的用戶是誰,即addrOfLatestCallback 對發起請求的用戶而言是難以預測的,因此將addrOfLatestCallback作為鹽(salt)輸入散列函數,可以盡可能使具體執行數據獲取業務的節點對用戶透明.
4)請求轉發.當且僅當當前認領請求的節點Pi,j無法執行數據獲取業務時,請求將向后轉發,否則當前節點將執行下一步驟.在向后轉發時,Pi,j將在請求體添加字段,記錄自增的轉發跳數hop,并用Pi,j的以太坊私鑰eki,j對hop構造數字簽名σi,j=S ign(eki,j,hop).當hop≥hopmax時,請求失敗.最后一跳節點調用合約函數,告訴區塊鏈預言機鏈上部分反饋qid對應的數據獲取請求已失敗,并提交轉發過程的以太坊公鑰鏈[eKi,j] 與簽名鏈[σi,j].智能合約將根據簽名驗證確認轉發鏈未被惡意篡改.
5)分布式查詢.設數據獲取請求在第hop跳被Pi,j最終認領,Pi,j將在所屬節點組Pi={Pi,1,Pi,2,…,Pi,n}發起關于分布式查詢結果的投票,即 Pi運行3.2 節提出的簽名階段算法,由一個機選舉的節點收集包含查詢結果、簽名份額的選票.
6)鏈下聚合.簽名聚合者Pi,j即時統計投票結果,在timeout內,當且僅當某一查詢結果mi,0獲得了至少t票,且投票者為這一結果構造了可驗證的簽名份額,Pi,j將構造并公開勝選的查詢結果mi,0與對應的聚合簽名 Σi,0;否則請求失敗.Pi的任意節點都能對勝選結果發起挑戰.
7)鏈上驗證.對已獲取投票結果的分布式查詢,智能合約也將根據節點組 Pi的全局公鑰驗證投票結果.當查詢結果mi,0對應的聚合簽名 Σi,0被成功構造、未被成功挑戰且被智能合約驗證時,這一結果將被用戶獲取.
8)業務結束.用戶可以在此之后回調合約函數,根據qid以及對應的addr獲取的數據獲取結果mi,0.
考慮區塊鏈預言機鏈下部分作為分布式系統提供數據可用性服務的過程,步驟3)已說明鏈下部分關于用戶是透明的.此外,鏈下部分節點是平等的,請求認領與聚合步驟引入了隨機性,任意節點都能基于公開信息挑戰數據獲取結果,因此滿足去中心化.
圖5 是數據獲取業務流程,一個數據獲取請求發起、廣播、認領、轉發、查詢、聚合、驗證與結束的例子.

Fig.5 Data availability business of blockchain oracle圖5 區塊鏈預言機數據獲取業務
在4.1 節構建基于NFT 的節點身份方案,以及4.2 節基于DHT 的、和節點標識符相關的稀疏節點拓撲的基礎上,本節內容將提供一個調度方案,確定節點和節點組之間的所屬關系.
調度是分布式系統增強可用性、容災能力,實現負載均衡的重要方法,是自動化管理與運維大型分布式系統的重要步驟.分布式系統調度解決的基本問題是為調度對象最優分配資源,調度對象承載分布式系統具體業務,資源由物理機或虛擬機提供.在本文設計的區塊鏈預言機中,調度是將節點調度到最優的節點組,使分布式區塊鏈預言機盡可能高效地為DApp 提供數據獲取服務.本節設計的節點調度方案將遵循“鏈上兜底,鏈下調度”的設計思想.
鏈上調度將調度算法放在智能合約運行,在合約所有者批準新節點加入后,智能合約具備運行調度算法為新節點選擇節點組的基礎能力.鏈下調度將調度算法放在鏈下服務運行,智能合約通過觸發合約事件、被鏈下服務調用合約函數和鏈下服務交互,發起與結束調度流程,智能合約僅關注調度算法的輸入與輸出.
表3 比較了鏈上兜底與鏈下調度方案.鏈上是區塊鏈完成節點調度的原生解決方案,可繼承區塊鏈公開、可信等特點,依賴于區塊鏈,比鏈下調度更穩定,但受限于Solidity 等開發敏捷度、智能合約部署、運行復雜算法的效率與開銷等,也將因為存儲跟調度相關的、區塊鏈預言機鏈下部分的資源信息帶來額外的存儲開銷.鏈下調度將調度邏輯放在鏈下執行,智能合約僅需在函數觸發事件、廣播參數表以及被調度器調用合約函數,接收函數參數表作為調度結果即可,計算與存儲開銷和調度算法復雜度無關,但如果鏈下服務發生宕機,則無法調度.因此,在綜合考慮鏈上與鏈下調度方案后,本節將兜底邏輯,例如round-robin 等常用、簡單的調度算法部署在智能合約,在一般情況下依賴鏈下服務調度節點,執行更復雜的調度邏輯,增強節點調度方案穩定性.

Table 3 Comparison of On-chain and Off-chain Scheduling表3 鏈上與鏈下調度比較
圖6 是“鏈上兜底,鏈下調度”方案.在收到區塊鏈預言機新節點加入請求后,智能合約將向鏈下調度器廣播調度請求,請求包含節點的標識符以及與具體業務相關的信息;在鏈下調度器運行合適的調度算法,為新節點分配最優節點組后,調度器通過調用合約函數將調度結果發送給智能合約.考慮智能合約實現了兜底邏輯,以及即使是非最優的調度結果也不導致區塊鏈預言機無法提供服務.

Fig.6 Blockchain oracle node scheduling scheme圖6 “鏈上兜底,鏈下調度”方案
本節將討論密碼學方案的安全性,實現密鑰生成與簽名并評估算法效率,將全局公鑰更新、節點去中心化身份生命階段變更以及調度方案實現在智能合約并評估鏈上運行開銷.
實驗環境為:1)物理機MacBook Pro,芯片Apple M1,內存16 GB,操作系統macOS Ventura 13.2.1.2)阿里云云服務器ECS,雙核虛擬CPU,內存4 GB,操作系統Debian GNU/Linux 10(buster),僅用于在AMD64架構為低版本Solidity 開發的智能合約生成應用二進制接口(application binary interface,ABI)文件.3)區塊鏈預言機鏈下部分編程語言Go,版本go1.19.6 darwin/arm64;區塊鏈預言機鏈上部分編程語言Solidity,版本v0.6.12+commit.27d51765;智能合約編譯、部署與測試框架Truffle,版本v5.7.4;以太坊硬分叉Petersburg;區塊鏈構建框架Ganache,版本v7.7.3;Node.js 版本v19.6.0;Web3.js 版本v1.8.2;Vue.js 版本v2.7.14.
本文所使用的BLS 簽名與 Feldman-VSS 基于開源實現[53],所使用雙線性群是BN256[54].本文使用的ERC721 通證標準基于一種開源實現[55]并根據Solidity 版本做了兼容性調試,在智能合約實現BN256 的群運算基于NPM 包elliptic-curve-solidity 實現,版本0.2.4,并為Solidity 版本做了兼容性調試.此外,為避免網絡時延波動的影響,本節的實驗將參與方部署為獨立的Go 協程(goroutine),通信方式為通道(channel)數據類型以及并發安全的共享內存方法.
3.1 節提出的密鑰生成方案安全性來源于Pedersen-DKG,具體為[46]:1)參與方所輸入的秘密數僅被用來構造承諾,根據離散對數問題ci,0=Qki難解假設,每輪密鑰分發滿足計算安全性;2)秘密數在秘密分片分發完成后被銷毀,未被持久化或傳輸,全局私鑰未在任何位置被構建、存儲或傳輸過,根據拉格朗日插值法,任意小于t個惡意參與方都不能共謀構建全局私鑰,因此私鑰滿足隱私性.
考慮3.2 節提出的簽名方案安全性,根據拉格朗日插值法,任意小于t個參與方都不能構造合法的聚合簽名,因此滿足抗共謀性.考慮惡意參與方試圖破壞合法的簽名過程,具體為:1)當敵手拒絕提供簽名體時,聚合者仍可在接收不小于t個合法簽名體時嘗試構造聚合簽名;2)當敵手提供錯誤簽名體時,聚合者可根據敵手的分布式公鑰驗證簽名體的合法性;3)當敵手作為聚合者拒絕提交聚合簽名體時,其他參與方可發起選舉重新選擇聚合者;4)當敵手作為聚合者提交錯誤聚合簽名體時,任意參與方可根據全局公鑰驗證聚合簽名體合法性并發起挑戰.簽名方案滿足去中心化,能防御至多n-t個惡意參與方.
3.3 節提出的參與方加入方案滿足計算安全性與抗共謀性[46].考慮惡意敵手竊取被持久化存儲的秘密分片的情況.根據式(11),在任意時刻,任意參與方持久化存儲的秘密分片數目都小于門限值,因此敵手無法根據竊取的信息構造秘密數.此外,當參與方預計算并持久化的秘密分片都分發完畢時,全體參與方將重新輸入隨機秘密數運行DKG.因此只要無法在某一邏輯時刻控制不小于門限值個參與方,惡意敵手始終無法依賴各節點持久化存儲以及過時的信息構造秘密數或私鑰.
考慮第4 節的節點身份方案,節點P0的身份標識h0、對應的NFT 以及公鑰、以太坊地址等信息都是被存儲在智能合約并公開在區塊鏈的,有且僅有NFT 的所有者或被批準的地址才能發起交易,變更節點身份憑證.此方案的安全性基于區塊鏈交易合法性依賴的簽名驗證,因此是計算安全的.此外,驅動NFT 生命周期變更的交易歷史全被公開在區塊鏈,滿足不可篡改性.
考慮在節點身份方案引入區塊鏈預言機所有者的安全性.區塊鏈預言機所有者作為維護者(maintainer)保障項目正常運行是相關案例[16-18]的通常做法.不限于區塊鏈預言機,開放項目的維護者可由社區選舉產生,選舉通?;跉v史貢獻,通過郵件組等方式進行.為增強去中心化,節點身份方案將節點與所有者的歷史操作公開在交易中,接受監督與挑戰,節點實施公開交易、監督、挑戰等行為的權限是平等的.此外,節點身份方案支持節點自由退出,因此所有者應保持誠實行為,否則項目將受到傷害.
關于區塊鏈預言機所有者選舉后出現變更的情況,根據表2,當NFT 處于生命階段2、3 時,僅需在區塊鏈預言機所有者之間發起NFT 轉移即可更新所有者字段,因此上述所有者變更是可行的.
本節實現了第3 節提出的密碼學方案.關于區塊鏈預言機鏈下部分,本節將測試節點生成分布式私鑰、構造全局公鑰與聚合簽名的時延,驗證密碼學方案的可行性;關于鏈上部分,本節將測試新節點加入的手續費開銷,說明參與方加入方案的可行性以及可拓展性.最后,本節將基于這些討論來討論門限值選擇對系統效率與安全性的影響.
圖7(a)是單個參與方Pi計算秘密分片列表[si,j]與承諾列表[ci,j]的時間開銷;圖7(b)為Pi驗證全體秘密分片[sj,i]與構造全局公鑰pk0的時間開銷.這2個過程都可以在各參與方并行執行,因此測試方案給出了單個參與方的時間開銷,在實際場景中,多個參與方共同完成秘密分片計算、分發和驗證的時間與實際通信時延和調度策略等有關.

Fig.7 Time cost of a single participant running key generation scheme圖7 單個參與方運行密鑰生成方案的時間開銷
圖8 是單個參與方Pi根據t個合法簽名份額構造聚合簽名 Σ0的時間開銷.單個參與方Pi構造簽名份額與驗證其他參與方簽名份額的時間開銷在5 ms 內,因此不予展示.

Fig.8 Time cost of a single participant constructing signature scheme圖8 單個參與方構造簽名的時間開銷
基于對密鑰生成方案與簽名方案的時間開銷與通信復雜度的討論,本文認為:在工程實踐中,合理控制節點規模n對控制時間與通信成本起決定性作用,相比而言,門限值t對算法運行的時間與通信成本影響比n小,可更多地結合實際業務靈活決定.
圖9 是參與方加入過程中,智能合約預更新全局公鑰的手續費開銷,單位是gas[3].手續費開銷本身無經濟意義,它體現了鏈上算法的復雜程度,即計算與存儲成本.其中,新節點數目為0 表示初始化智能合約存儲的全局公鑰,開銷是114 704 gas.

Fig.9 Transaction fee corresponding to the process of participant joining圖9 參與方加入過程的智能合約手續費
基于對參與方加入方案手續費開銷的討論,本文認為:當系統發生拓展時,僅有新節點支付手續費預更新全局公鑰,其他節點從智能合約讀全局公鑰無需支付手續費,這解釋了圖9 中手續費開銷為什么關于新節點數目近似線性.相比總是在新節點加入時重新運行DKG[10],此方案的優勢在于:1)更公平,每一節點都需要支付近似相等的手續費加入系統;2)實現更容易,基于全局公鑰關于邏輯時鐘遞推關系,無需在智能合約處理多點提交全局公鑰.
基于對密碼學方案在區塊鏈預言機鏈上、鏈下部分的實現評估,以及5.2 節的安全性分析,門限值對系統效率與安全性都有影響.考慮節點規模不變,當門限值變大時,系統特征有4 個變化:1)系統可拓展性增強,參與方加入方案支持更多新節點加入;2)敵手控制節點竊取私鑰、偽造簽名更困難;3)密碼學方案效率受影響,特別是構造聚合簽名的時延變長;4)敵手控制節點惡意提交非法簽名體,攻擊電子投票過程更容易.
本文實現了第4 節提出的節點身份方案以及節點調度方案.本節將測試節點生命周期的手續費開銷,并展示數據獲取業務的日志,證明節點身份方案的可行性;基于對鏈上與鏈下調度方案手續費開銷以及可用性的討論,說明“鏈上兜底,鏈下調度”的必要性.
表4 是在區塊鏈預言機鏈上部分實現NFT 生命階段1~4,驅動NFT 生命階段變更的手續費開銷.因為存在激勵清零操作的手續費退還機制[3-4],銷毀NFT 的手續費開銷顯著地比其他操作低.實現基于NFT的智能合約,證明公開、受控的節點身份方案是可行的.

Table 4 Transaction Fee in NFT Life Cycle表4 NFT 生命周期變更手續費
圖10 是區塊鏈預言機鏈下部分執行一次數據獲取請求截屏,電子投票發生在門限性質(4,6)的節點組 P2,DHT 標識符空間為 Z2128.“verifier selected”表示請求已被認領,聚合簽名構造者同時被選擇;“aggregated signature”表示電子投票過程完成,聚合簽名被成功構造,因此數據獲取業務能被正確執行.

Fig.10 Log screenshot corresponding to data availability request圖10 數據獲取請求對應的日志截屏
為測試鏈上與鏈下調度方案.實驗執行了13 步操作:操作1 分別創建了基于round-robin 算法的鏈上兜底方法與鏈下調度方案的智能合約并初始化;操作2 與13 分別創建與銷毀了一個節點組;操作3~7向此節點組新增了5 個節點;操作8~12 依次將這些節點刪除.
圖11 是調度方案測試結果,縱軸是調用者的手續費開銷之和.圖11 證明了鏈下調度是比鏈上調度更經濟的調度方案,這是因為鏈下調度僅執行調度任務廣播與調度結果提交,手續費開銷與調度邏輯復雜度無關.

Fig.11 Transaction fee of on-chain and off-chain scheduling圖11 鏈上、鏈下調度方案手續費
此外,考慮鏈上調度的優勢在于容災能力強,穩定性依賴于區塊鏈正常運行,但處理復雜的調度邏輯將帶來高昂成本,因此作為兜底是合適的.
綜上,本節驗證了第4 節所提方案的可行性,具體為:1)基于NFT 原生地實現節點身份管理是可行的;2)數據獲取請求能在鏈下部分如預期完成;3)鏈上與鏈下調度混合的方案是可行的,且鏈下調度有經濟性優勢.
從近5 年的相關研究看,區塊鏈預言機所解決的問題主要是:1)跨鏈場景下交易合法性驗證;2)資產交易場景下數據即時獲取.從趨勢上看,區塊鏈預言機相關研究與實踐越來越致力于構建開放、去中心化的系統,開放性是新節點可以在滿足某些條件的前提下加入區塊鏈預言機;去中心化則描述了節點在功能、權限等方面彼此等同的程度.事實上,開放性與去中心化特征對應了區塊鏈預言機在應用時面臨的主要挑戰.
早期的區塊鏈預言機項目[56]通常提供單一的數據可用性服務,開放性較差,有且僅有被認證的節點能加入系統.隨著區塊鏈承載越來越多樣的服務,數據獲取需求也越來越多樣,目前活躍的區塊鏈預言機項目[16-18]通常以公開項目文檔與開放API 的方法支持項目外部用戶自由注冊與加入,但通常也要求用戶抵押一些虛擬貨幣證明身份并保證做誠實的行為;相關研究[10, 19,57]也通?;诒WC金對節點授權,并以獎勵誠實行為的形式返還保證金.從開放性的角度看,目前區塊鏈預言機相關研究與應用支持節點自由加入與退出,且保持誠實的節點總能獲得虛擬貨幣收益作為獎勵.此方案的優勢在于契合區塊鏈相關資本市場“信任源于抵押”的“游戲規則”,但在客觀上仍然存在經濟門檻,還依賴于智能合約自動執行抵押、激勵等流程,缺乏對節點身份與行為的跟蹤與相互監督,因此將此方案應用在國內將受到合法與合規性挑戰.
區塊鏈預言機本身難以實現完全去中心化[8],在實踐中,一種對區塊鏈預言機去中心化程度的描述為:區塊鏈預言機節點讀寫等操作權限的等同程度.區塊鏈預言機去中心化程度越高,通常意味著開放性越好,敵手作惡的成本越高,安全性獲得增強;但挑戰在于模型更復雜,例如考慮匿名多點提交的公平性[57]與經濟性[10].因此,也需要應用博弈論方法討論激勵方案[19].
在與同類工作對比后,本文方案更適合被應用于大規模區塊鏈預言機,且通過引入基于NFT 的節點身份方案使節點無需抵押虛擬貨幣即可加入,且可跟蹤、可監督.NFT 能被用來表示節點身份,且節點身份控制方案繼承了NFT 去中心化、適合表示海量同類事物的特性,適合被應用于大規模區塊鏈預言機,將節點身份去中心化、通證化.
當區塊鏈預言機節點規模變大時,節點運行密鑰生成、簽名方案的時間開銷將顯著變高;且在此情況下,當節點加入與退出時,節點將與更多其他節點通信,節點因為資源有限,所以數據獲取業務可用性將下降,因此基于DHT 設計區塊鏈預言機鏈下部分是增強系統可用性的有效手段.
無論是在數據獲取業務中,智能合約僅需單次驗證聚合簽名,還是在節點調度業務中,智能合約可以無需實現復雜的調度邏輯,與鏈下調度器交互完成節點調度,智能合約的運行開銷都與區塊鏈預言機節點規模無關,因此此節的方案不僅更適合被應用于大規模區塊鏈預言機,而且增強了鏈上部分關于鏈下部分的透明性,降低了業務耦合度以及開發和維護成本.此外,用戶僅跟智能合約直接交互,因此發生在鏈下的、實際數據獲取業務關于用戶是透明的,此設計更貼近分布式系統范型.
本文設計與實現了一種基于BLS 簽名、滿足門限性質的區塊鏈預言機,節省了智能合約在數據獲取業務的開銷;從分布式系統范型出發,設計了區塊鏈預言機鏈下部分的網絡拓撲,增強了可用性與伸縮性,探索了將分布式調度應用于區塊鏈預言機的方案.
本文的創新性工作在于將NFT 應用為節點DID,并基于節點身份標識構造了DHT,設計了區塊鏈預言機鏈下部分,從分布式系統原理與范性的角度討論了區塊鏈預言機的設計與實現.此外,節點身份在整個生命周期公開,不再要求新節點通過抵押數字資產授信,增強了方案通用性與新穎性.
本文針對強投票協議的工作可被推廣到可信查詢多種鏈下數據庫,例如存儲監控指標、日志、市場數據等的時間序列數據庫通常是關于時間線性編排的數據存儲,且幾乎不更新歷史數據,因此針對這些數據發起的查詢是確定性的.本文認為,基于強投票協議的區塊鏈預言機很適合被應用于查詢時間序列數據庫,并支持多種算子以及算子組合.
此外,本文工作局限于強投票協議區塊鏈預言機,未來工作可討論弱投票協議的聚合邏輯如何實現在智能合約,并討論如何實現低成本、高可用.
作者貢獻聲明:張展鵬提出了設計思路并完成源代碼實現,撰寫論文;李可欣調研了相關工作并共同撰寫了論文;闞海斌提出指導意見.