|
|
@ -333,23 +333,25 @@ func (s *Synchronizer) setSlotCoordinator(slot *common.Slot) error { |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// firstBatchBlockNum is the blockNum of first batch in that block, if any
|
|
|
|
func (s *Synchronizer) getCurrentSlot(reset bool, firstBatchBlockNum *int64) (*common.Slot, error) { |
|
|
|
slot := common.Slot{ |
|
|
|
SlotNum: s.stats.Sync.Auction.CurrentSlot.SlotNum, |
|
|
|
ForgerCommitment: s.stats.Sync.Auction.CurrentSlot.ForgerCommitment, |
|
|
|
} |
|
|
|
// updateCurrentSlot updates the slot with information of the current slot.
|
|
|
|
// The information abouth which coordinator is allowed to forge is only updated
|
|
|
|
// when we are Synced.
|
|
|
|
// hasBatch is true when the last synced block contained at least one batch.
|
|
|
|
func (s *Synchronizer) updateCurrentSlot(slot *common.Slot, reset bool, hasBatch bool) error { |
|
|
|
// We want the next block because the current one is already mined
|
|
|
|
blockNum := s.stats.Sync.LastBlock.Num + 1 |
|
|
|
slotNum := s.consts.Auction.SlotNum(blockNum) |
|
|
|
firstBatchBlockNum := s.stats.Sync.LastBlock.Num |
|
|
|
if reset { |
|
|
|
// Using this query only to know if there
|
|
|
|
dbFirstBatchBlockNum, err := s.historyDB.GetFirstBatchBlockNumBySlot(slotNum) |
|
|
|
if err != nil && tracerr.Unwrap(err) != sql.ErrNoRows { |
|
|
|
return nil, tracerr.Wrap(fmt.Errorf("historyDB.GetFirstBatchBySlot: %w", err)) |
|
|
|
return tracerr.Wrap(fmt.Errorf("historyDB.GetFirstBatchBySlot: %w", err)) |
|
|
|
} else if tracerr.Unwrap(err) == sql.ErrNoRows { |
|
|
|
firstBatchBlockNum = nil |
|
|
|
hasBatch = false |
|
|
|
} else { |
|
|
|
firstBatchBlockNum = &dbFirstBatchBlockNum |
|
|
|
hasBatch = true |
|
|
|
firstBatchBlockNum = dbFirstBatchBlockNum |
|
|
|
} |
|
|
|
slot.ForgerCommitment = false |
|
|
|
} else if slotNum > slot.SlotNum { |
|
|
@ -360,11 +362,11 @@ func (s *Synchronizer) getCurrentSlot(reset bool, firstBatchBlockNum *int64) (*c |
|
|
|
slot.StartBlock, slot.EndBlock = s.consts.Auction.SlotBlocks(slot.SlotNum) |
|
|
|
// If Synced, update the current coordinator
|
|
|
|
if s.stats.Synced() && blockNum >= s.consts.Auction.GenesisBlockNum { |
|
|
|
if err := s.setSlotCoordinator(&slot); err != nil { |
|
|
|
return nil, tracerr.Wrap(err) |
|
|
|
if err := s.setSlotCoordinator(slot); err != nil { |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
if firstBatchBlockNum != nil && |
|
|
|
s.consts.Auction.RelativeBlock(*firstBatchBlockNum) < |
|
|
|
if hasBatch && |
|
|
|
s.consts.Auction.RelativeBlock(firstBatchBlockNum) < |
|
|
|
int64(s.vars.Auction.SlotDeadline) { |
|
|
|
slot.ForgerCommitment = true |
|
|
|
} |
|
|
@ -373,57 +375,61 @@ func (s *Synchronizer) getCurrentSlot(reset bool, firstBatchBlockNum *int64) (*c |
|
|
|
// BEGIN SANITY CHECK
|
|
|
|
canForge, err := s.ethClient.AuctionCanForge(slot.Forger, blockNum) |
|
|
|
if err != nil { |
|
|
|
return nil, tracerr.Wrap(err) |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
if !canForge { |
|
|
|
return nil, tracerr.Wrap(fmt.Errorf("Synchronized value of forger address for closed slot "+ |
|
|
|
return tracerr.Wrap(fmt.Errorf("Synchronized value of forger address for closed slot "+ |
|
|
|
"differs from smart contract: %+v", slot)) |
|
|
|
} |
|
|
|
// END SANITY CHECK
|
|
|
|
} |
|
|
|
return &slot, nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func (s *Synchronizer) getNextSlot() (*common.Slot, error) { |
|
|
|
// updateNextSlot updates the slot with information of the next slot.
|
|
|
|
// The information abouth which coordinator is allowed to forge is only updated
|
|
|
|
// when we are Synced.
|
|
|
|
func (s *Synchronizer) updateNextSlot(slot *common.Slot) error { |
|
|
|
// We want the next block because the current one is already mined
|
|
|
|
blockNum := s.stats.Sync.LastBlock.Num + 1 |
|
|
|
slotNum := s.consts.Auction.SlotNum(blockNum) + 1 |
|
|
|
slot := common.Slot{ |
|
|
|
SlotNum: slotNum, |
|
|
|
ForgerCommitment: false, |
|
|
|
} |
|
|
|
slot.SlotNum = slotNum |
|
|
|
slot.ForgerCommitment = false |
|
|
|
slot.StartBlock, slot.EndBlock = s.consts.Auction.SlotBlocks(slot.SlotNum) |
|
|
|
// If Synced, update the current coordinator
|
|
|
|
if s.stats.Synced() && blockNum >= s.consts.Auction.GenesisBlockNum { |
|
|
|
if err := s.setSlotCoordinator(&slot); err != nil { |
|
|
|
return nil, tracerr.Wrap(err) |
|
|
|
if err := s.setSlotCoordinator(slot); err != nil { |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Remove this SANITY CHECK once this code is tested enough
|
|
|
|
// BEGIN SANITY CHECK
|
|
|
|
canForge, err := s.ethClient.AuctionCanForge(slot.Forger, slot.StartBlock) |
|
|
|
if err != nil { |
|
|
|
return nil, tracerr.Wrap(err) |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
if !canForge { |
|
|
|
return nil, tracerr.Wrap(fmt.Errorf("Synchronized value of forger address for closed slot "+ |
|
|
|
return tracerr.Wrap(fmt.Errorf("Synchronized value of forger address for closed slot "+ |
|
|
|
"differs from smart contract: %+v", slot)) |
|
|
|
} |
|
|
|
// END SANITY CHECK
|
|
|
|
} |
|
|
|
return &slot, nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func (s *Synchronizer) updateCurrentNextSlotIfSync(reset bool, firstBatchBlockNum *int64) error { |
|
|
|
current, err := s.getCurrentSlot(reset, firstBatchBlockNum) |
|
|
|
if err != nil { |
|
|
|
// updateCurrentNextSlotIfSync updates the current and next slot. Information
|
|
|
|
// about forger address that is allowed to forge is only updated if we are
|
|
|
|
// Synced.
|
|
|
|
func (s *Synchronizer) updateCurrentNextSlotIfSync(reset bool, hasBatch bool) error { |
|
|
|
current := s.stats.Sync.Auction.CurrentSlot |
|
|
|
next := s.stats.Sync.Auction.NextSlot |
|
|
|
if err := s.updateCurrentSlot(¤t, reset, hasBatch); err != nil { |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
next, err := s.getNextSlot() |
|
|
|
if err != nil { |
|
|
|
if err := s.updateNextSlot(&next); err != nil { |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
s.stats.UpdateCurrentNextSlot(current, next) |
|
|
|
s.stats.UpdateCurrentNextSlot(¤t, &next) |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
@ -634,11 +640,11 @@ func (s *Synchronizer) Sync2(ctx context.Context, |
|
|
|
&rollupData.Batches[batchesLen-1].Batch, |
|
|
|
lastL1BatchBlock, lastForgeL1TxsNum) |
|
|
|
} |
|
|
|
var firstBatchBlockNum *int64 |
|
|
|
hasBatch := false |
|
|
|
if len(rollupData.Batches) > 0 { |
|
|
|
firstBatchBlockNum = &rollupData.Batches[0].Batch.EthBlockNum |
|
|
|
hasBatch = true |
|
|
|
} |
|
|
|
if err := s.updateCurrentNextSlotIfSync(false, firstBatchBlockNum); err != nil { |
|
|
|
if err := s.updateCurrentNextSlotIfSync(false, hasBatch); err != nil { |
|
|
|
return nil, nil, tracerr.Wrap(err) |
|
|
|
} |
|
|
|
|
|
|
@ -757,15 +763,15 @@ func (s *Synchronizer) resetState(block *common.Block) error { |
|
|
|
s.vars.WDelayer = *wDelayer |
|
|
|
} |
|
|
|
|
|
|
|
batchNum, err := s.historyDB.GetLastBatchNum() |
|
|
|
batch, err := s.historyDB.GetLastBatch() |
|
|
|
if err != nil && tracerr.Unwrap(err) != sql.ErrNoRows { |
|
|
|
return tracerr.Wrap(fmt.Errorf("historyDB.GetLastBatchNum: %w", err)) |
|
|
|
} |
|
|
|
if tracerr.Unwrap(err) == sql.ErrNoRows { |
|
|
|
batchNum = 0 |
|
|
|
batch = &common.Batch{} |
|
|
|
} |
|
|
|
|
|
|
|
err = s.stateDB.Reset(batchNum) |
|
|
|
err = s.stateDB.Reset(batch.BatchNum) |
|
|
|
if err != nil { |
|
|
|
return tracerr.Wrap(fmt.Errorf("stateDB.Reset: %w", err)) |
|
|
|
} |
|
|
@ -787,9 +793,9 @@ func (s *Synchronizer) resetState(block *common.Block) error { |
|
|
|
lastForgeL1TxsNum = &n |
|
|
|
} |
|
|
|
|
|
|
|
s.stats.UpdateSync(block, &batchNum, &lastL1BatchBlockNum, lastForgeL1TxsNum) |
|
|
|
s.stats.UpdateSync(block, batch, &lastL1BatchBlockNum, lastForgeL1TxsNum) |
|
|
|
|
|
|
|
if err := s.updateCurrentNextSlotIfSync(true, nil); err != nil { |
|
|
|
if err := s.updateCurrentNextSlotIfSync(true, false); err != nil { |
|
|
|
return tracerr.Wrap(err) |
|
|
|
} |
|
|
|
return nil |
|
|
|