Hyperledger Fabric处理Peer与Peer之间通信的源码解析

这里写图片描述

1.网络初始化的过程中执行以下内容,在创建节点Engine过程中该节点作为客户端的身份连接到其他Peer
peerServer, err = peer.NewPeerWithEngine(secHelperFunc, helper.GetEngine)
2.返回一个使用提供的handler工厂函数,在新的聊天服务调用上创建新的handler句柄的Peer
func NewPeerWithEngine(secHelperFunc func() crypto.Peer, engFactory EngineFactory) (peer *Impl, err error) {
    peer = new(Impl)
    peerNodes := peer.initDiscovery()

    peer.handlerMap = &handlerMap{m: make(map[pb.PeerID]MessageHandler)}

    peer.isValidator = ValidatorEnabled()
    peer.secHelper = secHelperFunc()

    // 为peer安装安全对象
    if SecurityEnabled() {
        if peer.secHelper == nil {
            return nil, fmt.Errorf("Security helper not provided")
        }
    }

    // 在引擎之前初始化账本,因为共识可能希望立即开始询问账本
    ledgerPtr, err := ledger.GetLedger()
    if err != nil {
        return nil, fmt.Errorf("Error constructing NewPeerWithHandler: %s", err)
    }
    peer.ledgerWrapper = &ledgerWrapper{ledger: ledgerPtr}

    peer.engine, err = engFactory(peer)
    if err != nil {
        return nil, err
    }
    peer.handlerFactory = peer.engine.GetHandlerFactory()
    if peer.handlerFactory == nil {
        return nil, errors.New("Cannot supply nil handler factory")
    }

    peer.chatWithSomePeers(peerNodes)
    return peer, nil

}
2.1.NewPeerWithHandler返回一个使用提供的handler工厂函数在新的聊天服务调用上创建新的handlers句柄的Peer,
func NewPeerWithHandler(secHelperFunc func() crypto.Peer, handlerFact HandlerFactory) (*Impl, error) {
    peer := new(Impl)
    peerNodes := peer.initDiscovery()

    if handlerFact == nil {
        return nil, errors.New("Cannot supply nil handler factory")
    }
    peer.handlerFactory = handlerFact
    peer.handlerMap = &handlerMap{m: make(map[pb.PeerID]MessageHandler)}

    peer.secHelper = secHelperFunc()

    // 为peer安装安全对象
    if SecurityEnabled() {
        if peer.secHelper == nil {
            return nil, fmt.Errorf("Security helper not provided")
        }
    }

    ledgerPtr, err := ledger.GetLedger()
    if err != nil {
        return nil, fmt.Errorf("Error constructing NewPeerWithHandler: %s", err)
    }
    peer.ledgerWrapper = &ledgerWrapper{ledger: ledgerPtr}

    peer.chatWithSomePeers(peerNodes)
    return peer, nil
}
2.2.Discovery是合并引导peer成员选择和对于NVP节点的VP节点选择接口
type Discovery interface {
    AddNode(string) bool           // 添加一个地址到discovery列表
    RemoveNode(string) bool        // 从discovery列表中移出一个地址
    GetAllNodes() []string         // 返回这个节点维护的所有地址
    GetRandomNodes(n int) []string // 返回这个peer连接的随机地址
    FindNode(string) bool          // 在discovery列表中找一个节点
}

// DiscoveryImpl是一个Discovery的实现
type DiscoveryImpl struct {
    sync.RWMutex
    nodes  map[string]bool
    seq    []string
    random *rand.Rand
}

// NewDiscoveryImpl 是一个Discovery实现的构造器
func NewDiscoveryImpl() *DiscoveryImpl {
    di := DiscoveryImpl{}
    di.nodes = make(map[string]bool)
    di.random = rand.New(rand.NewSource(time.Now().Unix()))
    return &di
}

// AddN
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值