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
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 {
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()
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()
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
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)
+}