區(qū)塊鏈技術(shù):區(qū)塊鏈系統(tǒng)合約介紹

[FISCO BCOS系統(tǒng)合約介紹](#FISCO BCOS系統(tǒng)合約介紹)

一鍵部署區(qū)塊鏈

設(shè)計(jì)概述

FISCO BCOS區(qū)塊鏈為了滿足準(zhǔn)入控制、身份認(rèn)證、配置管理、權(quán)限管理等需求,在網(wǎng)絡(luò)啟動之初,會部署一套功能強(qiáng)大、結(jié)構(gòu)靈活且支持自定義擴(kuò)展的智能合約,統(tǒng)稱系統(tǒng)合約。

系統(tǒng)合約原則上由區(qū)塊鏈管理員在網(wǎng)絡(luò)啟動之初部署全網(wǎng)生效。若是在網(wǎng)絡(luò)運(yùn)行期間重新部署變更升級,則需要在全網(wǎng)所有節(jié)點(diǎn)許可的情況下由區(qū)塊鏈管理員來執(zhí)行操作。

當(dāng)前FISCO BCOS系統(tǒng)合約主要有五個模塊,系統(tǒng)代理模塊、節(jié)點(diǎn)管理模塊、機(jī)構(gòu)證書模塊、權(quán)限管理模塊、全網(wǎng)配置模塊。系統(tǒng)合約的模塊可以根據(jù)需要自定義擴(kuò)展,它既可以供區(qū)塊鏈核心調(diào)用也可以對DAPP提供服務(wù)。每個模塊由一個或多個智能合約來實(shí)現(xiàn)。模塊結(jié)構(gòu)圖如下:

模塊圖

實(shí)現(xiàn)概述

當(dāng)前FISCO BCOS對系統(tǒng)代理模塊、節(jié)點(diǎn)管理模塊、機(jī)構(gòu)證書模塊、權(quán)限管理模塊、全網(wǎng)配置模塊都做了對應(yīng)的合約實(shí)現(xiàn)。合約源代碼目錄為systemcontractv2/。下面依次介紹各個合約實(shí)現(xiàn)的接口與邏輯。

系統(tǒng)代理合約

SystemProxy.sol是系統(tǒng)代理模塊的實(shí)現(xiàn)合約。它實(shí)現(xiàn)了路由到合約地址的命名服務(wù),提供了系統(tǒng)合約的統(tǒng)一入口。內(nèi)部實(shí)現(xiàn)中是通過mapping類型成員變量_routes來維護(hù)所有的路由表信息。路由表信息項(xiàng)的數(shù)據(jù)結(jié)構(gòu)主要是:

struct SystemContract {
        address _addr;      #合約地址
        bool _cache;        #緩存標(biāo)志位
        uint _blocknumber;  #生效區(qū)塊高度
    }   

主要接口如下:

接口 輸入?yún)?shù) 輸出參數(shù) 說明
getRoute string key#路由名稱 address, bool,uint # 合約地址,緩存標(biāo)志位,生效區(qū)塊高度 獲取路由信息
setRoute string key, address addr, bool cache# 路由名稱,合約地址,緩存標(biāo)志位,生效區(qū)塊高度 設(shè)置路由信息,若該路由名稱已存在,則覆蓋

節(jié)點(diǎn)管理合約

NodeAction.sol是節(jié)點(diǎn)管理模塊的實(shí)現(xiàn)合約。它實(shí)現(xiàn)了對網(wǎng)絡(luò)中所有節(jié)點(diǎn)列表信息的登記、管理、維護(hù)功能。每當(dāng)網(wǎng)絡(luò)中有節(jié)點(diǎn)加入或退出都必須與節(jié)點(diǎn)管理合約進(jìn)行交互。

在FISCO BCOS中節(jié)點(diǎn)分為三種類型:核心節(jié)點(diǎn)、全節(jié)點(diǎn)、輕節(jié)點(diǎn)。

enum NodeType{
        None,
        Core,   //核心 
        Full,   //全節(jié)點(diǎn) 
        Light   //輕節(jié)點(diǎn) 
    }

節(jié)點(diǎn)信息的數(shù)據(jù)結(jié)構(gòu)是:

struct NodeInfo{
        string      id;         #節(jié)點(diǎn)身份ID    
        string      ip;         #機(jī)器IP       
        uint        port;       #機(jī)器端口
        NodeType    category;   #節(jié)點(diǎn)類型
        string      desc;       #節(jié)點(diǎn)描述 
        string      CAhash;     #節(jié)點(diǎn)機(jī)構(gòu)證書哈希
        string      agencyinfo; #節(jié)點(diǎn)其他信息
        uint        idx;        #節(jié)點(diǎn)序號
        uint        blocknumber;#區(qū)塊高度
    }

