@@ -39,6 +39,8 @@ import (
3939func New (config * istanbul.Config , eventMux * event.TypeMux , privateKey * ecdsa.PrivateKey , db ethdb.Database ) consensus.Istanbul {
4040 // Allocate the snapshot caches and create the engine
4141 recents , _ := lru .NewARC (inmemorySnapshots )
42+ recentMessages , _ := lru .NewARC (inmemoryPeers )
43+ knownMessages , _ := lru .NewARC (inmemoryMessages )
4244 backend := & backend {
4345 config : config ,
4446 eventMux : eventMux ,
@@ -51,6 +53,8 @@ func New(config *istanbul.Config, eventMux *event.TypeMux, privateKey *ecdsa.Pri
5153 recents : recents ,
5254 candidates : make (map [common.Address ]bool ),
5355 coreStarted : false ,
56+ recentMessages : recentMessages ,
57+ knownMessages : knownMessages ,
5458 }
5559 backend .core = istanbulCore .New (backend , backend .config )
5660 return backend
@@ -87,6 +91,9 @@ type backend struct {
8791 // event subscription for ChainHeadEvent event
8892 eventSub * event.TypeMuxSubscription
8993 broadcaster consensus.Broadcaster
94+
95+ recentMessages * lru.ARCCache // the cache of peer's messages
96+ knownMessages * lru.ARCCache // the cache of self messages
9097}
9198
9299// Address implements istanbul.Backend.Address
@@ -111,7 +118,11 @@ func (sb *backend) Broadcast(valSet istanbul.ValidatorSet, payload []byte) error
111118 return nil
112119}
113120
121+ // Broadcast implements istanbul.Backend.Gossip
114122func (sb * backend ) Gossip (valSet istanbul.ValidatorSet , payload []byte ) error {
123+ hash := istanbul .RLPHash (payload )
124+ sb .knownMessages .Add (hash , true )
125+
115126 targets := make (map [common.Address ]bool )
116127 for _ , val := range valSet .List () {
117128 if val .Address () != sb .Address () {
@@ -121,7 +132,22 @@ func (sb *backend) Gossip(valSet istanbul.ValidatorSet, payload []byte) error {
121132
122133 if sb .broadcaster != nil && len (targets ) > 0 {
123134 ps := sb .broadcaster .FindPeers (targets )
124- for _ , p := range ps {
135+ for addr , p := range ps {
136+ ms , ok := sb .recentMessages .Get (addr )
137+ var m * lru.ARCCache
138+ if ok {
139+ m , _ = ms .(* lru.ARCCache )
140+ if _ , k := m .Get (hash ); k {
141+ // This peer had this event, skip it
142+ continue
143+ }
144+ } else {
145+ m , _ = lru .NewARC (inmemoryMessages )
146+ }
147+
148+ m .Add (hash , true )
149+ sb .recentMessages .Add (addr , m )
150+
125151 go p .Send (istanbulMsg , payload )
126152 }
127153 }
0 commit comments