区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令二

区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令二。
flogging,即:fabric logging,为Fabric基于第三方包go-logging封装的日志包,go-logging使用方法参考:github.com/op/go-logging
如下代码为flogging包的初始化函数:

func init() {
????logger = logging.MustGetLogger(pkgLogID) //创建仅在flogging包内代码使用的logging.Logger对象
????Reset() //全局变量初始化为默认值
????initgrpclogger() //初始化gRPC Logger,即创建logging.Logger对象,并用这个对象设置grpclog
}
//代码在common/flogging/logging.go

init()执行结束后,peer/main.go中调用flogging.InitFromSpec(loggingSpec),将再次初始化全局日志级别为loggingSpec,之前默认为logging.INFO。

func InitFromSpec(spec string) string代码如下。
其中spec格式为:[<module>[,<module>...]=]<level>[:[<module>[,<module>...]=]<level>...]。
此处传入spec为"",将""模块日志级别设置为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: //只有level
????????????if levelAll, err = logging.LogLevel(field); err != nil { //levelAll赋值为logging.LogLevel枚举中定义的Level级别
????????????????levelAll = defaultLevel // 如果没有定义,则使用默认日志级别
????????????}
????????case 2: //针对module,module...=level,split[0]为模块集,split[1]为要设置的日志级别
????????????levelSingle, err := logging.LogLevel(split[1]) //levelSingle赋值为logging.LogLevel枚举中定义的Level级别
????????????modules := strings.Split(split[0], ",") //按,分割获取模块名
????????????for _, module := range modules {
????????????????logging.SetLevel(levelSingle, module) //本条规则中所有模块日志级别均设置为levelSingle
????????????}
????????default:
????????????//...
????????}
????}
}
//代码在common/flogging/logging.go

flogging(Fabric日志系统)更详细信息参考:Fabric 1.0源代码笔记 之 flogging(Fabric日志系统)

4、初始化 MSP (Membership Service Provider会员服务提供者)

如下代码为初始化MSP,获取peer.mspConfigPath路径和peer.localMspId,分别表示MSP的本地路径(/etc/hyperledger/fabric/msp/)和Peer所关联的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文件,如[email protected]。
  • cacerts:为根CA证书的PEM文件,如ca.org1.example.com-cert.pem。
  • keystore:为具有节点的签名密钥的PEM文件,如91e54fccbb82b29d07657f6df9587c966edee6366786d234bbb8c96707ec7c16_sk。
  • signcerts:为节点X.509证书的PEM文件,如peer1.org1.example.com-cert.pem。
  • tlscacerts:为TLS根CA证书的PEM文件,如tlsca.org1.example.com-cert.pem。

如下代码为common.InitCrypto(mspMgrConfigDir, mspID)的具体实现,peer.BCCSP为密码库相关配置,包括算法和文件路径等,格式如下:

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)的具体实现,getKeysRecursively为递归读取peer.BCCSP配置信息。
mapstructure为第三方包:github.com/mitchellh/mapstructure,用于将map[string]interface{}转换为struct。
示例代码:https://godoc.org/github.com/mitchellh/mapstructure#example-Decode--WeaklyTypedInput

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)的具体实现,从指定目录中加载本地MSP。

conf, err := msp.GetLocalMspConfig(dir, bccspConfig, mspID) //获取本地MSP配置,序列化后写入msp.MSPConfig,即conf
return GetLocalMSP().Setup(conf) //调取msp.NewBccspMsp()创建bccspmsp实例,调取bccspmsp.Setup(conf)解码conf.Config并设置bccspmsp
//代码在msp/mgmt/mgmt.go

如下代码为msp.GetLocalMspConfig(dir, bccspConfig, mspID)的具体实现。
SetupBCCSPKeystoreConfig()核心代码为bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir},目的是在FileKeystore或KeyStorePath为空时设置默认值。

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) //设置bccspConfig.SwOpts.Ephemeral = false和bccspConfig.SwOpts.FileKeystore = &factory.FileKeystoreOpts{KeyStorePath: keystoreDir}
????//bccspConfig.SwOpts.Ephemeral是否短暂的
err := factory.InitFactories(bccspConfig) //初始化bccsp factory,并创建bccsp实例
signcert, err := getPemMaterialFromDir(signcertDir) //读取X.509证书的PEM文件
sigid := &msp.SigningIdentityInfo{PublicSigner: signcert[0], PrivateSigner: nil} //构造SigningIdentityInfo
return getMspConfig(dir, ID, sigid) //分别读取cacerts、admincerts、tlscacerts文件,以及config.yaml中组织信息,构造msp.FabricMSPConfig,序列化后用于构造msp.MSPConfig
//代码在msp/configbuilder.go

