@@ -282,13 +282,14 @@ func (n *Node) txStashLoop(ctx context.Context) {
282282}
283283
284284// guardBlockProcessing adds lock on block processing and maintains block conflicts.
285- func (n * Node ) guardBlockProcessing (blockNum uint32 , process func (conflicts [][] byte ) (thor.Bytes32 , error )) error {
285+ func (n * Node ) guardBlockProcessing (blockNum uint32 , process func (conflicts uint32 ) (thor.Bytes32 , error )) error {
286286 n .processLock .Lock ()
287287 defer n .processLock .Unlock ()
288288
289289 var (
290- err error
291- blockID thor.Bytes32
290+ err error
291+ blockID thor.Bytes32
292+ conflicts []thor.Bytes32
292293 )
293294
294295 if blockNum > n .maxBlockNum {
@@ -298,19 +299,19 @@ func (n *Node) guardBlockProcessing(blockNum uint32, process func(conflicts [][]
298299 }
299300
300301 // don't increase maxBlockNum if the block is unprocessable
301- if blockID , err = process (make ([][] byte , 0 ) ); err != nil {
302+ if blockID , err = process (0 ); err != nil {
302303 return err
303304 }
304305
305306 n .maxBlockNum = blockNum
306307 return nil
307308 }
308309
309- conflicts , err : = n .repo .GetConflicts (blockNum )
310+ conflicts , err = n .repo .GetConflicts (blockNum )
310311 if err != nil {
311312 return err
312313 }
313- blockID , err = process (conflicts )
314+ blockID , err = process (uint32 ( len ( conflicts )) )
314315 if err != nil {
315316 return err
316317 }
@@ -336,45 +337,52 @@ func (n *Node) guardBlockProcessing(blockNum uint32, process func(conflicts [][]
336337 }
337338 }
338339 }
339- return nil
340- }(); err != nil {
341- logger .Warn ("failed to run post process hook" , "err" , err )
342- }
343340
344- return nil
345- }
346-
347- func (n * Node ) processBlock (newBlock * block.Block , stats * blockStats ) (bool , error ) {
348- var isTrunk * bool
349-
350- if err := n .guardBlockProcessing (newBlock .Header ().Number (), func (conflicts [][]byte ) (thor.Bytes32 , error ) {
351- // Check whether the block was already there.
352- // It can be skipped if no conflicts.
353341 if len (conflicts ) > 0 {
342+ newBlock , err := n .repo .GetBlock (blockID )
343+ if err != nil {
344+ return err
345+ }
346+
354347 newSigner , err := newBlock .Header ().Signer ()
355348 if err != nil {
356- return thor. Bytes32 {}, err
349+ return err
357350 }
358351 // iter over conflicting blocks
359352 for _ , conflict := range conflicts {
360- conflictBlock , err := n .repo .GetBlock (thor . BytesToBytes32 ( conflict ) )
353+ conflictBlock , err := n .repo .GetBlock (conflict )
361354 if err != nil {
362- return thor. Bytes32 {}, err
355+ return err
363356 }
364357 // logic to verify that the blocks are different and from the same signer
365- signer , err := conflictBlock .Header ().Signer ()
358+ existingSigner , err := conflictBlock .Header ().Signer ()
366359 if err != nil {
367- return thor. Bytes32 {}, err
360+ return err
368361 }
369- if signer == newSigner &&
370- conflictBlock .Header ().ID () != newBlock .Header ().ID () &&
371- conflictBlock .Header ().StateRoot () != newBlock .Header ().StateRoot () {
372- log .Warn ("Double signing" , "block" , shortID (newBlock .Header ().ID ()), "previous" , shortID (thor .BytesToBytes32 (conflict )))
373- metricDoubleSignedBlocks ().AddWithLabel (1 , map [string ]string {"signer" : signer .String ()})
362+ if existingSigner == newSigner &&
363+ conflictBlock .Header ().ID () != newBlock .Header ().ID () {
364+ log .Warn ("Double signing" , "block" , shortID (newBlock .Header ().ID ()), "previous" , shortID (conflict ), "signer" , existingSigner )
365+ metricDoubleSignedBlocks ().AddWithLabel (1 , map [string ]string {"signer" : existingSigner .String ()})
374366 }
375367 }
368+ }
369+
370+ return nil
371+ }(); err != nil {
372+ logger .Warn ("failed to run post process hook" , "err" , err )
373+ }
376374
377- _ , err = n .repo .GetBlockSummary (newBlock .Header ().ID ())
375+ return nil
376+ }
377+
378+ func (n * Node ) processBlock (newBlock * block.Block , stats * blockStats ) (bool , error ) {
379+ var isTrunk * bool
380+
381+ if err := n .guardBlockProcessing (newBlock .Header ().Number (), func (conflicts uint32 ) (thor.Bytes32 , error ) {
382+ // Check whether the block was already there.
383+ // It can be skipped if no conflicts.
384+ if conflicts > 0 {
385+ _ , err := n .repo .GetBlockSummary (newBlock .Header ().ID ())
378386 if err != nil {
379387 if ! n .repo .IsNotFound (err ) {
380388 return thor.Bytes32 {}, err
@@ -403,7 +411,7 @@ func (n *Node) processBlock(newBlock *block.Block, stats *blockStats) (bool, err
403411 }
404412
405413 // process the new block
406- stage , receipts , err := n .cons .Process (parentSummary , newBlock , uint64 (time .Now ().Unix ()), uint32 ( len ( conflicts )) )
414+ stage , receipts , err := n .cons .Process (parentSummary , newBlock , uint64 (time .Now ().Unix ()), conflicts )
407415 if err != nil {
408416 return thor.Bytes32 {}, err
409417 }
@@ -444,7 +452,7 @@ func (n *Node) processBlock(newBlock *block.Block, stats *blockStats) (bool, err
444452 }
445453
446454 // add the new block into repository
447- if err := n .repo .AddBlock (newBlock , receipts , uint32 ( len ( conflicts )) , becomeNewBest ); err != nil {
455+ if err := n .repo .AddBlock (newBlock , receipts , conflicts , becomeNewBest ); err != nil {
448456 return thor.Bytes32 {}, errors .Wrap (err , "add block" )
449457 }
450458
0 commit comments