Skip to content

Commit

Permalink
feat: launch the mock mev builder (#94)
Browse files Browse the repository at this point in the history
  • Loading branch information
h4ck3rk3y committed Jun 27, 2023
1 parent 07ed500 commit 7fcd3e2
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 34 deletions.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,13 @@ To configure the package behaviour, you can modify your `eth2-package-params.yam
// The global log level that all clients should log at
// Valid values are "error", "warn", "info", "debug", and "trace"
// This value will be overridden by participant-specific values
"global_client_log_level": "info"
"global_client_log_level": "info",

// Supports three valeus
// Default: None - no mev boost, mev builder, mev flood or relays are spun up
// mock - mock-builder & mev-boost are spun up
// full - mev-boost, relays, flooder and builder are all spun up
"mev_type": None
}
```
</details>
Expand Down
39 changes: 26 additions & 13 deletions main.star
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ prometheus = import_module("github.com/kurtosis-tech/eth2-package/src/prometheus
grafana =import_module("github.com/kurtosis-tech/eth2-package/src/grafana/grafana_launcher.star")
testnet_verifier = import_module("github.com/kurtosis-tech/eth2-package/src/testnet_verifier/testnet_verifier.star")
mev_boost_launcher_module = import_module("github.com/kurtosis-tech/eth2-package/src/mev_boost/mev_boost_launcher.star")
mock_mev_launcher_module = import_module("github.com/kurtosis-tech/eth2-package/src/mock_mev/mock_mev_launcher.star")

GRAFANA_USER = "admin"
GRAFANA_PASSWORD = "admin"
Expand All @@ -18,11 +19,11 @@ GRAFANA_DASHBOARD_PATH_URL = "/d/QdTOwy-nz/eth2-merge-kurtosis-module-dashboard?
FIRST_NODE_FINALIZATION_FACT = "cl-boot-finalization-fact"
HTTP_PORT_ID_FOR_FACT = "http"

MEV_BOOST_SERVICE_NAME_PREFIX = "mev-boost-"
MEV_BOOST_SHOULD_CHECK_RELAY = True
MOCK_MEV_TYPE = "mock"

def run(plan, args):
args_with_right_defaults = parse_input.parse_input(args)
args_with_right_defaults, args_with_defaults_dict = parse_input.parse_input(args)

num_participants = len(args_with_right_defaults.participants)
network_params = args_with_right_defaults.network_params
Expand All @@ -34,22 +35,35 @@ def run(plan, args):
plan.print("Read the prometheus, grafana templates")

plan.print("Launching participant network with {0} participants and the following network params {1}".format(num_participants, network_params))
all_participants, cl_genesis_timestamp = eth_network_module.run(plan, args)
all_participants, cl_genesis_timestamp = eth_network_module.run(plan, args_with_defaults_dict)

all_el_client_contexts = []
all_cl_client_contexts = []
for participant in all_participants:
all_el_client_contexts.append(participant.el_client_context)
all_cl_client_contexts.append(participant.cl_client_context)

# spin up mev boost contexts


mev_endpoints = []
# passed external relays get priority
# perhaps add mev_type External or remove this
if hasattr(participant, "builder_network_params") and participant.builder_network_params != None:
mev_endpoints = participant.builder_network_params.relay_end_points
# otherwise dummy relays spinup if chosen
elif args_with_right_defaults.mev_type and args_with_right_defaults.mev_type == MOCK_MEV_TYPE:
el_uri = "{0}:{1}".format(all_el_client_contexts[0].ip_addr, all_el_client_contexts[0].engine_rpc_port_num)
beacon_uri = "{0}:{1}".format(all_cl_client_contexts[0].ip_addr, all_cl_client_contexts[0].http_port_num)
jwt_secret = all_el_client_contexts[0].jwt_secret
endpoint = mock_mev_launcher_module.launch_mock_mev(plan, el_uri, beacon_uri, jwt_secret)
mev_endpoints.append(endpoint)

# spin up the mev boost contexts if some endpoints for relays have been passed
all_mevboost_contexts = []
for index, participant in enumerate(args_with_right_defaults.participants):
mev_boost_context = None
if hasattr(participant, "builder_network_params") and participant.builder_network_params != None:
mev_boost_launcher = mev_boost_launcher_module.new_mev_boost_launcher(MEV_BOOST_SHOULD_CHECK_RELAY, participant.builder_network_params.relay_endpoints)
mev_boost_service_name = "{0}{1}".format(MEV_BOOST_SERVICE_NAME_PREFIX, index)
mev_boost_context = mev_boost_launcher_module.launch_mevboost(plan, mev_boost_launcher, mev_boost_service_name, network_params.network_id)
if mev_endpoints:
for index, participant in enumerate(args_with_right_defaults.participants):
mev_boost_launcher = mev_boost_launcher_module.new_mev_boost_launcher(MEV_BOOST_SHOULD_CHECK_RELAY, mev_endpoints)
mev_boost_service_name = "{0}{1}".format(parse_input.MEV_BOOST_SERVICE_NAME_PREFIX, index)
mev_boost_context = mev_boost_launcher_module.launch(plan, mev_boost_launcher, mev_boost_service_name, network_params.network_id)
all_mevboost_contexts.append(mev_boost_context)

if not args_with_right_defaults.launch_additional_services:
Expand Down Expand Up @@ -108,6 +122,5 @@ def run(plan, args):
password = GRAFANA_PASSWORD
)
output = struct(grafana_info = grafana_info)
return output


return output
25 changes: 13 additions & 12 deletions src/mev_boost/mev_boost_launcher.star
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
mev_boost_context = ("github.com/kurtosis-tech/eth2-package/src/mev_boost/mev_boost_context.star")
mev_boost_context_module = import_module("github.com/kurtosis-tech/eth2-package/src/mev_boost/mev_boost_context.star")
parse_input = import_module("github.com/kurtosis-tech/eth2-package/src/package_io/parse_input.star")

FLASHBOTS_MEV_BOOST_IMAGE = "flashbots/mev-boost"
FLASHBOTS_MEV_BOOST_PORT = 18550
FLASHBOTS_MEV_BOOST_PROTOCOL = "TCP"

USED_PORTS = {
"api": shared_utils.new_port_spec(FLASHBOTS_MEV_BOOST_PORT, FLASHBOTS_MEV_BOOST_PROTOCOL)
"api": shared_utils.new_port_spec(parse_input.FLASHBOTS_MEV_BOOST_PORT, FLASHBOTS_MEV_BOOST_PROTOCOL, wait="5s")
}

NETWORK_ID_TO_NAME = {
Expand All @@ -20,26 +20,27 @@ def launch(plan, mev_boost_launcher, service_name, network_id):

mev_boost_service = plan.add_service(service_name, config)

return mev_boost_context.new_mev_boost_context(mev_boost_service.ip_address, FLASHBOTS_MEV_BOOST_PORT)
return mev_boost_context_module.new_mev_boost_context(mev_boost_service.ip_address, parse_input.FLASHBOTS_MEV_BOOST_PORT)


def get_config(mev_boost_launcher, network_id):
network_name = NETWORK_ID_TO_NAME.get(network_id, "network-{0}".format(network_id))

command = ["mev-boost"]
command.append("-{0}".format(network_name))

if mev_boost_launcher.should_check_relay:
command.append("-relay-check")

if len(mev_boost_launcher.relay_end_points) != 0:
command.append("-relays")
command.append(",".join(mev_boost_launcher.relay_end_points))

return ServiceConfig(
image = FLASHBOTS_MEV_BOOST_IMAGE,
ports = USED_PORTS,
cmd = command
cmd = command,
env_vars = {
# TODO remove the hardcoding
# This is set to match this file https://github.com/kurtosis-tech/eth-network-package/blob/main/static_files/genesis-generation-config/cl/config.yaml.tmpl#L11
"GENESIS_FORK_VERSION": "0x10000038",
"BOOST_LISTEN_ADDR": "0.0.0.0:{0}".format(parse_input.FLASHBOTS_MEV_BOOST_PORT),
"SKIP_RELAY_SIGNATURE_CHECK": "true",
"RELAYS": mev_boost_launcher.relay_end_points[0]
}
)


Expand Down
21 changes: 21 additions & 0 deletions src/mock_mev/mock_mev_launcher.star
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MOCK_MEV_IMAGE = "ethpandaops/mock-builder:latest"
MOCK_MEV_SERVICE_NAME = "mock-mev"
MOCK_MEV_BUILDER_PORT = 18550
DUMMY_PUB_KEY_THAT_ISNT_VERIFIED = "0xae1c2ca7bbd6f415a5aa5bb4079caf0a5c273104be5fb5e40e2b5a2f080b2f5bd945336f2a9e8ba346299cb65b0f84c8"

def launch_mock_mev(plan, el_uri, beacon_uri, jwt_secret):
mock_builder = plan.add_service(
name = MOCK_MEV_SERVICE_NAME,
config = ServiceConfig(
image = MOCK_MEV_IMAGE,
ports = {
"rest": PortSpec(number = MOCK_MEV_BUILDER_PORT, transport_protocol="TCP"),
},
cmd = [
"--jwt-secret={0}".format(jwt_secret),
"--el={0}".format(el_uri),
"--cl={0}".format(beacon_uri)
]
)
)
return "http://{0}@{1}:{2}".format(DUMMY_PUB_KEY_THAT_ISNT_VERIFIED, mock_builder.ip_address, MOCK_MEV_BUILDER_PORT)
47 changes: 39 additions & 8 deletions src/package_io/parse_input.star
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
DEFAULT_EL_IMAGES = {
"geth": "ethereum/client-go:latest",
"geth": "ethereum/client-go:v1.11.5",
"erigon": "thorax/erigon:devel",
"nethermind": "nethermind/nethermind:latest",
"nethermind": "nethermind/nethermind:1.14.0",
"besu": "hyperledger/besu:develop"
}

DEFAULT_CL_IMAGES = {
"lighthouse": "sigp/lighthouse:latest",
"teku": "consensys/teku:latest",
"lighthouse": "sigp/lighthouse:v3.5.0",
"teku": "consensys/teku:23.1",
"nimbus": "statusim/nimbus-eth2:multiarch-latest",
"prysm": "gcr.io/prysmaticlabs/prysm/beacon-chain:latest,gcr.io/prysmaticlabs/prysm/validator:latest",
"lodestar": "chainsafe/lodestar:next",
"prysm": "prysmaticlabs/prysm/beacon-chain:latest,prysmaticlabs/prysm/validator:latest",
"lodestar": "chainsafe/lodestar:v1.7.2",
}

BESU_NODE_NAME = "besu"
NETHERMIND_NODE_NAME = "nethermind"

ATTR_TO_BE_SKIPPED_AT_ROOT = ("network_params", "participants")

# MEV Params
FLASHBOTS_MEV_BOOST_PORT = 18550
MEV_BOOST_SERVICE_NAME_PREFIX = "mev-boost-"


def parse_input(input_args):
result = default_input_args()
for attr in input_args:
Expand Down Expand Up @@ -100,6 +105,9 @@ def parse_input(input_args):
if len(result["participants"]) >= 2 and result["participants"][1]["el_client_type"] == NETHERMIND_NODE_NAME:
fail("nethermind can't be the first or second node")

if result.get("mev_type") in ("mock", "full"):
result = enrich_mev_extra_params(result, MEV_BOOST_SERVICE_NAME_PREFIX, FLASHBOTS_MEV_BOOST_PORT)

return struct(
participants=[struct(
el_client_type=participant["el_client_type"],
Expand Down Expand Up @@ -128,8 +136,9 @@ def parse_input(input_args):
wait_for_finalization=result["wait_for_finalization"],
wait_for_verifications=result["wait_for_verifications"],
verifications_epoch_limit=result["verifications_epoch_limit"],
global_client_log_level=result["global_client_log_level"]
)
global_client_log_level=result["global_client_log_level"],
mev_type=result["mev_type"],
), result

def get_client_log_level_or_default(participant_log_level, global_log_level, client_log_levels):
log_level = participant_log_level
Expand All @@ -143,6 +152,7 @@ def default_input_args():
network_params = default_network_params()
participants = [default_participant()]
return {
"mev_type": None,
"participants": participants,
"network_params": network_params,
"launch_additional_services" : True,
Expand Down Expand Up @@ -179,3 +189,24 @@ def default_participant():
"validator_extra_params": [],
"builder_network_params": None
}


# TODO perhaps clean this up into a map
def enrich_mev_extra_params(parsed_arguments_dict, mev_prefix, mev_port):
for index, participant in enumerate(parsed_arguments_dict["participants"]):
mev_url = "http://{0}{1}:{2}".format(mev_prefix, index, mev_port)
if participant["cl_client_type"] == "lighthouse":
participant["validator_extra_params"].append("--builder-proposals")
participant["beacon_extra_params"].append("--builder={0}".format(mev_url))
if participant["cl_client_type"] == "lodestar":
participant["validator_extra_params"].append("--builder")
participant["beacon_extra_params"].append("--builder", "--builder.urls={0}".format(mev_url))
if participant["cl_client_type"] == "nimbus":
participant["validator_extra_params"].append("--payload-builder=true")
participant["beacon_extra_params"].append("--payload-builder=true", "--payload-builder-urs={0}".format(mev_url))
if participant["cl_client_type"] == "teku":
participant["beacon_extra_params"].append("--validators-builder-registration-default-enabled=true", "--builder-endpoint=".format(mev_url))
if participant["cl_client_type"] == "prysm":
participant["validator_extra_params"].append("--enable-builder")
participant["beacon_extra_params"].append("--http-mev-relay={0}".format(mev_url))
return parsed_arguments_dict

0 comments on commit 7fcd3e2

Please sign in to comment.