Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactoring how proposer settings load into validator client #13645

Merged
merged 54 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
f8c39d3
refactoring how proposer settings load
james-prysm Feb 21, 2024
ab5eba8
fixing tests and moving test data
james-prysm Feb 21, 2024
f43a9d0
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 21, 2024
8b24dd7
fixing linting and adding comments
james-prysm Feb 21, 2024
49fe25c
accidently removed a function, adding it back in
james-prysm Feb 21, 2024
735c7ba
fixing usage of dependency
james-prysm Feb 21, 2024
09d5d0c
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 21, 2024
af6bb64
gaz
james-prysm Feb 21, 2024
1ceecc2
fixing package visibility
james-prysm Feb 21, 2024
72ca90a
gaz
james-prysm Feb 21, 2024
e9a5e78
iface config gaz
james-prysm Feb 21, 2024
4b41de8
adding visibility for db
james-prysm Feb 21, 2024
fe0bfff
fix ineffectual assignment to err
james-prysm Feb 21, 2024
0346809
adding in log for when the builder is set but ignored due to no fee r…
james-prysm Feb 21, 2024
da3d4c6
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 21, 2024
a1ee0f5
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 21, 2024
d7d3fd5
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 22, 2024
94fdd74
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 22, 2024
a8f8419
Update config/validator/service/proposer_settings.go
james-prysm Feb 22, 2024
8d33ab3
Update config/validator/service/proposer_settings.go
james-prysm Feb 22, 2024
cbaf046
Update validator/client/validator.go
james-prysm Feb 22, 2024
cd59a94
Update config/validator/service/proposer_settings.go
james-prysm Feb 22, 2024
4f2cbf6
Update config/proposer/loader.go
james-prysm Feb 22, 2024
def582a
Update config/proposer/loader.go
james-prysm Feb 22, 2024
c3a6ca7
Update config/proposer/loader.go
james-prysm Feb 22, 2024
15af87e
Update config/proposer/loader.go
james-prysm Feb 22, 2024
6ddf2ba
Update config/proposer/loader.go
james-prysm Feb 22, 2024
83572b0
Update config/validator/service/proposer_settings.go
james-prysm Feb 22, 2024
4fc92ad
Update config/util.go
james-prysm Feb 22, 2024
1924e76
some of the review feedback
james-prysm Feb 22, 2024
c982e4b
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 26, 2024
d66cab6
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 26, 2024
398fc37
more review comments
james-prysm Feb 23, 2024
84c9a2d
adding more test coverage
james-prysm Feb 26, 2024
588f204
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 26, 2024
5ef3f75
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 27, 2024
e9a5260
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 27, 2024
957dc68
Update config/proposer/loader.go
james-prysm Feb 28, 2024
9f264bf
Update config/proposer/loader.go
james-prysm Feb 28, 2024
840debb
Update config/proposer/loader.go
james-prysm Feb 28, 2024
0e03175
Update config/proposer/loader.go
james-prysm Feb 28, 2024
0dda35d
updating based on feedback
james-prysm Feb 28, 2024
05e4a79
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 28, 2024
6aac68d
renaming variable
james-prysm Feb 28, 2024
51b0620
fixing unhandled errors
james-prysm Feb 28, 2024
52bd7bf
fixing tests
james-prysm Feb 29, 2024
2e1fa85
gaz
james-prysm Feb 29, 2024
f9ba8c1
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 29, 2024
93a18d1
adding in gaslimit log
james-prysm Feb 29, 2024
2fbf9f7
fixing log
james-prysm Feb 29, 2024
e7bda49
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Feb 29, 2024
b9c150a
some more review comments
james-prysm Feb 29, 2024
dbfad46
renaming and moving proposer settings file
james-prysm Feb 29, 2024
7c8d3c5
Merge branch 'develop' into improve-proposer-setting-process
james-prysm Mar 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/validator/flags/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ go_library(
visibility = [
"//cmd/prysmctl:__subpackages__",
"//cmd/validator:__subpackages__",
"//config:__subpackages__",
"//testing/endtoend:__subpackages__",
"//validator:__subpackages__",
],
Expand Down
27 changes: 27 additions & 0 deletions config/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("@prysm//tools/go:def.bzl", "go_library", "go_test")

config_setting(
name = "mainnet",
flag_values = {
Expand All @@ -11,3 +13,28 @@ config_setting(
"//proto:network": "minimal",
},
)

go_library(
name = "go_default_library",
srcs = ["util.go"],
importpath = "github.com/prysmaticlabs/prysm/v5/config",
visibility = ["//visibility:public"],
deps = [
"@com_github_ethereum_go_ethereum//common:go_default_library",
"@com_github_pkg_errors//:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
"@io_k8s_apimachinery//pkg/util/yaml:go_default_library",
],
)

go_test(
name = "go_default_test",
srcs = ["util_test.go"],
embed = [":go_default_library"],
deps = [
"//config/params:go_default_library",
"//testing/assert:go_default_library",
"//testing/require:go_default_library",
"@com_github_sirupsen_logrus//hooks/test:go_default_library",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ load("@prysm//tools/go:def.bzl", "go_library", "go_test")

go_library(
name = "go_default_library",
srcs = ["proposer_settings.go"],
importpath = "github.com/prysmaticlabs/prysm/v5/config/validator/service",
srcs = ["settings.go"],
importpath = "github.com/prysmaticlabs/prysm/v5/config/proposer",
visibility = ["//visibility:public"],
deps = [
"//config:go_default_library",
"//config/fieldparams:go_default_library",
"//consensus-types/validator:go_default_library",
"//encoding/bytesutil:go_default_library",
Expand All @@ -18,7 +19,7 @@ go_library(

go_test(
name = "go_default_test",
srcs = ["proposer_settings_test.go"],
srcs = ["settings_test.go"],
embed = [":go_default_library"],
deps = [
"//config/fieldparams:go_default_library",
Expand Down
45 changes: 45 additions & 0 deletions config/proposer/loader/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
load("@prysm//tools/go:def.bzl", "go_library", "go_test")

go_test(
name = "go_default_test",
size = "small",
srcs = ["loader_test.go"],
data = glob(["testdata/**"]),
embed = [":go_default_library"],
deps = [
"//cmd/validator/flags:go_default_library",
"//config/fieldparams:go_default_library",
"//config/params:go_default_library",
"//config/proposer:go_default_library",
"//consensus-types/validator:go_default_library",
"//encoding/bytesutil:go_default_library",
"//testing/assert:go_default_library",
"//testing/require:go_default_library",
"//validator/db/iface:go_default_library",
"//validator/db/testing:go_default_library",
"@com_github_ethereum_go_ethereum//common:go_default_library",
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",
"@com_github_sirupsen_logrus//hooks/test:go_default_library",
"@com_github_urfave_cli_v2//:go_default_library",
],
)

go_library(
name = "go_default_library",
srcs = ["loader.go"],
importpath = "github.com/prysmaticlabs/prysm/v5/config/proposer/loader",
visibility = ["//visibility:public"],
deps = [
"//cmd/validator/flags:go_default_library",
"//config:go_default_library",
"//config/params:go_default_library",
"//config/proposer:go_default_library",
"//consensus-types/validator:go_default_library",
"//proto/prysm/v1alpha1/validator-client:go_default_library",
"//validator/db/iface:go_default_library",
"@com_github_ethereum_go_ethereum//common:go_default_library",
"@com_github_pkg_errors//:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
"@com_github_urfave_cli_v2//:go_default_library",
],
)
283 changes: 283 additions & 0 deletions config/proposer/loader/loader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
package loader

import (
"fmt"
"strconv"

"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v5/cmd/validator/flags"
"github.com/prysmaticlabs/prysm/v5/config"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/config/proposer"
"github.com/prysmaticlabs/prysm/v5/consensus-types/validator"
validatorpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1/validator-client"
"github.com/prysmaticlabs/prysm/v5/validator/db/iface"
log "github.com/sirupsen/logrus"
"github.com/urfave/cli/v2"
)

type settingsType int

const (
none settingsType = iota
defaultFlag
fileFlag
urlFlag
onlyDB
)

type settingsLoader struct {
loadMethods []settingsType
existsInDB bool
db iface.ValidatorDB
options *flagOptions
}

type flagOptions struct {
builderConfig *proposer.BuilderConfig
gasLimit *validator.Uint64
}

// SettingsLoaderOption sets additional options that affect the proposer settings
type SettingsLoaderOption func(cliCtx *cli.Context, psl *settingsLoader) error

// WithBuilderConfig applies the --enable-builder flag to proposer settings
func WithBuilderConfig() SettingsLoaderOption {
return func(cliCtx *cli.Context, psl *settingsLoader) error {
if cliCtx.Bool(flags.EnableBuilderFlag.Name) {
psl.options.builderConfig = &proposer.BuilderConfig{
Enabled: true,
GasLimit: validator.Uint64(params.BeaconConfig().DefaultBuilderGasLimit),
}
}
return nil
}
}

// WithGasLimit applies the --suggested-gas-limit flag to proposer settings
func WithGasLimit() SettingsLoaderOption {
return func(cliCtx *cli.Context, psl *settingsLoader) error {
sgl := cliCtx.String(flags.BuilderGasLimitFlag.Name)
if sgl != "" {
gl, err := strconv.ParseUint(sgl, 10, 64)
if err != nil {
return errors.Errorf("Value set by --%s is not a uint64", flags.BuilderGasLimitFlag.Name)
}
if gl == 0 {
log.Warnf("Gas limit was intentionally set to 0, this will be replaced with the default gas limit of %d", params.BeaconConfig().DefaultBuilderGasLimit)
}
rgl := reviewGasLimit(validator.Uint64(gl))
psl.options.gasLimit = &rgl
}
return nil
}
}

// NewProposerSettingsLoader returns a new proposer settings loader that can process the proposer settings based on flag options
func NewProposerSettingsLoader(cliCtx *cli.Context, db iface.ValidatorDB, opts ...SettingsLoaderOption) (*settingsLoader, error) {
if cliCtx.IsSet(flags.ProposerSettingsFlag.Name) && cliCtx.IsSet(flags.ProposerSettingsURLFlag.Name) {
return nil, fmt.Errorf("cannot specify both --%s and --%s flags; choose one method for specifying proposer settings", flags.ProposerSettingsFlag.Name, flags.ProposerSettingsURLFlag.Name)
}
psExists, err := db.ProposerSettingsExists(cliCtx.Context)
if err != nil {
return nil, err
}
psl := &settingsLoader{db: db, existsInDB: psExists, options: &flagOptions{}}

if cliCtx.IsSet(flags.SuggestedFeeRecipientFlag.Name) {
psl.loadMethods = append(psl.loadMethods, defaultFlag)
}
if cliCtx.IsSet(flags.ProposerSettingsFlag.Name) {
psl.loadMethods = append(psl.loadMethods, fileFlag)
}
if cliCtx.IsSet(flags.ProposerSettingsURLFlag.Name) {
psl.loadMethods = append(psl.loadMethods, urlFlag)
}
if len(psl.loadMethods) == 0 {
method := none
if psExists {
// override with db
method = onlyDB
}
psl.loadMethods = append(psl.loadMethods, method)
}

for _, o := range opts {
if err := o(cliCtx, psl); err != nil {
return nil, err
}
}

return psl, nil
}

// Load saves the proposer settings to the database
func (psl *settingsLoader) Load(cliCtx *cli.Context) (*proposer.Settings, error) {
loadConfig := &validatorpb.ProposerSettingsPayload{}

// override settings based on other options
if psl.options.builderConfig != nil && psl.options.gasLimit != nil {
psl.options.builderConfig.GasLimit = *psl.options.gasLimit
}

// check if database has settings already
if psl.existsInDB {
dbps, err := psl.db.ProposerSettings(cliCtx.Context)
if err != nil {
return nil, err
}
loadConfig = dbps.ToConsensus()
}

// start to process based on load method
for _, method := range psl.loadMethods {
switch method {
case defaultFlag:
suggestedFeeRecipient := cliCtx.String(flags.SuggestedFeeRecipientFlag.Name)
if !common.IsHexAddress(suggestedFeeRecipient) {
return nil, errors.Errorf("--%s is not a valid Ethereum address", flags.SuggestedFeeRecipientFlag.Name)
}
if err := config.WarnNonChecksummedAddress(suggestedFeeRecipient); err != nil {
return nil, err
}
defaultConfig := &validatorpb.ProposerOptionPayload{
FeeRecipient: suggestedFeeRecipient,
}
if psl.options.builderConfig != nil {
defaultConfig.Builder = psl.options.builderConfig.ToConsensus()
}
loadConfig.DefaultConfig = defaultConfig
case fileFlag:
var settingFromFile *validatorpb.ProposerSettingsPayload
if err := config.UnmarshalFromFile(cliCtx.String(flags.ProposerSettingsFlag.Name), &settingFromFile); err != nil {
return nil, err
}
if settingFromFile == nil {
return nil, errors.Errorf("proposer settings is empty after unmarshalling from file specified by %s flag", flags.ProposerSettingsFlag.Name)
}
loadConfig = psl.processProposerSettings(settingFromFile, loadConfig)
case urlFlag:
var settingFromURL *validatorpb.ProposerSettingsPayload
if err := config.UnmarshalFromURL(cliCtx.Context, cliCtx.String(flags.ProposerSettingsURLFlag.Name), &settingFromURL); err != nil {
return nil, err
}
if settingFromURL == nil {
return nil, errors.New("proposer settings is empty after unmarshalling from url")
}
loadConfig = psl.processProposerSettings(settingFromURL, loadConfig)
case onlyDB:
loadConfig = psl.processProposerSettings(nil, loadConfig)
case none:
if psl.options.builderConfig != nil {
// if there are no proposer settings provided, create a default where fee recipient is not populated, this will be skipped for validator registration on validators that don't have a fee recipient set.
// skip saving to DB if only builder settings are provided until a trigger like keymanager API updates with fee recipient values
option := &proposer.Option{
BuilderConfig: psl.options.builderConfig.Clone(),
}
loadConfig.DefaultConfig = option.ToConsensus()
}
default:
return nil, errors.New("load method for proposer settings does not exist")
}
}

// exit early if nothing is provided
if loadConfig == nil || (loadConfig.ProposerConfig == nil && loadConfig.DefaultConfig == nil) {
log.Warn("No proposer settings were provided")
return nil, nil
}
ps, err := proposer.SettingFromConsensus(loadConfig)
if err != nil {
return nil, err
}
if err := psl.db.SaveProposerSettings(cliCtx.Context, ps); err != nil {
return nil, err
}
return ps, nil
}

func (psl *settingsLoader) processProposerSettings(loadedSettings, dbSettings *validatorpb.ProposerSettingsPayload) *validatorpb.ProposerSettingsPayload {
if loadedSettings == nil && dbSettings == nil {
return nil
}

// loaded settings have higher priority than db settings
newSettings := &validatorpb.ProposerSettingsPayload{}

var builderConfig *validatorpb.BuilderConfig
var gasLimitOnly *validator.Uint64

if psl.options != nil {
if psl.options.builderConfig != nil {
builderConfig = psl.options.builderConfig.ToConsensus()
}
if psl.options.gasLimit != nil {
gasLimitOnly = psl.options.gasLimit
}
}

if dbSettings != nil && dbSettings.DefaultConfig != nil {
if builderConfig == nil {
dbSettings.DefaultConfig.Builder = nil
}
newSettings.DefaultConfig = dbSettings.DefaultConfig
}
if loadedSettings != nil && loadedSettings.DefaultConfig != nil {
newSettings.DefaultConfig = loadedSettings.DefaultConfig
}

// process any builder overrides on defaults
if newSettings.DefaultConfig != nil {
newSettings.DefaultConfig.Builder = processBuilderConfig(newSettings.DefaultConfig.Builder, builderConfig, gasLimitOnly)
}

if dbSettings != nil && len(dbSettings.ProposerConfig) != 0 {
for _, option := range dbSettings.ProposerConfig {
if builderConfig == nil {
option.Builder = nil
}
}
newSettings.ProposerConfig = dbSettings.ProposerConfig
}
if loadedSettings != nil && len(loadedSettings.ProposerConfig) != 0 {
newSettings.ProposerConfig = loadedSettings.ProposerConfig
}

// process any overrides for proposer config
for _, option := range newSettings.ProposerConfig {
if option != nil {
option.Builder = processBuilderConfig(option.Builder, builderConfig, gasLimitOnly)
}
}

// if default and proposer configs are both missing even after db setting
if newSettings.DefaultConfig == nil && newSettings.ProposerConfig == nil {
return nil
}

return newSettings
}

func processBuilderConfig(current *validatorpb.BuilderConfig, override *validatorpb.BuilderConfig, gasLimitOnly *validator.Uint64) *validatorpb.BuilderConfig {
if current != nil {
current.GasLimit = reviewGasLimit(current.GasLimit)
if override != nil {
current.Enabled = override.Enabled
}
if gasLimitOnly != nil {
current.GasLimit = *gasLimitOnly
}
return current
}
return override
}

func reviewGasLimit(gasLimit validator.Uint64) validator.Uint64 {
// sets gas limit to default if not defined or set to 0
if gasLimit == 0 {
return validator.Uint64(params.BeaconConfig().DefaultBuilderGasLimit)
}
// TODO(10810): add in warning for ranges
return gasLimit
}
Loading
Loading