github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/sequencer/closingsignalsmanager.go (about)

     1  package sequencer
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/0xPolygon/supernets2-node/log"
     8  )
     9  
    10  type closingSignalsManager struct {
    11  	ctx                    context.Context
    12  	dbManager              dbManagerInterface
    13  	closingSignalCh        ClosingSignalCh
    14  	cfg                    FinalizerCfg
    15  	lastForcedBatchNumSent uint64
    16  	etherman               etherman
    17  }
    18  
    19  func newClosingSignalsManager(ctx context.Context, dbManager dbManagerInterface, closingSignalCh ClosingSignalCh, cfg FinalizerCfg, etherman etherman) *closingSignalsManager {
    20  	return &closingSignalsManager{ctx: ctx, dbManager: dbManager, closingSignalCh: closingSignalCh, cfg: cfg, etherman: etherman}
    21  }
    22  
    23  func (c *closingSignalsManager) Start() {
    24  	go c.checkForcedBatches()
    25  	go c.checkGERUpdate()
    26  }
    27  
    28  func (c *closingSignalsManager) checkGERUpdate() {
    29  	lastBatch, err := c.dbManager.GetLastBatch(c.ctx)
    30  	for err != nil {
    31  		log.Errorf("error getting last batch: %v", err)
    32  		time.Sleep(time.Second)
    33  		lastBatch, err = c.dbManager.GetLastBatch(c.ctx)
    34  	}
    35  	lastGERSent := lastBatch.GlobalExitRoot
    36  	for {
    37  		time.Sleep(c.cfg.ClosingSignalsManagerWaitForCheckingGER.Duration)
    38  
    39  		lastL1BlockNumber, err := c.etherman.GetLatestBlockNumber(c.ctx)
    40  		if err != nil {
    41  			log.Errorf("error getting latest L1 block number: %v", err)
    42  			continue
    43  		}
    44  
    45  		maxBlockNumber := uint64(0)
    46  		if c.cfg.GERFinalityNumberOfBlocks <= lastL1BlockNumber {
    47  			maxBlockNumber = lastL1BlockNumber - c.cfg.GERFinalityNumberOfBlocks
    48  		}
    49  
    50  		ger, _, err := c.dbManager.GetLatestGer(c.ctx, maxBlockNumber)
    51  		if err != nil {
    52  			log.Errorf("error checking GER update: %v", err)
    53  			continue
    54  		}
    55  
    56  		if ger.GlobalExitRoot != lastGERSent {
    57  			log.Debugf("sending GER update signal (GER: %v)", ger.GlobalExitRoot)
    58  			c.closingSignalCh.GERCh <- ger.GlobalExitRoot
    59  			lastGERSent = ger.GlobalExitRoot
    60  		}
    61  	}
    62  }
    63  
    64  func (c *closingSignalsManager) checkForcedBatches() {
    65  	for {
    66  		time.Sleep(c.cfg.ClosingSignalsManagerWaitForCheckingForcedBatches.Duration)
    67  
    68  		if c.lastForcedBatchNumSent == 0 {
    69  			lastTrustedForcedBatchNum, err := c.dbManager.GetLastTrustedForcedBatchNumber(c.ctx, nil)
    70  			if err != nil {
    71  				log.Errorf("error getting last trusted forced batch number: %v", err)
    72  				continue
    73  			}
    74  			if lastTrustedForcedBatchNum > 0 {
    75  				c.lastForcedBatchNumSent = lastTrustedForcedBatchNum
    76  			}
    77  		}
    78  		// Take into account L1 finality
    79  		lastBlock, err := c.dbManager.GetLastBlock(c.ctx, nil)
    80  		if err != nil {
    81  			log.Errorf("failed to get latest eth block number, err: %v", err)
    82  			continue
    83  		}
    84  
    85  		blockNumber := lastBlock.BlockNumber
    86  
    87  		maxBlockNumber := uint64(0)
    88  		finalityNumberOfBlocks := c.cfg.ForcedBatchesFinalityNumberOfBlocks
    89  
    90  		if finalityNumberOfBlocks <= blockNumber {
    91  			maxBlockNumber = blockNumber - finalityNumberOfBlocks
    92  		}
    93  
    94  		forcedBatches, err := c.dbManager.GetForcedBatchesSince(c.ctx, c.lastForcedBatchNumSent, maxBlockNumber, nil)
    95  		if err != nil {
    96  			log.Errorf("error checking forced batches: %v", err)
    97  			continue
    98  		}
    99  
   100  		for _, forcedBatch := range forcedBatches {
   101  			log.Debugf("sending forced batch signal (forced batch number: %v)", forcedBatch.ForcedBatchNumber)
   102  			c.closingSignalCh.ForcedBatchCh <- *forcedBatch
   103  			c.lastForcedBatchNumSent = forcedBatch.ForcedBatchNumber
   104  		}
   105  	}
   106  }