主要接口如下:

接口 輸入?yún)?shù) 輸出參數(shù) 說明
registerNode string _id,string _ip,uint _port,NodeType _category,string _desc,string _CAhash,string _agencyinfo,uint _idx #節(jié)點(diǎn)身份ID、IP、端口、節(jié)點(diǎn)類型、節(jié)點(diǎn)描述、節(jié)點(diǎn)CA哈希、節(jié)點(diǎn)agency、節(jié)點(diǎn)序號 bool #注冊結(jié)果 注冊節(jié)點(diǎn) ,若該節(jié)點(diǎn)信息已存在,則忽略
cancelNode string _id #節(jié)點(diǎn)身份ID bool #注冊結(jié)果 注銷節(jié)點(diǎn),若該節(jié)點(diǎn)信息不存在,則忽略

機(jī)構(gòu)證書合約

CAAction.sol是機(jī)構(gòu)證書模塊的實(shí)現(xiàn)合約。它實(shí)現(xiàn)了對網(wǎng)絡(luò)中所有節(jié)點(diǎn)的機(jī)構(gòu)證書信息的登記、管理、維護(hù)功能。當(dāng)網(wǎng)絡(luò)啟用機(jī)構(gòu)證書驗(yàn)證功能的情況下,網(wǎng)絡(luò)中節(jié)點(diǎn)加入或退出都需要與機(jī)構(gòu)證書合約進(jìn)行交互。

機(jī)構(gòu)證書的數(shù)據(jù)結(jié)構(gòu)是:

struct CaInfo{
        string  hash;       #節(jié)點(diǎn)機(jī)構(gòu)證書哈希
        string pubkey;      #證書公鑰
        string orgname;     #機(jī)構(gòu)名稱
        uint notbefore;     #證書啟用日期
        uint notafter;      #證書失效時(shí)間
        CaStatus status;    #證書狀態(tài)
        string    whitelist;#IP白名單
        string    blacklist;#IP黑名單
        uint    blocknumber;#生效區(qū)塊高度
      }

主要接口如下:

接口 輸入?yún)?shù) 輸出參數(shù) 說明
update string _hash,string _pubkey,string _orgname,uint _notbefore,uint _notafter,CaStatus _status,string _whitelist,string _blacklist # 證書哈希、證書公鑰、機(jī)構(gòu)名稱、 證書啟用日期、 證書失效時(shí)間、證書狀態(tài)、IP白名單、IP黑名單 bool #更新結(jié)果 更新證書信息, 若該證書信息不存在,則新建證書記錄
get string _hash#證書哈希 string,string,string,uint,uint,CaStatus,uint# 證書哈希、證書公鑰、機(jī)構(gòu)名稱、證書啟用日期、證書失效時(shí)間、證書狀態(tài)、生效區(qū)塊塊號 查詢證書信息

權(quán)限管理合約

FISCO BCOS基于角色的身份權(quán)限設(shè)計(jì)有三要點(diǎn):一個外部賬戶只屬于一個角色;一個角色擁有一個權(quán)限項(xiàng)列表; 一個權(quán)限項(xiàng)由合約地址加上合約接口來唯一標(biāo)識。

當(dāng)前FISCO BCOS權(quán)限管理模塊主要由TransactionFilterChain.sol、TransactionFilterBase.sol、AuthorityFilter.sol、Group.sol四個合約來實(shí)現(xiàn)。

TransactionFilterChain是對Filter模型的實(shí)現(xiàn)框架。它在內(nèi)部維護(hù)了一個實(shí)現(xiàn)繼承于TransactionFilterBase的Filter合約地址列表。它對區(qū)塊鏈核心提供了統(tǒng)一的權(quán)限檢查接口process。process執(zhí)行過程中會對Filter合約地址列表中的所有Filter依次執(zhí)行process函數(shù),以完成所有需要的權(quán)限檢查。

TransactionFilterBase是Filter的基類合約。所有Filter必須要實(shí)現(xiàn)它的process接口。AuthorityFilter是繼承于TransactionFilterBase的角色權(quán)限Filter實(shí)現(xiàn)。它的process接口實(shí)現(xiàn)了對用戶所屬角色組的權(quán)限項(xiàng)進(jìn)行檢查邏輯。

Group是對角色的實(shí)現(xiàn)。它內(nèi)部維護(hù)了該角色的所有權(quán)限項(xiàng)的mapping標(biāo)志位。

主要接口如下:

