Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
ethereum-package
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
vicotor
ethereum-package
Commits
7fcd3e24
Unverified
Commit
7fcd3e24
authored
Jun 27, 2023
by
Gyanendra Mishra
Committed by
GitHub
Jun 27, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: launch the mock mev builder (#94)
parent
07ed5008
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
106 additions
and
34 deletions
+106
-34
README.md
README.md
+7
-1
main.star
main.star
+26
-13
mev_boost_launcher.star
src/mev_boost/mev_boost_launcher.star
+13
-12
mock_mev_launcher.star
src/mock_mev/mock_mev_launcher.star
+21
-0
parse_input.star
src/package_io/parse_input.star
+39
-8
No files found.
README.md
View file @
7fcd3e24
...
@@ -174,7 +174,13 @@ To configure the package behaviour, you can modify your `eth2-package-params.yam
...
@@ -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
//
The
global
log
level
that
all
clients
should
log
at
//
Valid
values
are
"error"
,
"warn"
,
"info"
,
"debug"
,
and
"trace"
//
Valid
values
are
"error"
,
"warn"
,
"info"
,
"debug"
,
and
"trace"
//
This
value
will
be
overridden
by
participant-specific
values
//
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>
</details>
...
...
main.star
View file @
7fcd3e24
...
@@ -10,6 +10,7 @@ prometheus = import_module("github.com/kurtosis-tech/eth2-package/src/prometheus
...
@@ -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")
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")
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")
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_USER = "admin"
GRAFANA_PASSWORD = "admin"
GRAFANA_PASSWORD = "admin"
...
@@ -18,11 +19,11 @@ GRAFANA_DASHBOARD_PATH_URL = "/d/QdTOwy-nz/eth2-merge-kurtosis-module-dashboard?
...
@@ -18,11 +19,11 @@ GRAFANA_DASHBOARD_PATH_URL = "/d/QdTOwy-nz/eth2-merge-kurtosis-module-dashboard?
FIRST_NODE_FINALIZATION_FACT = "cl-boot-finalization-fact"
FIRST_NODE_FINALIZATION_FACT = "cl-boot-finalization-fact"
HTTP_PORT_ID_FOR_FACT = "http"
HTTP_PORT_ID_FOR_FACT = "http"
MEV_BOOST_SERVICE_NAME_PREFIX = "mev-boost-"
MEV_BOOST_SHOULD_CHECK_RELAY = True
MEV_BOOST_SHOULD_CHECK_RELAY = True
MOCK_MEV_TYPE = "mock"
def run(plan, args):
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)
num_participants = len(args_with_right_defaults.participants)
network_params = args_with_right_defaults.network_params
network_params = args_with_right_defaults.network_params
...
@@ -34,22 +35,35 @@ def run(plan, args):
...
@@ -34,22 +35,35 @@ def run(plan, args):
plan.print("Read the prometheus, grafana templates")
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))
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_el_client_contexts = []
all_cl_client_contexts = []
all_cl_client_contexts = []
for participant in all_participants:
for participant in all_participants:
all_el_client_contexts.append(participant.el_client_context)
all_el_client_contexts.append(participant.el_client_context)
all_cl_client_contexts.append(participant.cl_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 = []
all_mevboost_contexts = []
for index, participant in enumerate(args_with_right_defaults.participants):
if mev_endpoints:
mev_boost_context = None
for index, participant in enumerate(args_with_right_defaults.participants):
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, mev_endpoints)
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(parse_input.MEV_BOOST_SERVICE_NAME_PREFIX, index)
mev_boost_service_name = "{0}{1}".format(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)
mev_boost_context = mev_boost_launcher_module.launch_mevboost(plan, mev_boost_launcher, mev_boost_service_name, network_params.network_id)
all_mevboost_contexts.append(mev_boost_context)
all_mevboost_contexts.append(mev_boost_context)
if not args_with_right_defaults.launch_additional_services:
if not args_with_right_defaults.launch_additional_services:
...
@@ -108,6 +122,5 @@ def run(plan, args):
...
@@ -108,6 +122,5 @@ def run(plan, args):
password = GRAFANA_PASSWORD
password = GRAFANA_PASSWORD
)
)
output = struct(grafana_info = grafana_info)
output = struct(grafana_info = grafana_info)
return output
return output
src/mev_boost/mev_boost_launcher.star
View file @
7fcd3e24
shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star")
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_IMAGE = "flashbots/mev-boost"
FLASHBOTS_MEV_BOOST_PORT = 18550
FLASHBOTS_MEV_BOOST_PROTOCOL = "TCP"
FLASHBOTS_MEV_BOOST_PROTOCOL = "TCP"
USED_PORTS = {
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 = {
NETWORK_ID_TO_NAME = {
...
@@ -20,26 +20,27 @@ def launch(plan, mev_boost_launcher, service_name, network_id):
...
@@ -20,26 +20,27 @@ def launch(plan, mev_boost_launcher, service_name, network_id):
mev_boost_service = plan.add_service(service_name, config)
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):
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 = ["mev-boost"]
command.append("-{0}".format(network_name))
if mev_boost_launcher.should_check_relay:
if mev_boost_launcher.should_check_relay:
command.append("-relay-check")
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(
return ServiceConfig(
image = FLASHBOTS_MEV_BOOST_IMAGE,
image = FLASHBOTS_MEV_BOOST_IMAGE,
ports = USED_PORTS,
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]
}
)
)
...
...
src/mock_mev/mock_mev_launcher.star
0 → 100644
View file @
7fcd3e24
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)
src/package_io/parse_input.star
View file @
7fcd3e24
DEFAULT_EL_IMAGES = {
DEFAULT_EL_IMAGES = {
"geth": "ethereum/client-go:
latest
",
"geth": "ethereum/client-go:
v1.11.5
",
"erigon": "thorax/erigon:devel",
"erigon": "thorax/erigon:devel",
"nethermind": "nethermind/nethermind:
latest
",
"nethermind": "nethermind/nethermind:
1.14.0
",
"besu": "hyperledger/besu:develop"
"besu": "hyperledger/besu:develop"
}
}
DEFAULT_CL_IMAGES = {
DEFAULT_CL_IMAGES = {
"lighthouse": "sigp/lighthouse:
latest
",
"lighthouse": "sigp/lighthouse:
v3.5.0
",
"teku": "consensys/teku:
latest
",
"teku": "consensys/teku:
23.1
",
"nimbus": "statusim/nimbus-eth2:multiarch-latest",
"nimbus": "statusim/nimbus-eth2:multiarch-latest",
"prysm": "
gcr.io/prysmaticlabs/prysm/beacon-chain:latest,gcr.io/
prysmaticlabs/prysm/validator:latest",
"prysm": "
prysmaticlabs/prysm/beacon-chain:latest,
prysmaticlabs/prysm/validator:latest",
"lodestar": "chainsafe/lodestar:
next",
"lodestar": "chainsafe/lodestar:
v1.7.2",
}
}
BESU_NODE_NAME = "besu"
BESU_NODE_NAME = "besu"
...
@@ -18,6 +18,11 @@ NETHERMIND_NODE_NAME = "nethermind"
...
@@ -18,6 +18,11 @@ NETHERMIND_NODE_NAME = "nethermind"
ATTR_TO_BE_SKIPPED_AT_ROOT = ("network_params", "participants")
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):
def parse_input(input_args):
result = default_input_args()
result = default_input_args()
for attr in input_args:
for attr in input_args:
...
@@ -100,6 +105,9 @@ def parse_input(input_args):
...
@@ -100,6 +105,9 @@ def parse_input(input_args):
if len(result["participants"]) >= 2 and result["participants"][1]["el_client_type"] == NETHERMIND_NODE_NAME:
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")
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(
return struct(
participants=[struct(
participants=[struct(
el_client_type=participant["el_client_type"],
el_client_type=participant["el_client_type"],
...
@@ -128,8 +136,9 @@ def parse_input(input_args):
...
@@ -128,8 +136,9 @@ def parse_input(input_args):
wait_for_finalization=result["wait_for_finalization"],
wait_for_finalization=result["wait_for_finalization"],
wait_for_verifications=result["wait_for_verifications"],
wait_for_verifications=result["wait_for_verifications"],
verifications_epoch_limit=result["verifications_epoch_limit"],
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):
def get_client_log_level_or_default(participant_log_level, global_log_level, client_log_levels):
log_level = participant_log_level
log_level = participant_log_level
...
@@ -143,6 +152,7 @@ def default_input_args():
...
@@ -143,6 +152,7 @@ def default_input_args():
network_params = default_network_params()
network_params = default_network_params()
participants = [default_participant()]
participants = [default_participant()]
return {
return {
"mev_type": None,
"participants": participants,
"participants": participants,
"network_params": network_params,
"network_params": network_params,
"launch_additional_services" : True,
"launch_additional_services" : True,
...
@@ -179,3 +189,24 @@ def default_participant():
...
@@ -179,3 +189,24 @@ def default_participant():
"validator_extra_params": [],
"validator_extra_params": [],
"builder_network_params": None
"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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment