mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 03:16:45 +01:00
WIP3
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user