合約 接口 輸入?yún)?shù) 輸出參數(shù) 說明
TransactionFilterBase process address origin, address from, address to, string func, string input# 用戶外部賬戶、交易發(fā)起賬戶、合約地址、合約接口、交易輸入數(shù)據(jù) bool#處理結(jié)果 權(quán)限檢查
Group setPermission address to, string func, bool perrmission# 合約地址、合約接口、權(quán)限標(biāo)記 bool#處理結(jié)果 設(shè)置角色權(quán)限項(xiàng)

全網(wǎng)配置合約

ConfigAction.sol是全網(wǎng)配置模塊的實(shí)現(xiàn)合約。它維護(hù)了FISCO BCOS區(qū)塊鏈中全網(wǎng)運(yùn)行的可配置信息。 配置信息可以通過交易廣播上鏈來達(dá)到全網(wǎng)配置的一致性更新。原則上只能由區(qū)塊鏈管理員來發(fā)出全網(wǎng)配置更新交易。

ConfigAction.sol的內(nèi)部實(shí)現(xiàn)中維護(hù)了配置項(xiàng)信息的mapping 成員變量。

主要接口如下:

接口 輸入?yún)?shù) 輸出參數(shù) 說明
set string key, string value# 配置項(xiàng)、配置值 設(shè)置配置項(xiàng)
get string key #配置項(xiàng) string, uint# 配置值、生效區(qū)塊高度 查詢配置值

當(dāng)前FISCO BCOS主要有以下全網(wǎng)配置項(xiàng):

配置項(xiàng) 說明 默認(rèn)值 推薦值
maxBlockHeadGas 塊最大GAS (16進(jìn)制) 200000000 20000000000
intervalBlockTime 塊間隔(ms) (16進(jìn)制) 1000 1000
maxBlockTranscations 塊最大交易數(shù)(16進(jìn)制) 1000 1000
maxNonceCheckBlock 交易nonce檢查最大塊范圍(16進(jìn)制) 1000 1000
maxBlockLimit blockLimit超過當(dāng)前塊號的偏移最大值(16進(jìn)制) 1000 1000
maxTranscationGas 交易的最大gas(16進(jìn)制) 20000000 20000000
CAVerify CA驗(yàn)證開關(guān) FALSE FALSE

自定義擴(kuò)展

示例1-自定義業(yè)務(wù)配置合約

假設(shè)業(yè)務(wù)需要利用系統(tǒng)合約框架,自定義業(yè)務(wù)配置合約以對業(yè)務(wù)相關(guān)合約提供配置服務(wù)。大體可以參考以下步驟來擴(kuò)展:

  1. 根據(jù)業(yè)務(wù)合約需求,實(shí)現(xiàn)業(yè)務(wù)配置合約的設(shè)置配置項(xiàng)接口set和查詢配置值接口get。
  2. 部署業(yè)務(wù)配置合約,獲得業(yè)務(wù)配置合約鏈上地址。
  3. 調(diào)用系統(tǒng)代理合約SystemProxy的setRoute接口,將業(yè)務(wù)配置合約地址注冊到路由表中。
  4. 至此,業(yè)務(wù)配置合約已經(jīng)完成在系統(tǒng)代理合約的路由注冊,已可在業(yè)務(wù)交易中調(diào)用。

業(yè)務(wù)配置合約的使用方法:

  1. 調(diào)用SystemProxy的getRoute接口運(yùn)行時(shí)獲得業(yè)務(wù)配置合約地址。
  2. 通過業(yè)務(wù)配置合約地址調(diào)用查詢配置值接口get獲得配置值。

示例2-自定義業(yè)務(wù)權(quán)限Filter合約

假設(shè)業(yè)務(wù)需要增加業(yè)務(wù)權(quán)限校驗(yàn)邏輯,則可以利用權(quán)限管理合約的Filter機(jī)制來無縫擴(kuò)展。大體可以參考以下步驟來擴(kuò)展:

  1. 繼承于TransactionFilterBase實(shí)現(xiàn)一個業(yè)務(wù)權(quán)限Filter合約,業(yè)務(wù)權(quán)限Filter合約根據(jù)業(yè)務(wù)需要的權(quán)限校驗(yàn)邏輯實(shí)現(xiàn)process接口。
  2. 部署業(yè)務(wù)權(quán)限Filter合約,獲得對應(yīng)的合約地址。
  3. 調(diào)用系統(tǒng)代理合約SystemProxy的getRoute接口,獲得TransactionFilterChain合約地址。
  4. 調(diào)用TransactionFilterChain合約的addFilter接口,將業(yè)務(wù)權(quán)限Filter合約地址注冊到Filter合約列表中。
  5. 至此,業(yè)務(wù)權(quán)限Filter合約已經(jīng)啟用。
    獲取更多精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容