return manager, nil
}
+func (sm *SyncManager) AddPeer(peer BasePeer) {
+ sm.peers.addPeer(peer)
+}
+
//BestPeer return the highest p2p peerInfo
func (sm *SyncManager) BestPeer() *PeerInfo {
bestPeer := sm.peers.bestPeer(consensus.SFFullNode)
peer.setStatus(block.Height, &hash)
}
-func (sm *SyncManager) handleStatusRequestMsg(peer BasePeer) {
- bestHeader := sm.chain.BestBlockHeader()
- genesisBlock, err := sm.chain.GetBlockByHeight(0)
- if err != nil {
- log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on handleStatusRequestMsg get genesis")
- }
-
- genesisHash := genesisBlock.Hash()
- msg := NewStatusResponseMessage(bestHeader, &genesisHash)
- if ok := peer.TrySend(BlockchainChannel, struct{ BlockchainMessage }{msg}); !ok {
- sm.peers.removePeer(peer.ID())
- }
-}
-
-func (sm *SyncManager) handleStatusResponseMsg(basePeer BasePeer, msg *StatusResponseMessage) {
+func (sm *SyncManager) handleStatusMsg(basePeer BasePeer, msg *StatusMessage) {
if peer := sm.peers.getPeer(basePeer.ID()); peer != nil {
peer.setStatus(msg.Height, msg.GetHash())
return
}
-
- if genesisHash := msg.GetGenesisHash(); sm.genesisHash != *genesisHash {
- log.WithFields(log.Fields{"module": logModule, "remote genesis": genesisHash.String(), "local genesis": sm.genesisHash.String()}).Warn("fail hand shake due to differnt genesis")
- return
- }
-
- sm.peers.addPeer(basePeer, msg.Height, msg.GetHash())
}
func (sm *SyncManager) handleTransactionMsg(peer *peer, msg *TransactionMessage) {
func (sm *SyncManager) processMsg(basePeer BasePeer, msgType byte, msg BlockchainMessage) {
peer := sm.peers.getPeer(basePeer.ID())
- if peer == nil && msgType != StatusResponseByte && msgType != StatusRequestByte {
+ if peer == nil {
return
}
case *BlockMessage:
sm.handleBlockMsg(peer, msg)
- case *StatusRequestMessage:
- sm.handleStatusRequestMsg(basePeer)
-
- case *StatusResponseMessage:
- sm.handleStatusResponseMsg(basePeer, msg)
+ case *StatusMessage:
+ sm.handleStatusMsg(basePeer, msg)
case *TransactionMessage:
sm.handleTransactionMsg(peer, msg)
}
}
+func (sm *SyncManager) SendStatus(peer BasePeer) error {
+ p := sm.peers.getPeer(peer.ID())
+ if p == nil {
+ return errors.New("invalid peer")
+ }
+
+ if err := p.sendStatus(sm.chain.BestBlockHeader()); err != nil {
+ sm.peers.removePeer(p.ID())
+ return err
+ }
+ return nil
+}
+
func (sm *SyncManager) Start() error {
var err error
if _, err = sm.sw.Start(); err != nil {