Skip to content

Commit

Permalink
feat: add magi
Browse files Browse the repository at this point in the history
  • Loading branch information
barnabasbusa committed Jun 20, 2024
1 parent c69bf34 commit 989f880
Show file tree
Hide file tree
Showing 12 changed files with 241 additions and 14 deletions.
3 changes: 1 addition & 2 deletions .github/tests/blockscout.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,4 @@ ethereum_package:
- el_type: reth
network_params:
preset: minimal
additional_services:
- blockscout
additional_services: []
15 changes: 15 additions & 0 deletions .github/tests/magi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
optimism_package:
participants:
- el_type: op-geth
cl_type: magi
- el_type: op-reth
cl_type: magi
- el_type: op-erigon
cl_type: magi
ethereum_package:
participants:
- el_type: geth
- el_type: reth
network_params:
preset: minimal
additional_services: []
3 changes: 1 addition & 2 deletions .github/tests/multiple_l2s.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,4 @@ ethereum_package:
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
5 changes: 3 additions & 2 deletions .github/tests/op-erigon.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ optimism_package:
participants:
- el_type: op-erigon
cl_type: op-node
- el_type: op-erigon
cl_type: magi
ethereum_package:
participants:
- el_type: geth
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
5 changes: 3 additions & 2 deletions .github/tests/op-geth.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ optimism_package:
participants:
- el_type: op-geth
cl_type: op-node
- el_type: op-geth
cl_type: magi
ethereum_package:
participants:
- el_type: geth
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
3 changes: 1 addition & 2 deletions .github/tests/op-node.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ ethereum_package:
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
5 changes: 3 additions & 2 deletions .github/tests/op-reth.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ optimism_package:
participants:
- el_type: op-reth
cl_type: op-node
- el_type: op-reth
cl_type: magi
ethereum_package:
participants:
- el_type: geth
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
3 changes: 1 addition & 2 deletions .github/tests/single_l2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ ethereum_package:
- el_type: reth
network_params:
preset: minimal
additional_services:
- dora
additional_services: []
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,13 @@ optimism_package:
# The type of CL client that should be started
# Valid values are:
# op-node
# magi
cl_type: op-node

# The Docker image that should be used for the CL client; leave blank to use the default for the client type
# Defaults by client:
# - op-node: parithoshj/op-node:v1
# - magi: a16zcrypto/magi:latest
cl_image: ""

# Count of nodes to spin up for this participant
Expand Down
205 changes: 205 additions & 0 deletions src/cl/magi/magi_launcher.star
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
shared_utils = import_module(
"github.com/ethpandaops/ethereum-package/src/shared_utils/shared_utils.star"
)

cl_context = import_module(
"github.com/ethpandaops/ethereum-package/src/cl/cl_context.star"
)

cl_node_ready_conditions = import_module(
"github.com/ethpandaops/ethereum-package/src/cl/cl_node_ready_conditions.star"
)
constants = import_module(
"github.com/ethpandaops/ethereum-package/src/package_io/constants.star"
)

# ---------------------------------- Beacon client -------------------------------------

# The Docker container runs as the "magi" user so we can't write to root
BEACON_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/magi/magi-beacon-data"
ROLLUP_CONFIG_MOUNT_PATH_ON_CONTAINER = "/network-configs/rollup.json"
# Port IDs
BEACON_TCP_DISCOVERY_PORT_ID = "tcp-discovery"
BEACON_UDP_DISCOVERY_PORT_ID = "udp-discovery"
BEACON_HTTP_PORT_ID = "http"

# Port nums
BEACON_DISCOVERY_PORT_NUM = 9003
BEACON_HTTP_PORT_NUM = 8547


def get_used_ports(discovery_port):
used_ports = {
BEACON_TCP_DISCOVERY_PORT_ID: shared_utils.new_port_spec(
discovery_port, shared_utils.TCP_PROTOCOL, wait=None
),
BEACON_UDP_DISCOVERY_PORT_ID: shared_utils.new_port_spec(
discovery_port, shared_utils.UDP_PROTOCOL, wait=None
),
BEACON_HTTP_PORT_ID: shared_utils.new_port_spec(
BEACON_HTTP_PORT_NUM,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
),
}
return used_ports


ENTRYPOINT_ARGS = ["sh", "-c"]

VERBOSITY_LEVELS = {
constants.GLOBAL_LOG_LEVEL.error: "ERROR",
constants.GLOBAL_LOG_LEVEL.warn: "WARN",
constants.GLOBAL_LOG_LEVEL.info: "INFO",
constants.GLOBAL_LOG_LEVEL.debug: "DEBUG",
constants.GLOBAL_LOG_LEVEL.trace: "TRACE",
}


def launch(
plan,
launcher,
service_name,
image,
el_context,
existing_cl_clients,
l1_config_env_vars,
gs_sequencer_private_key,
sequencer_enabled,
):
network_name = shared_utils.get_network_name(launcher.network)

