葛 艷 姚海東 鄒一波 陳 明 孫偵龍
(1.上海海洋大學信息學院, 上海 201306; 2.農業農村部漁業信息重點實驗室, 上海 201306;3.中洋漁業(江門)有限公司, 江門 226600)
水產品供應鏈各環節通過信息共享以及水產品和資金流通,將企業以物資流向連載整合,從而提升整個水產品供應鏈的運作效率[1]。但是傳統水產品供應鏈存在信息化程度較低、結構松散且相對獨立以及各環節之間協調不足、效率低等問題[2],同時在水產品供應鏈的應用中同樣存在著安全性差、信息不對稱、質量安全缺乏監管等問題[3-5]。
區塊鏈具有去中心化、可追溯和不可篡改的特點[6-7],為解決上述問題提供了新的思路[8]。國外學者利用區塊鏈的特性,從交易管理方面對供應鏈上的應用展開研究[9-12]。隨著各種區塊鏈項目之間融合交互需求日益增長,傳統的單鏈業務結構逐步發展為多鏈業務結構,而區塊鏈的信息孤島是企業之間區塊鏈無法實現鏈上數據互通的關鍵[13],區塊鏈的跨鏈技術也應運而生。
跨鏈是一種價值在不同區塊鏈之間流動的過程,這里的價值不僅指鏈上的資產,也是一種信息[14],價值交換要在價值守恒的前提下,保證精確性和可靠性[15]。目前,已有公證人機制[16]、側鏈/中繼[17]、哈希鎖定[18]和分布式私鑰控制[19]這4種主流的跨鏈技術,在不同程度上解決了跨鏈互操作問題,為實現跨鏈提供了技術方案[20]。國內外學者采用上述跨鏈機制從共識機制[21-22]、密碼學技術[23]、多鏈架構[24-26]等角度對區塊鏈的效率、安全性以及擴展性等展開研究。此外在能源[27]、電信[28]、電力[29]等領域,也使用跨鏈技術為其交易與認證設計出安全可靠的模型。

圖1 水產品供應鏈的業務分析Fig.1 Business analysis of aquatic products supply chain
同樣,國內外學者也分別從技術角度和業務邏輯角度對現有水產品供應鏈的效率、安全性以及擴展性等做出了改進。文獻[30]構建多鏈結構將不同類型的數據信息分開存儲,實現不同數據的隔離保存,提高數據的安全性;文獻[31-33]構建出基于雙區塊鏈架構的產品防偽溯源系統,擴展溯源數據的存儲容量,同時提高了溯源的效率與可信度。將現有供應鏈結構與多鏈架構相結合,使供應鏈的擴展性有了較大的提升,同時水產品供應鏈的應用也更加靈活。
跨鏈技術在水產品供應鏈領域更加偏向溯源的應用,而利用跨鏈技術對供應鏈中水產品交易改進方面的研究卻很少。本文將跨鏈技術應用在水產品交易領域,改進交易流程,實現水產品在鏈間交易。
水產品供應鏈的特點是環節眾多,根據水產品供應鏈中業務功能的特點,將水產品供應鏈按照業務邏輯分為養殖、加工、倉儲、銷售、運輸5個環節,如圖1所示。各個環節分屬的企業之間相互獨立,水產品在供應鏈中按照交易流向,從養殖企業開始交易至銷售企業,最終到達消費者手中。
各個環節不同的業務功能需求,導致環節之間業務信息的數據結構不同,水產品供應鏈中的業務信息是水產品供應鏈上交易的基礎,針對上述供應鏈中水產品交易的業務信息特點,將水產品供應鏈各環節的業務信息分為產品信息和交易信息:①產品信息是指在當前環節中記錄的產品情況信息,各個環節的水產品信息根據業務需求有所不同。②交易信息中不僅包含交易雙方信息和包含水產品數量、單價、保質期等水產品的交易產品信息,還包含交易雙方是否對交易達成一致的交易確認信息以及交易在后續執行情況的交易執行信息。
以養殖企業與加工企業之間的交易為例,養殖企業可為加工企業提供一批水產品養殖的詳細信息,然后雙方會對數量、規格、單價等交易的產品信息進行協商,最終對交易達成一致并在后續完成對交易的執行。交易過程中交易雙方對交易的協商、確認和執行分別作為交易產品信息、交易確認信息和交易執行信息進行保存。
基于水產品供應鏈交易的業務分析,本文設計了水產品跨鏈交易模型的架構,如圖2所示。模型架構共分為5層,根據實現功能自下而上分別是網絡層、智能合約層、數據層、交互層和業務層。

