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

简介:

  区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric 1.0源代码笔记 之 Peer #peer根命令入口及加载子命令

1、加载环境变量配置和配置文件

Fabric支持通过环境变量对部分配置进行更新,如:CORE_LOGGING_LEVEL为输出的日志级别、CORE_PEER_ID为Peer的ID等。
此部分功能由第三方包viper来实现,viper除支持环境变量的配置方式外,还支持配置文件方式。viper使用方法参考:github.com/spf13/viper。
如下代码为加载环境变量配置,其中cmdRoot为"core",即CORE_开头的环境变量。

viper.SetEnvPrefix(cmdRoot)
viper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
//代码在peer/main.go

加载配置文件,同样由第三方包viper来实现,具体代码如下:
其中cmdRoot为"core",即/etc/hyperledger/fabric/core.yaml。

err := common.InitConfig(cmdRoot) 
//代码在peer/main.go

如下代码为common.InitConfig(cmdRoot)的具体实现:

config.InitViper(nil, cmdRoot)
err := viper.ReadInConfig()
//代码在peer/common/common.go

另附config.InitViper(nil, cmdRoot)的代码实现:
优先从环境变量FABRIC_CFG_PATH中获取配置文件路径,其次为当前目录、开发环境目录(即:src/github.com/hyperledger/fabric/sampleconfig)、和OfficialPath(即:/etc/hyperledger/fabric)。
AddDevConfigPath是对addConfigPath的封装,目的是通过GetDevConfigDir()调取sampleconfig路径。

var altPath = os.Getenv("FABRIC_CFG_PATH")
if altPath != "" {
    addConfigPath(v, altPath)
} else {
    addConfigPath(v, "./")
    err := AddDevConfigPath(v)
    addConfigPath(v, OfficialPath)
}
viper.SetConfigName(configName)
//代码在core/config/config.go

2、加载命令行工具和命令

Fabric支持类似peer node start、peer channel create、peer chaincode install这种命令、子命令、命令选项的命令行形式。
此功能由第三方包cobra来实现,以peer chaincode install -n test_cc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02为例,
其中peer、chaincode、install、-n分别为命令、子命令、子命令的子命令、命令选项。

如下代码为mainCmd的初始化,其中Use为命令名称,PersistentPreRunE先于Run执行用于初始化日志系统,Run此处用于打印版本信息或帮助信息。cobra使用方法参考:https://github.com/spf13/cobra

var mainCmd = &cobra.Command{
    Use: "peer",
    PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
        loggingSpec := viper.GetString("logging_level")

        if loggingSpec == "" {
            loggingSpec = viper.GetString("logging.peer")
        }
        flogging.InitFromSpec(loggingSpec) //初始化flogging日志系统

        return nil
    },
    Run: func(cmd *cobra.Command, args []string) {
        if versionFlag {
            fmt.Print(version.GetInfo())
        } else {
            cmd.HelpFunc()(cmd, args)
        }
    },
}
//代码在peer/main.go

如下代码为添加命令行选项,-v, --version、--logging-level和--test.coverprofile分别用于版本信息、日志级别和测试覆盖率分析。

mainFlags := mainCmd.PersistentFlags()
mainFlags.BoolVarP(&versionFlag, "version", "v", false, "Display current version of fabric peer server")
mainFlags.String("logging-level", "", "Default logging level and overrides, see core.yaml for full syntax")
viper.BindPFlag("logging_level", mainFlags.Lookup("logging-level"))
testCoverProfile := ""
mainFlags.StringVarP(&testCoverProfile, "test.coverprofile", "", "coverage.cov", "Done")
//代码在peer/main.go

如下代码为逐一加载peer命令下子命令:node、channel、chaincode、clilogging、version。

mainCmd.AddCommand(version.Cmd())
mainCmd.AddCommand(node.Cmd())
mainCmd.AddCommand(chaincode.Cmd(nil))
mainCmd.AddCommand(clilogging.Cmd(nil))
mainCmd.AddCommand(channel.Cmd(nil))
//代码在peer/main.go 

mainCmd.Execute()为命令启动。

3、初始化日志系统(输出对象、日志格式、日志级别)

如下为初始日志系统代码入口,其中loggingSpec取自环境变量CORE_LOGGING_LEVEL或配置文件中logging.peer,即:全局的默认日志级别。

flogging.InitFromSpec(loggingSpec)
//代码在peer/main.go

未完待续感谢关注兄弟连区块链教程分享!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
29天前
|
安全 区块链
区块链积分商城系统开发详细指南//需求功能/指南教程/源码流程
Developing a blockchain points mall system involves multiple aspects such as blockchain technology, smart contracts, front-end development, and business logic design. The following is the general process for developing a blockchain points mall system
|
26天前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
|
1月前
|
安全 区块链
区块链游戏系统开发步骤需求丨功能逻辑丨规则玩法丨指南教程丨源码详细
Developing blockchain game systems has been a highly anticipated field in recent years. By combining blockchain technology and game mechanics, players can enjoy a brand new gaming experience and higher game credibility.
|
9月前
Minecraft Fabric 教程 #8 添加附魔书
这就创建了一个FireBoom附魔书 onTargetDamaged //当目标被攻击 在mc FireballEntity类有一个 方法就是当火球碰撞了就创建一个火焰爆炸的效果
42 0
|
9月前
Minecraft Fabric 教程 #4 添加分组
在 ItemGroup 显示 使用 FabricItemGroupBuilder
37 0
|
7月前
|
区块链
区块链的发币流程技术分析
区块链现在是发展的如火如荼,很多人都想趁着这个风口,投入区块链创业的浪潮中。 那么我们该怎么做才能抓住这个机会呢? 进行区块链发币要求是很多的,主要有以下几个步骤。
|
7月前
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
7月前
|
区块链 安全 数据安全/隐私保护
区块链LP流动性SWAP博饼交易所系统开发分析模式
Web3在生态的每一个要素中,都体现出了去中心化的特点。
|
7月前
|
SQL 安全 区块链
交易所系统开发(案例项目)丨区块链交易所系统开发(稳定版)/成熟技术/步骤逻辑/源码教程
The development of a blockchain exchange system involves complex technologies and functions.
|
8月前
|
区块链
区块链DAO众筹资金模式合约开发源代码详情
// 众筹函数,向DAO众筹资金 function contribute() public { uint contributionAmount = (unitPrice * msg.value).div(10 ether); // 计算贡献金额,最小单位为0.01ETH