季超越 郭仲勇 岳勇



摘 ?要:超級賬本是聯盟鏈的代表,支持智能合約的應用。該文介紹了超級賬本智能合約鏈碼的編寫、鏈碼的安裝與調用、鏈碼的執行過程等基礎知識。最后介紹了一種對超級賬本API的封裝,包括Go、Java、Node語言等框架。它以聯盟鏈或BaaS的方式幫助企業更加高效、安全地部署區塊鏈應用。區塊鏈開發者能夠快速建立自己所需的開發環境,高效快捷地完成智能合約的編寫、部署、執行、區塊查詢等功能。
關鍵詞:聯盟鏈;智能合約;背書策略;容器;Peer節點;封裝
中圖分類號:TP311.1 ? ? 文獻標識碼:A 文章編號:2096-4706(2020)04-0176-04
Abstract:Hyperledger Fabric is the representative of the consortium blockchain,it supports the smart contracts.This paper introduces some basic knowledge about coding,installation,call and execution of smart contract. Finally it introduces the encapsulation of Hyperledger Fabrics API,including Go,Java,Node and other programming languages.The encapsulation helps companies to deploy blockchain application more efficiently and securely by consortium blockchain or BaaS. Blockchain developers can build their own development environments quickly,accomplish the coding,deployment,execution,block query and other functions of the smart contract efficiently.
Keywords:consortium blockchain;smart contract;endorsement policy;container;Peer node;encapsulation
0 ?引 ?言
超級賬本(Hyperledger)是IBM貢獻的一個開源項目。它首次將區塊鏈技術引入到了分布式聯盟賬本的應用場景。超級賬本項目中提出和實現了許多創新的設計和理念,包括完備的權限和審查管理、細粒度隱私保護,以及可拔插、可擴展的實現框架,對于區塊鏈相關技術和產業的發展都將產生深遠的影響[1]。
智能合約作為區塊鏈上運行的一段由用戶自定義的代碼,給了用戶極大的自由空間來操作鏈上數據[2]。智能合約在數據校驗、數據交易、數據共享等方面發揮著重大作用[3]。通過智能合約,用戶可以開發出適用于本身業務場景的代碼,使區塊鏈架構適用于自身的業務需求。掌握智能合約的開發和設計,是區塊鏈架構應用落地的關鍵步驟。不同的區塊鏈架構對智能合約的支持有所不同,開發智能合約所用的語言,以及需要遵循的協議也不相同[4]。本文基于超級賬本來研究智能合約在實際應用中的設計實施方案。超級賬本目前支持用Go、Java、Node來編寫鏈碼,本文使用Go語言來實現。
筆者所在公司主打信息安全與區塊鏈應用研發的方向,對各大知名區塊鏈架構都有深入的研究。并且公司內部擁有一套自主研發的區塊鏈技術架構,申請有數個相關專利。現將數月的研究成果總結,來進行技術上的交流分享。
1 ?超級賬本中智能合約的簡介
1.1 ?鏈碼簡介
智能合約對于區塊鏈開發人員來說是一個熟悉的概念,而智能合約在Fabric中,通常被稱為鏈碼。用戶在鏈碼中實現相關的接口,通過官方提供的API來操作賬本,實現對賬本的增刪改查。在Fabric系統中鏈碼分為系統鏈碼和用戶鏈碼,系統鏈碼集成于Fabric網絡中,無需用戶自己安裝。系統鏈碼用來實現系統層面的功能,包括系統的配置,用戶鏈碼的部署、升級,用戶交易的簽名和驗證策略等;用戶鏈碼用于實現用戶自己的應用功能[5]。用戶根據需求編寫好相應的鏈碼后,需將其安裝在Fabric網絡中。用戶鏈碼安裝并實例化成功后可通過兩種方式來調用:(1)在安裝了Fabric節點的系統中,可直接通過命令的方式來調用,這種方式一般適用于開發人或是管理人員。(2)通過SDK開發出客戶端來調用,這種方式相對來說更加靈活、友好,面向用戶時需要使用這種方式。
鏈碼通常是由Go語言來編寫,也支持其他語言(Java、Node.js)。開發人員需要在鏈碼中實現系統指定好的接口。開發人員可以通過鏈碼來操作賬本,賬本的存儲是K-V結構的,每條記錄都需要一個獨一的key來表示,通過鏈碼可以實現增加一條記錄、查詢某個key對應的值、修改key的當前值、刪除key。一段鏈碼創建的賬本狀態是與其他鏈碼互相隔離的,故而不能被其他鏈碼直接訪問。不過,如果是在相同的網絡中,一段鏈碼在獲取相應許可后,則可以調用其他鏈碼來訪問它的賬本。
鏈碼運行在一個受保護的Docker容器當中,與節點的運行互相隔離。通過gRPC協議與相應的Peer節點進行交互,以操作分布式賬本中的數據。容器將會在用戶實例化鏈碼或是調用鏈碼時被啟動。
1.2 ?鏈碼的背書策略
背書策略是背書節點判定一項交易是否能夠被認可的依據。鏈碼實例化時可指定背書策略。當記賬節點接收到交易時,會獲知相關鏈碼信息,然后檢查鏈碼的背書策略,判斷交易是否滿足背書策略[6]。
背書策略可分為主體Principal(P)和閾值Threshold(T)兩部分。Principal指定由哪些成員進行背書。Threshold接受兩個輸入,分別為閾值T和若干個P的集合n,只要交易中包含了n中t個成員的背書則認為交易合法。通過主題和閾值相結合的方式,可靈活地設定需要背書的企業成員。
1.3 ?系統鏈碼
系統鏈碼與用戶鏈碼有相同的編程模型,但系統鏈碼運行在Peer節點,用戶鏈碼則在隔離的容器中運行。因此,系統鏈碼內置在Peer節點的可執行文件中,不遵循用戶鏈碼的生命周期。系統鏈碼用于減少Peer節點與用戶鏈碼進行gRPC通信的開銷,同時權衡管理的靈活性。系統鏈碼只能通過Peer節點的二進制文件升級,必須通過一組固定的參數進行注冊,但不具有背書策略。
Hyperledger Fabric系統鏈碼實現了一系列系統功能,以便系統集成人員能夠根據需求對其進行修改與替換。常見系統鏈碼如下[7]:(1)生命周期系統鏈碼(LSCC):管理鏈碼的生命周期。(2)配置系統鏈碼(CSCC):處理在Peer節點上的通道配置。(3)查詢系統鏈碼(QSCC):提供查詢的賬本API,例如獲取交易信息、區塊信息等。(4)背書系統鏈碼(ESCC):通過簽名交易提案響應處理背書過程。(5)驗證系統鏈碼(VSCC):處理交易驗證,包括檢查背書策略以及多進程并發控制。
2 ?鏈碼的編寫
2.1 ?鏈碼的基本格式
編寫鏈碼需要符合官方的基本格式要求,才能夠正常地在鏈上運行,并執行業務。超級賬本編寫鏈碼所遵循的格式要求非常簡單,開發人員可以輕松地掌握,并熟練應用。開發鏈碼需要遵循的格式要求如下:(1)引入基礎包:首先要引入最重要的兩個包:Shim和Peer,這兩個包提供了操作賬本的接口,和數據返回的結構。(2)復寫Init方法:鏈碼接口中總共有兩個接口需要復寫,Init是其中之一,該方法在初始化鏈碼時執行,可完成對賬本的初始化,或是初始化一些基本業務數據。(3)復寫Invoke方法:Invoke是業務執行時所調用的方法,所有的業務都要在該方法中完成。
2.2 ?鏈碼的API
下面介紹一下Fabric為用戶提供的操作賬本的API。超級賬本Fabric提供了豐富的接口,給用戶極大的自由空間來操作賬本。通過這些接口用戶可以靈活地操作鏈上數據。
2.2.1 ?獲得調用的參數
(1)GetArgs() [][]byte:返回以byte數組的形式的參數列表。(2)GetStringArgs() []string:返回字符串格式的參數列表。(3)GetFunctionAndParameters() (string, []string):將參數分為兩部分,第一個參數作為函數名,其余的參數作為參數列表。(4)GetArgsSlice() ([]byte, error):返回byte切片的形式獲得參數列表。
2.2.2 ?增刪改查StateDB
(1)PutState(key string, value []byte) error:存入數據庫,若key已存在則修改。(2)DelState (key string) error:刪除key。(3)GetState(key string) ([]byte, error):查詢某個key對應的value值,返回byte數組數據,需要轉換為string。(4)GetStateByRange(startKey, endKey string)** (StateQu- eryIteratorInterface , error):批量查詢某個區間內的記錄。(5)GetHistoryForKey(key string) ( HistoryQueryIterato- rInterface , error):獲取某個key的修改歷史記錄。
2.2.3 ?復合鍵處理
(1)CreateCompositeKey(objectType string, attributes []string) (string, error):根據某個對象生成復合鍵。(2)Split CompositeKey(compositeKey string) (string, [] string , error):根據復合鍵拆分得到對象類型,屬性字符串數組。
2.2.4 ?獲取當前用戶證書
GetCreator() ([]byte, error):獲得調用本鏈碼的客戶端的用戶證書。
2.2.5 ?調用鏈碼
InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response:在本鏈碼中調用其它通道上已經部署好的鏈碼。
2.2.6 ?獲取提案對象屬性
(1)GetSignedProposal() (*pb.SignedProposal, error):獲得當前的提案對象包括客戶端對提案的簽名。(2)GetTransient() (map[string][]byte, error):返回提案對象的Payload的屬性。(3)GetTxTimestamp() (*timestamp.Timestamp, error):獲得交易時間戳。(4)GetBinding() ([]byte, error):獲得Binding對象,返回提案對象的proposal.Header中SignatureHeader.Nonce、SignatureHeader.Creator和ChannelHeader.Epoch的組合。
2.2.7 ?事件設置
SetEvent(name string, payload []byte) error:當鏈碼提交完畢,會通過事件的方式通知客戶端,通知的內容可以通過SetEvent設置。
3 ?鏈碼的安裝與調用
鏈碼可以通過兩種方式安裝到Fabric網絡上,通過命令直接安裝或是通過SDK安裝。
目前,Fabric提供了package、install、instantiate和upgrade四個命令管理鏈碼生命周期。后續計劃會加入stop和start命令來啟用以及停用已經部署好的鏈碼。這里先來討論前面四個命令,它們的生命周期的轉換如圖1所示。
一個創建完成鏈碼經過install的操作,安裝到Peer節點中。安裝完成后在該鏈中任一安裝過的節點進行實例化(instantiate),鏈碼即進入正常運行階段。實例化鏈碼只需要一次。鏈碼實例化完成以后,如果需要進行改動,可通過升級(upgrade)命令來完成。實例化和升級的命令執行時都會執行鏈碼中的Init方法,所以在升級鏈碼時,一定要注意避免Init方法對已有的數據造成影響。下面對控制鏈碼生命周期的指令做簡單的介紹:(1)package:鏈碼打包的方法有兩種,一種是打包成多所有者的鏈碼,需要先創建一個被簽名的鏈碼包(SignedCDS),然后將其按順序地傳遞給其他所有者簽名;一種是打包單個所有者持有的鏈碼。(2)signpackage:在創建階段就被簽名的鏈碼包能夠交給其他所有者進行檢查與簽名,支持帶外對鏈碼進行簽名。當在某些通道上實例化鏈碼時,背書策略是在帶外確定的,用于提供合適的MSP主體。如果沒指定實例化策略,則默認的策略就是通道的任何MSP管理員。(3)install:將鏈碼的源代碼打包成Chaincode Deployment Spec(CDS)的規定的格式,然后安裝到通道中的背書節點上。當安裝的鏈碼包只包含一個Chaincode Deployment Spec時,將使用默認初始化策略并包括一個空的所有者列表。(4)instantiate:實例化調用生命周期系統鏈碼用于創建及初始化通道上的鏈碼。鏈碼能夠在任意數量的通道上實例化,并在每個通道上單獨調用。一個節點上的鏈碼在多個通道實例化時,每個通道的狀態仍是隔離的。實例化的創建者必須滿足包含在SignedCDS內鏈碼的實例化策略,而且還必須是通道的寫入器(作為通道創建的一部分被配置)。可以防止部署鏈碼的流氓實體或者欺騙者在未被綁定的通道上執行鏈碼。(5)upgrade:鏈碼的升級時需要改變鏈碼的版本號(作為SignedCDS的一部分)。SignedCDS另外的部分,如所有者及實例化策略都是可選的。然而,鏈碼的名稱前后必須保持一致,否則會被當作另外一個新的鏈碼。在升級前,必須將新版本的鏈碼安裝到需求的背書節點上。升級也是一種交易,會把新版本的鏈碼綁定到通道中。升級只會對升級的通道產生影響,其他通道仍然運行舊版本的鏈碼。
4 ?鏈碼的執行過程
鏈碼運行在單獨的Docker容器當中,與節點相隔離。節點與容器之間通過gRPC協議進行通信[8]。在鏈碼執行過程中,節點與容器之間交互的流程圖如圖2所示。
(1)首先是客戶端發起請求到Fabric的Peer節點[9]。(2)節點收到請求后,向Chaincode容器發起請求,執行鏈碼。鏈碼執行過程中會涉及到對狀態數據庫的增刪改查操作。執行GetState時,容器通過節點訪問本地的狀態數據庫,獲取到狀態數據,執行GutState時,節點將數據狀態緩存在本地,此時并不修改狀態數據庫。(3)鏈碼執行完成后返回給客戶端執行結果并簽名信息。客戶端收集到足夠的成功消息后,會將信息提交給Orderer節點。
5 ?提供BaaS或聯盟鏈服務
5.1 ?BaaS服務
為了降低區塊鏈網絡的使用門檻,減輕企業應用區塊鏈技術的工作量。目前已有許多的區塊鏈架構開源項目,其中最為有名的就是Linux基金會發起的Hyperledger。下面介紹一下一套成熟的BaaS框架應當具有的基本功能:(1)客戶端管理:提供用戶賬號的管理操作,例如生成新的用戶賬號、對用戶權限的配置與管理、查詢現有的用戶,及其基本的系統登錄記錄。(2)合約管理:提供合約的基本管理,如合約的生命周期管理,包括合約的安裝、實例化、升級等;提供合約的基本信息查詢。(3)通道管理:提供對通道的基本管理與操作,例如通道的創建,查看通道的組織信息、節點信息、鏈碼信息等。
通過BaaS服務,用戶可以在不知道底層區塊鏈技術的情況下,使用區塊鏈技術存儲數據。所以BaaS服務應當具有如下特點:(1)簡單易用:簡單的操作流程,讓用戶可以輕易上手。(2)封裝性:將底層技術進行封裝,僅暴露給用戶一些簡單易用的接口,降低用戶的學習成本。(3)靈活性:給用戶更多的權限和接口,方便用戶對區塊鏈系統的管理,并且保證系統的安全性不受到破壞。
綜合上述功能及特點并結合區塊鏈本身的特性,要開發出一套性能穩定,靈活易用的區塊鏈BaaS服務,筆者在這里提出一套更加靈活適用的BaaS數據流程,如圖3所示。
5.2 ?聯盟鏈
對超級賬本API進行封裝,幫助企業更加高效、安全地搭建超級賬本聯盟鏈、部署區塊鏈應用。封裝后的聯盟鏈對區塊鏈開發者友好,能夠輔助其快速的完成開發環境搭建、智能合約的編寫及部署、區塊查詢等功能。總結其主要特點如下[10]:(1)穩定性強:對于任何系統而言,穩定性都是至關重要的,鑒于聯盟鏈的分布式特性,以及區塊鏈共識機制的復雜性,想要構建一個穩定性強的聯盟鏈并不簡單。(2)效率高:聯盟鏈是一個分布式架構,使分布式系統達成共識,需要一定的時間。如何縮短達成共識的時間,是聯盟鏈提高效率的關鍵。超級賬本采用特殊的共識機制,可運行于solo或是kafka模式,共識效率相對較高。(3)容錯性好:不同的區塊鏈應用場景對容錯能力的要求也不同,有些需要具有拜占庭容錯能力,而有些只需要具有對崩潰故障容錯的能力即可[11]。鑒于聯盟鏈的成員是身份確知的,一般僅需要對崩潰故障容錯的支持。
6 ?結 ?論
當前,區塊鏈技術已經在金融、物聯網、社交、醫療、檔案、司法、版權[12]等場景實現了技術落地。區塊鏈賦能實體產業之路發展前景廣闊[13],隨著區塊鏈技術的深入應用,需要不斷探索區塊鏈應用價值和技術創新。技術創新支撐和驅動商業模式創新,助力行業應用的落地進而產生新的經濟模型[14]。
超級賬本具備很好的保密性、可伸縮性、靈活性和可擴展性等特點,使用超級賬本來構建、運行和執行使用多種語言編寫的智能合約,具有契約成本低、人為干預風險較低、執行高效準確等優點。
參考文獻:
[1] 楊保華,陳昌.區塊鏈原理、設計與應用 [M].北京:機械工業出版社,2017.
[2] 付夢琳,吳禮發,洪征,等.智能合約安全漏洞挖掘技術研究 [J].計算機應用,2019,39(7):1959-1966.
[3] 周潤,盧迎.智能合約對我國合同制度的影響與對策 [J].南方金融,2018(5):93-98.
[4] 納拉揚·普魯斯蒂.區塊鏈項目開發指南 [M].朱軒彤,閆鶯,董寧,譯.北京:機械工業出版社,2017.
[5] 馮翔,劉濤,吳壽鶴,等.區塊鏈開發實戰:Hyperledger Fabric關鍵技術與案例分析 [M].北京:機械工業出版社,2018:121-138.
[6] 張增駿,董寧,朱軒彤,等.深度探索區塊鏈:Hyperledger技術與應用 [M].北京:機械工業出版社,2018:61- 69.
[7] 楊毅.HyperLedger Fabric開發實戰:快速掌握區塊鏈技術 [M].北京:電子工業出版社,2018:160-177.
[8] 史文斌.基于Hyperledger Fabric的區塊鏈應用系統云服務化 [D].杭州:浙江大學,2018.
[9] 張海寧.超級賬本:助力企業級區塊鏈應用與開發 [C].《IMI研究動態》2017年上半年合輯.北京:《IMI 研究動態》編輯部,2017:565-570.
[10] ANDROULAKI E,BARGER A,BORTNIKOV V,et al.Hyperledger Fabric:A Distributed Operating System for Permissioned Blockchains [C]// Proceedings of EuroSys 2018 conference,2018:30.
[11] 邵奇峰,金澈清,張召,等.區塊鏈技術:架構及進展 [J].計算機學報,2018,41(5):969-988.
[12] 華劼.區塊鏈技術與智能合約在知識產權確權和交易中的運用及其法律規制 [J].知識產權,2018(2):13-19.
[13] 陳德,姜新旺,王艷霞,等.基于Hyperledger的自交易共享平臺解決方案 [J].計算機時代,2018(1):20-22+26.
[14] 尹稚淳,李航.基于超級賬本技術的電子合同解決方案 [J].現代計算機(專業版),2018(11):86-90.
作者簡介:季超越(1994-),男,漢族,河南淮陽人,高級工程師,本科,主要研究方向:供應鏈金融、區塊鏈。