背景介绍
先介绍下自己吧,身为码农,平时很少写文章了,下笔后不知从何说起。
缘于工作,最近一年开始做区块链项目,采用联盟链Fabric。开源的力量确实非常强大,fabric现在是Hyperledger下很活跃的一个项目。代码更新迭代也非常迅速,年初开始做项目时使用的版本是1.0.0,目前已经到了1.3.0了。最熟悉的还是1.0.0版本的,不过我打算写的这篇《fabric源码分析》系列打算使用1.2.0,是不是跳跃有点大呢。其实作为一个技术人,对1.2.0版本的private data还是比较感兴趣的,所以分析也就从这个版本下手了!
不过还是先给各位看官提个醒,这个源码分析系列并不适合fabric初学者作为入门参考,最好是已经具备fabric基本框架的认识,并具有一定的使用经验最好。前期的文章是以分析为主(正合源码分析的题义哈),后期会有一些实操。这些实操更多是为我自己的目标服务,侧重于fabric的性能优化或本地化修改。
Fabric模块结构
从fabric的模块结构来看,主要分为peer、orderer、msp三大块。源码分析将会对此进行逐步分析,并附加分析一些其他依赖组件。
Peer节点主要逻辑梳理
我们先看代码结构:
Fabric各组件命令使用cobra库进行构建的,cobra可以很方便的构造命令行的工具,允许添加子命令。peer命令下包含了version、node、chaincode、channel、clilogging等5个子命令。我们以此为线索,对peer命令主要的工作逐一梳理。
node子命令
node子命令还包含start和status两个子命令。很明显,start自命令才是我们的分析重点。所在源码结构为:peer->node->start.go
命令形式:“peer node start ***”,它主要完成了哪些工作呢?
1. mgmt.GetLocalMSP(),获取当前MSP组件,其类型必须是FabricMSP。也就是只支持Fabric下的MSP实体。
2. common.SetLogLevelFromViper(module),为各模块设置log级别(模块有:msp,gossip,ledger,cauthdsl,policies,grpc,peer.gossip)
3. aclmgmt.NewACLProvider(),新建一个ACL进行访问控制
4. peer.GetPeerEndpoint(),获取peer节点的地址和端口等信息、服务器配置信息等
5. peer.NewPeerServer(),根据第4步中的信息创建一个peer服务器
6. serverConfig.SecOpts.UseTLS,如果使用tls通信,则找到对应证书
7. createEventHubServer(serverConfig),创建时间监听服务
8. peer.NewDeliverEventsServer(),创建时间传递器
9. pb.RegisterDeliverServer(peerServer.Server(), abServer),将传递器注册到peer节点中,后边通过protobuf进行报文传输
10. ccprovider.SetChaincodesPath(),设置链码的路径
11. createChaincodeServer(ca, peerHost),创建链码服务并启动
12. startAdminServer(listenAddr, peerServer.Server()),启动admin的服务
13. service.GetGossipService().DistributePrivateData(),1.2版本独有的私有数据设置
14. library.Config{},还不明白
15. pb.RegisterEndorserServer(peerServer.Server(), auth),注册背书服务
16. viper.GetStringSlice("peer.gossip.bootstrap"),还不明白
17. service.InitGossipService(),初始化gossip服务器
18. cc.InstalledCCs,安装系统链码
19. peer.Initialize,初始化系统链码
20. registerDiscoveryService(peerServer, policyMgr, lifecycle),注册发现服务
21. peerServer.Start(),启动peer服务器
22. ehubGrpcServer.Start(), 启动eventhub服务器
上述步骤完成的事项比较繁多,其中主要有几个服务器(或服务)值得关注:
peerServer、eventHubServer、DeliverEventsServer、ChaincodeServer、AdminServer、EndorserServer、GossipService、DiscoveryService。
不得不承认,fabric是个复杂的工程!
搞清楚上述几个服务后,才能真正明白node启动命令中完成的主要工作。node自命令分析下回再分析吧。