OSDN Git Service

fix votetx for validation (#75)
[bytom/vapor.git] / netsync / handle.go
index db50d8a..ce10e1a 100644 (file)
@@ -44,7 +44,6 @@ type Switch interface {
        AddReactor(name string, reactor p2p.Reactor) p2p.Reactor
        AddBannedPeer(string) error
        StopPeerGracefully(string)
-       NodeInfo() *p2p.NodeInfo
        Start() (bool, error)
        Stop() bool
        IsListening() bool
@@ -109,6 +108,10 @@ func newSyncManager(config *cfg.Config, sw Switch, chain Chain, txPool *core.TxP
        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)
@@ -303,32 +306,11 @@ func (sm *SyncManager) handleMineBlockMsg(peer *peer, msg *MineBlockMessage) {
        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) {
@@ -350,10 +332,6 @@ func (sm *SyncManager) IsListening() bool {
        return sm.sw.IsListening()
 }
 
-func (sm *SyncManager) NodeInfo() *p2p.NodeInfo {
-       return sm.sw.NodeInfo()
-}
-
 func (sm *SyncManager) PeerCount() int {
        if sm.config.VaultMode {
                return 0
@@ -363,7 +341,7 @@ func (sm *SyncManager) PeerCount() int {
 
 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
        }
 
@@ -381,11 +359,8 @@ func (sm *SyncManager) processMsg(basePeer BasePeer, msgType byte, msg Blockchai
        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)
@@ -426,6 +401,19 @@ func (sm *SyncManager) processMsg(basePeer BasePeer, msgType byte, msg Blockchai
        }
 }
 
+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 {