圖2 水產品跨鏈交易模型架構Fig.2 Aquatic products cross-chain trading model architecture
(1)網絡層包括區塊鏈結構和跨鏈結構。區塊鏈結構是指水產品供應鏈中各個企業的區塊鏈,而跨鏈結構是實現跨鏈交易的核心。區塊鏈結構負責跨鏈交易的發起與確認,以及對跨鏈交易中跨鏈資源的發送與接收。而跨鏈結構負責接收由區塊鏈發送的跨鏈資源然后進行轉發,其中跨鏈資源包括跨鏈交易信息、驗證信息以及智能合約等。
(2)智能合約層對交易流程在鏈上實現的功能設計了相應的智能合約,包括用于發起跨鏈交易并完成交易流程的跨鏈合約、實現跨鏈功能的系統合約以及能夠對交易信息進行訪問的查詢合約。智能合約布署在區塊鏈上,企業用戶在鏈上直接調用智能合約就可以完成跨鏈交易的流程。
(3)數據層根據水產品供應鏈業務分析中的信息字段內容以及跨鏈傳輸的功能需求,在模型中設計了跨鏈交易信息與跨鏈傳輸信息。跨鏈交易信息包括產品信息、交易產品信息、交易雙方信息、交易確認信息和交易執行信息,用于跨鏈交易過程中區塊鏈結構和跨鏈結構之間的信息傳輸。而跨鏈傳輸信息在跨鏈結構中流轉,包括跨鏈交易信息和含時間戳、哈希、背書信息等的區塊信息。
(4)交互層操作包括跨鏈交易傳輸、跨鏈交易確認和跨鏈交易驗證。發起鏈通過系統合約以及跨鏈結構,將交易信息發送至目的鏈;目的鏈接收到交易信息后,對交易進行判斷,選擇是否確認當前交易:若確認交易,則表示接收交易;若回滾交易,則表示拒絕交易;最后將確認或回滾的結果返回至發起鏈,完成交易。同時,在跨鏈交易信息的傳輸過程中,還需要對跨鏈交易進行驗證,驗證通過則進行下一步,若驗證失敗,則返回錯誤信息并取消當前跨鏈交易。
(5)業務層可實現跨鏈交易發起、交易信息上傳和交易信息查詢功能。企業將區塊鏈接入模型后就可以作為發起鏈發起跨鏈交易,也可以作為目的鏈接受或拒絕一筆跨鏈交易。若選擇接受交易,則在交互層完成對交易的確認,并在線下完成后續交易執行的環節,并上傳交易執行的信息;若選擇拒絕交易,則在交互層完成對交易的回滾,取消交易。交易的企業雙方可以通過交易編號對當前交易進行查詢,獲取交易信息。

