feat: Charon - #1062
Open
sugh01 wants to merge 37 commits into
Open
Conversation
aly-obol
approved these changes
Jun 16, 2025
Collaborator
|
can you add charon details to the readme too? |
Author
Added @barnabasbusa |
Charon DV monitoring (local scraping of all Charon nodes/VCs) is kept; only the remote_write feature and the personal prometheus-package fork import are removed, so this branch depends solely on the upstream kurtosis-tech/prometheus-package. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the optional Prometheus remote_write feature on top of the cleaned charon branch: prometheus_params gains remote_write_url/token/relabel_configs (generic, inert unless a URL is set) and the prometheus import is pinned to the fork branch that implements remote_write. The Charon example documents the Charon-specific relabel rules. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment on lines
+1
to
+168
| participants: | ||
| # EL | ||
| - el_type: geth | ||
| el_image: ethereum/client-go:latest | ||
| # CL | ||
| cl_type: lighthouse | ||
| cl_image: sigp/lighthouse:latest-unstable | ||
| supernode: false | ||
| use_separate_vc: true | ||
| # Validator | ||
| vc_type: charon | ||
| vc_image: obolnetwork/charon:latest | ||
| charon_node_count: 4 | ||
| charon_params: | ||
| charon_vc: teku | ||
| charon_vc_image: consensys/teku:latest | ||
| validator_count: null | ||
| use_remote_signer: false | ||
| - el_type: geth | ||
| el_image: ethereum/client-go:latest | ||
| # CL | ||
| cl_type: lighthouse | ||
| cl_image: sigp/lighthouse:latest-unstable | ||
| supernode: false | ||
| use_separate_vc: true | ||
| # Validator | ||
| vc_type: lighthouse | ||
| vc_image: sigp/lighthouse:latest-unstable | ||
| use_remote_signer: false | ||
| - el_type: geth | ||
| el_image: ethereum/client-go:latest | ||
| # CL | ||
| cl_type: lighthouse | ||
| cl_image: sigp/lighthouse:latest-unstable | ||
| supernode: false | ||
| use_separate_vc: true | ||
| # Validator | ||
| vc_type: lighthouse | ||
| vc_image: sigp/lighthouse:latest-unstable | ||
| use_remote_signer: false | ||
| network_params: | ||
| network: kurtosis | ||
| network_id: "3151908" | ||
| deposit_contract_address: "0x00000000219ab540356cBB839Cbe05303d7705Fa" | ||
| seconds_per_slot: 12 | ||
| num_validator_keys_per_node: 64 | ||
| preregistered_validator_keys_mnemonic: | ||
| "giant issue aisle success illegal bike spike | ||
| question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy | ||
| very lucky have athlete" | ||
| preregistered_validator_count: 0 | ||
| genesis_delay: 20 | ||
| genesis_gaslimit: 30000000 | ||
| max_per_epoch_activation_churn_limit: 8 | ||
| churn_limit_quotient: 65536 | ||
| ejection_balance: 16000000000 | ||
| eth1_follow_distance: 2048 | ||
| min_validator_withdrawability_delay: 256 | ||
| shard_committee_period: 256 | ||
| deneb_fork_epoch: 0 | ||
| electra_fork_epoch: 0 | ||
| fulu_fork_epoch: 18446744073709551615 | ||
| network_sync_base_url: https://snapshots.ethpandaops.io/ | ||
| force_snapshot_sync: false | ||
| samples_per_slot: 8 | ||
| custody_requirement: 4 | ||
| max_blobs_per_block_electra: 9 | ||
| target_blobs_per_block_electra: 6 | ||
| base_fee_update_fraction_electra: 5007716 | ||
| additional_preloaded_contracts: {} | ||
| devnet_repo: ethpandaops | ||
| prefunded_accounts: {} | ||
| additional_services: [] | ||
| dora_params: | ||
| image: "" | ||
| tx_fuzz_params: | ||
| tx_fuzz_extra_args: [] | ||
| spamoor_params: | ||
| min_cpu: 100 | ||
| max_cpu: 1000 | ||
| min_mem: 20 | ||
| max_mem: 300 | ||
| extra_args: [] | ||
| prometheus_params: | ||
| storage_tsdb_retention_time: "1d" | ||
| storage_tsdb_retention_size: "512MB" | ||
| min_cpu: 10 | ||
| max_cpu: 1000 | ||
| min_mem: 128 | ||
| max_mem: 2048 | ||
| grafana_params: | ||
| additional_dashboards: [] | ||
| min_cpu: 10 | ||
| max_cpu: 1000 | ||
| min_mem: 128 | ||
| max_mem: 2048 | ||
| assertoor_params: | ||
| image: "" | ||
| run_stability_check: false | ||
| run_block_proposal_check: false | ||
| run_transaction_test: false | ||
| run_blob_transaction_test: false | ||
| run_opcodes_transaction_test: false | ||
| run_lifecycle_test: false | ||
| tests: [] | ||
| wait_for_finalization: false | ||
| global_log_level: info | ||
| snooper_enabled: false | ||
| ethereum_metrics_exporter_enabled: false | ||
| parallel_keystore_generation: false | ||
| disable_peer_scoring: false | ||
| persistent: false | ||
| mev_type: null | ||
| mev_params: | ||
| mev_relay_image: ethpandaops/mev-boost-relay:main | ||
| mev_builder_image: ethpandaops/flashbots-builder:main | ||
| mev_builder_cl_image: sigp/lighthouse:latest | ||
| mev_boost_image: ethpandaops/mev-boost:develop | ||
| mev_boost_args: ["mev-boost", "--relay-check"] | ||
| mev_relay_api_extra_args: [] | ||
| mev_relay_housekeeper_extra_args: [] | ||
| mev_relay_website_extra_args: [] | ||
| mev_builder_extra_args: [] | ||
| mev_builder_prometheus_config: | ||
| scrape_interval: 15s | ||
| labels: {} | ||
| custom_flood_params: | ||
| interval_between_transactions: 1 | ||
| xatu_sentry_enabled: false | ||
| xatu_sentry_params: | ||
| xatu_sentry_image: ethpandaops/xatu-sentry | ||
| xatu_server_addr: localhost:8000 | ||
| xatu_server_tls: false | ||
| xatu_server_headers: {} | ||
| beacon_subscriptions: | ||
| - attestation | ||
| - block | ||
| - chain_reorg | ||
| - finalized_checkpoint | ||
| - head | ||
| - voluntary_exit | ||
| - contribution_and_proof | ||
| - blob_sidecar | ||
| apache_port: 40000 | ||
| global_tolerations: [] | ||
| global_node_selectors: {} | ||
| keymanager_enabled: false | ||
| checkpoint_sync_enabled: false | ||
| checkpoint_sync_url: "" | ||
| ethereum_genesis_generator_params: | ||
| image: ethpandaops/ethereum-genesis-generator:4.0.4 | ||
| port_publisher: | ||
| nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER | ||
| el: | ||
| enabled: false | ||
| public_port_start: 32000 | ||
| cl: | ||
| enabled: false | ||
| public_port_start: 33000 | ||
| vc: | ||
| enabled: false | ||
| public_port_start: 34000 | ||
| remote_signer: | ||
| enabled: false | ||
| public_port_start: 35000 | ||
| additional_services: | ||
| enabled: false | ||
| public_port_start: 36000 |
Collaborator
There was a problem hiding this comment.
This seems to be the same as :
Suggested change
| participants: | |
| # EL | |
| - el_type: geth | |
| el_image: ethereum/client-go:latest | |
| # CL | |
| cl_type: lighthouse | |
| cl_image: sigp/lighthouse:latest-unstable | |
| supernode: false | |
| use_separate_vc: true | |
| # Validator | |
| vc_type: charon | |
| vc_image: obolnetwork/charon:latest | |
| charon_node_count: 4 | |
| charon_params: | |
| charon_vc: teku | |
| charon_vc_image: consensys/teku:latest | |
| validator_count: null | |
| use_remote_signer: false | |
| - el_type: geth | |
| el_image: ethereum/client-go:latest | |
| # CL | |
| cl_type: lighthouse | |
| cl_image: sigp/lighthouse:latest-unstable | |
| supernode: false | |
| use_separate_vc: true | |
| # Validator | |
| vc_type: lighthouse | |
| vc_image: sigp/lighthouse:latest-unstable | |
| use_remote_signer: false | |
| - el_type: geth | |
| el_image: ethereum/client-go:latest | |
| # CL | |
| cl_type: lighthouse | |
| cl_image: sigp/lighthouse:latest-unstable | |
| supernode: false | |
| use_separate_vc: true | |
| # Validator | |
| vc_type: lighthouse | |
| vc_image: sigp/lighthouse:latest-unstable | |
| use_remote_signer: false | |
| network_params: | |
| network: kurtosis | |
| network_id: "3151908" | |
| deposit_contract_address: "0x00000000219ab540356cBB839Cbe05303d7705Fa" | |
| seconds_per_slot: 12 | |
| num_validator_keys_per_node: 64 | |
| preregistered_validator_keys_mnemonic: | |
| "giant issue aisle success illegal bike spike | |
| question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy | |
| very lucky have athlete" | |
| preregistered_validator_count: 0 | |
| genesis_delay: 20 | |
| genesis_gaslimit: 30000000 | |
| max_per_epoch_activation_churn_limit: 8 | |
| churn_limit_quotient: 65536 | |
| ejection_balance: 16000000000 | |
| eth1_follow_distance: 2048 | |
| min_validator_withdrawability_delay: 256 | |
| shard_committee_period: 256 | |
| deneb_fork_epoch: 0 | |
| electra_fork_epoch: 0 | |
| fulu_fork_epoch: 18446744073709551615 | |
| network_sync_base_url: https://snapshots.ethpandaops.io/ | |
| force_snapshot_sync: false | |
| samples_per_slot: 8 | |
| custody_requirement: 4 | |
| max_blobs_per_block_electra: 9 | |
| target_blobs_per_block_electra: 6 | |
| base_fee_update_fraction_electra: 5007716 | |
| additional_preloaded_contracts: {} | |
| devnet_repo: ethpandaops | |
| prefunded_accounts: {} | |
| additional_services: [] | |
| dora_params: | |
| image: "" | |
| tx_fuzz_params: | |
| tx_fuzz_extra_args: [] | |
| spamoor_params: | |
| min_cpu: 100 | |
| max_cpu: 1000 | |
| min_mem: 20 | |
| max_mem: 300 | |
| extra_args: [] | |
| prometheus_params: | |
| storage_tsdb_retention_time: "1d" | |
| storage_tsdb_retention_size: "512MB" | |
| min_cpu: 10 | |
| max_cpu: 1000 | |
| min_mem: 128 | |
| max_mem: 2048 | |
| grafana_params: | |
| additional_dashboards: [] | |
| min_cpu: 10 | |
| max_cpu: 1000 | |
| min_mem: 128 | |
| max_mem: 2048 | |
| assertoor_params: | |
| image: "" | |
| run_stability_check: false | |
| run_block_proposal_check: false | |
| run_transaction_test: false | |
| run_blob_transaction_test: false | |
| run_opcodes_transaction_test: false | |
| run_lifecycle_test: false | |
| tests: [] | |
| wait_for_finalization: false | |
| global_log_level: info | |
| snooper_enabled: false | |
| ethereum_metrics_exporter_enabled: false | |
| parallel_keystore_generation: false | |
| disable_peer_scoring: false | |
| persistent: false | |
| mev_type: null | |
| mev_params: | |
| mev_relay_image: ethpandaops/mev-boost-relay:main | |
| mev_builder_image: ethpandaops/flashbots-builder:main | |
| mev_builder_cl_image: sigp/lighthouse:latest | |
| mev_boost_image: ethpandaops/mev-boost:develop | |
| mev_boost_args: ["mev-boost", "--relay-check"] | |
| mev_relay_api_extra_args: [] | |
| mev_relay_housekeeper_extra_args: [] | |
| mev_relay_website_extra_args: [] | |
| mev_builder_extra_args: [] | |
| mev_builder_prometheus_config: | |
| scrape_interval: 15s | |
| labels: {} | |
| custom_flood_params: | |
| interval_between_transactions: 1 | |
| xatu_sentry_enabled: false | |
| xatu_sentry_params: | |
| xatu_sentry_image: ethpandaops/xatu-sentry | |
| xatu_server_addr: localhost:8000 | |
| xatu_server_tls: false | |
| xatu_server_headers: {} | |
| beacon_subscriptions: | |
| - attestation | |
| - block | |
| - chain_reorg | |
| - finalized_checkpoint | |
| - head | |
| - voluntary_exit | |
| - contribution_and_proof | |
| - blob_sidecar | |
| apache_port: 40000 | |
| global_tolerations: [] | |
| global_node_selectors: {} | |
| keymanager_enabled: false | |
| checkpoint_sync_enabled: false | |
| checkpoint_sync_url: "" | |
| ethereum_genesis_generator_params: | |
| image: ethpandaops/ethereum-genesis-generator:4.0.4 | |
| port_publisher: | |
| nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER | |
| el: | |
| enabled: false | |
| public_port_start: 32000 | |
| cl: | |
| enabled: false | |
| public_port_start: 33000 | |
| vc: | |
| enabled: false | |
| public_port_start: 34000 | |
| remote_signer: | |
| enabled: false | |
| public_port_start: 35000 | |
| additional_services: | |
| enabled: false | |
| public_port_start: 36000 | |
| participants: | |
| - el_type: geth | |
| cl_type: lighthouse | |
| vc_type: charon | |
| vc_image: obolnetwork/charon:latest | |
| charon_node_count: 4 | |
| charon_params: | |
| charon_vc: teku | |
| charon_vc_image: consensys/teku:latest | |
| validator_count: null | |
| use_remote_signer: false | |
| - el_type: geth | |
| cl_type: lighthouse | |
| count: 2 |
feat: add remote write via KaloyanTanev/prometheus-package fork
Charon writes split-key password files as 0400/root. Non-root VC images (teku, lodestar) could not read the password files nor create teku .lock files. chmod the converter output so they are accessible. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A Charon distributed validator shares the same validator pubkeys across all cluster nodes (threshold signing). Nimbus VC enables doppelganger detection by default: at startup it watches ~2 epochs for its validators attesting elsewhere as an anti-slashing check. Because the cluster as a whole attests those pubkeys, each Nimbus VC sees its own validators live on the network and self-terminates at the epoch-1 boundary (FATAL, exit 127) -- taking down every VC in the DV and leaving Charon reporting 'VC not connected'. Add --doppelganger-detection=false in the distributed branch only; standalone Nimbus VCs keep it enabled.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR implements Charon distributed validator support in the Kurtosis Ethereum package.
Validators supported
Configuration
Core Component
charon_launcher.star