摘要:兄弟連區(qū)塊鏈教程源代碼分析根命令入口及加載子命令二。此處傳入為,將模塊日志級別設(shè)置為,并會將初始化為。代碼在目錄下包括。核心代碼為,目的是在或?yàn)榭諘r設(shè)置默認(rèn)值。感謝關(guān)注兄弟連區(qū)塊鏈教程分享
兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令二。
flogging,即:fabric logging,為Fabric基于第三方包go-logging封裝的日志包,go-logging使用方法參考:github.com/op/go-logging
如下代碼為flogging包的初始化函數(shù):
func init() { ????logger = logging.MustGetLogger(pkgLogID) //創(chuàng)建僅在flogging包內(nèi)代碼使用的logging.Logger對象 ????Reset() //全局變量初始化為默認(rèn)值 ????initgrpclogger() //初始化gRPC Logger,即創(chuàng)建logging.Logger對象,并用這個對象設(shè)置grpclog } //代碼在common/flogging/logging.go
init()執(zhí)行結(jié)束后,peer/main.go中調(diào)用flogging.InitFromSpec(loggingSpec),將再次初始化全局日志級別為loggingSpec,之前默認(rèn)為logging.INFO。
func InitFromSpec(spec string) string代碼如下。
其中spec格式為:[
此處傳入spec為"",將""模塊日志級別設(shè)置為defaultLevel,并會將modules初始化為defaultLevel。
levelAll := defaultLevel //defaultLevel為logging.INFO var err error if spec != "" { //如果spec不為空,則按既定格式讀取 ????fields := strings.Split(spec, ":") //按:分割 ????for _, field := range fields { ????????split := strings.Split(field, "=") //按=分割 ????????switch len(split) { ????????case 1: //只有l(wèi)evel ????????????if levelAll, err = logging.LogLevel(field); err != nil { //levelAll賦值為logging.LogLevel枚舉中定義的Level級別 ????????????????levelAll = defaultLevel // 如果沒有定義,則使用默認(rèn)日志級別 ????????????} ????????case 2: //針對module,module...=level,split[0]為模塊集,split[1]為要設(shè)置的日志級別 ????????????levelSingle, err := logging.LogLevel(split[1]) //levelSingle賦值為logging.LogLevel枚舉中定義的Level級別 ????????????modules := strings.Split(split[0], ",") //按,分割獲取模塊名 ????????????for _, module := range modules { ????????????????logging.SetLevel(levelSingle, module) //本條規(guī)則中所有模塊日志級別均設(shè)置為levelSingle ????????????} ????????default: ????????????//... ????????} ????} } //代碼在common/flogging/logging.go
flogging(Fabric日志系統(tǒng))更詳細(xì)信息參考:Fabric 1.0源代碼筆記 之 flogging(Fabric日志系統(tǒng))
4、初始化 MSP (Membership Service Provider會員服務(wù)提供者)如下代碼為初始化MSP,獲取peer.mspConfigPath路徑和peer.localMspId,分別表示MSP的本地路徑(/etc/hyperledger/fabric/msp/)和Peer所關(guān)聯(lián)的MSP ID,并初始化組織和身份信息。
var mspMgrConfigDir = config.GetPath("peer.mspConfigPath") var mspID = viper.GetString("peer.localMspId") err = common.InitCrypto(mspMgrConfigDir, mspID) //代碼在peer/main.go
/etc/hyperledger/fabric/msp/目錄下包括:admincerts、cacerts、keystore、signcerts、tlscacerts。其中:
admincerts:為管理員證書的PEM文件,如Admin@org1.example.com-cert.pem。
cacerts:為根CA證書的PEM文件,如ca.org1.example.com-cert.pem。
keystore:為具有節(jié)點(diǎn)的簽名密鑰的PEM文件,如91e54fccbb82b29d07657f6df9587c966edee6366786d234bbb8c96707ec7c16_sk。
signcerts:為節(jié)點(diǎn)X.509證書的PEM文件,如peer1.org1.example.com-cert.pem。
tlscacerts:為TLS根CA證書的PEM文件,如tlsca.org1.example.com-cert.pem。
如下代碼為common.InitCrypto(mspMgrConfigDir, mspID)的具體實(shí)現(xiàn),peer.BCCSP為密碼庫相關(guān)配置,包括算法和文件路徑等,格式如下:
BCCSP: ????Default: SW ????SW: ????????Hash: SHA2 ????????Security: 256 ????????FileKeyStore: ????????????KeyStore: ???????????? var bccspConfig *factory.FactoryOpts err = viperutil.EnhancedExactUnmarshalKey("peer.BCCSP", &bccspConfig) //將peer.BCCSP配置信息加載至bccspConfig中 err = mspmgmt.LoadLocalMsp(mspMgrConfigDir, bccspConfig, localMSPID) //從指定目錄中加載本地MSP //代碼在peer/common/common.go
factory.FactoryOpts定義為:
type FactoryOpts struct { ????ProviderName string `mapstructure:"default" json:"default" yaml:"Default"` ????SwOpts *SwOpts `mapstructure:"SW,omitempty" json:"SW,omitempty" yaml:"SwOpts"` } //FactoryOpts代碼在bccsp/factory/nopkcs11.go,本目錄下另有代碼文件pkcs11.go,在-tags "nopkcs11"條件下二選一編譯。
type SwOpts struct { ????// Default algorithms when not specified (Deprecated?) ????SecLevel int `mapstructure:"security" json:"security" yaml:"Security"` ????HashFamily string `mapstructure:"hash" json:"hash" yaml:"Hash"` ????// Keystore Options ????Ephemeral bool `mapstructure:"tempkeys,omitempty" json:"tempkeys,omitempty"` ????FileKeystore *FileKeystoreOpts `mapstructure:"filekeystore,omitempty" json:"filekeystore,omitempty" yaml:"FileKeyStore"` ????DummyKeystore *DummyKeystoreOpts `mapstructure:"dummykeystore,omitempty" json:"dummykeystore,omitempty"` } type FileKeystoreOpts struct { ????KeyStorePath string `mapstructure:"keystore" yaml:"KeyStore"` } //SwOpts和FileKeystoreOpts代碼均在bccsp/factory/swfactory.go
如下代碼為viperutil.EnhancedExactUnmarshalKey("peer.BCCSP", &bccspConfig)的具體實(shí)現(xiàn),getKeysRecursively為遞歸讀取peer.BCCSP配置信息。
mapstructure為第三方包:github.com/mitchellh/mapstructure,用于將map[string]interface{}轉(zhuǎn)換為struct。
示例代碼:https://godoc.org/github.com/...
func EnhancedExactUnmarshalKey(baseKey string, output interface{}) error { ????m := make(map[string]interface{}) ????m[baseKey] = nil ????leafKeys := getKeysRecursively("", viper.Get, m) ????config := &mapstructure.DecoderConfig{ ????????Metadata: nil, ????????Result: output, ????????WeaklyTypedInput: true, ????} ????decoder, err := mapstructure.NewDecoder(config) ????return decoder.Decode(leafKeys[baseKey]) } //代碼在common/viperutil/config_util.go
如下代碼為mspmgmt.LoadLocalMsp(mspMgrConfigDir, bccspConfig, localMSPID)的具體實(shí)現(xiàn),從指定目錄中加載本地MSP。
conf, err := msp.GetLocalMspConfig(dir, bccspConfig, mspID) //獲取本地MSP配置,序列化后寫入msp.MSPConfig,即conf return GetLocalMSP().Setup(conf) //調(diào)取msp.NewBccspMsp()創(chuàng)建bccspmsp實(shí)例,調(diào)取bccspmsp.Setup(conf)解碼conf.Config并設(shè)置bccspmsp //代碼在msp/mgmt/mgmt.go
如下代碼為msp.GetLocalMspConfig(dir, bccspConfig, mspID)的具體實(shí)現(xiàn)。
SetupBCCSPKeystoreConfig()核心代碼為bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir},目的是在FileKeystore或KeyStorePath為空時設(shè)置默認(rèn)值。
signcertDir := filepath.Join(dir, signcerts) //signcerts為"signcerts",signcertDir即/etc/hyperledger/fabric/msp/signcerts/ keystoreDir := filepath.Join(dir, keystore) //keystore為"keystore",keystoreDir即/etc/hyperledger/fabric/msp/keystore/ bccspConfig = SetupBCCSPKeystoreConfig(bccspConfig, keystoreDir) //設(shè)置bccspConfig.SwOpts.Ephemeral = false和bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir} ????//bccspConfig.SwOpts.Ephemeral是否短暫的 err := factory.InitFactories(bccspConfig) //初始化bccsp factory,并創(chuàng)建bccsp實(shí)例 signcert, err := getPemMaterialFromDir(signcertDir) //讀取X.509證書的PEM文件 sigid := &msp.SigningIdentityInfo{PublicSigner: signcert[0], PrivateSigner: nil} //構(gòu)造SigningIdentityInfo return getMspConfig(dir, ID, sigid) //分別讀取cacerts、admincerts、tlscacerts文件,以及config.yaml中組織信息,構(gòu)造msp.FabricMSPConfig,序列化后用于構(gòu)造msp.MSPConfig //代碼在msp/configbuilder.go
factory.InitFactories(bccspConfig)及BCCSP(區(qū)塊鏈加密服務(wù)提供者)更詳細(xì)內(nèi)容,參考:Fabric 1.0源代碼筆記 之 BCCSP(區(qū)塊鏈加密服務(wù)提供者)
至此,peer/main.go結(jié)束,接下來將進(jìn)入peer/node/start.go中serve(args)函數(shù)。
感謝關(guān)注兄弟連區(qū)塊鏈教程分享!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/24369.html
摘要:區(qū)塊鏈教程源代碼分析根命令入口及加載子命令,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。代碼在為命令啟動。 區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令,2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多的...
摘要:兄弟連區(qū)塊鏈教程源代碼分析命令及子命令實(shí)現(xiàn),年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。 兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer chaincode命令及子命令實(shí)現(xiàn),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多...
摘要:兄弟連區(qū)塊鏈教程源代碼分析客戶端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。源代碼筆記之客戶端概述相關(guān)代碼分布如下,接口及實(shí)現(xiàn)。代碼在工具函數(shù)獲取客戶端代碼在 兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer EndorserClient(Endorser客戶端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性...
摘要:兄弟連區(qū)塊鏈教程源代碼分析服務(wù)端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價似乎正在回落。源代碼筆記之服務(wù)端概述相關(guān)代碼在目錄下。,接口實(shí)現(xiàn),即結(jié)構(gòu)體及方法,以及服務(wù)端處理流程。 兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer(Endorser服務(wù)端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與...
摘要:企業(yè)區(qū)塊鏈平臺企業(yè)級許可的分布式分類賬平臺,為廣泛的行業(yè)用例提供模塊化和多功能性。這些節(jié)點(diǎn)通過應(yīng)用已經(jīng)由共識協(xié)議驗(yàn)證的交易來維護(hù)分類帳的副本,該交易被分組為包括將每個塊綁定到前一個塊的散列的塊中。 企業(yè)區(qū)塊鏈平臺 企業(yè)級許可的分布式分類賬平臺,為廣泛的行業(yè)用例提供模塊化和多功能性。 介紹 一般而言,區(qū)塊鏈?zhǔn)且粋€不可變的交易分類賬,維護(hù)在一個分布式對等節(jié)點(diǎn)網(wǎng)絡(luò)中。這些節(jié)點(diǎn)通過應(yīng)用已經(jīng)由共...
閱讀 2372·2021-11-24 10:31
閱讀 3427·2021-11-23 09:51
閱讀 2239·2021-11-15 18:11
閱讀 2387·2021-09-02 15:15
閱讀 2452·2019-08-29 17:02
閱讀 2285·2019-08-29 15:04
閱讀 831·2019-08-29 12:27
閱讀 2853·2019-08-28 18:15