OSDN Git Service

Add protocol state module test case (#380)
[bytom/vapor.git] / netsync / peers / peer.go
index e74a458..e0c52f5 100644 (file)
@@ -30,6 +30,7 @@ const (
 var (
        errSendStatusMsg = errors.New("send status msg fail")
        ErrPeerMisbehave = errors.New("peer is misbehave")
+       ErrNoValidPeer   = errors.New("Can't find valid fast sync peer")
 )
 
 //BasePeer is the interface for connection level peer
@@ -251,32 +252,6 @@ func (p *Peer) markTransaction(hash *bc.Hash) {
        p.knownTxs.Add(hash.String())
 }
 
-func (ps *PeerSet) PeersWithoutBlock(hash bc.Hash) []string {
-       ps.mtx.RLock()
-       defer ps.mtx.RUnlock()
-
-       var peers []string
-       for _, peer := range ps.peers {
-               if !peer.knownBlocks.Has(hash.String()) {
-                       peers = append(peers, peer.ID())
-               }
-       }
-       return peers
-}
-
-func (ps *PeerSet) PeersWithoutSign(signature []byte) []string {
-       ps.mtx.RLock()
-       defer ps.mtx.RUnlock()
-
-       var peers []string
-       for _, peer := range ps.peers {
-               if !peer.knownSignatures.Has(hex.EncodeToString(signature)) {
-                       peers = append(peers, peer.ID())
-               }
-       }
-       return peers
-}
-
 func (p *Peer) SendBlock(block *types.Block) (bool, error) {
        msg, err := msgs.NewBlockMessage(block)
        if err != nil {
@@ -543,14 +518,6 @@ func (ps *PeerSet) BroadcastTx(tx *types.Tx) error {
        return nil
 }
 
-func (ps *PeerSet) ErrorHandler(peerID string, level byte, err error) {
-       if errors.Root(err) == ErrPeerMisbehave {
-               ps.ProcessIllegal(peerID, level, err.Error())
-       } else {
-               ps.RemovePeer(peerID)
-       }
-}
-
 // Peer retrieves the registered peer with the given id.
 func (ps *PeerSet) GetPeer(id string) *Peer {
        ps.mtx.RLock()
@@ -558,6 +525,19 @@ func (ps *PeerSet) GetPeer(id string) *Peer {
        return ps.peers[id]
 }
 
+func (ps *PeerSet) GetPeersByHeight(height uint64) []*Peer {
+       ps.mtx.RLock()
+       defer ps.mtx.RUnlock()
+
+       peers := []*Peer{}
+       for _, peer := range ps.peers {
+               if peer.Height() >= height {
+                       peers = append(peers, peer)
+               }
+       }
+       return peers
+}
+
 func (ps *PeerSet) GetPeerInfos() []*PeerInfo {
        ps.mtx.RLock()
        defer ps.mtx.RUnlock()
@@ -604,14 +584,27 @@ func (ps *PeerSet) MarkTx(peerID string, txHash bc.Hash) {
        peer.markTransaction(&txHash)
 }
 
-func (ps *PeerSet) peersWithoutBlock(hash *bc.Hash) []*Peer {
+func (ps *PeerSet) PeersWithoutBlock(hash bc.Hash) []string {
        ps.mtx.RLock()
        defer ps.mtx.RUnlock()
 
-       peers := []*Peer{}
+       var peers []string
        for _, peer := range ps.peers {
                if !peer.knownBlocks.Has(hash.String()) {
-                       peers = append(peers, peer)
+                       peers = append(peers, peer.ID())
+               }
+       }
+       return peers
+}
+
+func (ps *PeerSet) PeersWithoutSignature(signature []byte) []string {
+       ps.mtx.RLock()
+       defer ps.mtx.RUnlock()
+
+       var peers []string
+       for _, peer := range ps.peers {
+               if !peer.knownSignatures.Has(hex.EncodeToString(signature)) {
+                       peers = append(peers, peer.ID())
                }
        }
        return peers
@@ -658,3 +651,12 @@ func (ps *PeerSet) SetStatus(peerID string, height uint64, hash *bc.Hash) {
 
        peer.SetBestStatus(height, hash)
 }
+
+func (ps *PeerSet) SetIrreversibleStatus(peerID string, height uint64, hash *bc.Hash) {
+       peer := ps.GetPeer(peerID)
+       if peer == nil {
+               return
+       }
+
+       peer.SetIrreversibleStatus(height, hash)
+}