区块链教程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格式为:[[,...]=][:[[,...]=]...]。
此处传入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文件,如Admin@org1.example.com-cert.pem。
- 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)函数。
感谢关注兄弟连区块链教程分享!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
网络爬虫相关库/工具/API大列表
详细罗列了用户Web抓取的工具、编程库和API列表,包括Python、PHP、Ruby、JavaScript等。 Web Scraping The list of tools, programming libraries and APIs used in web-scraping. ●Python ●PHP ●Ruby ●JavaScript ●Golang ●Feel free to add your favourite language. Use new_language_template.md as start point. ●Proxy Services ●Web Services ●Console tools ●Books Other Awesome List Projects ●lists - List of useful, silly and awesome lists curated on GitHub ●HeadlessBrowsers - a list of (almost) all headless web browsers in existence Contri...
- 下一篇
区块链教程Fabric1.0源代码分析Peer(Endorser服务端)-兄弟连区块链
区块链教程Fabric1.0源代码分析Peer(Endorser服务端),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 Fabric 1.0源代码笔记 之 Peer #EndorserServer(Endorser服务端) 1、EndorserServer概述 EndorserServer相关代码在protos/peer、core/endorser目录下。 protos/peer/peer.pb.go,EndorserServer接口定义。 core/endorser/endorser.go,EndorserServer接口实现,即Endorser结构体及方法,以及Endorser服务端ProcessProposal处理流程。 2、EndorserServer接口定义 2.1、EndorserServer接口定义 type EndorserServer interface { ProcessProposal(context.Context, *Sign...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池