peer.go

优质
小牛编辑
124浏览
2023-12-01

peer.go

peer 相关

比较核心的数据结构。

Peer 接口,两个方法:包括获取一个 peer 端点和发送探测 hello 消息。

type Peer interface {    GetPeerEndpoint() (*pb.PeerEndpoint, error)    NewOpenchainDiscoveryHello() (*pb.Message, error)}

具体实现的数据结构为 PeerImpl。

type PeerImpl struct {    handlerFactory HandlerFactory  // 生成一个 MessageHandler    handlerMap     *handlerMap     // 所有注册上来的消息处理器    ledgerWrapper  *ledgerWrapper  // ledger 操作句柄    secHelper      crypto.Peer     // 处理身份验证和安全相关    engine         Engine          // handler 工厂 + 本地交易处理的引擎    isValidator    bool    reconnectOnce  sync.Once    discHelper     discovery.Discovery //探测任务句柄    discPersist    bool}

核心方法,包括:

  • ExecuteTransaction:准备执行一个交易,发送给本地的引擎(VP 节点),或给远端的 peer;
  • Broadcast:向所有注册的消息句柄发送消息;
  • Unicast:向指定的 peer 发送消息;
  • 一系列 Get 方法:包括获取 Block 内容、获取当前链的大小、当前状态的 hash、获取已注册的 peer 端点、远端 ledger 等等,很多功能实际上都是通过其它包来完成。
  • sendTransactionsToLocalEngine:交易发给本地的引擎处理;
  • SendTransactionsToPeer:交易发给其它 peer 处理;

消息相关

两个基础接口 MessageHandler 和 MessageHandlerCoordinator。

type MessageHandler interface {    RemoteLedger    // 获取远端的 ledger    HandleMessage(msg *pb.Message) error // 接收到某个消息进行处理    SendMessage(msg *pb.Message) error //发送消息到对端    To() (pb.PeerEndpoint, error) // 对端是哪个节点    Stop() error}
type MessageHandlerCoordinator interface {    Peer    SecurityAccessor    BlockChainAccessor    BlockChainModifier    BlockChainUtil    StateAccessor    RegisterHandler(messageHandler MessageHandler) error    DeregisterHandler(messageHandler MessageHandler) error    Broadcast(*pb.Message, pb.PeerEndpoint_Type) []error    Unicast(*pb.Message, *pb.PeerID) error    GetPeers() (*pb.PeersMessage, error)    GetRemoteLedger(receiver *pb.PeerID) (RemoteLedger, error)    PeersDiscovered(*pb.PeersMessage) error    ExecuteTransaction(transaction *pb.Transaction) *pb.Response    Discoverer}