)
const (
- maxTxChanSize = 10000
+ maxTxChanSize = 10000
+ maxFilterAddressSize = 50
+ maxFilterAddressCount = 1000
)
// Chain is the interface for Bytom core
}
func (sm *SyncManager) handleFilterAddMsg(peer *peer, msg *FilterAddMessage) {
- peer.filterAdds.Add(hex.EncodeToString(msg.Address))
+ peer.addFilterAddress(msg.Address)
}
func (sm *SyncManager) handleFilterClearMsg(peer *peer) {
}
func (sm *SyncManager) handleFilterLoadMsg(peer *peer, msg *FilterLoadMessage) {
- if len(msg.Addresses) == 0 {
- log.Info("the addresses is empty from filter load message")
- return
- }
peer.addFilterAddresses(msg.Addresses)
}
func (sm *SyncManager) handleGetMerkleBlockMsg(peer *peer, msg *GetMerkleBlockMessage) {
var err error
- var block *types.Block
+ var block *types.Block
if msg.Height != 0 {
block, err = sm.chain.GetBlockByHeight(msg.Height)
} else {
return false
}
-func (p *peer) addFilterAddresses(addresses [][]byte) {
+func (p *peer) addFilterAddress(address []byte) {
p.mtx.Lock()
defer p.mtx.Unlock()
+ if p.filterAdds.Size() >= maxFilterAddressCount {
+ log.Warn("the count of filter addresses is greater than limit")
+ return
+ }
+ if len(address) > maxFilterAddressSize {
+ log.Warn("the size of filter address is greater than limit")
+ return
+ }
+ p.filterAdds.Add(hex.EncodeToString(address))
+}
+
+func (p *peer) addFilterAddresses(addresses [][]byte) {
if !p.filterAdds.IsEmpty() {
p.filterAdds.Clear()
}
for _, address := range addresses {
- p.filterAdds.Add(hex.EncodeToString(address))
+ p.addFilterAddress(address)
}
}