@@ -76,6 +76,21 @@ func (p *Pbft) BroadMessage(msg elap2p.Message) {
76
76
}
77
77
}
78
78
79
+ func (p * Pbft ) BroadMessageExcept (msg elap2p.Message , exceptPeer peer.PID ) {
80
+ peers := p .network .DumpPeersInfo ()
81
+ for _ , peer := range peers {
82
+ pid := peer .PID [:]
83
+ producer := p .dispatcher .GetConsensusView ().IsProducers (pid )
84
+ if producer == false {
85
+ continue
86
+ }
87
+ if peer .PID .Equal (exceptPeer ) {
88
+ continue
89
+ }
90
+ p .network .SendMessageToPeer (peer .PID , msg )
91
+ }
92
+ }
93
+
79
94
func (p * Pbft ) BroadMessageToPeers (msg elap2p.Message , peers [][]byte ) {
80
95
for _ , pbk := range peers {
81
96
pid := peer.PID {}
@@ -201,7 +216,7 @@ func (p *Pbft) OnPong(id peer.PID, height uint32) {
201
216
}
202
217
203
218
func (p * Pbft ) OnBlock (id peer.PID , block * dmsg.BlockMsg ) {
204
- log .Info ("-----OnBlock received------" )
219
+ log .Info ("-----PBFT OnBlock received------" )
205
220
b := & types.Block {}
206
221
207
222
err := b .DecodeRLP (rlp .NewStream (bytes .NewBuffer (block .GetData ()), 0 ))
@@ -306,6 +321,10 @@ func (p *Pbft) OnInv(id peer.PID, blockHash elacom.Uint256) {
306
321
return
307
322
}
308
323
hash := common .BytesToHash (blockHash .Bytes ())
324
+ if p .chain .GetBlockByHash (hash ) != nil {
325
+ return
326
+ }
327
+
309
328
if _ , ok := p .requestedBlocks [hash ]; ok {
310
329
return
311
330
}
@@ -317,8 +336,16 @@ func (p *Pbft) OnInv(id peer.PID, blockHash elacom.Uint256) {
317
336
}
318
337
319
338
func (p * Pbft ) OnGetBlock (id peer.PID , blockHash elacom.Uint256 ) {
320
- if block , ok := p .blockPool .GetBlock (blockHash ); ok {
321
- if b , suc := block .(* types.Block ); suc {
339
+ ok := false
340
+ var block dpos.DBlock
341
+ block , ok = p .blockPool .GetBlock (blockHash )
342
+ if ! ok {
343
+ hash := common .BytesToHash (blockHash .Bytes ())
344
+ block = p .chain .GetBlockByHash (hash )
345
+ ok = block != nil
346
+ }
347
+ if ok {
348
+ if b , suc := block .(* types.Block ); suc && b != nil {
322
349
buffer := bytes .NewBuffer ([]byte {})
323
350
err := b .EncodeRLP (buffer )
324
351
if err != nil {
@@ -388,7 +415,7 @@ func (p *Pbft) OnIllegalVotesReceived(id peer.PID, votes *payload.DPOSIllegalVot
388
415
}
389
416
390
417
func (p * Pbft ) OnProposalReceived (id peer.PID , proposal * payload.DPOSProposal ) {
391
- log .Info ("OnProposalReceived" , "hash:" , proposal .Hash ().String ())
418
+ log .Info ("OnProposalReceived" , "hash:" , proposal .Hash ().String (), "from" , id . String () )
392
419
if _ , ok := p .requestedProposals [proposal .Hash ()]; ok {
393
420
delete (p .requestedProposals , proposal .Hash ())
394
421
}
@@ -692,10 +719,28 @@ func (p *Pbft) OnBlockReceived(id peer.PID, b *dmsg.BlockMsg, confirmed bool) {
692
719
log .Warn ("is bigger than local number" )
693
720
return
694
721
}
722
+ if p .chain .GetBlockByHash (block .Hash ()) != nil {
723
+ log .Error ("insert chain is known block" , "hash" , block .Hash ().String (), "number" , block .NumberU64 ())
724
+ return
725
+ }
695
726
if _ , err := p .chain .InsertChain (blocks ); err != nil {
696
727
if p .OnInsertChainError != nil {
697
728
p .OnInsertChainError (id , block , err )
698
729
}
730
+ } else {
731
+ preHash , err := elacom .Uint256FromBytes (block .ParentHash ().Bytes ())
732
+ if err != nil {
733
+ log .Error ("error parent block hash" , "error" , err , "parentHash" , block .ParentHash ().String ())
734
+ } else {
735
+ p .BroadMessageExcept (msg .NewInventory (* preHash ), id )
736
+ }
737
+
738
+ blockHash , err := elacom .Uint256FromBytes (block .Hash ().Bytes ())
739
+ if err != nil {
740
+ log .Error ("error block hash" , "error" , err , "blockHash" , block .Hash ().String ())
741
+ } else {
742
+ p .BroadMessageExcept (msg .NewInventory (* blockHash ), id )
743
+ }
699
744
}
700
745
}
701
746
0 commit comments