圖3 跨鏈路由的模塊設計Fig.3 Modular design of cross-chain routing
在水產品跨鏈交易模型中,將負責接收和轉發跨鏈資源的跨鏈結構與交互層的功能實現整合,設計了跨鏈路由。
跨鏈路由中使用中繼的跨鏈方式,將跨鏈路由作為實現跨鏈功能的中介,一方面結合業務需求,融合水產品在鏈上交易的流程業務,跨鏈路由采用模塊化的設計,降低耦合性;另一方面結合跨鏈需求,設計了區塊鏈鏈入接口、權限、交易隊列、驗證和通信模塊,如圖3(圖中CCIF表示跨鏈信息格式)所示,實現跨鏈功能,減少維護成本。跨鏈路由之間以P2P自組網的方式相互連接,共同組成跨鏈網絡,實現跨鏈資源在跨鏈路由之間、跨鏈網絡之中傳輸同步。
2.2.1區塊鏈鏈入接口
每個區塊鏈平臺都有獨立的框架結構和運行邏輯,不同區塊鏈之間無法直接交互,這也是跨鏈技術難點之一。因此區塊鏈鏈入接口的意義便是適配對應的區塊鏈,通過區塊鏈鏈入接口實現跨鏈交互功能。
區塊鏈鏈入接口在跨鏈路由中發揮兩種作用:區塊鏈與跨鏈路由的連接以及跨鏈資源在區塊鏈與跨鏈路由之間的傳輸。區塊鏈鏈入接口中的跨鏈接口分為跨鏈信息接口、跨鏈交易接口和調用接口。在企業區塊鏈上布署的系統合約中包含與區塊鏈鏈入接口相連接的接口。系統合約中的接口分為兩部分:跨鏈調用接口和交易接口。通過系統合約與區塊鏈鏈入接口,完成區塊鏈與跨鏈路由的連接,實現跨鏈資源的傳輸。
2.2.2權限模塊
區塊鏈使用本鏈的公鑰、私鑰、證書等文件與跨鏈路由一對一進行綁定。綁定后,會生成該鏈在水產品跨鏈交易模型中的唯一身份標識即區塊鏈編號,同時區塊鏈也賦予跨鏈路由一定的權限。
區塊鏈編號用來標識區塊鏈,進而可以標識鏈上的智能合約。區塊鏈編號會在跨鏈路由之間同步,從而區塊鏈的身份能夠在整個跨鏈網絡中得到認證,使跨鏈資源能夠在跨鏈路由間正確傳輸,實現跨鏈資源在不同鏈間的可信流轉。
跨鏈路由在接入區塊鏈后,不僅要能夠監聽交易,而且要保證跨鏈交易的可驗證性。區塊鏈會賦予跨鏈路由一定的權限,使跨鏈路由能夠獲取跨鏈交易的背書信息等驗證信息。跨鏈路由會根據區塊存儲結構獲取該跨鏈交易的合法性證明。
2.2.3交易隊列模塊
交易隊列模塊會將區塊鏈發送的跨鏈交易信息形成跨鏈交易信息列表,暫時存儲等待執行。當企業用戶發起跨鏈交易,跨鏈路由接收跨鏈交易信息后,會收集當前跨鏈交易的驗證信息,以便后續驗證。而未執行的跨鏈交易信息按照順序暫時存儲在交易隊列模塊中,等待獲取相應的驗證信息。
2.2.4驗證模塊
在跨鏈場景中,由于雙方并沒有參與對方區塊鏈的共識流程,因此本文引入跨鏈驗證協議,實現數據信息在鏈間的安全傳輸。驗證模塊收集跨鏈交易的驗證信息,并根據跨鏈驗證協議對這些驗證信息進行驗證。在跨鏈驗證協議中,使用Merkle驗證[34]對跨鏈交易實施驗證,保證跨鏈交易的正確性,也保障了整個水產品跨鏈交易模型處于正確的狀態。
圖4是某一區塊內的Merkle樹,若要驗證交易TX1的存在性,只需要提供路徑哈希即Hash2、Hash34、RootHash。具體的Merkle驗證過程如下:根據交易TX1計算得到,Hash等于Hash(TX1);根據Hash1和提供的Hash2計算得到,Hash12等于Hash(Hash1 + Hash2);根據Hash12和提供的Hash34計算得到Hash1234等于Hash(Hash12 + Hash34);最后比較Hash1234和提供的根哈希RootHash,若Hash1234等于RootHash,則證明當前區塊中存在TX1,反之則不存在。