factory.InitFactories(bccspConfig)及BCCSP(区块链加密服务提供者)更详细内容,参考:Fabric 1.0源代码笔记 之 BCCSP(区块链加密服务提供者)

至此,peer/main.go结束,接下来将进入peer/node/start.go中serve(args)函数。

原文地址:http://blog.51cto.com/14041296/2313478

时间: 2024-11-05 19:43:55

区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令二的相关文章

兄弟连区块链教程Fabric1.0源代码分析ledgerID数据

1.idStore概述 Fabric支持创建多个Ledger,不同Ledger以ledgerID区分. 多个ledgerID及其创世区块存储在idStore数据库中,idStore数据库基于leveldb实现. idStore默认使用路径:/var/hyperledger/production/ledgersData/ledgerProvider/. idStore库中特殊key "underConstructionLedgerKey",用于标志最新在建的ledgerID,ledger

区块链教程Fabric1.0源代码分析Ledger historydb历史数据库

1.historydb概述 historydb,用于存储所有块读写集中写集的内容.代码分布在core/ledger/kvledger/history/historydb目录下,目录结构如下: historydb.go,定义核心接口HistoryDBProvider和HistoryDB. histmgr_helper.go,historydb工具函数. historyleveldb目录,historydb基于leveldb的实现.???? historyleveldb.go,HistoryDBPr

区块链教程以太源码分析accounts账户管理分析

区块链教程以太源码分析accounts账户管理分析. 数据结构分析 ETH的账户管理定义在accounts/manager.go中,其数据结构为: // Manager is an overarching account manager that can communicate with various // backends for signing transactions. type Manager struct { backends map[reflect.Type][]Backend /

区块链教程以太源码分析accounts包简介

accounts包实现了eth客户端的钱包和账户管理.账号的数据结构:typeAccount struct { Address common.Address json:"address" // Ethereum account addressderived from the key URLURL json:"url" // Optional resource locator within a backend }钱包interface,是指包含了一个或多个账户的软件钱

兄弟连区块链教程open-ethereum-pool矿池源码分析unlocker模块

兄弟连区块链教程open-ethereum-pool以太坊矿池源码分析unlocker模块open-ethereum-pool以太坊矿池-unlocker模块 unlocker模块配置 json"unlocker": {????"enabled": false,????"poolFee": 1.0,????"poolFeeAddress": "",????"donate": true,?

区块链教程open-ethereum-pool矿池源码分析main入口

兄弟连区块链教程open-ethereum-pool矿池源码分析main入口,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上. open-ethereum-pool以太坊矿池-main入口 命令行启动 ./build/bin/open-ethereum-pool config.json config.json配置文件 { ????"threads": 2,

区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为true????* true即要求矿机立即切换job 三种情况下将向矿机下发新job:???? 收到新高度的job???? 过去一个job为新高度且为空块job,且最新job为非空块job????* 达到预定的时间间隔30秒 最近一次下发job的时间将写入文件(

区块链教程以太坊源码分析core-state-process源码分析(二)

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二):关于g0的计算,在黄皮书上由详细的介绍和黄皮书有一定出入的部分在于if contractCreation && homestead {igas.SetUint64(params.TxGasContractCreation) 这是因为 Gtxcreate+Gtransaction = TxGasContractCreation func IntrinsicGas(data []byte, contractCre

{区块链教程}以太坊源码分析fast sync算法二

{区块链教程}以太坊源码分析fast sync算法二:上面的表格应该这样解释:如果我们每隔K个区块头验证一次区块头,在N个区块头之后,伪造的概率小于***者产生SHA3冲突的概率.这也意味着,如果确实发现了伪造,那么最后的N个头部应该被丢弃,因为不够安全.可以从上表中选择任何{N,K}对,为了选择一个看起来好看点的数字,我们选择N = 2048,K = 100.后续可能会根据网络带宽/延迟影响以及可能在一些CPU性能比较受限的设备上运行的情况来进行调整. Using this caveat ho