- 區塊鏈國產化實踐指南:基于Fabric 2.0
- 王雅震編著
- 1255字
- 2022-04-13 16:10:51
2.1 配置的形式
Fabric項目涉及較多的技術領域,如Go語言、PKI證書體系、Docker容器等,因而配置來源有多種形式,歸納總結如下。
●硬編碼的默認配置。如internal/peer/common/common.go中的const CmdRoot="core",orderer/common/localconfig/config.go中的var Defaults=TopLevel{...},在源碼中常以全局變量或常量的形式存在。
●隱藏的配置項。與硬編碼的默認配置稍有區別,它是一種配置文件中通常沒有明確顯示,但源碼在獲取配置時使用的對應數據結構中存在的配置項。如sampleconfig/core.yaml中peer.BCCSP.PKCS11部分的配置,在源碼中被讀取時對應使用的是bccsp/pkcs11/conf.go中的PKCS11Opts結構體,該結構體中存在SoftVerify、Immutable這兩個配置項,但sampleconfig/core.yaml中peer.BCCSP.PKCS11中并沒有這兩個配置項。此類配置較為邊緣,但確實存在,一般使用默認值。
●配置文件。以文件形式呈現的配置,包括Fabric區塊鏈網絡配置文件和節點配置文件。網絡配置文件,如生成創世紀塊、應用通道配置交易的configtx.yaml。節點配置文件,如orderer節點啟動時讀取的orderer.yaml、peer節點啟動時讀取的core.yaml。
●環境變量。比較典型的為啟動Docker容器時所配置的環境變量,如FABRIC_CFG_PATH,定義了節點使用的配置文件的路徑。
●命令行參數。如執行peer chaincode install -p時,通過-p指定鏈碼源碼路徑。
Fabric使用上述配置形式的配置,有如下兩個特性。
●配置的優先級和覆蓋。當一個節點啟動時,同一個配置項可能在多處均有配置,但優先級不一樣。上述配置形式中,優先級從上到下遞增,即命令行參數的配置值會覆蓋環境變量的配置值,環境變量的配置值會覆蓋配置文件的配置值,配置文件的配置值會覆蓋代碼中硬編碼的默認配置值。
●配置間的對應關系。節點(orderer或peer)是網絡的組成部分,基于此,節點的配置值要服從網絡的配置值。典型地,如configtx.yaml中定義了一個組織的MSP ID,若一個節點屬于該組織,其使用的MSP ID自然是configtx.yaml中已經定義好的值。
在具體部署時,節點一般以Docker容器的形式運行。在官方的默認鏡像中,peer.yaml、orderer.yaml分別在peer節點容器、orderer節點容器中的/etc/hyperledger/fabric目錄下。節點在配置文件的配置項和容器的環境變量是一一對應的,如core.yaml中peer下的id配置項,對應的環境變量為CORE_PEER_ID。再如orderer.yaml中General下的LedgerType配置項,對應的環境變量為ORDERER_GENERAL_LEDGERTYPE,依此類推。
提示
為釋義清晰,本書在講述源碼的過程中,若涉及配置,也會以A.B.C的形式進行引用,如core.peer.id,指core.yaml中peer下的id配置項。
在源碼層面,Fabric配置的管理主要使用第三方庫viper(項目倉庫為spf13/viper)實現。viper可以對環境變量、YAML/JSON等格式的配置文件,甚至是遠程配置,進行讀取和設置,是一個專用于處理配置的解決方案。viper提供的配置具有優先級,由低到高為“硬編碼的默認配置 < 配置文件 < 環境變量 < 命令行參數 < viper.Set函數”。此外,viper對于配置項的大小寫是不敏感的,在讀取配置時,viper均會將配置項轉化為小寫,如對于3個配置abc=1、ABC=1或AbC=1,viper均視為同一個配置項abc。
viper的典型用法,也是Fabric使用的方式,如代碼清單2-1所示。
代碼清單2-1 viper的典型用法
1. //1.viper讀取環境變量
2. viper.SetEnvPrefix("CORE") //設置環境變量前綴,若為core,會將core變為大寫并設為前綴
3. viper.AutomaticEnv() //獲取當前系統所有以CORE為前綴的環境變量
4. replacer := strings.NewReplacer(".", "_") //將環境變量名稱中的 . 換成 _
5. viper.SetEnvKeyReplacer(replacer)
6. //2.viper獲取配置文件
7. viper.SetConfigName("config_name") //設置配置文件名,不包含后綴,viper自動判斷
8. viper.AddConfigPath("/app/config/path")
9. viper.AddConfigPath(".") //設置查找配置文件的路徑,可以有多個
10. viper.ReadInConfig() //讀取配置文件中的所有配置項
11. viper.Get("common.name") //獲取common下name項的值
12. viper.Set("common.name", "Bill") //將common下name項的值設置為Bill
- C# 7 and .NET Core Cookbook
- Arduino by Example
- x86匯編語言:從實模式到保護模式(第2版)
- Groovy for Domain:specific Languages(Second Edition)
- Banana Pi Cookbook
- Node.js全程實例
- Web Development with MongoDB and Node(Third Edition)
- Visual FoxPro程序設計習題集及實驗指導(第四版)
- Tableau 10 Bootcamp
- iOS自動化測試實戰:基于Appium、Python與Pytest
- Python+Tableau數據可視化之美
- Web前端應用開發技術
- R數據科學實戰:工具詳解與案例分析
- Rust游戲開發實戰
- Python:Deeper Insights into Machine Learning