區塊鍊教程Fabric1.0源代碼分析Peer,2018年下半年,區塊鍊行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鍊真正的技術之上。
Fabric 1.0源代碼筆記 之 Peer
1、Peer概述
在Fabric中,Peer(節點)是指在網絡中負責接收交易請求、維護一緻賬本的各個fabric-peer執行個體。節點之間彼此通過gRPC通信。
按角色劃分,Peer包括兩種類型:
- Endorser(背書者):負責對來自用戶端的交易提案進行檢查和背書。
- Committer(送出者):負責檢查交易請求,執行交易并維護區塊鍊和賬本結構。
Peer核心代碼在peer目錄下,其他相關代碼分布在core/peer和protos/peer目錄下。目錄結構如下:
-
peer目錄:
* main.go,peer指令入口。
* node目錄,peer node指令及子指令peer node start和peer node status實作。
* node.go,peer node指令入口。
* start.go,peer node start子指令實作。
* status.go,peer node status子指令實作。
* channel目錄,peer channel指令及子指令實作。
* chaincode目錄,peer chaincode指令及子指令實作。
* clilogging目錄,peer clilogging指令及子指令實作。
* version目錄,peer version指令實作。
* common目錄,peer相關通用代碼。
* common.go,部分公共函數。
* ordererclient.go,BroadcastClient接口及實作。
* gossip目錄,gossip最終一緻性算法相關代碼。
-
core/peer目錄:
* config.go,Peer配置相關工具函數。
* peer.go,Peer服務相關工具函數。
- core/endorser目錄:背書服務端。
如下為分節說明Peer代碼:
- Fabric 1.0源代碼筆記 之 Peer #peer根指令入口及加載子指令
- Fabric 1.0源代碼筆記 之 Peer #peer node start指令實作
- Fabric 1.0源代碼筆記 之 Peer #peer channel指令及子指令實作
- Fabric 1.0源代碼筆記 之 Peer #peer chaincode指令及子指令實作
- Fabric 1.0源代碼筆記 之 Peer #EndorserClient(Endorser用戶端)
- Fabric 1.0源代碼筆記 之 Peer #EndorserServer(Endorser服務端)
- Fabric 1.0源代碼筆記 之 Peer #BroadcastClient(Broadcast用戶端)
- Fabric 1.0源代碼筆記 之 Peer #committer(送出者)
2、Peer配置相關工具函數
//為全局變量localAddress和peerEndpoint指派
func CacheConfiguration() (err error)
func cacheConfiguration() //調用CacheConfiguration()
//擷取localAddress
func GetLocalAddress() (string, error)
//擷取peerEndpoint
func GetPeerEndpoint() (*pb.PeerEndpoint, error)
//擷取Peer安全配置
func GetSecureConfig() (comm.SecureServerConfig, error)
//代碼在core/peer/config.go
PeerEndpoint結構體定義如下:
type PeerID struct {
Name string
}
type PeerEndpoint struct {
Id *PeerID
Address string
}
//代碼在protos/peer/peer.pb.go
SecureServerConfig結構體定義如下:
type SecureServerConfig struct {
ServerCertificate []byte //簽名公鑰,取自peer.tls.cert.file
ServerKey []byte //簽名私鑰,取自peer.tls.key.file
ServerRootCAs [][]byte //根CA憑證,取自peer.tls.rootcert.file
ClientRootCAs [][]byte
UseTLS bool //是否啟用TLS,取自peer.tls.enabled
RequireClientCert bool
}
//代碼在core/comm/server.go
3、Peer服務相關工具函數
func (cs *chainSupport) Ledger() ledger.PeerLedger
func (cs *chainSupport) GetMSPIDs(cid string) []string
func MockInitialize()
func MockSetMSPIDGetter(mspIDGetter func(string) []string)
func Initialize(init func(string)) //Peer初始化,并部署系統鍊碼
func InitChain(cid string)
func getCurrConfigBlockFromLedger(ledger ledger.PeerLedger) (*common.Block, error)
func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block) error
func CreateChainFromBlock(cb *common.Block) error
func MockCreateChain(cid string) error
func GetLedger(cid string) ledger.PeerLedger
func GetPolicyManager(cid string) policies.Manager
func GetCurrConfigBlock(cid string) *common.Block
func updateTrustedRoots(cm configtxapi.Manager)
func buildTrustedRootsForChain(cm configtxapi.Manager)
func GetMSPIDs(cid string) []string
func SetCurrConfigBlock(block *common.Block, cid string) error
func NewPeerClientConnection() (*grpc.ClientConn, error)
func GetLocalIP() string
func NewPeerClientConnectionWithAddress(peerAddress string) (*grpc.ClientConn, error)
func GetChannelsInfo() []*pb.ChannelInfo
//構造type channelPolicyManagerGetter struct{}
func NewChannelPolicyManagerGetter() policies.ChannelPolicyManagerGetter
func (c *channelPolicyManagerGetter) Manager(channelID string) (policies.Manager, bool)
func CreatePeerServer(listenAddress string,secureConfig comm.SecureServerConfig) (comm.GRPCServer, error)
func GetPeerServer() comm.GRPCServer
//代碼在core/peer/peer.go