From 308d4d4130b56f234619efe4fcabccee3fc219ad Mon Sep 17 00:00:00 2001 From: qu0b Date: Mon, 16 Feb 2026 04:45:29 +0000 Subject: [PATCH] Add ethrex (lambdaclass) EL client to bal-devnet-2 infrastructure Adds terraform node definitions and ansible configuration for ethrex, a Rust-based execution layer client. All nodes start with count=0 (disabled) until the ethpandaops/ansible-collection-general ethrex role is merged upstream. Co-Authored-By: Claude Opus 4.6 --- .../devnet-2/group_vars/all/images.yaml | 1 + .../devnet-2/group_vars/ethrex.yaml | 82 +++++++++++++++++++ terraform/devnet-2/ansible_inventory.tmpl | 2 +- terraform/devnet-2/hetzner/main.tf | 4 + terraform/devnet-2/hetzner/nodes.tf | 36 ++++++++ 5 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 ansible/inventories/devnet-2/group_vars/ethrex.yaml diff --git a/ansible/inventories/devnet-2/group_vars/all/images.yaml b/ansible/inventories/devnet-2/group_vars/all/images.yaml index c1b888b..acce09f 100644 --- a/ansible/inventories/devnet-2/group_vars/all/images.yaml +++ b/ansible/inventories/devnet-2/group_vars/all/images.yaml @@ -14,6 +14,7 @@ default_ethereum_client_images: nethermind: ethpandaops/nethermind:bal-devnet-2 reth: ethpandaops/reth:bal-devnet-2 nimbusel: ethpandaops/nimbus-eth1:bal-devnet-2 + ethrex: ethpandaops/ethrex:bal-devnet-2 default_tooling_images: mev_boost: ethpandaops/mev-boost:develop diff --git a/ansible/inventories/devnet-2/group_vars/ethrex.yaml b/ansible/inventories/devnet-2/group_vars/ethrex.yaml new file mode 100644 index 0000000..eeb166f --- /dev/null +++ b/ansible/inventories/devnet-2/group_vars/ethrex.yaml @@ -0,0 +1,82 @@ +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_github_team_el: + - fmoletta + - JereSalo + - ilitteri + +# role: ethpandaops.general.ethereum_node +ethereum_node_el: ethrex +# role: ethpandaops.general.ethrex +ethrex_container_name: execution +ethrex_container_image: "{{ default_ethereum_client_images.ethrex }}" +ethrex_container_env: + VIRTUAL_HOST: "{{ ethereum_node_rcp_hostname }}" + VIRTUAL_PORT: "{{ ethereum_node_el_ports_http_rpc | string }}" + LETSENCRYPT_HOST: "{{ ethereum_node_rcp_hostname }}" + RUST_LOG: "info" +ethrex_container_volumes: + - "{{ ethrex_datadir }}:/data" + - "{{ ethrex_auth_jwt_path }}:/execution-auth.jwt:ro" + - "{{ eth_testnet_config_dir }}:/network-config:ro" +ethrex_container_command_extra_args: + - --chain=/network-config/genesis.json + - --http.api=eth,net,web3,debug,admin,txpool + - --bootnodes={{ ethereum_el_bootnodes | join(',') }} + - --builder.gaslimit=80000000 + +prometheus_config: | + global: + scrape_interval: 30s + evaluation_interval: 30s + scrape_timeout: 10s + external_labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + ip_address: "{{ ansible_host }}" + network: "{{ ethereum_network_name }}" + testnet: "{{ ethereum_network_name }}" + execution_client: "{{ ethereum_node_el }}" + consensus_client: "{{ ethereum_node_cl }}" + supernode: "{{ ethereum_node_cl_supernode_enabled | bool | default(false) }}" + remote_write: + - queue_config: + batch_send_deadline: 5s + max_backoff: 500ms + max_samples_per_send: 500 + min_backoff: 50ms + max_shards: 100 + url: {{ prometheus_remote_push_url }} + remote_timeout: 10s + basic_auth: + username: {{ prometheus_remote_write_username }} + password: {{ prometheus_remote_write_password }} + scrape_configs: + - job_name: "prometheus" + metrics_path: "/metrics" + static_configs: + - targets: ["localhost:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "node" + metrics_path: "/metrics" + static_configs: + - targets: ["172.17.0.1:9100"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "exporter" + metrics_path: "/metrics" + static_configs: + - targets: ["ethereum-metrics-exporter:9090"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "consensus_node" + metrics_path: "/metrics" + static_configs: + - targets: ["{{ vars[ethereum_node_cl + '_container_name'] }}:{{ ethereum_node_cl_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" + - job_name: "execution" + metrics_path: "/metrics" + static_configs: + - targets: ["execution:{{ ethereum_node_el_ports_metrics }}"] + labels: + instance: "{{ ethereum_network_name }}-{{ inventory_hostname }}" diff --git a/terraform/devnet-2/ansible_inventory.tmpl b/terraform/devnet-2/ansible_inventory.tmpl index fd56ef9..1dcd134 100644 --- a/terraform/devnet-2/ansible_inventory.tmpl +++ b/terraform/devnet-2/ansible_inventory.tmpl @@ -33,7 +33,7 @@ ${replace(gid, "-", "_")} # Execution client groups -%{ for el in ["besu", "ethereumjs", "geth", "nethermind", "erigon", "reth", "nimbusel"] ~} +%{ for el in ["besu", "ethereumjs", "geth", "nethermind", "erigon", "reth", "nimbusel", "ethrex"] ~} [${el}:children] %{ for gid, group in groups ~} %{ if split("-", gid)[0] != "bootnode" && split("-", gid)[0] != "mev" ~} diff --git a/terraform/devnet-2/hetzner/main.tf b/terraform/devnet-2/hetzner/main.tf index 4aae915..50b0cc4 100644 --- a/terraform/devnet-2/hetzner/main.tf +++ b/terraform/devnet-2/hetzner/main.tf @@ -74,6 +74,7 @@ locals { var.lighthouse_besu_full, var.lighthouse_reth_full, var.lighthouse_nimbusel_full, + var.lighthouse_ethrex_full, var.prysm_geth_full, var.prysm_nethermind_full, var.prysm_erigon_full, @@ -86,6 +87,7 @@ locals { var.lodestar_besu_full, var.lodestar_reth_full, var.lodestar_nimbusel_full, + var.lodestar_ethrex_full, var.nimbus_geth_full, var.nimbus_nethermind_full, var.nimbus_erigon_full, @@ -111,6 +113,7 @@ locals { var.lighthouse_besu_super, var.lighthouse_reth_super, var.lighthouse_nimbusel_super, + var.lighthouse_ethrex_super, var.prysm_geth_super, var.prysm_nethermind_super, var.prysm_erigon_super, @@ -123,6 +126,7 @@ locals { var.lodestar_besu_super, var.lodestar_reth_super, var.lodestar_nimbusel_super, + var.lodestar_ethrex_super, var.nimbus_geth_super, var.nimbus_nethermind_super, var.nimbus_erigon_super, diff --git a/terraform/devnet-2/hetzner/nodes.tf b/terraform/devnet-2/hetzner/nodes.tf index 23204f5..d61a12c 100644 --- a/terraform/devnet-2/hetzner/nodes.tf +++ b/terraform/devnet-2/hetzner/nodes.tf @@ -75,6 +75,15 @@ variable "lighthouse_nimbusel_super" { } } +variable "lighthouse_ethrex_super" { + default = { + name = "lighthouse-ethrex-super" + count = 1 + validator_start = 2000 + validator_end = 2200 + } +} + # Prysm variable "prysm_geth_super" { default = { @@ -185,6 +194,15 @@ variable "lodestar_nimbusel_super" { } } +variable "lodestar_ethrex_super" { + default = { + name = "lodestar-ethrex-super" + count = 1 + validator_start = 2200 + validator_end = 2400 + } +} + # Nimbus variable "nimbus_geth_super" { default = { @@ -407,6 +425,15 @@ variable "lighthouse_nimbusel_full" { } } +variable "lighthouse_ethrex_full" { + default = { + name = "lighthouse-ethrex-full" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + # Prysm variable "prysm_geth_full" { default = { @@ -517,6 +544,15 @@ variable "lodestar_nimbusel_full" { } } +variable "lodestar_ethrex_full" { + default = { + name = "lodestar-ethrex-full" + count = 0 + validator_start = 0 + validator_end = 0 + } +} + # Nimbus variable "nimbus_geth_full" { default = {