From f5e46716677e7f834cd4719a6e2e128d85e9ad97 Mon Sep 17 00:00:00 2001 From: fahimahmedx Date: Mon, 17 Jun 2024 14:49:48 -0700 Subject: [PATCH 1/4] add flags for configurable hours of blob data --- validator/cmd/main.go | 2 +- validator/flags/config.go | 18 +++++++++++++++--- validator/flags/flags.go | 14 ++++++++++++++ validator/service/service.go | 30 +++++++++++++++--------------- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/validator/cmd/main.go b/validator/cmd/main.go index 0e9b270..7453ccc 100644 --- a/validator/cmd/main.go +++ b/validator/cmd/main.go @@ -59,6 +59,6 @@ func Main() cliapp.LifecycleAction { beaconClient := service.NewBlobSidecarClient(cfg.BeaconConfig.BeaconURL) blobClient := service.NewBlobSidecarClient(cfg.BlobConfig.BeaconURL) - return service.NewValidator(l, headerClient, beaconClient, blobClient, closeApp), nil + return service.NewValidator(l, headerClient, beaconClient, blobClient, closeApp, cfg.BlocksPerMinuteConfig*cfg.HoursOfBlobDataConfig*60), nil } } diff --git a/validator/flags/config.go b/validator/flags/config.go index ea6144c..618d1cf 100644 --- a/validator/flags/config.go +++ b/validator/flags/config.go @@ -10,9 +10,11 @@ import ( ) type ValidatorConfig struct { - LogConfig oplog.CLIConfig - BeaconConfig common.BeaconConfig - BlobConfig common.BeaconConfig + LogConfig oplog.CLIConfig + BeaconConfig common.BeaconConfig + BlobConfig common.BeaconConfig + BlocksPerMinuteConfig int + HoursOfBlobDataConfig int } func (c ValidatorConfig) Check() error { @@ -24,6 +26,14 @@ func (c ValidatorConfig) Check() error { return fmt.Errorf("blob config check failed: %w", err) } + if c.BlocksPerMinuteConfig <= 0 { + return fmt.Errorf("blocks per minute must be greater than 0") + } + + if c.HoursOfBlobDataConfig <= 0 { + return fmt.Errorf("hours of blob data must be greater than 0") + } + return nil } @@ -40,5 +50,7 @@ func ReadConfig(cliCtx *cli.Context) ValidatorConfig { BeaconURL: cliCtx.String(BlobApiClientUrlFlag.Name), BeaconClientTimeout: timeout, }, + BlocksPerMinuteConfig: cliCtx.Int(BeaconClientTimeoutFlag.Name), + HoursOfBlobDataConfig: cliCtx.Int(HoursOfBlobDataClientFlag.Name), } } diff --git a/validator/flags/flags.go b/validator/flags/flags.go index befb67b..5415bd8 100644 --- a/validator/flags/flags.go +++ b/validator/flags/flags.go @@ -27,6 +27,20 @@ var ( Required: true, EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "BLOB_API_HTTP"), } + BlocksPerMinuteClientFlag = &cli.IntFlag{ + Name: "blocks-per-minute", + Usage: "The number of blocks per minute", + Value: 5, + Required: true, + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "BLOCKS_PER_MINUTE"), + } + HoursOfBlobDataClientFlag = &cli.IntFlag{ + Name: "hours-of-blob-data", + Usage: "The number of hours of blob data to fetch", + Value: 2, + Required: true, + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "HOURS_OF_BLOB_DATA"), + } ) func init() { diff --git a/validator/service/service.go b/validator/service/service.go index 4137a59..50e29a7 100644 --- a/validator/service/service.go +++ b/validator/service/service.go @@ -21,8 +21,6 @@ import ( var ErrAlreadyStopped = errors.New("already stopped") const ( - // 5 blocks per minute, 120 minutes - twoHoursOfBlocks = 5 * 120 // finalized l1 offset finalizedL1Offset = 64 // Known log for any validation errors @@ -31,23 +29,25 @@ const ( retryAttempts = 10 ) -func NewValidator(l log.Logger, headerClient client.BeaconBlockHeadersProvider, beaconAPI BlobSidecarClient, blobAPI BlobSidecarClient, app context.CancelCauseFunc) *ValidatorService { +func NewValidator(l log.Logger, headerClient client.BeaconBlockHeadersProvider, beaconAPI BlobSidecarClient, blobAPI BlobSidecarClient, app context.CancelCauseFunc, hoursOfBlocks int) *ValidatorService { return &ValidatorService{ - log: l, - headerClient: headerClient, - beaconAPI: beaconAPI, - blobAPI: blobAPI, - closeApp: app, + log: l, + headerClient: headerClient, + beaconAPI: beaconAPI, + blobAPI: blobAPI, + closeApp: app, + hoursOfBlocks: hoursOfBlocks, } } type ValidatorService struct { - stopped atomic.Bool - log log.Logger - headerClient client.BeaconBlockHeadersProvider - beaconAPI BlobSidecarClient - blobAPI BlobSidecarClient - closeApp context.CancelCauseFunc + stopped atomic.Bool + log log.Logger + headerClient client.BeaconBlockHeadersProvider + beaconAPI BlobSidecarClient + blobAPI BlobSidecarClient + closeApp context.CancelCauseFunc + hoursOfBlocks int } // Start starts the validator service. This will fetch the current range of blocks to validate and start the validation @@ -64,7 +64,7 @@ func (a *ValidatorService) Start(ctx context.Context) error { } end := header.Data.Header.Message.Slot - finalizedL1Offset - start := end - twoHoursOfBlocks + start := end - phase0.Slot(a.hoursOfBlocks) go a.checkBlobs(ctx, start, end) From c95b3300808553d8fa7cb6b13a06b54435ed2d37 Mon Sep 17 00:00:00 2001 From: fahimahmedx Date: Mon, 17 Jun 2024 15:04:48 -0700 Subject: [PATCH 2/4] add default blocks per hour data for a test case --- validator/service/service_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/validator/service/service_test.go b/validator/service/service_test.go index 33de554..8993273 100644 --- a/validator/service/service_test.go +++ b/validator/service/service_test.go @@ -71,7 +71,9 @@ func setup(t *testing.T) (*ValidatorService, *beacontest.StubBeaconClient, *stub data: make(map[string]response), } - return NewValidator(l, headerClient, beacon, blob, cancel), headerClient, beacon, blob + HoursOfBlobData := 5 * 2 * 60 // 2 hours of blob data at 5 blocks per minute + + return NewValidator(l, headerClient, beacon, blob, cancel, HoursOfBlobData), headerClient, beacon, blob } func TestValidatorService_OnFetchError(t *testing.T) { From ab283663be2e956b68d36414ac32cebd906345ed Mon Sep 17 00:00:00 2001 From: fahimahmedx Date: Mon, 17 Jun 2024 16:17:21 -0700 Subject: [PATCH 3/4] condense flags into NUM_BLOCKS --- validator/cmd/main.go | 2 +- validator/flags/config.go | 20 +++++++------------- validator/flags/flags.go | 17 +++++------------ validator/service/service.go | 30 +++++++++++++++--------------- validator/service/service_test.go | 4 ++-- 5 files changed, 30 insertions(+), 43 deletions(-) diff --git a/validator/cmd/main.go b/validator/cmd/main.go index 7453ccc..7c4c492 100644 --- a/validator/cmd/main.go +++ b/validator/cmd/main.go @@ -59,6 +59,6 @@ func Main() cliapp.LifecycleAction { beaconClient := service.NewBlobSidecarClient(cfg.BeaconConfig.BeaconURL) blobClient := service.NewBlobSidecarClient(cfg.BlobConfig.BeaconURL) - return service.NewValidator(l, headerClient, beaconClient, blobClient, closeApp, cfg.BlocksPerMinuteConfig*cfg.HoursOfBlobDataConfig*60), nil + return service.NewValidator(l, headerClient, beaconClient, blobClient, closeApp, cfg.NumBlocks), nil } } diff --git a/validator/flags/config.go b/validator/flags/config.go index 618d1cf..b600f27 100644 --- a/validator/flags/config.go +++ b/validator/flags/config.go @@ -10,11 +10,10 @@ import ( ) type ValidatorConfig struct { - LogConfig oplog.CLIConfig - BeaconConfig common.BeaconConfig - BlobConfig common.BeaconConfig - BlocksPerMinuteConfig int - HoursOfBlobDataConfig int + LogConfig oplog.CLIConfig + BeaconConfig common.BeaconConfig + BlobConfig common.BeaconConfig + NumBlocks int } func (c ValidatorConfig) Check() error { @@ -26,12 +25,8 @@ func (c ValidatorConfig) Check() error { return fmt.Errorf("blob config check failed: %w", err) } - if c.BlocksPerMinuteConfig <= 0 { - return fmt.Errorf("blocks per minute must be greater than 0") - } - - if c.HoursOfBlobDataConfig <= 0 { - return fmt.Errorf("hours of blob data must be greater than 0") + if c.NumBlocks <= 0 { + return fmt.Errorf("number of blocks must be greater than 0") } return nil @@ -50,7 +45,6 @@ func ReadConfig(cliCtx *cli.Context) ValidatorConfig { BeaconURL: cliCtx.String(BlobApiClientUrlFlag.Name), BeaconClientTimeout: timeout, }, - BlocksPerMinuteConfig: cliCtx.Int(BeaconClientTimeoutFlag.Name), - HoursOfBlobDataConfig: cliCtx.Int(HoursOfBlobDataClientFlag.Name), + NumBlocks: cliCtx.Int(NumBlocksClientFlag.Name), } } diff --git a/validator/flags/flags.go b/validator/flags/flags.go index 5415bd8..c9167d0 100644 --- a/validator/flags/flags.go +++ b/validator/flags/flags.go @@ -27,19 +27,12 @@ var ( Required: true, EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "BLOB_API_HTTP"), } - BlocksPerMinuteClientFlag = &cli.IntFlag{ - Name: "blocks-per-minute", - Usage: "The number of blocks per minute", - Value: 5, + NumBlocksClientFlag = &cli.IntFlag{ + Name: "num-blocks", + Usage: "The number of blocks to read blob data for", + Value: 600, Required: true, - EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "BLOCKS_PER_MINUTE"), - } - HoursOfBlobDataClientFlag = &cli.IntFlag{ - Name: "hours-of-blob-data", - Usage: "The number of hours of blob data to fetch", - Value: 2, - Required: true, - EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "HOURS_OF_BLOB_DATA"), + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "NUM_BLOCKS"), } ) diff --git a/validator/service/service.go b/validator/service/service.go index 50e29a7..adefc36 100644 --- a/validator/service/service.go +++ b/validator/service/service.go @@ -29,25 +29,25 @@ const ( retryAttempts = 10 ) -func NewValidator(l log.Logger, headerClient client.BeaconBlockHeadersProvider, beaconAPI BlobSidecarClient, blobAPI BlobSidecarClient, app context.CancelCauseFunc, hoursOfBlocks int) *ValidatorService { +func NewValidator(l log.Logger, headerClient client.BeaconBlockHeadersProvider, beaconAPI BlobSidecarClient, blobAPI BlobSidecarClient, app context.CancelCauseFunc, numBlocks int) *ValidatorService { return &ValidatorService{ - log: l, - headerClient: headerClient, - beaconAPI: beaconAPI, - blobAPI: blobAPI, - closeApp: app, - hoursOfBlocks: hoursOfBlocks, + log: l, + headerClient: headerClient, + beaconAPI: beaconAPI, + blobAPI: blobAPI, + closeApp: app, + numBlocks: numBlocks, } } type ValidatorService struct { - stopped atomic.Bool - log log.Logger - headerClient client.BeaconBlockHeadersProvider - beaconAPI BlobSidecarClient - blobAPI BlobSidecarClient - closeApp context.CancelCauseFunc - hoursOfBlocks int + stopped atomic.Bool + log log.Logger + headerClient client.BeaconBlockHeadersProvider + beaconAPI BlobSidecarClient + blobAPI BlobSidecarClient + closeApp context.CancelCauseFunc + numBlocks int } // Start starts the validator service. This will fetch the current range of blocks to validate and start the validation @@ -64,7 +64,7 @@ func (a *ValidatorService) Start(ctx context.Context) error { } end := header.Data.Header.Message.Slot - finalizedL1Offset - start := end - phase0.Slot(a.hoursOfBlocks) + start := end - phase0.Slot(a.numBlocks) go a.checkBlobs(ctx, start, end) diff --git a/validator/service/service_test.go b/validator/service/service_test.go index 8993273..1454bf2 100644 --- a/validator/service/service_test.go +++ b/validator/service/service_test.go @@ -71,9 +71,9 @@ func setup(t *testing.T) (*ValidatorService, *beacontest.StubBeaconClient, *stub data: make(map[string]response), } - HoursOfBlobData := 5 * 2 * 60 // 2 hours of blob data at 5 blocks per minute + numBlocks := 600 - return NewValidator(l, headerClient, beacon, blob, cancel, HoursOfBlobData), headerClient, beacon, blob + return NewValidator(l, headerClient, beacon, blob, cancel, numBlocks), headerClient, beacon, blob } func TestValidatorService_OnFetchError(t *testing.T) { From a85fee2bca81e44abc5568ae3645e10781a836ab Mon Sep 17 00:00:00 2001 From: fahimahmedx Date: Tue, 18 Jun 2024 09:33:26 -0700 Subject: [PATCH 4/4] append num_blocks flag --- validator/flags/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/flags/flags.go b/validator/flags/flags.go index c9167d0..5fd4bbc 100644 --- a/validator/flags/flags.go +++ b/validator/flags/flags.go @@ -38,7 +38,7 @@ var ( func init() { Flags = append(Flags, oplog.CLIFlags(EnvVarPrefix)...) - Flags = append(Flags, BeaconClientTimeoutFlag, L1BeaconClientUrlFlag, BlobApiClientUrlFlag) + Flags = append(Flags, BeaconClientTimeoutFlag, L1BeaconClientUrlFlag, BlobApiClientUrlFlag, NumBlocksClientFlag) } // Flags contains the list of configuration options available to the binary.