圖4 Merkle驗證Fig.4 Merkle verification
而一次跨鏈交易,不僅需要驗證發起跨鏈交易時在發起鏈上的存在性,還需要驗證跨鏈交易是否在目的鏈上成功執行。即目的鏈是否成功對跨鏈交易進行執行并上鏈。因此當跨鏈交易返回至發起鏈的跨鏈路由后,還需驗證跨鏈交易在目的鏈上的存在性,即驗證跨鏈交易的執行性。驗證跨鏈交易執行性的步驟與驗證存在性是相同的。若驗證執行性失敗,則將錯誤信息按原路徑返回至發起鏈,然后取消當前跨鏈交易,并根據狀態Merkle樹回滾至跨鏈交易前的狀態。只有當跨鏈交易的存在性與執行性全部驗證通過,跨鏈交易才認為成功。
2.2.5通信模塊
跨鏈路由接收來自企業區塊鏈的跨鏈交易信息,然后在鏈上獲取跨鏈交易的背書信息和Merkle證明信息,一同由通信模塊按照跨鏈信息格式打包生成CCIF信息,并由通信模塊對CCIF信息進行發送、接收和解析[25]。表1為跨鏈路由傳輸的CCIF信息的詳細內容。

表1 跨鏈信息格式Tab.1 Cross-chain information format
在Proof中還分為4個字段:Hash、Path、MerkleRoot、Signature。其中Hash是跨鏈交易內容的哈希,Path是Merkle驗證的路徑哈希,MerkleRoot是根哈希,Signature是對于根哈希的簽名。其中Signature字段在Fabric鏈中則是背書節點的背書信息,也是由跨鏈路由從區塊鏈中獲得。
水產品跨鏈交易模型的拓撲結構如圖5所示。模型整體的拓撲結構是由多條交易鏈和多個跨鏈路由組成,每一個跨鏈路由與一條交易鏈連接。跨鏈路由之間通過P2P網絡進行連接,共同構成跨鏈網絡。跨鏈信息通過跨鏈網絡實現多方參與、信息相互隔離的模式。企業用戶可通過鏈上的節點在鏈上發起跨鏈交易,并經由跨鏈網絡將跨鏈信息進行轉發。

圖5 模型拓撲結構Fig.5 Model topology structure
為了保護企業在鏈上交易時企業內部的數據安全,在各個企業現有的區塊鏈網絡的基礎上增加一條交易鏈,將此鏈作為每個企業的交易鏈加入到水產品跨鏈交易模型中,實現鏈與鏈之間的數據互通并進行跨鏈交易。
3.1 水產品跨鏈交易模型中的模塊交互
如圖6所示,水產品跨鏈交易模型可分為兩個部分:區塊鏈網絡以及跨鏈網絡。區塊鏈網絡由各個企業的交易鏈組成,企業用戶可在鏈內發起跨鏈請求,調用跨鏈合約生成跨鏈交易信息,并且在交易鏈上記錄跨鏈交易的詳細信息。跨鏈網絡則由各條企業交易鏈的跨鏈路由組成。跨鏈交易信息的存儲、驗證、打包、傳輸都由跨鏈路由完成,實現了數據信息在不同區塊鏈之間的傳輸,完成跨鏈交易,即交易合同在鏈上的擬定和確認。

圖6 水產品跨鏈交易模型中模塊交互Fig.6 Module interaction in the model of cross-chain aquatic product trading
圖6是交易在水產品跨鏈交易模型中模塊間交互。跨鏈交易由發起鏈發起,通過跨鏈合約和系統合約與區塊鏈鏈入接口的連接,將生成的跨鏈交易信息發送至跨鏈路由;驗證模塊收集跨鏈交易的背書信息和Merkle證明信息,并連同跨鏈交易信息一同發送至通信模塊;通信模塊按照跨鏈信息格式打包成CCIF信息,發送至目的鏈的跨鏈路由;目的鏈跨鏈路由中的通信模塊接收后,驗證模塊先對CCIF信息進行驗證;驗證通過后,再經通信模塊解析重新獲取跨鏈交易信息后,由區塊鏈鏈入接口發送至目的鏈,目的鏈通過系統合約來接收跨鏈交易信息。之后,目的鏈完成跨鏈交易的后續執行操作。
由于跨鏈交易信息不僅包含交易產品信息,同時還要將交易執行信息保存。考慮到交易過程的原子性與交易信息的可溯性,簡單地將跨鏈轉賬流程引入并不適用。因此本文引入兩階段提交協議,加入跨鏈事件,將跨鏈交易分為兩個步驟:發起跨鏈事件,并根據跨鏈交易信息發起存證交易,保存存證信息;根據跨鏈交易信息,對跨鏈事件執行確認或回滾操作,保存執行結果信息。圖7為水產品跨鏈交易流程的示意圖,并以養殖企業與加工企業為例說明跨鏈交易的具體流程。

