本文基於 Fabric v2.0.1
,與 v1.x
版不同,v2
版將 protos
定義放到一個獨立倉庫 fabric-protos 進行管理,並且使用 protoc
工具生成的具體語言代碼也使用獨立的倉庫存放,如 golang
版 fabric-protos-go。
一、 Orderer
1. AtomicBroadcast
服務定義於 orderer/ab.proto
service AtomicBroadcast {
// broadcast receives a reply of Acknowledgement for each common.Envelope in order, indicating success or type of failure
rpc Broadcast(stream common.Envelope) returns (stream BroadcastResponse);
// deliver first requires an Envelope of type DELIVER_SEEK_INFO with Payload data as a mashaled SeekInfo message, then a stream of block replies is received.
rpc Deliver(stream common.Envelope) returns (stream DeliverResponse);
}
1.1 Broadcast
Broadcast
接口用於接收待排序的消息,包括普通事務 tx
消息和 channel
配置消息。
客戶端將事務消息提交到 endorsing peers
預執行 chaincode
並背書讀寫集結果,由客戶端將返回結果提交到 Orderer
進行排序。
1.2 Deliver
Deliver
接口用於向 peers
分發已經過排序 block
數據,peer
節點通過 join channel
從 Orderer
獲取已排序的 block
。
2. Cluster
服務定義於 orderer/cluster.proto
// Cluster defines communication between cluster members.
service Cluster {
// Step passes an implementation-specific message to another cluster member.
rpc Step(stream StepRequest) returns (stream StepResponse);
}
Fabric v1.1 之後支持 EtcdRaft
共識算法,與使用 Kafka
共識算法各orderer
獨立連接中心化的 kafka
集羣不同,使用 EtcdRaft
共識算法各 orderer
組成一個集羣, Step
用於集羣節點間消息交換。
二、Peer
1. Endorser
服務定義於 peer/peer.proto
service Endorser {
rpc ProcessProposal(SignedProposal) returns (ProposalResponse);
}
ProcessProposal
接口用於客戶端將已簽名的事務消息提交到 endorsing peers
進行預執行並背書讀寫集。所謂預執行是指使用當前本地賬本狀態執行 chaincode
生成讀寫集,但執行結果不寫入賬本。
2. Deliver
服務定義於 peer/events.proto
service Deliver {
// Deliver first requires an Envelope of type ab.DELIVER_SEEK_INFO with
// Payload data as a marshaled orderer.SeekInfo message,
// then a stream of block replies is received
rpc Deliver (stream common.Envelope) returns (stream DeliverResponse) {
}
// DeliverFiltered first requires an Envelope of type ab.DELIVER_SEEK_INFO with
// Payload data as a marshaled orderer.SeekInfo message,
// then a stream of **filtered** block replies is received
rpc DeliverFiltered (stream common.Envelope) returns (stream DeliverResponse) {
}
// DeliverWithPrivateData first requires an Envelope of type ab.DELIVER_SEEK_INFO with
// Payload data as a marshaled orderer.SeekInfo message,
// then a stream of block and private data replies is received
rpc DeliverWithPrivateData (stream common.Envelope) returns (stream DeliverResponse) {
}
}
2.1 Deliver & DeliverFiltered
Deliver
接口用於向客戶端分發已寫入本地賬本的 block
數據。客戶端將 endorsing peers
返回的結果提交給 orderer
後,等待 peer
通知事務處理完畢。
2.2 DeliverWithPrivateData
DeliverWithPrivateData
v2.0 版本新增,分發帶私密數據的 block
數據
三、Chaincode
1. ChaincodeSupport
服務定義於 peer/chaincode_shim.proto
// Interface that provides support to chaincode execution. ChaincodeContext
// provides the context necessary for the server to respond appropriately.
service ChaincodeSupport {
rpc Register(stream ChaincodeMessage) returns (stream ChaincodeMessage);
}
Register
用於 Chaincode
啓動時向 peer
註冊當前 Chaincode
2. Chaincode
服務定義於 peer/chaincode_shim.proto
// Chaincode as a server - peer establishes a connection to the chaincode as a client
// Currently only supports a stream connection.
service Chaincode {
rpc Connect(stream ChaincodeMessage) returns (stream ChaincodeMessage);
}
v2
新增服務,Chaincode
啓動並作爲服務端,由 peer
通過 Connect
接口連接 Chaincode
四、Gossip
服務定義於 gossip/message.proto
// Gossip
service Gossip {
// GossipStream is the gRPC stream used for sending and receiving messages
rpc GossipStream (stream Envelope) returns (stream Envelope);
// Ping is used to probe a remote peer's aliveness
rpc Ping (Empty) returns (Empty);
}
爲減輕 Orderer
壓力,組織內只有少量 peer
連接 orderer
獲取最新 block
,組織內各 peer
通過 Gossip
互聯,通過 Gossip
交換 block
數據及私密數據。
五、Discovery
服務定義於 discovery/protocol.proto
// Discovery defines a service that serves information about the fabric network
// like which peers, orderers, chaincodes, etc.
service Discovery {
// Discover receives a signed request, and returns a response.
rpc Discover (SignedRequest) returns (Response);
}
Discovery
服務用於方便客戶端獲取整個 Fabric
網絡的情況,只需要知道一個初始節點便可查詢到 channel
內的 peers
、config
、membership
、chaincode
等。
參考: