From a170740e1693eb0b59f8511d3aee2f21b25bbce2 Mon Sep 17 00:00:00 2001 From: maskpp Date: Fri, 10 Jan 2025 15:17:35 +0800 Subject: [PATCH 1/6] remove some unnecssary check or set --- .../beaconsync/progress_tracker.go | 37 ++++--------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go index fbf588bae12..301eeaa29da 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go @@ -67,8 +67,8 @@ func (t *SyncProgressTracker) track(ctx context.Context) { t.mutex.Lock() defer t.mutex.Unlock() - if !t.triggered { - log.Debug("Beacon sync not triggered") + if t.Finished() { + log.Debug("Beacon sync is finished") return } @@ -158,9 +158,6 @@ func (t *SyncProgressTracker) ClearMeta() { log.Debug("Clear sync progress tracker meta") t.triggered = false - t.lastSyncedBlockID = nil - t.lastSyncedBlockHash = common.Hash{} - t.outOfSync = false } // NeedReSync checks if a new beacon sync request will be needed: @@ -171,11 +168,6 @@ func (t *SyncProgressTracker) NeedReSync(newID *big.Int) (bool, error) { t.mutex.RLock() defer t.mutex.RUnlock() - // If the beacon sync has not been triggered yet, we will simply trigger it. - if !t.triggered { - return true, nil - } - if t.lastSyncedBlockID == nil { return true, nil } @@ -242,22 +234,11 @@ func syncProgressed(last *ethereum.SyncProgress, new *ethereum.SyncProgress) boo return false } - if new == nil { - return true - } - - // Block - if new.CurrentBlock > last.CurrentBlock { - return true - } - - // Fast sync fields - if new.PulledStates > last.PulledStates { - return true - } - // Snap sync fields - if new.SyncedAccounts > last.SyncedAccounts || + return new == nil || + new.CurrentBlock > last.CurrentBlock || + new.PulledStates > last.PulledStates || + new.SyncedAccounts > last.SyncedAccounts || new.SyncedAccountBytes > last.SyncedAccountBytes || new.SyncedBytecodes > last.SyncedBytecodes || new.SyncedBytecodeBytes > last.SyncedBytecodeBytes || @@ -268,11 +249,7 @@ func syncProgressed(last *ethereum.SyncProgress, new *ethereum.SyncProgress) boo new.HealedBytecodes > last.HealedBytecodes || new.HealedBytecodeBytes > last.HealedBytecodeBytes || new.HealingTrienodes > last.HealingTrienodes || - new.HealingBytecode > last.HealingBytecode { - return true - } - - return false + new.HealingBytecode > last.HealingBytecode } // MarkFinished marks the current beacon sync as finished. From 1eeda92b75b209de9c322a4bf5888bb5a0b17866 Mon Sep 17 00:00:00 2001 From: maskpp Date: Fri, 10 Jan 2025 15:41:09 +0800 Subject: [PATCH 2/6] remove some unnecssary check or set --- .../beaconsync/progress_tracker.go | 10 --- .../beaconsync/progress_tracker_test.go | 6 -- .../driver/chain_syncer/blob/syncer.go | 64 +++++++------------ .../driver/chain_syncer/chain_syncer.go | 46 ++++++------- 4 files changed, 42 insertions(+), 84 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go index 301eeaa29da..b16fae3e6a4 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go @@ -150,16 +150,6 @@ func (t *SyncProgressTracker) UpdateMeta(id *big.Int, blockHash common.Hash) { t.lastSyncedBlockHash = blockHash } -// ClearMeta cleans the inner beacon sync metadata. -func (t *SyncProgressTracker) ClearMeta() { - t.mutex.Lock() - defer t.mutex.Unlock() - - log.Debug("Clear sync progress tracker meta") - - t.triggered = false -} - // NeedReSync checks if a new beacon sync request will be needed: // 1, if the beacon sync has not been triggered yet // 2, if there is 64 blocks gap between the last head to sync and the new block diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go index dd5bb47f1a5..3558d71d391 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go @@ -49,12 +49,6 @@ func (s *BeaconSyncProgressTrackerTestSuite) TestSyncProgressed() { s.True(syncProgressed(ðereum.SyncProgress{HealingBytecode: 0}, ðereum.SyncProgress{HealingBytecode: 1})) } -func (s *BeaconSyncProgressTrackerTestSuite) TestClearMeta() { - s.t.triggered = true - s.t.ClearMeta() - s.False(s.t.triggered) -} - func (s *BeaconSyncProgressTrackerTestSuite) TestHeadChanged() { s.True(s.t.NeedReSync(common.Big256)) s.t.triggered = true diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer.go b/packages/taiko-client/driver/chain_syncer/blob/syncer.go index 7b5e8c1ddce..1ed31d85266 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer.go @@ -176,30 +176,28 @@ func (s *Syncer) onBlockProposed( // If we are not inserting a block whose parent block is the latest verified block in protocol, // and the node hasn't just finished the P2P sync, we check if the L1 chain has been reorged. - if !s.progressTracker.Triggered() { - reorgCheckResult, err := s.checkReorg(ctx, meta.GetBlockID()) - if err != nil { - return err - } + reorgCheckResult, err := s.checkReorg(ctx, meta.GetBlockID()) + if err != nil { + return err + } + if reorgCheckResult.IsReorged { + log.Info( + "Reset L1Current cursor due to L1 reorg", + "l1CurrentHeightOld", s.state.GetL1Current().Number, + "l1CurrentHashOld", s.state.GetL1Current().Hash(), + "l1CurrentHeightNew", reorgCheckResult.L1CurrentToReset.Number, + "l1CurrentHashNew", reorgCheckResult.L1CurrentToReset.Hash(), + "lastInsertedBlockIDOld", s.lastInsertedBlockID, + "lastInsertedBlockIDNew", reorgCheckResult.LastHandledBlockIDToReset, + ) + s.state.SetL1Current(reorgCheckResult.L1CurrentToReset) + s.lastInsertedBlockID = reorgCheckResult.LastHandledBlockIDToReset + s.reorgDetectedFlag = true + endIter() - if reorgCheckResult.IsReorged { - log.Info( - "Reset L1Current cursor due to L1 reorg", - "l1CurrentHeightOld", s.state.GetL1Current().Number, - "l1CurrentHashOld", s.state.GetL1Current().Hash(), - "l1CurrentHeightNew", reorgCheckResult.L1CurrentToReset.Number, - "l1CurrentHashNew", reorgCheckResult.L1CurrentToReset.Hash(), - "lastInsertedBlockIDOld", s.lastInsertedBlockID, - "lastInsertedBlockIDNew", reorgCheckResult.LastHandledBlockIDToReset, - ) - s.state.SetL1Current(reorgCheckResult.L1CurrentToReset) - s.lastInsertedBlockID = reorgCheckResult.LastHandledBlockIDToReset - s.reorgDetectedFlag = true - endIter() - - return nil - } + return nil } + // Ignore those already inserted blocks. if s.lastInsertedBlockID != nil && meta.GetBlockID().Cmp(s.lastInsertedBlockID) <= 0 { return nil @@ -221,20 +219,11 @@ func (s *Syncer) onBlockProposed( // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's // last synced verified block as the parent, otherwise, we fetch the parent block from L2 EE. - var ( - parent *types.Header - err error - ) - if s.progressTracker.Triggered() { - // Already synced through beacon sync, just skip this event. - if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { - return nil - } - - parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) - } else { - parent, err = s.rpc.L2ParentByBlockID(ctx, meta.GetBlockID()) + // Already synced through beacon sync, just skip this event. + if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { + return nil } + parent, err := s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) } @@ -243,7 +232,6 @@ func (s *Syncer) onBlockProposed( "Parent block", "blockID", parent.Number, "hash", parent.Hash(), - "beaconSyncTriggered", s.progressTracker.Triggered(), ) tx, err := s.rpc.L1.TransactionInBlock(ctx, meta.GetRawBlockHash(), meta.GetTxIndex()) @@ -299,10 +287,6 @@ func (s *Syncer) onBlockProposed( metrics.DriverL1CurrentHeightGauge.Set(float64(meta.GetRawBlockHeight().Uint64())) s.lastInsertedBlockID = meta.GetBlockID() - if s.progressTracker.Triggered() { - s.progressTracker.ClearMeta() - } - return nil } diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer.go b/packages/taiko-client/driver/chain_syncer/chain_syncer.go index 15c6cd69c8a..541568d4d01 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer.go @@ -104,38 +104,28 @@ func (s *L2ChainSyncer) Sync() error { // we will only check and trigger P2P sync progress once right after the driver starts s.progressTracker.MarkFinished() - // We have triggered at least a beacon sync in L2 execution engine, we should reset the L1Current - // cursor at first, before start inserting pending L2 blocks one by one. - if s.progressTracker.Triggered() { - log.Info( - "Switch to insert pending blocks one by one", - "p2pEnabled", s.p2pSync, - "p2pOutOfSync", s.progressTracker.OutOfSync(), - ) - - // Get the execution engine's chain head. - l2Head, err := s.rpc.L2.HeaderByNumber(s.ctx, nil) - if err != nil { - return fmt.Errorf("failed to get L2 chain head: %w", err) - } - - log.Info( - "L2 head information", - "number", l2Head.Number, - "hash", l2Head.Hash(), - "lastSyncedBlockID", s.progressTracker.LastSyncedBlockID(), - "lastSyncedBlockHash", s.progressTracker.LastSyncedBlockHash(), - ) + // Get the execution engine's chain head. + l2Head, err := s.rpc.L2.HeaderByNumber(s.ctx, nil) + if err != nil { + return fmt.Errorf("failed to get L2 chain head: %w", err) + } - // Reset the L1Current cursor. - if err := s.state.ResetL1Current(s.ctx, l2Head.Number); err != nil { - return fmt.Errorf("failed to reset L1 current cursor: %w", err) - } + log.Info( + "L2 head information", + "number", l2Head.Number, + "hash", l2Head.Hash(), + "lastSyncedBlockID", s.progressTracker.LastSyncedBlockID(), + "lastSyncedBlockHash", s.progressTracker.LastSyncedBlockHash(), + ) - // Reset to the latest L2 execution engine's chain status. - s.progressTracker.UpdateMeta(l2Head.Number, l2Head.Hash()) + // Reset the L1Current cursor. + if err := s.state.ResetL1Current(s.ctx, l2Head.Number); err != nil { + return fmt.Errorf("failed to reset L1 current cursor: %w", err) } + // Reset to the latest L2 execution engine's chain status. + s.progressTracker.UpdateMeta(l2Head.Number, l2Head.Hash()) + // Insert the proposed block one by one. return s.blobSyncer.ProcessL1Blocks(s.ctx) } From 2af4bbd2fd8861a08d5eb216e43738e53d86315d Mon Sep 17 00:00:00 2001 From: maskpp Date: Fri, 10 Jan 2025 16:09:13 +0800 Subject: [PATCH 3/6] remove some unnecssary check or set --- .../beaconsync/progress_tracker.go | 12 +++++++++++ .../beaconsync/progress_tracker_test.go | 6 ++++++ .../driver/chain_syncer/blob/syncer.go | 20 ++++++++++++++----- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go index b16fae3e6a4..4c5756fa64f 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go @@ -150,6 +150,18 @@ func (t *SyncProgressTracker) UpdateMeta(id *big.Int, blockHash common.Hash) { t.lastSyncedBlockHash = blockHash } +// ClearMeta cleans the inner beacon sync metadata. +func (t *SyncProgressTracker) ClearMeta() { + t.mutex.Lock() + defer t.mutex.Unlock() + + log.Debug("Clear sync progress tracker meta") + + t.triggered = false + t.lastSyncedBlockID = nil + t.lastSyncedBlockHash = common.Hash{} +} + // NeedReSync checks if a new beacon sync request will be needed: // 1, if the beacon sync has not been triggered yet // 2, if there is 64 blocks gap between the last head to sync and the new block diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go index 3558d71d391..dd5bb47f1a5 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker_test.go @@ -49,6 +49,12 @@ func (s *BeaconSyncProgressTrackerTestSuite) TestSyncProgressed() { s.True(syncProgressed(ðereum.SyncProgress{HealingBytecode: 0}, ðereum.SyncProgress{HealingBytecode: 1})) } +func (s *BeaconSyncProgressTrackerTestSuite) TestClearMeta() { + s.t.triggered = true + s.t.ClearMeta() + s.False(s.t.triggered) +} + func (s *BeaconSyncProgressTrackerTestSuite) TestHeadChanged() { s.True(s.t.NeedReSync(common.Big256)) s.t.triggered = true diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer.go b/packages/taiko-client/driver/chain_syncer/blob/syncer.go index b80c4e341e5..30bf17e18a4 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer.go @@ -193,7 +193,6 @@ func (s *Syncer) onBlockProposed( return nil } - // Ignore those already inserted blocks. if s.lastInsertedBlockID != nil && meta.GetBlockID().Cmp(s.lastInsertedBlockID) <= 0 { return nil @@ -215,11 +214,17 @@ func (s *Syncer) onBlockProposed( // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's // last synced verified block as the parent, otherwise, we fetch the parent block from L2 EE. - // Already synced through beacon sync, just skip this event. - if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { - return nil + var parent *types.Header + if s.progressTracker.Triggered() { + // Already synced through beacon sync, just skip this event. + if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { + return nil + } + + parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) + } else { + parent, err = s.rpc.L2ParentByBlockID(ctx, meta.GetBlockID()) } - parent, err := s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) } @@ -228,6 +233,7 @@ func (s *Syncer) onBlockProposed( "Parent block", "blockID", parent.Number, "hash", parent.Hash(), + "beaconSyncTriggered", s.progressTracker.Triggered(), ) tx, err := s.rpc.L1.TransactionInBlock(ctx, meta.GetRawBlockHash(), meta.GetTxIndex()) @@ -283,6 +289,10 @@ func (s *Syncer) onBlockProposed( metrics.DriverL1CurrentHeightGauge.Set(float64(meta.GetRawBlockHeight().Uint64())) s.lastInsertedBlockID = meta.GetBlockID() + if s.progressTracker.Triggered() { + s.progressTracker.ClearMeta() + } + return nil } From b44194e0f944a1e9a0025400cfaeb978afa677d9 Mon Sep 17 00:00:00 2001 From: maskpp Date: Fri, 10 Jan 2025 17:08:39 +0800 Subject: [PATCH 4/6] fix bug --- .../driver/chain_syncer/beaconsync/progress_tracker.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go index 4c5756fa64f..2aef42313bb 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/progress_tracker.go @@ -67,8 +67,8 @@ func (t *SyncProgressTracker) track(ctx context.Context) { t.mutex.Lock() defer t.mutex.Unlock() - if t.Finished() { - log.Debug("Beacon sync is finished") + if !t.triggered { + log.Debug("Beacon sync not triggered") return } From 3835f8c71a8bf44523066f0ab356bde9906a6bdf Mon Sep 17 00:00:00 2001 From: maskpp Date: Sat, 11 Jan 2025 08:10:52 +0800 Subject: [PATCH 5/6] revert change --- .../driver/chain_syncer/chain_syncer.go | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer.go b/packages/taiko-client/driver/chain_syncer/chain_syncer.go index ebf19d51e81..218a78871c6 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer.go @@ -104,27 +104,37 @@ func (s *L2ChainSyncer) Sync() error { // we will only check and trigger P2P sync progress once right after the driver starts s.progressTracker.MarkFinished() - // Get the execution engine's chain head. - l2Head, err := s.rpc.L2.HeaderByNumber(s.ctx, nil) - if err != nil { - return fmt.Errorf("failed to get L2 chain head: %w", err) - } + // We have triggered at least a beacon sync in L2 execution engine, we should reset the L1Current + // cursor at first, before start inserting pending L2 blocks one by one. + if s.progressTracker.Triggered() { + log.Info( + "Switch to insert pending blocks one by one", + "p2pEnabled", s.p2pSync, + "p2pOutOfSync", s.progressTracker.OutOfSync(), + ) - log.Info( - "L2 head information", - "number", l2Head.Number, - "hash", l2Head.Hash(), - "lastSyncedBlockID", s.progressTracker.LastSyncedBlockID(), - "lastSyncedBlockHash", s.progressTracker.LastSyncedBlockHash(), - ) + // Get the execution engine's chain head. + l2Head, err := s.rpc.L2.HeaderByNumber(s.ctx, nil) + if err != nil { + return fmt.Errorf("failed to get L2 chain head: %w", err) + } - // Reset the L1Current cursor. - if err := s.state.ResetL1Current(s.ctx, l2Head.Number); err != nil { - return fmt.Errorf("failed to reset L1 current cursor: %w", err) - } + log.Info( + "L2 head information", + "number", l2Head.Number, + "hash", l2Head.Hash(), + "lastSyncedBlockID", s.progressTracker.LastSyncedBlockID(), + "lastSyncedBlockHash", s.progressTracker.LastSyncedBlockHash(), + ) - // Reset to the latest L2 execution engine's chain status. - s.progressTracker.UpdateMeta(l2Head.Number, l2Head.Hash()) + // Reset the L1Current cursor. + if err := s.state.ResetL1Current(s.ctx, l2Head.Number); err != nil { + return fmt.Errorf("failed to reset L1 current cursor: %w", err) + } + + // Reset to the latest L2 execution engine's chain status. + s.progressTracker.UpdateMeta(l2Head.Number, l2Head.Hash()) + } // Insert the proposed block one by one. return s.blobSyncer.ProcessL1Blocks(s.ctx) From 14b66648500cacb345404da8120f208dabe08aa5 Mon Sep 17 00:00:00 2001 From: maskpp Date: Sat, 11 Jan 2025 16:57:40 +0800 Subject: [PATCH 6/6] update logs --- packages/taiko-client/driver/chain_syncer/chain_syncer.go | 6 +++--- packages/taiko-client/driver/state/state.go | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer.go b/packages/taiko-client/driver/chain_syncer/chain_syncer.go index 218a78871c6..9a76a520fe7 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer.go @@ -168,14 +168,14 @@ func (s *L2ChainSyncer) AheadOfHeadToSync(heightToSync uint64) bool { // If the L2 execution engine's chain is ahead of the block head to sync, // we can mark the beacon sync progress as finished. - if s.progressTracker.LastSyncedBlockID() != nil { + if id := s.progressTracker.LastSyncedBlockID(); id != nil && s.state.GetL2Head().Number.Uint64() < id.Uint64() { log.Info( "L2 execution engine is ahead of the head to sync", "heightToSync", heightToSync, "executionEngineHead", s.state.GetL2Head().Number, - "lastSyncedBlockID", s.progressTracker.LastSyncedBlockID(), + "lastSyncedBlockID", id, ) - return s.state.GetL2Head().Number.Uint64() >= s.progressTracker.LastSyncedBlockID().Uint64() + return false } return true diff --git a/packages/taiko-client/driver/state/state.go b/packages/taiko-client/driver/state/state.go index bae8c311cf7..2bb5b6a46cf 100644 --- a/packages/taiko-client/driver/state/state.go +++ b/packages/taiko-client/driver/state/state.go @@ -5,6 +5,7 @@ import ( "math/big" "sync" "sync/atomic" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -126,6 +127,7 @@ func (s *State) eventLoop(ctx context.Context) { l2BlockVerifiedV2Sub = rpc.SubscribeBlockVerifiedV2(s.rpc.TaikoL1, blockVerifiedV2Ch) l2BlockProposedV2Sub = rpc.SubscribeBlockProposedV2(s.rpc.TaikoL1, blockProposedV2Ch) l2TransitionProvedV2Sub = rpc.SubscribeTransitionProvedV2(s.rpc.TaikoL1, transitionProvedV2Ch) + tick = time.NewTicker(time.Minute * 10) ) defer func() { @@ -137,12 +139,15 @@ func (s *State) eventLoop(ctx context.Context) { l2BlockVerifiedV2Sub.Unsubscribe() l2BlockProposedV2Sub.Unsubscribe() l2TransitionProvedV2Sub.Unsubscribe() + tick.Stop() }() for { select { case <-ctx.Done(): return + case <-tick.C: + log.Info("state log, current L2 head", "blockID", s.GetL2Head().Number) case e := <-blockProposedCh: s.setHeadBlockID(e.BlockId) case e := <-blockProposedV2Ch: