成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令二

tuantuan / 3003人閱讀

摘要:兄弟連區(qū)塊鏈教程源代碼分析根命令入口及加載子命令二。此處傳入為,將模塊日志級(jí)別設(shè)置為,并會(huì)將初始化為。代碼在目錄下包括。核心代碼為,目的是在或?yàn)榭諘r(shí)設(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對(duì)象
????Reset() //全局變量初始化為默認(rèn)值
????initgrpclogger() //初始化gRPC Logger,即創(chuàng)建logging.Logger對(duì)象,并用這個(gè)對(duì)象設(shè)置grpclog
}
//代碼在common/flogging/logging.go

init()執(zhí)行結(jié)束后,peer/main.go中調(diào)用flogging.InitFromSpec(loggingSpec),將再次初始化全局日志級(jí)別為loggingSpec,之前默認(rèn)為logging.INFO。

func InitFromSpec(spec string) string代碼如下。
其中spec格式為:[[,...]=][:[[,...]=]...]。
此處傳入spec為"",將""模塊日志級(jí)別設(shè)置為defaultLevel,并會(huì)將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級(jí)別
????????????????levelAll = defaultLevel // 如果沒(méi)有定義,則使用默認(rèn)日志級(jí)別
????????????}
????????case 2: //針對(duì)module,module...=level,split[0]為模塊集,split[1]為要設(shè)置的日志級(jí)別
????????????levelSingle, err := logging.LogLevel(split[1]) //levelSingle賦值為logging.LogLevel枚舉中定義的Level級(jí)別
????????????modules := strings.Split(split[0], ",") //按,分割獲取模塊名
????????????for _, module := range modules {
????????????????logging.SetLevel(levelSingle, module) //本條規(guī)則中所有模塊日志級(jí)別均設(shè)置為levelSingle
????????????}
????????default:
????????????//...
????????}
????}
}
//代碼在common/flogging/logging.go

flogging(Fabric日志系統(tǒng))更詳細(xì)信息參考:Fabric 1.0源代碼筆記 之 flogging(Fabric日志系統(tǒng))

4、初始化 MSP (Membership Service Provider會(huì)員服務(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:為管理員證書(shū)的PEM文件,如[email protected]。

cacerts:為根CA證書(shū)的PEM文件,如ca.org1.example.com-cert.pem。

keystore:為具有節(jié)點(diǎn)的簽名密鑰的PEM文件,如91e54fccbb82b29d07657f6df9587c966edee6366786d234bbb8c96707ec7c16_sk。

signcerts:為節(jié)點(diǎn)X.509證書(shū)的PEM文件,如peer1.org1.example.com-cert.pem。

tlscacerts:為T(mén)LS根CA證書(shū)的PEM文件,如tlsca.org1.example.com-cert.pem。

如下代碼為common.InitCrypto(mspMgrConfigDir, mspID)的具體實(shí)現(xiàn),peer.BCCSP為密碼庫(kù)相關(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配置,序列化后寫(xiě)入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í)設(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證書(shū)的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é)束,接下來(lái)將進(jìn)入peer/node/start.go中serve(args)函數(shù)。
感謝關(guān)注兄弟連區(qū)塊鏈教程分享!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24369.html

相關(guān)文章

  • 兄弟連區(qū)塊教程Fabric1.0代碼分析Peer peer命令入口及加載子命令

    摘要:區(qū)塊鏈教程源代碼分析根命令入口及加載子命令,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。代碼在為命令啟動(dòng)。   區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令,2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多的...

    sean 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer peer chaincode命令及子命令實(shí)現(xiàn)

    摘要:兄弟連區(qū)塊鏈教程源代碼分析命令及子命令實(shí)現(xiàn),年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer peer chaincode命令及子命令實(shí)現(xiàn),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。但事實(shí)上,正是初期泡沫的漸退,讓人們更多...

    gghyoo 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer EndorserClient(Endorser客戶(hù)端

    摘要:兄弟連區(qū)塊鏈教程源代碼分析客戶(hù)端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之客戶(hù)端概述相關(guān)代碼分布如下,接口及實(shí)現(xiàn)。代碼在工具函數(shù)獲取客戶(hù)端代碼在   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer EndorserClient(Endorser客戶(hù)端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性...

    lufficc 評(píng)論0 收藏0
  • 區(qū)塊教程Fabric1.0代碼分析Peer(Endorser服務(wù)端)

    摘要:兄弟連區(qū)塊鏈教程源代碼分析服務(wù)端,年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁回歸理性,表面上看相關(guān)人才需求與身價(jià)似乎正在回落。源代碼筆記之服務(wù)端概述相關(guān)代碼在目錄下。,接口實(shí)現(xiàn),即結(jié)構(gòu)體及方法,以及服務(wù)端處理流程。   兄弟連區(qū)塊鏈教程Fabric1.0源代碼分析Peer(Endorser服務(wù)端),2018年下半年,區(qū)塊鏈行業(yè)正逐漸褪去發(fā)展之初的浮躁、回歸理性,表面上看相關(guān)人才需求與...

    leone 評(píng)論0 收藏0
  • Hyperledger Fabric(目錄)

    摘要:企業(yè)區(qū)塊鏈平臺(tái)企業(yè)級(jí)許可的分布式分類(lèi)賬平臺(tái),為廣泛的行業(yè)用例提供模塊化和多功能性。這些節(jié)點(diǎn)通過(guò)應(yīng)用已經(jīng)由共識(shí)協(xié)議驗(yàn)證的交易來(lái)維護(hù)分類(lèi)帳的副本,該交易被分組為包括將每個(gè)塊綁定到前一個(gè)塊的散列的塊中。 企業(yè)區(qū)塊鏈平臺(tái) 企業(yè)級(jí)許可的分布式分類(lèi)賬平臺(tái),為廣泛的行業(yè)用例提供模塊化和多功能性。 介紹 一般而言,區(qū)塊鏈?zhǔn)且粋€(gè)不可變的交易分類(lèi)賬,維護(hù)在一個(gè)分布式對(duì)等節(jié)點(diǎn)網(wǎng)絡(luò)中。這些節(jié)點(diǎn)通過(guò)應(yīng)用已經(jīng)由共...

    trigkit4 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<