"github.com/vapor/consensus"
"github.com/vapor/errors"
msgs "github.com/vapor/netsync/messages"
- "github.com/vapor/p2p/trust"
"github.com/vapor/protocol/bc"
"github.com/vapor/protocol/bc/types"
)
maxKnownTxs = 32768 // Maximum transactions hashes to keep in the known list (prevent DOS)
maxKnownSignatures = 1024 // Maximum block signatures to keep in the known list (prevent DOS)
maxKnownBlocks = 1024 // Maximum block hashes to keep in the known list (prevent DOS)
- defaultBanThreshold = uint32(100)
maxFilterAddressSize = 50
maxFilterAddressCount = 1000
//BasePeerSet is the intergace for connection level peer manager
type BasePeerSet interface {
- AddBannedPeer(string) error
StopPeerGracefully(string)
+ IsBanned(peerID string, level byte, reason string) bool
}
type BroadcastMsg interface {
services consensus.ServiceFlag
height uint64
hash *bc.Hash
- banScore trust.DynamicBanScore
knownTxs *set.Set // Set of transaction hashes known to be known by this peer
knownBlocks *set.Set // Set of block hashes known to be known by this peer
knownSignatures *set.Set // Set of block signatures known to be known by this peer
return p.height
}
-func (p *Peer) addBanScore(persistent, transient uint32, reason string) bool {
- score := p.banScore.Increase(persistent, transient)
- if score > defaultBanThreshold {
- log.WithFields(log.Fields{
- "module": logModule,
- "address": p.Addr(),
- "score": score,
- "reason": reason,
- }).Errorf("banning and disconnecting")
- return true
- }
-
- warnThreshold := defaultBanThreshold >> 1
- if score > warnThreshold {
- log.WithFields(log.Fields{
- "module": logModule,
- "address": p.Addr(),
- "score": score,
- "reason": reason,
- }).Warning("ban score increasing")
- }
- return false
-}
-
func (p *Peer) AddFilterAddress(address []byte) {
p.mtx.Lock()
defer p.mtx.Unlock()
for p.knownSignatures.Size() >= maxKnownSignatures {
p.knownSignatures.Pop()
}
- p.knownSignatures.Add(signature)
+ p.knownSignatures.Add(hex.EncodeToString(signature))
}
func (p *Peer) markTransaction(hash *bc.Hash) {
var peers []string
for _, peer := range ps.peers {
- if !peer.knownSignatures.Has(signature) {
+ if !peer.knownSignatures.Has(hex.EncodeToString(signature)) {
peers = append(peers, peer.ID())
}
}
}
}
-func (ps *PeerSet) AddBanScore(peerID string, persistent, transient uint32, reason string) {
+func (ps *PeerSet) ProcessIllegal(peerID string, level byte, reason string) {
ps.mtx.Lock()
peer := ps.peers[peerID]
ps.mtx.Unlock()
if peer == nil {
return
}
- if ban := peer.addBanScore(persistent, transient, reason); !ban {
- return
- }
- if err := ps.AddBannedPeer(peer.Addr().String()); err != nil {
- log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on add ban peer")
+ if banned := ps.IsBanned(peer.Addr().String(), level, reason); banned {
+ ps.RemovePeer(peerID)
}
- ps.RemovePeer(peerID)
+ return
}
func (ps *PeerSet) AddPeer(peer BasePeer) {
return nil
}
-func (ps *PeerSet) ErrorHandler(peerID string, err error) {
+func (ps *PeerSet) ErrorHandler(peerID string, level byte, err error) {
if errors.Root(err) == ErrPeerMisbehave {
- ps.AddBanScore(peerID, 20, 0, err.Error())
+ ps.ProcessIllegal(peerID, level, err.Error())
} else {
ps.RemovePeer(peerID)
}