圖7 水產品跨鏈交易流程示意圖Fig.7 Schematic diagram of the cross-chain trading process of aquatic products
(1)發起跨鏈交易,生成跨鏈交易信息。養殖企業用戶發起跨鏈請求,與加工企業對某水產品進行交易。此時養殖交易鏈作為發起鏈,而加工交易鏈就作為目的鏈。通過調用鏈中的跨鏈合約發起一筆跨鏈交易,然后生成跨鏈交易信息,此時鏈中的背書節點對當前交易進行模擬計算并按照共識機制完成背書,驗證通過后,當前交易便打包至區塊中。
(2)發起跨鏈事件,發起鏈生成存證交易。在生成跨鏈交易信息后,跨鏈合約會在當前跨鏈交易中開啟一次跨鏈事件,跨鏈事件中包含兩筆存證交易,分別由發起鏈與目的鏈生成。其中在生成跨鏈事件后,養殖交易鏈根據跨鏈交易信息內容發起存證交易,并將存證信息保存至鏈上。
(3)跨鏈交易信息發送至跨鏈路由。系統合約首先調用跨鏈調用接口與區塊鏈鏈入接口中的調用接口相連,然后系統合約通過交易接口將跨鏈交易信息發送至養殖跨鏈路由。養殖跨鏈路由通過區塊鏈鏈入接口中的跨鏈交易接口接收跨鏈交易信息。
(4)生成CCIF信息。接收到的跨鏈交易信息都會被暫時存儲在交易列表模塊中等待順序執行。對于要執行的跨鏈交易,跨鏈路由首先從交易鏈中獲取當前跨鏈交易的Merkle證明信息以及背書信息,然后通信模塊將這些信息統一打包成CCIF信息。
(5)發送CCIF信息。養殖跨鏈路由根據CCIF信息中的To字段,將CCIF信息發送至加工跨鏈路由。
(6)驗證跨鏈交易存在性。加工跨鏈路由接收后,通信模塊將CCIF信息發送至驗證模塊。驗證模塊根據CCIF信息中的Proof字段對當前跨鏈交易進行驗證。驗證通過,進行下一步;驗證不通過,跨鏈交易結束。
(7)解析CCIF信息并發送至目的鏈。驗證模塊將驗證通過的CCIF信息再發給通信模塊進行解析,重新得到跨鏈交易信息,然后將跨鏈交易信息發送至加工交易鏈。
(8)目的鏈生成存證交易。加工交易鏈接收到跨鏈交易信息后,同樣根據跨鏈交易信息發起存證交易。至此跨鏈事件中的兩筆存證交易都已生成。
(9)執行跨鏈交易。目的鏈對跨鏈交易的執行,就是目的鏈對跨鏈事件執行確認或回滾操作。在加工交易鏈對兩筆存證交易都確認后,當前跨鏈事件會結束,同時在鏈上保存確認后的存證信息以及確認后跨鏈交易信息;若加工交易鏈對跨鏈交易信息有疑問,可以選擇回滾當前跨鏈事件,存證交易中的存證信息會回滾至跨鏈事件前,則此時存證交易中沒有任何信息,然后結束跨鏈事件,而執行跨鏈交易的失敗結果與回滾后的存證交易也都會記錄在鏈上。然后將包含跨鏈交易執行結果的跨鏈交易信息返回。
(10)跨鏈交易信息返回至跨鏈路由,返回CCIF信息。加工跨鏈路由接收到跨鏈交易信息后,從交易鏈中獲取相應的驗證信息,再由通信模塊重新打包成CCIF信息發送至養殖跨鏈路由。
(11)驗證跨鏈交易執行性,并返回至發起鏈。養殖跨鏈路由接收返回的CCIF信息后,執行步驟(6)、(7),將解析后的跨鏈交易信息發送至養殖交易鏈。
(12)獲取回調結果。養殖交易鏈獲得返回的執行結果,即加工交易鏈是否同意當前跨鏈交易,交易完成。之后雙方都可以在各自鏈上查看存證交易和跨鏈交易獲取交易詳情。
系統合約(System smart contract)用于交易鏈與跨鏈路由的連接以及信息在交易鏈與跨鏈路由之間的傳輸。通過系統合約中的InterchainInvoke接口,完成交易鏈與跨鏈路由的連接,實現跨鏈資源的傳輸。系統合約被調用后,將傳入的參數做json格式數據轉換,便于信息的傳輸,并對每一筆接收到的跨鏈交易信息進行編號排序,然后將信息上鏈,返回跨鏈調用成功與否的結果,最后等待跨鏈交易的有序執行。具體算法如下:
輸入:目的鏈編號ToID,目的鏈調用合約Contract,調用合約地址Addr,調用合約方法Method,參數args
輸出:跨鏈調用響應結果
function InterchainInvoke (stub, args[])
if len(args) != 5
return傳入的參數數量有誤
Cert = Stub.GetCreator()
∥獲取發起跨鏈調用請求用戶的信息
if Exit = Stub.GetState(ToID)
∥查詢目的鏈編號是否存在
if Exit = Stub.GetState(Addr)
∥查詢目的鏈上合約地址是否存在
SeqNum ++ ∥對跨鏈交易依次排序
Message = json.Marshal (SeqNum+args[]+Cert)
∥將跨鏈信息做json格式數據轉換
stub.PutState(Message)
return shim.Success
∥返回跨鏈調用的響應結果
跨鏈合約(Interchain smart contract)發起鏈調用后,發起跨鏈交易,經過目的鏈對跨鏈交易進行確認或拒絕,并將結果返回至發起鏈。跨鏈合約的算法為:發起鏈發起跨鏈交易,生成跨鏈交易信息,并以json文件格式將跨鏈交易信息保存至鏈上,然后返回當前跨鏈交易的編號。具體算法如下:
輸入:發起鏈編號FromID,目的鏈編號ToID,跨鏈交易信息TxInfo
輸出:跨鏈交易編號TxID
function CrossChainTx (stub, args[])
if len(args) !=3
return傳入的參數數量有誤
return TxID
存證交易包含在跨鏈事件中,一次跨鏈事件中會包含兩筆分別由發起鏈和目的鏈發起的存證交易。跨鏈事件只有在兩筆存證交易都確認或是回滾后,才會結束。而在交易確認或回滾前,正處于跨鏈事件中時,是無法發起新的交易對當前交易進行修改。跨鏈事件生成的具體算法如下:
輸入:發起鏈編號FromID,目的鏈編號ToID,跨鏈交易編號TxID,跨鏈交易信息TxInfo
輸出:跨鏈事件編號EventID
function Event (stub, args[])
if len(args) != 4
return傳入的參數數量有誤
if Exit = Stub.GetState(TXID)
∥查詢鏈上是否已經存在交易記錄
IsEventExec = false
∥鎖定跨鏈事件,雙方鏈無法再次生成跨鏈事件
Stub.PutState (args[] + IsEventExec)
∥發起鏈根據信息生成存證交易上鏈
return EventID
跨鏈事件執行的具體算法如下:
輸入:發起鏈編號FromID,目的鏈編號ToID,跨鏈事件編號EventID
輸出:跨鏈事件執行結果
EventCommit/ EventRollback
function EventExec (stub, args[])
if len(args) != 3
return傳入的參數數量有誤
if Exit = Stub.GetState(EventID)
∥查詢鏈上是否已經存在交易記錄
if IsEventExec
∥查詢跨鏈事件是否已經執行
return跨鏈事件執行結果
if commitEvent ( EventID ){
∥目的鏈確認跨鏈事件,接受交易
return EventCommit = true,
IsEventExec = true
∥返回“接受”執行結果
} else if rollbackEvent ( EventID ){
∥目的鏈回滾跨鏈事件,拒絕交易
return EventRollback = true,
IsEventExec = true
∥返回“拒絕”執行結果
}
一筆跨鏈交易從發起到執行最后返回結果后完成交易的過程:首先交易鏈上發起跨鏈請求,生成跨鏈交易;之后發起跨鏈事件,并根據跨鏈交易信息生成存證交易;然后調用系統合約中的InterchainInvoke接口,將跨鏈交易信息進行傳輸;經由跨鏈路由的轉發,目的鏈對跨鏈事件執行確認或回滾操作,執行結果返回至發起鏈,完成跨鏈交易。具體算法如下:
輸入:跨鏈交易編號TxID
輸出:跨鏈交易執行結果TxExec
function InterChain (stub, args[])
CrossChainTx() ∥發起鏈發起跨鏈交易
if Exit = Stub.GetState( TXID )
∥查詢鏈上是否已經存在交易記錄
Event() ∥發起鏈開啟跨鏈事件
Stub.InvokeChaincode(“System”)
∥調用系統合約中的跨鏈調用接口
EventExec() ∥目的鏈執行跨鏈事件
If EventCommit {
return TxExec = true
∥返回“成功”的跨鏈交易結果
}If EventRollback {
return TxExec = false
∥返回“失敗”的跨鏈交易結果
}
查詢合約(Query smart contract)在水產品跨鏈交易模型中,一筆跨鏈交易結束后,企業用戶可在交易鏈上調用查詢合約,通過輸入交易編號或是跨鏈事件編號,獲取對應跨鏈交易或存證交易的詳細信息。查詢合約的具體算法如下:
輸入:交易編號TxID,跨鏈事件編號EventID
輸出:交易信息Info
function Query (stub, args[] )
if Exit = Stub.GetState( TxID/EventID )
∥查詢企業鏈上是否存在當前交易記錄
return Info ∥返回交易詳細信息
基于水產品跨鏈交易模型,實現了水產品跨鏈交易的應用,應用架構層與模型架構層相對應,同樣分為網絡層、智能合約層、數據層、交互層和業務層5層。實驗環境采用Ubuntu 16.04,Docker 20.10.7,Go 1.13,區塊鏈架構使用Hyperledger Fabric 1.4.4。跨鏈路由依據Fabric平臺的SDK和JAVA語言進行設計,智能合約層借助GO語言進行鏈碼開發,并對業務層開發了前端界面。

