@@ -2,7 +2,6 @@ package prover
2
2
3
3
import (
4
4
"context"
5
- "crypto/ecdsa"
6
5
"errors"
7
6
"fmt"
8
7
"math/big"
@@ -35,8 +34,7 @@ import (
35
34
// Prover keeps trying to prove newly proposed blocks.
36
35
type Prover struct {
37
36
// Configurations
38
- cfg * Config
39
- proverPrivateKey * ecdsa.PrivateKey
37
+ cfg * Config
40
38
41
39
// Clients
42
40
rpc * rpc.Client
@@ -89,7 +87,9 @@ func (p *Prover) InitFromCli(ctx context.Context, c *cli.Context) error {
89
87
func InitFromConfig (ctx context.Context , p * Prover , cfg * Config ) (err error ) {
90
88
p .cfg = cfg
91
89
p .ctx = ctx
92
- p .proverPrivateKey = cfg .L1ProverPrivKey
90
+
91
+ // Initialize state which will be shared by event handlers.
92
+ p .sharedState = state .New ()
93
93
94
94
// Initialize state which will be shared by event handlers.
95
95
p .sharedState = state .New ()
@@ -152,11 +152,11 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) {
152
152
senderCfg .MaxRetrys = 0
153
153
}
154
154
155
- txSender , err := sender .NewSender (p .ctx , senderCfg , p .rpc .L1 , p .proverPrivateKey )
155
+ txSender , err := sender .NewSender (p .ctx , senderCfg , p .rpc .L1 , p .cfg . L1ProverPrivKey )
156
156
if err != nil {
157
157
return err
158
158
}
159
- txBuilder := transaction .NewProveBlockTxBuilder (p .rpc , p .proverPrivateKey )
159
+ txBuilder := transaction .NewProveBlockTxBuilder (p .rpc , p .cfg . L1ProverPrivKey )
160
160
161
161
// Proof submitters
162
162
if err := p .initProofSubmitters (p .ctx , txSender , txBuilder ); err != nil {
@@ -167,7 +167,6 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) {
167
167
p .proofContester , err = proofSubmitter .NewProofContester (
168
168
p .ctx ,
169
169
p .rpc ,
170
- p .cfg .L1ProverPrivKey ,
171
170
txSender ,
172
171
p .cfg .Graffiti ,
173
172
txBuilder ,
@@ -253,9 +252,7 @@ func (p *Prover) Start() error {
253
252
// eventLoop starts the main loop of Taiko prover.
254
253
func (p * Prover ) eventLoop () {
255
254
p .wg .Add (1 )
256
- defer func () {
257
- p .wg .Done ()
258
- }()
255
+ defer p .wg .Done ()
259
256
260
257
// reqProving requests performing a proving operation, won't block
261
258
// if we are already proving.
@@ -297,35 +294,23 @@ func (p *Prover) eventLoop() {
297
294
case <- p .ctx .Done ():
298
295
return
299
296
case proofWithHeader := <- p .proofGenerationCh :
300
- p .submitProofOp ( p . ctx , proofWithHeader )
297
+ p .withRetry ( func () error { return p . submitProofOp ( proofWithHeader ) } )
301
298
case req := <- p .proofSubmissionCh :
302
- p .requestProofOp ( p . ctx , req .Event , req .Tier )
299
+ p .withRetry ( func () error { return p . requestProofOp ( req .Event , req .Tier ) } )
303
300
case req := <- p .proofContestCh :
304
- p .contestProofOp ( p . ctx , req )
301
+ p .withRetry ( func () error { return p . contestProofOp ( req ) } )
305
302
case <- p .proveNotify :
306
303
if err := p .proveOp (); err != nil {
307
304
log .Error ("Prove new blocks error" , "error" , err )
308
305
}
309
306
case e := <- blockVerifiedCh :
310
307
p .blockVerifiedHandler .Handle (e )
311
308
case e := <- transitionProvedCh :
312
- go func () {
313
- if err := p .withRetry (func () error { return p .transitionProvedHandler .Handle (p .ctx , e ) }); err != nil {
314
- log .Error ("Handle TaikoL1.TransitionProved event error" , "error" , err )
315
- }
316
- }()
309
+ p .withRetry (func () error { return p .transitionProvedHandler .Handle (p .ctx , e ) })
317
310
case e := <- transitionContestedCh :
318
- go func () {
319
- if err := p .withRetry (func () error { return p .transitionContestedHandler .Handle (p .ctx , e ) }); err != nil {
320
- log .Error ("Handle TaikoL1.TransitionContested event error" , "error" , err )
321
- }
322
- }()
311
+ p .withRetry (func () error { return p .transitionContestedHandler .Handle (p .ctx , e ) })
323
312
case e := <- p .assignmentExpiredCh :
324
- go func () {
325
- if err := p .withRetry (func () error { return p .assignmentExpiredHandler .Handle (p .ctx , e ) }); err != nil {
326
- log .Error ("Handle proof window expired event error" , "error" , err )
327
- }
328
- }()
313
+ p .withRetry (func () error { return p .assignmentExpiredHandler .Handle (p .ctx , e ) })
329
314
case <- blockProposedCh :
330
315
reqProving ()
331
316
case <- forceProvingTicker .C :
@@ -376,86 +361,53 @@ func (p *Prover) proveOp() error {
376
361
}
377
362
378
363
// contestProofOp performs a proof contest operation.
379
- func (p * Prover ) contestProofOp (ctx context.Context , req * proofSubmitter.ContestRequestBody ) {
380
- go func () {
381
- if err := backoff .Retry (func () error {
382
- if err := p .proofContester .SubmitContest (
383
- p .ctx ,
384
- req .BlockID ,
385
- req .ProposedIn ,
386
- req .ParentHash ,
387
- req .Meta ,
388
- req .Tier ,
389
- ); err != nil {
390
- log .Error ("Request new proof contest error" , "blockID" , req .BlockID , "error" , err )
391
- return err
392
- }
364
+ func (p * Prover ) contestProofOp (req * proofSubmitter.ContestRequestBody ) error {
365
+ if err := p .proofContester .SubmitContest (
366
+ p .ctx ,
367
+ req .BlockID ,
368
+ req .ProposedIn ,
369
+ req .ParentHash ,
370
+ req .Meta ,
371
+ req .Tier ,
372
+ ); err != nil {
373
+ log .Error ("Request new proof contest error" , "blockID" , req .BlockID , "error" , err )
374
+ return err
375
+ }
393
376
394
- return nil
395
- }, backoff .WithMaxRetries (
396
- backoff .NewConstantBackOff (p .cfg .BackOffRetryInterval ),
397
- p .cfg .BackOffMaxRetrys ,
398
- )); err != nil {
399
- log .Error ("Request new proof contest error" , "blockID" , req .BlockID , "error" , err )
400
- }
401
- }()
377
+ return nil
402
378
}
403
379
404
380
// requestProofOp requests a new proof generation operation.
405
- func (p * Prover ) requestProofOp (ctx context.Context , e * bindings.TaikoL1ClientBlockProposed , minTier uint16 ) {
406
- go func () {
407
- if p .IsGuardianProver () {
408
- minTier = encoding .TierGuardianID
381
+ func (p * Prover ) requestProofOp (e * bindings.TaikoL1ClientBlockProposed , minTier uint16 ) error {
382
+ if p .IsGuardianProver () {
383
+ minTier = encoding .TierGuardianID
384
+ }
385
+ if submitter := p .selectSubmitter (minTier ); submitter != nil {
386
+ if err := submitter .RequestProof (p .ctx , e ); err != nil {
387
+ log .Error ("Request new proof error" , "blockID" , e .BlockId , "error" , err )
388
+ return err
409
389
}
410
390
411
- if err := backoff .Retry (func () error {
412
- if ctx .Err () != nil {
413
- log .Error ("Context is done, aborting requestProofOp" , "blockID" , e .BlockId , "error" , ctx .Err ())
414
- return nil
415
- }
416
-
417
- if proofSubmitter := p .selectSubmitter (minTier ); proofSubmitter != nil {
418
- if err := proofSubmitter .RequestProof (ctx , e ); err != nil {
419
- log .Error ("Request new proof error" , "blockID" , e .BlockId , "error" , err )
420
- return err
421
- }
422
-
423
- return nil
424
- }
391
+ return nil
392
+ }
425
393
426
- log .Error ("Failed to find proof submitter" , "blockID" , e .BlockId , "minTier" , minTier )
427
- return nil
428
- }, backoff .WithMaxRetries (
429
- backoff .NewConstantBackOff (p .cfg .BackOffRetryInterval ),
430
- p .cfg .BackOffMaxRetrys ,
431
- )); err != nil {
432
- log .Error ("Request new proof error" , "blockID" , e .BlockId , "error" , err )
433
- }
434
- }()
394
+ log .Error ("Failed to find proof submitter" , "blockID" , e .BlockId , "minTier" , minTier )
395
+ return nil
435
396
}
436
397
437
398
// submitProofOp performs a proof submission operation.
438
- func (p * Prover ) submitProofOp (ctx context.Context , proofWithHeader * proofProducer.ProofWithHeader ) {
439
- go func () {
440
- if err := backoff .Retry (
441
- func () error {
442
- proofSubmitter := p .getSubmitterByTier (proofWithHeader .Tier )
443
- if proofSubmitter == nil {
444
- return nil
445
- }
399
+ func (p * Prover ) submitProofOp (proofWithHeader * proofProducer.ProofWithHeader ) error {
400
+ submitter := p .getSubmitterByTier (proofWithHeader .Tier )
401
+ if submitter == nil {
402
+ return nil
403
+ }
446
404
447
- if err := proofSubmitter .SubmitProof (p .ctx , proofWithHeader ); err != nil {
448
- log .Error ("Submit proof error" , "error" , err )
449
- return err
450
- }
405
+ if err := submitter .SubmitProof (p .ctx , proofWithHeader ); err != nil {
406
+ log .Error ("Submit proof error" , "error" , err )
407
+ return err
408
+ }
451
409
452
- return nil
453
- },
454
- backoff .WithMaxRetries (backoff .NewConstantBackOff (p .cfg .BackOffRetryInterval ), p .cfg .BackOffMaxRetrys ),
455
- ); err != nil {
456
- log .Error ("Submit proof error" , "error" , err )
457
- }
458
- }()
410
+ return nil
459
411
}
460
412
461
413
// Name returns the application name.
@@ -497,19 +449,26 @@ func (p *Prover) IsGuardianProver() bool {
497
449
498
450
// ProverAddress returns the current prover account address.
499
451
func (p * Prover ) ProverAddress () common.Address {
500
- return crypto .PubkeyToAddress (p .proverPrivateKey .PublicKey )
452
+ return crypto .PubkeyToAddress (p .cfg . L1ProverPrivKey .PublicKey )
501
453
}
502
454
503
455
// withRetry retries the given function with prover backoff policy.
504
- func (p * Prover ) withRetry (f func () error ) error {
505
- return backoff .Retry (
506
- func () error {
507
- if p .ctx .Err () != nil {
508
- log .Error ("Context is done, aborting" , "error" , p .ctx .Err ())
509
- return nil
510
- }
511
- return f ()
512
- },
513
- backoff .WithMaxRetries (backoff .NewConstantBackOff (p .cfg .BackOffRetryInterval ), p .cfg .BackOffMaxRetrys ),
514
- )
456
+ func (p * Prover ) withRetry (f func () error ) {
457
+ p .wg .Add (1 )
458
+ go func () {
459
+ defer p .wg .Done ()
460
+ err := backoff .Retry (
461
+ func () error {
462
+ if p .ctx .Err () != nil {
463
+ log .Error ("Context is done, aborting" , "error" , p .ctx .Err ())
464
+ return nil
465
+ }
466
+ return f ()
467
+ },
468
+ backoff .WithMaxRetries (backoff .NewConstantBackOff (p .cfg .BackOffRetryInterval ), p .cfg .BackOffMaxRetrys ),
469
+ )
470
+ if err != nil {
471
+ log .Error ("Operation failed" , "error" , err )
472
+ }
473
+ }()
515
474
}
0 commit comments