OSDN Git Service

Merge pull request #1386 from Bytom/dev
[bytom/bytom.git] / netsync / peer.go
index 8a7a1c2..eaa20ef 100644 (file)
@@ -87,15 +87,27 @@ func (p *peer) addBanScore(persistent, transient uint64, reason string) bool {
        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)
        }
 }
 
@@ -230,7 +242,7 @@ func (p *peer) sendMerkleBlock(block *types.Block, txStatuses *bc.TransactionSta
        if err := msg.setTxInfo(txHashes, txFlags, relatedTxs); err != nil {
                return false, nil
        }
-       
+
        statusHashes := types.GetStatusMerkleTreeProof(txStatuses.VerifyStatus, txFlags)
        if err := msg.setStatusInfo(statusHashes, relatedStatuses); err != nil {
                return false, nil
@@ -348,9 +360,12 @@ func (ps *peerSet) broadcastMinedBlock(block *types.Block) error {
 }
 
 func (ps *peerSet) broadcastNewStatus(bestBlock, genesisBlock *types.Block) error {
+       bestBlockHash := bestBlock.Hash()
+       peers := ps.peersWithoutBlock(&bestBlockHash)
+
        genesisHash := genesisBlock.Hash()
        msg := NewStatusResponseMessage(&bestBlock.BlockHeader, &genesisHash)
-       for _, peer := range ps.peers {
+       for _, peer := range peers {
                if ok := peer.TrySend(BlockchainChannel, struct{ BlockchainMessage }{msg}); !ok {
                        ps.removePeer(peer.ID())
                        continue