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 }