beacon_node_identity_recipe = PostHttpRequestRecipe(
endpoint="/",
content_type="application/json",
body='{"jsonrpc":"2.0","method":"opp2p_self","params":[],"id":1}',
port_id=BEACON_HTTP_PORT_ID,
extract={
"enr": ".result.ENR",
"multiaddr": ".result.addresses[0]",
"peer_id": ".result.peerID",
},
)

config = get_beacon_config(
plan,
launcher.el_cl_genesis_data,
launcher.jwt_file,
image,
service_name,
el_context,
existing_cl_clients,
l1_config_env_vars,
gs_sequencer_private_key,
beacon_node_identity_recipe,
sequencer_enabled,
)

beacon_service = plan.add_service(service_name, config)

beacon_http_port = beacon_service.ports[BEACON_HTTP_PORT_ID]
beacon_http_url = "http://{0}:{1}".format(
beacon_service.ip_address, beacon_http_port.number
)

response = plan.request(
recipe=beacon_node_identity_recipe, service_name=service_name
)

beacon_node_enr = response["extract.enr"]
beacon_multiaddr = response["extract.multiaddr"]
beacon_peer_id = response["extract.peer_id"]

return cl_context.new_cl_context(
"magi",
beacon_node_enr,
beacon_service.ip_address,
beacon_http_port.number,
beacon_http_url,
None,
service_name,
multiaddr=beacon_multiaddr,
peer_id=beacon_peer_id,
)


def get_beacon_config(
plan,
el_cl_genesis_data,
jwt_file,
image,
service_name,
el_context,
existing_cl_clients,
l1_config_env_vars,
gs_sequencer_private_key,
beacon_node_identity_recipe,
sequencer_enabled,
):
EXECUTION_ENGINE_ENDPOINT = "http://{0}:{1}".format(
el_context.ip_addr,
el_context.engine_rpc_port_num,
)
EXECUTION_RPC_ENDPOINT = "http://{0}:{1}".format(
el_context.ip_addr,
el_context.rpc_port_num,
)

used_ports = get_used_ports(BEACON_DISCOVERY_PORT_NUM)

cmd = [
"magi",
"--devnet",
"--jwt-file=" + constants.JWT_MOUNT_PATH_ON_CONTAINER,
"--l1-beacon-url={0}".format(l1_config_env_vars["CL_RPC_URL"]),
"--l1-rpc-url={0}".format(l1_config_env_vars["L1_RPC_URL"]),
"--l2-engine-url={0}".format(EXECUTION_ENGINE_ENDPOINT),
"--l2-rpc-url={0}".format(EXECUTION_RPC_ENDPOINT),
"--rpc-addr=0.0.0.0",
"--rpc-port={0}".format(BEACON_HTTP_PORT_NUM),
"--sync-mode=full",
"--network=optimism",
]

# if sequencer_enabled:
# cmd.append("--p2p.sequencer.key=" + gs_sequencer_private_key)
# cmd.append("--sequencer.enabled")
# cmd.append("--sequencer.l1-confs=5")

if len(existing_cl_clients) > 0:
# cmd.append(
# "--p2p.bootnodes="
# + ",".join(
# [ctx.enr for ctx in existing_cl_clients[: constants.MAX_ENR_ENTRIES]]
# )
# )

files = {
constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_genesis_data,
constants.JWT_MOUNTPOINT_ON_CLIENTS: jwt_file,
}
ports = {}
ports.update(used_ports)

return ServiceConfig(
image=image,
ports=ports,
cmd=cmd,
files=files,
private_ip_address_placeholder=constants.PRIVATE_IP_ADDRESS_PLACEHOLDER,
ready_conditions=ReadyCondition(
recipe=beacon_node_identity_recipe,
field="code",
assertion="==",
target_value=200,
timeout="1m",
),
)


def new_magi_launcher(el_cl_genesis_data, jwt_file, network_params):
return struct(
el_cl_genesis_data=el_cl_genesis_data,
jwt_file=jwt_file,
network=network_params.network,
)
5 changes: 5 additions & 0 deletions src/el_cl_launcher.star
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ op_reth = import_module("./el/op-reth/op_reth_launcher.star")
op_erigon = import_module("./el/op-erigon/op_erigon_launcher.star")
# CL
op_node = import_module("./cl/op-node/op_node_launcher.star")
magi = import_module("./cl/magi/magi_launcher.star")


def launch(
Expand Down Expand Up @@ -60,6 +61,10 @@ def launch(
),
"launch_method": op_node.launch,
},
"magi": {
"launcher": magi.new_magi_launcher(el_cl_data, jwt_file, network_params),
"launch_method": magi.launch,
},
}

all_cl_contexts = []
Expand Down
1 change: 1 addition & 0 deletions src/package_io/input_parser.star
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ DEFAULT_EL_IMAGES = {

DEFAULT_CL_IMAGES = {
"op-node": "parithoshj/op-node:v1",
"magi": "a16zcrypto/magi:latest",
}

DEFAULT_BATCHER_IMAGES = {
Expand Down

0 comments on commit 989f880

Please sign in to comment.