本文源码解析主要在peer文件夹,如有特殊文件夹会特别标出
main函数在main.go文件中
一、初始化
1、定义主命令
基于Gobra组件构造主命令
1 | var mainCmd = &cobra.Command{ |
2、注册子命令
1 | func main() { |
channel通道子命令:创建应用通道、获取区块、Peer节点加入应用通道、获取节点所加入的应用通道列表、更新应用通道配置、签名配置交易文件、获取指定的应用通道信息等,包括create、fetch、join、list、update、signconfigtx、getinfo等子命令
1 | channelCmd.AddCommand(createCmd(cf)) |
chaincode链码子命令:用于安装链码、实例化(部署)链码、调用链码、打包链码、查询链码、签名链码包、升级链码、获取通道链码列表等,包括install、instantiate、invoke、package、query、signpackage、upgrade、list等子命令
node节点子命令:用于管理节点服务进程与查询服务状态,包括start、status等子命令
logging日志子命令: 用于获取、设置与恢复日志级别功能,包括getlevel、setlevel、revertlevels等子命令;
version版本子命令:打印Hyperledger Fabric中的Peer节点服务器版本信息
二、初始化本地MSP组件
在每个子命令中,执行初始化本地MSP组件。
1 | var chaincodeCmd = &cobra.Command{ |
MSP组件是管理本地成员身份的重要安全模块,封装了根CA证书、本地签名者实体等。main()函数首先基于Viper组件获取core.yaml文件中MSP组件的配置文件路径mspMgrConfigDir(peer.mspConfigPath配置项)、MSP名称mspID(peer.localMspId配置项)与MSP组件类型mspType(peer.localMspType配置项,默认为FABRIC类型),提供给common.InitCrypto()函数作为参数进行调用,以获取BCCSP区块链加密服务组件,并用于初始化本地MSP组件
1 | // 初始化MSP |
配置文件如下:
1 | func InitCrypto(mspMgrConfigDir, localMSPID, localMSPType string) error { |
三、执行启动Peer节点命令
1 | func main() { |
main()主函数通过Cobra组件调用主命令Execute()方法,执行peer node start命令启动Peer节点
在byfn中调用peer-base.yaml,启动peer node start
peer node start 主要流程:主要在start子命令执行server()函数。(函数实现在peer/node/start.go文件)
1、初始化服务启动的基本参数
1 | func serve(args []string) error { |
(1) 获取本地MSP组件类型
代码已经注释
(2) 注册资源访问策略提供者
代码已经注释
(3) 初始化本地账本管理器
peer.ConfigTxProcessors定义通道上配置交易信息处理器字典,且configtxProcessor提供GenerateSimulationResults()方法,用于生成配置交易消息对应的通道配置与资源配置信息,作为模拟执行结果保存到交易模拟器中,再生成模拟执行结果的公共数据,封装成交易对象(Transaction类型)提交给Committer记账节点进行验证
func initialize真正函数
1 | func initialize(initializer *Initializer) { |
创建本地peer账本提供者:kvledger.NewProvider()
1、账本ID数据库(idStore类型):提供存储账本ID(即链ID)与创世区块键值对的LevelDB数据库;
2、账本数据存储对象提供者(ledgerstorage.Provider类型):创建账本数据存储对象,负责管理区块数据文件、隐私数据库、区块索引数据库等;
3、历史数据库提供者(HistoryDBProvider类型):创建历史数据库,存储每个状态数据的历史信息;
4、状态数据库提供者(CommonStorageDBProvider类型):创建状态数据库(LevelDB或CouchDB类型),存储世界状态(world state),包括有效交易的公有数据与隐私数据
(4) 初始化服务器基本参数
代码已注释
2、创建gRPC服务器
peer节点所有的服务器:
(1) 创建gRPC服务器
1 | func server() { |
(2) 创建DeliverEnvents事件服务器
1 | func server() { |
(3) 创建ChaincodeSupport链码支持服务器
Peer节点上的全局链码支持服务实例或链码支持服务器
1 | func server() { |
1 | // startChaincodeServer will finish chaincode related initialization, including: |
在peer注册所以系统链码
(4) 创建Admin管理服务器与Endorser背书服务器
Admin管理服务器提供节点启动、节点状态查询等服务。Endorser背书服务器提供对交易提案的模拟执行结果执行签名背书的服务
1 | func server() { |
(5) 创建Gossip消息服务器
Peer节点的Gossip消息服务器是基于Gossip消息协议分发数据与同步状态的,负责将区块数据与隐私数据发送到组织内的其他Peer节点。同时,Gossip消息服务器提供了节点管理机制、反熵算法等,支持同步更新节点信息与缺失的数据信息(区块数据与隐私数据)
1 | func server() { |
3、部署系统链码与初始化现存通道的链结构
(1) 部署系统链码initSysCCs()函数
1 | func server() { |
部署系统链码
1 | func deploySysCC(chainID string, ccprov ccprovider.ChaincodeProvider, syscc SelfDescribingSysCC) error { |
(2) 初始化现存通道上的链结构Initialize()函数
1 | func server() { |
1 | func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, |
4、启动gRPC服务器与profile服务器
此时再执行4个goroutine,监听信号程序、grpc服务器、profile服务器等
1 | func server() { |