Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
63 changes: 63 additions & 0 deletions cli/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package cli

import (
"os"
"strings"

"github.com/flashbots/mev-boost/server/types"
"gopkg.in/yaml.v3"
)

type RelayConfigYAML struct {
URL string `yaml:"url"`
EnableTimingGames bool `yaml:"enable_timing_games"`
TargetFirstRequestMs uint64 `yaml:"target_first_request_ms"`
FrequencyGetHeaderMs uint64 `yaml:"frequency_getheader_ms"`
}

// LoadRelayConfigFile loads relay configurations from a YAML file
func LoadRelayConfigFile(configPath string) (map[string]types.RelayConfig, error) {
data, err := os.ReadFile(configPath)
if err != nil {
return nil, err
}

var relays []RelayConfigYAML
if err := yaml.Unmarshal(data, &relays); err != nil {
return nil, err
}

configMap := make(map[string]types.RelayConfig)
for _, relay := range relays {
relayEntry, err := types.NewRelayEntry(strings.TrimSpace(relay.URL))
if err != nil {
return nil, err
}
relayConfig := types.RelayConfig{
RelayEntry: relayEntry,
EnableTimingGames: relay.EnableTimingGames,
TargetFirstRequestMs: relay.TargetFirstRequestMs,
FrequencyGetHeaderMs: relay.FrequencyGetHeaderMs,
}
configMap[relayEntry.String()] = relayConfig
}

return configMap, nil
}

// MergeRelayConfigs merges relays passed via --relays to config file settings.
// this allows the users to still use --relays if they dont want to provide a config file
func MergeRelayConfigs(relays []types.RelayEntry, configMap map[string]types.RelayConfig) []types.RelayConfig {
configs := make([]types.RelayConfig, 0, len(relays))

for _, entry := range relays {
if config, exists := configMap[entry.String()]; exists {
config.RelayEntry = entry
configs = append(configs, config)
} else {
configs = append(configs, types.NewRelayConfig(entry))
}
}

return configs
}
7 changes: 7 additions & 0 deletions cli/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ var flags = []cli.Flag{
hoodiFlag,
// relay
relaysFlag,
relayConfigFlag,
deprecatedRelayMonitorFlag,
minBidFlag,
relayCheckFlag,
Expand Down Expand Up @@ -135,6 +136,12 @@ var (
Usage: "relay urls - single entry or comma-separated list (scheme://pubkey@host)",
Category: RelayCategory,
}
relayConfigFlag = &cli.StringFlag{
Name: "relay-config",
Sources: cli.EnvVars("RELAY_CONFIG_FILE"),
Usage: "path to YAML file with relay timing games configuration",
Category: RelayCategory,
}
deprecatedRelayMonitorFlag = &cli.StringSliceFlag{
Name: "relay-monitors",
Aliases: []string{"relay-monitor"},
Expand Down
41 changes: 30 additions & 11 deletions cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/flashbots/mev-boost/common"
"github.com/flashbots/mev-boost/config"
"github.com/flashbots/mev-boost/server"
serverTypes "github.com/flashbots/mev-boost/server/types"
"github.com/sirupsen/logrus"
"github.com/urfave/cli/v3"
)
Expand Down Expand Up @@ -65,17 +66,17 @@ func start(_ context.Context, cmd *cli.Command) error {
}

var (
genesisForkVersion, genesisTime = setupGenesis(cmd)
relays, minBid, relayCheck = setupRelays(cmd)
listenAddr = cmd.String(addrFlag.Name)
metricsEnabled = cmd.Bool(metricsFlag.Name)
metricsAddr = cmd.String(metricsAddrFlag.Name)
genesisForkVersion, genesisTime = setupGenesis(cmd)
relayConfigs, minBid, relayCheck = setupRelays(cmd)
listenAddr = cmd.String(addrFlag.Name)
metricsEnabled = cmd.Bool(metricsFlag.Name)
metricsAddr = cmd.String(metricsAddrFlag.Name)
)

opts := server.BoostServiceOpts{
Log: log,
ListenAddr: listenAddr,
Relays: relays,
RelayConfigs: relayConfigs,
GenesisForkVersionHex: genesisForkVersion,
GenesisTime: genesisTime,
RelayCheck: relayCheck,
Expand Down Expand Up @@ -108,7 +109,7 @@ func start(_ context.Context, cmd *cli.Command) error {
return service.StartHTTPServer()
}

func setupRelays(cmd *cli.Command) (relayList, types.U256Str, bool) {
func setupRelays(cmd *cli.Command) ([]serverTypes.RelayConfig, types.U256Str, bool) {
// For backwards compatibility with the -relays flag.
var relays relayList
if cmd.IsSet(relaysFlag.Name) {
Expand All @@ -125,9 +126,27 @@ func setupRelays(cmd *cli.Command) (relayList, types.U256Str, bool) {
if len(relays) == 0 {
log.Fatal("no relays specified")
}
log.Infof("using %d relays", len(relays))
for index, relay := range relays {
log.Infof("relay #%d: %s", index+1, relay.String())

// load relays via config file
var configMap map[string]serverTypes.RelayConfig
if cmd.IsSet(relayConfigFlag.Name) {
configPath := cmd.String(relayConfigFlag.Name)
log.Infof("loading relay config from: %s", configPath)
var err error
configMap, err = LoadRelayConfigFile(configPath)
if err != nil {
log.WithError(err).Fatal("failed to load relay config file")
}
}
relayConfigs := MergeRelayConfigs(relays, configMap)

log.Infof("using %d relays", len(relayConfigs))
for index, config := range relayConfigs {
if config.EnableTimingGames {
log.Infof("relay #%d: %s timing games: enabled", index+1, config.RelayEntry.String())
} else {
log.Infof("relay #%d: %s", index+1, config.RelayEntry.String())
}
}

relayMinBidWei, err := sanitizeMinBid(cmd.Float(minBidFlag.Name))
Expand All @@ -137,7 +156,7 @@ func setupRelays(cmd *cli.Command) (relayList, types.U256Str, bool) {
if relayMinBidWei.BigInt().Sign() > 0 {
log.Infof("min bid set to %v eth (%v wei)", cmd.Float(minBidFlag.Name), relayMinBidWei)
}
return relays, *relayMinBidWei, cmd.Bool(relayCheckFlag.Name)
return relayConfigs, *relayMinBidWei, cmd.Bool(relayCheckFlag.Name)
}

func setupGenesis(cmd *cli.Command) (string, uint64) {
Expand Down
15 changes: 15 additions & 0 deletions examples/relay_config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Example relay configuration with timing games for mev-boost
relays:
# relay with timing games enabled
- url: "https://0x9000009807ed12c1f08bf4e81c6da3ba8e3fc3d953898ce0102433094e5f22f21102ec057841fcb81978ed1ea0fa8246@relay.relayer1.net"
enable_timing_games: true
# time in ms from slot start for the first getHeader request
target_first_request_ms: 500
# time in ms between subsequent getHeader requests
frequency_getheader_ms: 100

# relay with timing games disabled (standard behavior)
- url: "https://0x9000009807ed12c1f08bf4e81c6da3ba8e3fc3d953898ce0102433094e5f22f21102ec057841fcb81978ed1ea0fa8246@relay.relayer2.com"
enable_timing_games: false
target_first_request_ms: 0
frequency_getheader_ms: 0
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,5 @@ require (
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/sys v0.32.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gopkg.in/yaml.v3 v3.0.1
)
Loading
Loading