# Fabric 1.0源代码笔记 之 Peer #BroadcastClient(Broadcast客户端)
## 1、BroadcastClient概述
BroadcastClient代码分布如下:
* peer/common/ordererclient.go,BroadcastClient接口定义及实现,及BroadcastClient工具函数。
* protos/orderer/ab.pb.go,AtomicBroadcastClient接口定义及实现,AtomicBroadcast_BroadcastClient接口定义及实现。
## 2、BroadcastClient接口定义及实现
### 2.1、BroadcastClient工具函数
```go
//构造broadcastClient
func GetBroadcastClient(orderingEndpoint string, tlsEnabled bool, caFile string) (BroadcastClient, error)
//代码在peer/common/ordererclient.go
```
代码如下:
```go
func GetBroadcastClient(orderingEndpoint string, tlsEnabled bool, caFile string) (BroadcastClient, error) {
var opts []grpc.DialOption
if tlsEnabled { //检查TLS
if caFile != "" {
creds, err := credentials.NewClientTLSFromFile(caFile, "")
opts = append(opts, grpc.WithTransportCredentials(creds))
}
} else {
opts = append(opts, grpc.WithInsecure())
}
opts = append(opts, grpc.WithTimeout(3*time.Second))
opts = append(opts, grpc.WithBlock())
conn, err := grpc.Dial(orderingEndpoint, opts...)
//NewAtomicBroadcastClient构造atomicBroadcastClient
//.Broadcast构造atomicBroadcastBroadcastClient
client, err := ab.NewAtomicBroadcastClient(conn).Broadcast(context.TODO())
return &broadcastClient{conn: conn, client: client}, nil
}
//代码在peer/common/ordererclient.go
```
### 2.2、BroadcastClient接口定义及实现
```go
type BroadcastClient interface {
//Send data to orderer
Send(env *cb.Envelope) error
Close() error
}
type broadcastClient struct {
conn *grpc.ClientConn
client ab.AtomicBroadcast_BroadcastClient
}
//获取应答
func (s *broadcastClient) getAck() error {
msg, err := s.client.Recv()
if msg.Status != cb.Status_SUCCESS {
//是否成功
}
return nil
}
//向orderer发送数据
func (s *broadcastClient) Send(env *cb.Envelope) error {
err := s.client.Send(env) //发送cb.Envelope
err := s.getAck() //获取应答
return err
}
func (s *broadcastClient) Close() error { //关闭连接
return s.conn.Close()
}
//代码在peer/common/ordererclient.go
```
## 3、AtomicBroadcastClient接口定义及实现
### 3.1、AtomicBroadcastClient工具函数
```go
//构造atomicBroadcastClient
func NewAtomicBroadcastClient(cc *grpc.ClientConn) AtomicBroadcastClient {
return &atomicBroadcastClient{cc}
}
//代码在protos/orderer/ab.pb.go
```
### 3.2、AtomicBroadcastClient接口定义
```go
type AtomicBroadcastClient interface {
//广播
Broadcast(ctx context.Context, opts ...grpc.CallOption) (AtomicBroadcast_BroadcastClient, error)
//投递
Deliver(ctx context.Context, opts ...grpc.CallOption) (AtomicBroadcast_DeliverClient, error)
}
//代码在protos/orderer/ab.pb.go
```
### 3.3、AtomicBroadcastClient接口实现
AtomicBroadcastClient接口实现,即atomicBroadcastClient结构体及方法。
```go
type atomicBroadcastClient struct {
cc *grpc.ClientConn
}
//构造atomicBroadcastBroadcastClient
func (c *atomicBroadcastClient) Broadcast(ctx context.Context, opts ...grpc.CallOption) (AtomicBroadcast_BroadcastClient, error) {
stream, err := grpc.NewClientStream(ctx, &_AtomicBroadcast_serviceDesc.Streams[0], c.cc, "/orderer.AtomicBroadcast/Broadcast", opts...)
x := &atomicBroadcastBroadcastClient{stream}
}
func (c *atomicBroadcastClient) Deliver(ctx context.Context, opts ...grpc.CallOption) (AtomicBroadcast_DeliverClient, error) {
stream, err := grpc.NewClientStream(ctx, &_AtomicBroadcast_serviceDesc.Streams[1], c.cc, "/orderer.AtomicBroadcast/Deliver", opts...)
x := &atomicBroadcastDeliverClient{stream}
}
var _AtomicBroadcast_serviceDesc = grpc.ServiceDesc{
ServiceName: "orderer.AtomicBroadcast",
HandlerType: (*AtomicBroadcastServer)(nil),
Methods: []grpc.MethodDesc{},
Streams: []grpc.StreamDesc{
{
StreamName: "Broadcast",
Handler: _AtomicBroadcast_Broadcast_Handler,
ServerStreams: true,
ClientStreams: true,
},
{
StreamName: "Deliver",
Handler: _AtomicBroadcast_Deliver_Handler,
ServerStreams: true,
ClientStreams: true,
},
},
Metadata: "orderer/ab.proto",
}
//代码在protos/orderer/ab.pb.go
```
### 3.4、atomicBroadcastBroadcastClient
```go
type AtomicBroadcast_BroadcastClient interface {
Send(*common.Envelope) error //发送
Recv() (*BroadcastResponse, error) //接收
grpc.ClientStream
}
type atomicBroadcastBroadcastClient struct {
grpc.ClientStream
}
func (x *atomicBroadcastBroadcastClient) Send(m *common.Envelope) error {
return x.ClientStream.SendMsg(m)
}
func (x *atomicBroadcastBroadcastClient) Recv() (*BroadcastResponse, error) {
m := new(BroadcastResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
//代码在protos/orderer/ab.pb.go
```
### 3.5、atomicBroadcastDeliverClient
```go
type AtomicBroadcast_DeliverClient interface {
Send(*common.Envelope) error //发送
Recv() (*DeliverResponse, error) //接收
grpc.ClientStream
}
type atomicBroadcastDeliverClient struct {
grpc.ClientStream
}
func (x *atomicBroadcastDeliverClient) Send(m *common.Envelope) error {
return x.ClientStream.SendMsg(m)
}
func (x *atomicBroadcastDeliverClient) Recv() (*DeliverResponse, error) {
m := new(DeliverResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
//代码在protos/orderer/ab.pb.go
```

