fabric中节点同步使用gossip协议详解

一个节点被选中为leader节点后,会通过 StartDeliverForChannel 方法启动deliver,就可以向同一个组织里的其他节点gossip消息了,具体代码在 gossip_service.go中。

1.首先重新生成一个新的deliveryclient, 通过这个deliveryclient生成一个blockProvider (deliveryclient.go)

2.调用 blocksprovider.go中 DeliverBlocks 方法,会先验证一次区块,验证的内容主要包括:
区块序列号
channelId是否一致
Metadata 能否反序列化
块数据的hash值是否和header中存的hash值一致
通过channel policy来验证签名是否有效 (mcs.go)

3.通过gossip把块发出去

gossip消息流程
g.sendGossipBatch方法:
把需要发送的gossip数据放在msgs2Gossip切片中,调用g.gossipBatch发送
1.在这个方法里,首先会把消息进行分区,划分成多个区块(这里的区块不是用于提交的,里面的数据可能包含多个不同channel下的数据。这里的gossip数据包括三种:实际的区块,leasdership 消息和 状态信息),因为gossip服务是针对整个fabric系统的,所以在一段时间内,会有多条不同的数据同时存在。
2. 从这一批区块消息里获取到这些区块所在的channel,对每一个channel,从整个区块中抽取出这个channel下的所有消息,再次分区成多个区块(这里的区块是用于提交的,数据只包含了一个channel下的所有数据)
3. 获取这个channel下的所有可见成员peer,如果本节点是leader节点,就选取所有可见节点进行gossip发送消息。如果不是leader节点,就根据core.yaml里配置的 propagatePeerNum 个数来选择,默认是3个。
4.sendAndFilterSecrets方法:
调用comm_impl.go中的Send方法
Send方法中对逐个peer使用sendToEndpoint()
先使用getConnection建立连接,
不管是否成功均有调用disConnection

同一个组织内的非leader节点,是接收leader节点发过来的gossip消息。本身不进行deliver消息.

参考链接:https://www.jianshu.com/p/8f3f093bae3b

你可能感兴趣的:(fabric中节点同步使用gossip协议详解)