圖8 Fabric區塊鏈結構Fig.8 Fabric blockchain structure

圖9 跨鏈配置信息Fig.9 Cross-chain configuration information

圖10 水產品跨鏈交易后臺實現Fig.10 Aquatic products cross-chain trading back-end implementation
在實驗中,對每條鏈做多通道處理后再接入模型中,實現跨鏈交易信息分離的同時,也避免了重新搭建新鏈作為交易鏈接入模型的成本。這樣既可以確保鏈上原有數據和交易信息的安全性,又可以提高查詢跨鏈交易的效率。如圖8所示,水產品供應鏈中的養殖、加工和銷售企業分別置于一條Fabric區塊鏈。在每條鏈中設置org1、org2和org3共3個組織以及跨鏈通道channel12和原數據通道channelall兩個通道,將跨鏈交易的鏈碼以及交易流程中產生的信息保存至channel12中。將org1和org2接入channel12,org3接入channelall。之后在跨鏈通道上布署跨鏈合約、系統合約和查詢合約,再將跨鏈通道接入跨鏈路由,如圖9所示,模型中接入的部分區塊鏈信息包括名稱、類型、跨鏈賬戶、區塊高度和公鑰信息以及對應跨鏈路由的IP和端口信息。
用戶可以通過org1上的節點向目的鏈發起跨鏈交易。如圖10a所示,養殖企業A1在channel12中調用合約interchain_marine向加工企業B1發起交易,并傳入交易產品信息。交易發起后,在channel12中再次調用合約query_marine,輸入交易編號即可查詢當前交易信息,如圖10b所示。
圖11是水產品跨鏈交易前端實現。如圖11a所示,加工企業B1可以查詢與自己企業相關的交易信息,并且對于作為目的方的交易,可以根據交易產品信息選擇接受或是拒絕這筆交易,以修改交易狀態;同樣可以根據交易編號查詢到當前交易的區塊信息,如圖11b所示。
本文從發起跨鏈交易與交易查詢兩方面進行測試,采用Caliper性能測試工具,并從3個指標——每秒交易吞吐量、平均交易成功率和平均交易延遲對系統進行測試。每次實驗的數據采用測試10次的平均值。本文中將系統設置每10筆交易生成一個區塊,區塊生成間隔為2 s,同時采用CouchDB數據庫以提升數據查詢效率。