网址:http://www.qukuailianxueyuan.io/

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

网址:http://www.qukuailianxueyuan.io/

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

Fabric 1.0源代码分析(38) Peer #BroadcastClient(Broadcast客户端)相关推荐

  1. Fabric 1.0源代码分析(31) Peer

    # Fabric 1.0源代码笔记 之 Peer ## 1.Peer概述 在Fabric中,Peer(节点)是指在网络中负责接收交易请求.维护一致账本的各个fabric-peer实例.节点之间彼此通过 ...

  2. Fabric 1.0源代码分析(34) Peer #peer chaincode命令及子命令实现

    # Fabric 1.0源代码笔记 之 Peer #peer chaincode命令及子命令实现 ## 1.peer chaincode install子命令实现(安装链码) ### 1.0.peer ...

  3. Fabric 1.0源代码分析(32)Peer #peer根命令入口及加载子命令

    # Fabric 1.0源代码笔记 之 Peer #peer根命令入口及加载子命令 ## 1.加载环境变量配置和配置文件 Fabric支持通过环境变量对部分配置进行更新,如:CORE_LOGGING_ ...

  4. Fabric 1.0源代码分析(33) Peer #peer channel命令及子命令实现

    # Fabric 1.0源代码笔记 之 Peer #peer channel命令及子命令实现 ## 1.peer channel create子命令实现(创建通道) ### 1.1.初始化Ordere ...

  5. Fabric 1.0源代码分析(37) Peer #DeliverClient(Deliver客户端)

    # Fabric 1.0源代码笔记 之 Peer #DeliverClient(Deliver客户端) ## 1.DeliverClient概述 DeliverClient代码分布如下: * peer ...

  6. Fabric 1.0源代码分析(32) Peer #peer node start命令实现

    # Fabric 1.0源代码笔记 之 Peer #peer node start命令实现 ## 1.peer node加载子命令start和status peer node加载子命令start和st ...

  7. Fabric 1.0源代码分析(15)gossip(流言算法)

    # Fabric 1.0源代码笔记 之 gossip(流言算法) ## 1.gossip概述 gossip,翻译为流言蜚语,即为一种可最终达到一致的算法.最终一致的另外的含义就是,不保证同时达到一致. ...

  8. Fabric 1.0源代码分析(17)gossip(流言算法) #deliverclient(deliver客户端)

    # Fabric 1.0源代码笔记 之 gossip(流言算法) #deliverclient(deliver客户端) ## 1.deliverclient概述 deliverclient代码分布在g ...

  9. Fabric 1.0源代码分析(22)Ledger #blkstorage(block文件存储)

    # Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储) ## blkstorage概述 blkstorage,默认目录/var/hyperledger/pr ...

最新文章

  1. GPT-3数学不及格,愁坏伯克利团队,于是他们出了12500道数学作业
  2. Android Studio离线打包5+SDK
  3. bilibili有电脑版吗_虚充制冷剂、谎称电脑版故障...空调维修的这些套路,你 中招了吗...
  4. 《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
  5. 创建分辨率自适应的Windows Phone 8应用程序
  6. 一文看懂微服务背后的技术演进与应用实践
  7. React封装一个组件弹出框
  8. 农行运营合规管理心得体会_“乘风破浪”的农行合规达人秀来啦
  9. java枚举变量带括号_java枚举类型 - 墨梅的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. [转]链接中 href='#' 和 href='###' 的区别以及优缺点
  11. ODI Studio(二)--接口数据库集成,数据库 TO 数据库
  12. Java回调函数实现案例
  13. 手机技巧之扩展内存的检测以及修复。
  14. 多媒体教室建设方案综述
  15. 笔记本电脑摄像头频闪问题,打开摄像头出现错误代码0xA00F4244(0xC00D36D5)的问题解决方法
  16. excel 第3讲:查找、替换与定位
  17. 沧海云帆服务器哪里的,天涯明月刀沧海云帆9月合服_天刀沧海云帆大区9月合服公告_3DM网游...
  18. 红警教育2020版笔记本芯片级维修教材(含军工级)
  19. 涉密计算机不得接入互联网等公共信息网络,在涉密场所使用的与国际互联网或者其他公共网络连接的计算机不得安装视频、音频等输入装置 - 作业在线问答...
  20. [微信小程序开发者工具] × #initialize-error: Error: ENOENT: no such file or directory, open

热门文章

  1. 如何备份便签内容,便签云备份在哪里
  2. weblogic t3 协议利用与防御
  3. Java 接口与多态 实例
  4. HTTP 协议之 Chunked 解析
  5. js室内地图开发_概述-室内地图 JS API | 高德地图API
  6. YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读
  7. 蓝桥杯刷题冲刺 | 倒计时8天
  8. flutter纵向滚动嵌套横向滚动
  9. IOS状态栏和导航栏的控制问题
  10. 拓嘉启远电商:拼多多选词怎样选