diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 61329df4e..4fb5de1a1 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -39,6 +39,7 @@ var ( ProverProofsAssigned = factory.NewCounter(prometheus.CounterOpts{Name: "prover_proof_assigned"}) ProverReceivedProposedBlockGauge = factory.NewGauge(prometheus.GaugeOpts{Name: "prover_proposed_received"}) ProverReceivedProvenBlockGauge = factory.NewGauge(prometheus.GaugeOpts{Name: "prover_proven_received"}) + ProverProvenByGuardianGauge = factory.NewGauge(prometheus.GaugeOpts{Name: "prover_proven_by_guardian"}) ProverSubmissionAcceptedCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_submission_accepted", }) diff --git a/pkg/rpc/methods.go b/pkg/rpc/methods.go index a7112102f..766ee43b6 100644 --- a/pkg/rpc/methods.go +++ b/pkg/rpc/methods.go @@ -725,6 +725,14 @@ func (c *Client) GetTaikoDataSlotBByNumber(ctx context.Context, number uint64) ( return nil, fmt.Errorf("failed to get state variables by block number %d", number) } +// GetGuardianProverAddress fetches the guardian prover address from the protocol. +func (c *Client) GetGuardianProverAddress(ctx context.Context) (common.Address, error) { + ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + defer cancel() + + return c.TaikoL1.Resolve0(&bind.CallOpts{Context: ctxWithTimeout}, StringToBytes32("tier_guardian"), false) +} + // WaitL1NewPendingTransaction waits until the L1 account has a new pending transaction. func (c *Client) WaitL1NewPendingTransaction( ctx context.Context, diff --git a/prover/event_handler/block_verified.go b/prover/event_handler/block_verified.go index 7bb0c2ab7..00b911547 100644 --- a/prover/event_handler/block_verified.go +++ b/prover/event_handler/block_verified.go @@ -9,12 +9,23 @@ import ( ) // BlockVerifiedEventHandler is responsible for handling the BlockVerified event. -type BlockVerifiedEventHandler struct{} +type BlockVerifiedEventHandler struct { + guardianProverAddress common.Address +} + +// NewBlockVerifiedEventHandler creates a new BlockVerifiedEventHandler instance. +func NewBlockVerifiedEventHandler(guardianProverAddress common.Address) *BlockVerifiedEventHandler { + return &BlockVerifiedEventHandler{guardianProverAddress: guardianProverAddress} +} // Handle handles the BlockVerified event. func (h *BlockVerifiedEventHandler) Handle(e *bindings.TaikoL1ClientBlockVerified) { metrics.ProverLatestVerifiedIDGauge.Set(float64(e.BlockId.Uint64())) + if e.Prover == h.guardianProverAddress { + metrics.ProverProvenByGuardianGauge.Set(1) + } + log.Info( "New verified block", "blockID", e.BlockId, diff --git a/prover/init.go b/prover/init.go index 45c8244b8..737b3f011 100644 --- a/prover/init.go +++ b/prover/init.go @@ -193,7 +193,7 @@ func (p *Prover) initL1Current(startingBlockID *big.Int) error { } // initEventHandlers initialize all event handlers which will be used by the current prover. -func (p *Prover) initEventHandlers() { +func (p *Prover) initEventHandlers() error { // ------- BlockProposed ------- opts := &handler.NewBlockProposedEventHandlerOps{ SharedState: p.sharedState, @@ -240,6 +240,13 @@ func (p *Prover) initEventHandlers() { p.proofContestCh, p.cfg.ContesterMode, ) + // ------- BlockVerified ------- - p.blockVerifiedHandler = new(handler.BlockVerifiedEventHandler) + guardianProverAddress, err := p.rpc.GetGuardianProverAddress(p.ctx) + if err != nil { + return err + } + p.blockVerifiedHandler = handler.NewBlockVerifiedEventHandler(guardianProverAddress) + + return nil } diff --git a/prover/prover.go b/prover/prover.go index 8c06b7398..a2c56ae09 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -203,7 +203,9 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { } // Initialize event handlers. - p.initEventHandlers() + if err := p.initEventHandlers(); err != nil { + return err + } return nil } diff --git a/prover/prover_test.go b/prover/prover_test.go index 10f5f05a2..672f43c4c 100644 --- a/prover/prover_test.go +++ b/prover/prover_test.go @@ -234,14 +234,14 @@ func (s *ProverTestSuite) TestOnBlockVerified() { func (s *ProverTestSuite) TestContestWrongBlocks() { s.T().Skip() s.p.cfg.ContesterMode = false - s.p.initEventHandlers() + s.Nil(s.p.initEventHandlers()) e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ BlockId: e.BlockId, Tier: e.Meta.MinTier, })) s.p.cfg.ContesterMode = true - s.p.initEventHandlers() + s.Nil(s.p.initEventHandlers()) // Submit a wrong proof at first. sink := make(chan *bindings.TaikoL1ClientTransitionProved) @@ -284,7 +284,7 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { contesterKey, )) s.p.cfg.ContesterMode = true - s.p.initEventHandlers() + s.Nil(s.p.initEventHandlers()) s.Greater(header.Number.Uint64(), uint64(0)) s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), event))