圖11 水產品跨鏈交易前端實現Fig.11 Front-end realization of cross-chain trading of aquatic products

圖12 跨鏈交易性能測試結果Fig.12 Cross-chain transaction performance test results
圖12為在交易總量分別為1 000、2 000、5 000筆的情況下,每秒向系統并發的交易量不同,記錄每輪測試的平均交易成功率和平均交易延遲,10輪過后可求得系統的平均交易成功率和平均交易延遲。如圖12所示,跨鏈交易的平均成功率都在99%左右,而交易的平均延遲在0.2 s左右。交易總量的增加會正向影響平均交易成功率,而增加交易的成功率,同時也增加了平均交易延遲;每秒交易并發量則是反向影響著平均交易成功率和平均交易延遲,二者都隨著每秒交易并發量的增加而減小。

圖13 交易查詢性能測試結果Fig.13 Transaction query performance test results
在交易查詢的測試中,隨著查詢交易數量的增長,查詢的平均交易延遲整體呈現下降趨勢,每秒交易吞吐量則是不斷增長(圖13);同時數據總量的增加也使平均交易延遲增加;數據總量會反向影響每秒交易吞吐量,數據總量10 000條的每秒交易吞吐量會低于數據總量5 000條的每秒交易吞吐量;最后交易查詢的平均成功率是非常穩定的100%。
(1)主要探討基于區塊鏈跨鏈技術的水產品交易模型及應用。通過引入中繼的跨鏈方式,并結合水產品供應鏈上的交易流程,構建了水產品跨鏈交易模型,并設計了企業在模型中的跨鏈交易流程;通過對各功能環節的智能合約的編寫,使企業能夠在鏈上實現跨鏈交易目的。
(2)模型中的跨鏈路由采用對業務需求和跨鏈功能的模塊化設計,能夠更加簡易地接入企業的區塊鏈,也為企業之間進行跨鏈交易提供了技術支撐;跨鏈路由負責對跨鏈交易信息接收、轉發和驗證,保證了跨鏈交易的可驗證性和安全可信性。
(3)增加交易鏈接入模型,既保證了企業原有鏈上數據的隱私性,又提高了跨鏈交易執行和查詢的效率;交易信息中一部分數據來源于企業原有區塊鏈,同時跨鏈交易中每個階段的信息也保存在鏈上,在保證數據安全、不可篡改的同時,也做到了交易信息的可信可溯。
(4)在Hyperledger Fabric平臺實現對水產品跨鏈交易模型的應用,系統性能測試的結果表明水產品跨鏈交易模型的可靠性與適用性,保證水產品在鏈間交易安全可信的同時,也保證了跨鏈交易的效率與成功率。