From 2dc0e2b1f90f671adb5e93ba60421114a3fc628a Mon Sep 17 00:00:00 2001 From: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:09:48 +0200 Subject: [PATCH] Prepare for v1 release (#380) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove beta software cautions * Update charon versions, linting, typos, CLI updates * Rename charon to Charon on all necessary places * Capitalise Prometheus and Grafana everywhere needed * Add Gnosis Chain Co-authored-by: Oisín Kyne <4981644+OisinKyne@users.noreply.github.com> * Remove Goerli Co-authored-by: Oisín Kyne <4981644+OisinKyne@users.noreply.github.com> * Revert public dashboard --------- Co-authored-by: Oisín Kyne <4981644+OisinKyne@users.noreply.github.com> --- README.md | 16 +- docs/advanced/adv-docker-configs.md | 8 +- docs/advanced/monitoring.md | 56 +++--- docs/advanced/obol-monitoring.md | 8 +- docs/advanced/quickstart-builder-api.md | 48 ++--- docs/advanced/quickstart-combine.md | 10 +- docs/advanced/quickstart-eigenpod.md | 5 +- docs/advanced/quickstart-sdk.md | 4 +- docs/advanced/quickstart-split.md | 49 ++--- docs/advanced/self-relay.md | 8 +- docs/advanced/test-command.md | 28 +-- docs/cf/bug-report.md | 4 +- docs/cf/docs.md | 5 +- docs/cf/feedback.md | 7 +- docs/charon/charon-cli-reference.md | 65 +++---- docs/charon/cluster-configuration.md | 44 ++--- docs/charon/dkg.md | 20 +- docs/charon/intro.md | 55 +++--- docs/charon/networking.md | 47 ++--- docs/dvl/intro.md | 4 +- docs/faq/dkg_failure.md | 21 ++- docs/faq/errors.mdx | 77 ++++---- docs/faq/general.md | 30 +-- docs/faq/risks.md | 15 +- docs/fr/ethereum_and_dvt.md | 11 +- docs/fr/testnet.md | 8 +- docs/int/Overview.md | 21 +-- docs/int/key-concepts.md | 19 +- docs/sec/bug-bounty.md | 4 +- docs/sec/ev-assessment.md | 73 ++++---- docs/sec/overview.md | 11 +- docs/sec/smart_contract_audit.md | 20 +- docs/sec/threat_model.md | 4 +- docs/start/activate-dv.md | 12 +- docs/start/quickstart-exit.md | 232 ++++++++++++------------ docs/start/quickstart_alone.md | 72 +++++--- docs/start/quickstart_group.md | 85 +++++---- docs/start/quickstart_overview.md | 4 +- docs/start/update.md | 35 ++-- 39 files changed, 655 insertions(+), 590 deletions(-) diff --git a/README.md b/README.md index 6deee42d63..9e6506fc04 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ This website is built using [Docusaurus 2](https://docusaurus.io/), a modern sta ### Installation -``` +```shell $ yarn ``` ### Local Development -``` +```shell $ yarn start ``` @@ -24,7 +24,7 @@ This command starts a local development server and opens up a browser window. Mo ### Build -``` +```shell $ yarn build ``` @@ -46,7 +46,7 @@ Control/Command+F the `/docs/` folder for the current version, and update all re Now you are ready to create the next version by running the following command. -```bash +```shell yarn run version v0.5.0 ``` @@ -113,7 +113,7 @@ module.exports = { Copy the `docs/intro.md` file to the `i18n/fr` folder: -```bash +```shell mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/ cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md @@ -125,7 +125,7 @@ Translate `i18n/fr/docusaurus-plugin-content-docs/current/intro.md` in French. Start your site on the French locale: -```bash +```shell npm run start -- --locale fr ``` @@ -167,13 +167,13 @@ The locale dropdown now appears in your navbar: Build your site for a specific locale: -```bash +```shell npm run build -- --locale fr ``` Or build your site to include all the locales at once: -```bash +```shell npm run build ``` diff --git a/docs/advanced/adv-docker-configs.md b/docs/advanced/adv-docker-configs.md index b19b0adf7b..8747511f9f 100644 --- a/docs/advanced/adv-docker-configs.md +++ b/docs/advanced/adv-docker-configs.md @@ -6,7 +6,7 @@ description: Use advanced docker-compose features to have more flexibility and p # Advanced Docker Configs :::info -This section is intended for *docker power users*, i.e., for those who are familiar with working with `docker-compose` and want to have more flexibility and power to change the default configuration. +This section is intended for *docker power users*, i.e.: for those who are familiar with working with `docker compose` and want to have more flexibility and power to change the default configuration. ::: We use the "Multiple Compose File" feature which provides a very powerful way to override any configuration in `docker-compose.yml` without needing to modify git-checked-in files since that results in conflicts when upgrading this repo. @@ -16,7 +16,7 @@ There are some additional compose files in [this repository](https://github.com/ - `compose-debug.yml` contains some additional containers that developers can use for debugging, like `jaeger`. To achieve this, you can run: -``` +```shell docker compose -f docker-compose.yml -f compose-debug.yml up ``` @@ -24,7 +24,7 @@ docker compose -f docker-compose.yml -f compose-debug.yml up - To use it, just copy the sample file to `docker-compose.override.yml` and customise it to your liking. Please create this file ONLY when you want to tweak something. This is because the default override file is empty and docker errors if you provide an empty compose file. -``` +```shell cp docker-compose.override.yml.sample docker-compose.override.yml # Tweak docker-compose.override.yml and then run docker compose up @@ -33,6 +33,6 @@ docker compose up - You can also run all these compose files together. This is desirable when you want to use both the features. For example, you may want to have some debugging containers AND also want to override some defaults. To achieve this, you can run: -``` +```shell docker compose -f docker-compose.yml -f docker-compose.override.yml -f compose-debug.yml up ``` diff --git a/docs/advanced/monitoring.md b/docs/advanced/monitoring.md index 04574e34ef..dac1726187 100644 --- a/docs/advanced/monitoring.md +++ b/docs/advanced/monitoring.md @@ -4,40 +4,48 @@ description: Add monitoring credentials to help the Obol Team monitor the health --- # Monitoring your Node -This comprehensive guide will assist you in effectively monitoring your Charon clusters and setting up alerts by running your own Prometheus and Grafana server. If you want to use Obol’s [public dashboard](https://grafana.monitoring.gcp.obol.tech/d/d895e47a-3c2d-46b7-9b15-8f31202681af/clusters-aggregate-view?orgId=6) instead of running your servers, refer to [this section](./obol-monitoring.md) in Obol docs that teaches you how to push Prometheus metrics to Obol. +This comprehensive guide will assist you in effectively monitoring your Charon clusters and setting up alerts by running your own Prometheus and Grafana server. If you want to use Obol’s [public dashboard](https://grafana.monitoring.gcp.obol.tech/d/d895e47a-3c2d-46b7-9b15-8f31202681af/clusters-aggregate-view?orgId=6) instead of running your servers, refer to [this section](./obol-monitoring.md) in Obol docs that teaches you how to push Prometheus metrics to Obol. -To explain quickly, Prometheus generates the metrics and Grafana visualizes them. To learn more about prometheus and Grafana, visit [here](https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-prometheus/). If you are using **[CDVN repository](https://github.com/ObolNetwork/charon-distributed-validator-node)** or **[CDVC repository](https://github.com/ObolNetwork/charon-distributed-validator-cluster)**, then Prometheus and Grafana are part of docker compose file and will be installed when you run `docker compose up`. +To explain quickly, Prometheus generates the metrics and Grafana visualizes them. To learn more about Prometheus and Grafana, visit [here](https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-prometheus/). If you are using **[CDVN repository](https://github.com/ObolNetwork/charon-distributed-validator-node)** or **[CDVC repository](https://github.com/ObolNetwork/charon-distributed-validator-cluster)**, then Prometheus and Grafana are part of docker compose file and will be installed when you run `docker compose up`. -The local Grafana server will have a few pre-built dashboards - +The local Grafana server will have a few pre-built dashboards: -1. Charon Overview : This is the main dashboard that provides all the relavant details about the charon node, for example, peer connectivity, duty completion, health of beacon node and downstream validator etc. To open, navigate to `charon-distributed-validator-node` directory and open the following `uri` in the browser `http://localhost:3000/d/d6qujIJVk/` . -2. Single Charon Node Dashboard (deprecated) - This is an older dashboard charon node monitoring which is now deprecated. If you are still using it, we would highly recommend to move to Charon Overview for most up to date panels. -3. Charon Log Dashboard - This dashboard can be used to query the logs emitted while running your charon node . It utilizes [Grafana Loki](https://grafana.com/oss/loki/). This dashboard is not active by default and should only be used in debug mode. Refer to [advanced docker config](./adv-docker-configs) section on how to set up a debug mode. +1. Charon Overview -| Alert Name | Description | Trouble shoot | + This is the main dashboard that provides all the relavant details about the Charon node, for example - peer connectivity, duty completion, health of beacon node and downstream validator, etc. To open, navigate to `charon-distributed-validator-node` directory and open the following `uri` in the browser `http://localhost:3000/d/d6qujIJVk/`. + +2. Single Charon Node Dashboard (deprecated) + + This is an older dashboard Charon node monitoring which is now deprecated. If you are still using it, we would highly recommend to move to Charon Overview for most up to date panels. + +3. Charon Log Dashboard + + This dashboard can be used to query the logs emitted while running your Charon node. It utilises [Grafana Loki](https://grafana.com/oss/loki/). This dashboard is not active by default and should only be used in debug mode. Refer to [advanced docker config](./adv-docker-configs) section on how to set up a debug mode. + +| Alert Name | Description | Troubleshoot | | --- | --- | --- | -| ClusterBeaconNodeDown | This alert is activated when the beacon node in a the cluster is offline. The beacon node is crucial for validating transactions and producing new blocks. Its unavailability could disrupt the overall functionality of the cluster | Most likely data is corrupted. Wipe data from the point you know data was corrupted and restart beacon node so it can be synced again. | -| ClusterMissedAttestations | This alert indicates that there have been missed attestations in the cluster. Missed attestations may suggest that validators are not operating correctly, compromising the security and efficiency of the cluster. | This alert is triggered when 3 attestation are missed in 2 minutes. Check if threshold peers are online. If correct, check beacon node api error and downstream validator errors using Loki. Lastly, debug the docker using docker compose debug. | -| ClusterInUnknownStatus |  This alert is designed to activate when a node within the cluster is detected to be in an unknown state. The condition is evaluated by checking whether the maximum of the app_monitoring_readyz metric is 0. | This is most likely a bug in charon. report to us via https://discord.com/channels/849256203614945310/970759460693901362. | -| ClusterInsufficientPeers | This alert is set to activate when the number of peers for a node in the cluster is insufficient. The condition is evaluated by checking whether the maximum of the app_monitoring_readyz equals 4. | If you are running group cluster, check with other peers to troubleshoot issue. If you are running solo cluster, look into other machines running the DVs to find the problem, | -| ClusterFailureRate | This alert is activated when the failure rate of the cluster exceeds a certain threshold, more specifically, more than 5% failures in duties in the last 6 hours. | Check the upstream and downstream dependencies, latency and hardware issues. | -| ClusterVCMissingValidators | This alert is activated if any validators in the cluster are missing. This happens when validator client cannot load validator keys in past 10 minutes. | Find if validator keys are missing and load them. | -| ClusterHighPctFailedSyncMsgDuty | This alert is activated if a high percentage of sync message duties failed in the cluster. The alert is activated if the sum of the increase in failed duties tagged with "sync_message" in the last hour divided by the sum of the increase in total duties tagged with "sync_message" in the last hour is greater than 10%. | This may be due to limitations in beacon node performance on nodes within the cluster. In charon, this duty is the most demanding, however an increased failure rate does not impact rewards. | -| ClusterNumConnectedRelays | This alert is activated if the number of connected relays in the cluster falls to 0. | Make sure correct relay is configured. If you still get the error report to us via https://discord.com/channels/849256203614945310/970759460693901362. | +| ClusterBeaconNodeDown | This alert is activated when the beacon node in a the cluster is offline. The beacon node is crucial for validating transactions and producing new blocks. Its unavailability could disrupt the overall functionality of the cluster. | Most likely data is corrupted. Wipe data from the point you know data was corrupted and restart beacon node so it can be synced again. | +| ClusterMissedAttestations | This alert indicates that there have been missed attestations in the cluster. Missed attestations may suggest that validators are not operating correctly, compromising the security and efficiency of the cluster. | This alert is triggered when 3 attestation are missed in 2 minutes. Check if the minimum threshold of peers are online. If correct, check for beacon node API errors and downstream validator errors using Loki. Lastly, debug from Docker using `docker compose debug`. | +| ClusterInUnknownStatus | This alert is designed to activate when a node within the cluster is detected to be in an unknown state. The condition is evaluated by checking whether the maximum of the `app_monitoring_readyz` metric is 0. | This is most likely a bug in Charon. Report to us via [Discord](https://discord.com/channels/849256203614945310/970759460693901362). | +| ClusterInsufficientPeers | This alert is set to activate when the number of peers for a node in the cluster is insufficient. The condition is evaluated by checking whether the maximum of the `app_monitoring_readyz` equals 4. | If you are running group cluster, check with other peers to troubleshoot the issue. If you are running solo cluster, look into other machines running the DVs to find the problem. | +| ClusterFailureRate | This alert is activated when the failure rate of the cluster exceeds a certain threshold, more specifically - more than 5% failures in duties in the last 6 hours. | Check the upstream and downstream dependencies, latency and hardware issues. | +| ClusterVCMissingValidators | This alert is activated if any validators in the cluster are missing. This happens when validator client cannot load validator keys in the past 10 minutes. | Find if validator keys are missing and load them. | +| ClusterHighPctFailedSyncMsgDuty | This alert is activated if a high percentage of sync message duties failed in the cluster. The alert is activated if the sum of the increase in failed duties tagged with "sync_message" in the last hour divided by the sum of the increase in total duties tagged with "sync_message" in the last hour is greater than 10%. | This may be due to limitations in beacon node performance on nodes within the cluster. In charon, this duty is the most demanding, however, an increased failure rate does not impact rewards. | +| ClusterNumConnectedRelays | This alert is activated if the number of connected relays in the cluster falls to 0. | Make sure correct relay is configured. If you still get the error report to us via [Discord](https://discord.com/channels/849256203614945310/970759460693901362). | | PeerPingLatency | This alert is activated if the 90th percentile of the ping latency to the peers in a cluster exceeds 400ms within 2 minutes. | Make sure to set up stable and high speed internet connection. If you have geographically distributed nodes, make sure latency does not go over 250 ms. | -| ClusterBeaconNodeZeroPeers | This alert is activated when beacon node cannot find peers. | Go to docs of beacon node client to trouble shoot. Make sure if there is no port overlap and p2p discovery is open. | +| ClusterBeaconNodeZeroPeers | This alert is activated when beacon node cannot find peers. | Go to docs of beacon node client to troubleshoot. Make sure there is no port overlap and p2p discovery is open. | ## Setting Up a Contact Point -When alerts are triggered, they are routed to contact points according notification policies. For this, contact points must be added. Grafana supports several kind of contact points like email, pager duty, discord, slack, telegram etc. This document will teach how to add discord channel as contact point. +When alerts are triggered, they are routed to contact points according notification policies. For this, contact points must be added. Grafana supports several kind of contact points like email, PagerDuty, Discord, Slack, Telegram etc. This document will teach how to add Discord channel as contact point. -1. On left nav bar in grafana console, under `Alerts` section, click on contact points. +1. On left nav bar in Grafana console, under `Alerts` section, click on contact points. 2. Click on `+ Add contact point`. It will show following page. Choose Discord in the `Integration` drop down. - + ![AlertsContactPoint](../../static/img/AlertsContactPoint.png) - + 3. Give a descriptive name to the alert. Create a channel in Discord and copy its `webhook url`. Once done, click `Save contact point` to finish. -4. When the alerts are fired, it will send without filling in the variables for cluster detail. For example, cluster_hash variable is missing here `cluster_hash = {{.cluster_hash}}`. This is done to save disk space. To find the details, use `docker compose -f docker-compose.yml -f compose-debug.yml up`. More description [here](https://docs.obol.tech/docs/advanced/adv-docker-configs). +4. When the alerts are fired, it will send without filling in the variables for cluster detail. For example, `cluster_hash` variable is missing here `cluster_hash = {{.cluster_hash}}`. This is done to save disk space. To find the details, use `docker compose -f docker-compose.yml -f compose-debug.yml up`. More description [here](https://docs.obol.tech/docs/advanced/adv-docker-configs). ## Best Practices for Monitoring Charon Nodes & Cluster @@ -77,6 +85,6 @@ When alerts are triggered, they are routed to contact points according notificat It is also important to check: -- NTP clock skew -- Process restarts and failures (eg. through `node_systemd`) -- alert on high error and panic log counts. \ No newline at end of file +- NTP clock skew; +- Process restarts and failures (eg. through `node_systemd`); +- Alert on high error and panic log counts. diff --git a/docs/advanced/obol-monitoring.md b/docs/advanced/obol-monitoring.md index e69aedf8d9..fe7d496a78 100644 --- a/docs/advanced/obol-monitoring.md +++ b/docs/advanced/obol-monitoring.md @@ -9,14 +9,16 @@ description: Add monitoring credentials to help the Obol Team monitor the health This is **optional** and does not confer any special privileges within the Obol Network. ::: -You may have been provided with **Monitoring Credentials** used to push distributed validator metrics to Obol's central prometheus cluster to monitor, analyze, and improve your Distributed Validator Cluster's performance. +You may have been provided with **Monitoring Credentials** used to push distributed validator metrics to Obol's central Prometheus cluster to monitor, analyze, and improve your Distributed Validator Cluster's performance. The provided credentials needs to be added in `prometheus/prometheus.yml` replacing `$PROM_REMOTE_WRITE_TOKEN` and will look like: -``` + +```shell obol20tnt8UC... ``` The updated `prometheus/prometheus.yml` file should look like: + ```yaml global: scrape_interval: 30s # Set the scrape interval to every 30 seconds. @@ -44,4 +46,4 @@ scrape_configs: - job_name: "lodestar" static_configs: - targets: [ "lodestar:5064" ] -``` \ No newline at end of file +``` diff --git a/docs/advanced/quickstart-builder-api.md b/docs/advanced/quickstart-builder-api.md index 0c0c7f840d..0ce80f7762 100644 --- a/docs/advanced/quickstart-builder-api.md +++ b/docs/advanced/quickstart-builder-api.md @@ -8,10 +8,6 @@ import TabItem from '@theme/TabItem'; # Enable MEV -:::caution -Charon is in a beta state and should be used with caution according to its [Terms of Use](https://obol.tech/terms.pdf). -::: - This quickstart guide focuses on configuring the builder API for Charon and supported validator and consensus clients. ## Getting started with Charon & the Builder API @@ -19,20 +15,20 @@ This quickstart guide focuses on configuring the builder API for Charon and supp Running a distributed validator cluster with the builder API enabled will give the validators in the cluster access to the builder network. This builder network is a network of "Block Builders" who work with MEV searchers to produce the most valuable blocks a validator can propose. -[MEV-Boost](https://boost.flashbots.net/) is one such product from flashbots that enables you to ask multiple +[MEV-Boost](https://boost.flashbots.net/) is one such product from Flashbots that enables you to ask multiple block relays (who communicate with the "Block Builders") for blocks to propose. The block that pays the largest reward to the validator will be signed and returned to the relay for broadcasting to the wider network. The end result for the validator is generally an increased APR as they receive some share of the MEV. -:::info -Before completing this guide, please check your cluster version, which can be found inside the `cluster-lock.json` file. If you are using cluster-lock version `1.7.0` or higher release verions, Obol seamlessly accommodates all validator client implementations within a mev-enabled distributed validator cluster. +:::info +Before completing this guide, please check your cluster version, which can be found inside the `cluster-lock.json` file. If you are using cluster-lock version `1.7.0` or higher, Charon seamlessly accommodates all validator client implementations within a MEV-enabled distributed validator cluster. -For clusters with a cluster-lock version `1.6.0` and below, charon is compatible only with [Teku](https://github.com/ConsenSys/teku). Use the version history feature of this documentation to see the instructions for configuring a cluster in that manner (`v0.16.0`). +For clusters with a `cluster-lock.json` version `1.6.0` and below, Charon is compatible only with [Teku](https://github.com/ConsenSys/teku). Use the version history feature of this documentation to see the instructions for configuring a cluster in that manner (`v0.16.0`). ::: ## Client configuration :::note -You need to add CLI flags to your consensus client, charon client, and validator client, to enable the builder API. +You need to add CLI flags to your consensus client, Charon client, and validator client, to enable the builder API. You need all operators in the cluster to have their nodes properly configured to use the builder API, or you risk missing a proposal. ::: @@ -41,26 +37,26 @@ You need all operators in the cluster to have their nodes properly configured to Charon supports builder API with the `--builder-api` flag. To use builder API, one simply needs to add this flag to the `charon run` command: -``` +```shell charon run --builder-api ``` ### Consensus Clients -The following flags need to be configured on your chosen consensus client. A flashbots relay URL is provided for example purposes, you should choose a relay that suits your preferences from [this list](https://github.com/eth-educators/ethstaker-guides/blob/main/MEV-relay-list.md#mev-relay-list-for-mainnet). +The following flags need to be configured on your chosen consensus client. A Flashbots relay URL is provided for example purposes, you should choose a relay that suits your preferences from [this list](https://github.com/eth-educators/ethstaker-guides/blob/main/MEV-relay-list.md#mev-relay-list-for-mainnet). Teku can communicate with a single relay directly:
       
-    {String.raw`--builder-endpoint="https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
+    {String.raw`teku --builder-endpoint="https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
       
     
Or you can configure it to communicate with a local MEV-boost sidecar to configure multiple relays:
       
-    {String.raw`--builder-endpoint=http://mev-boost:18550`}
+    {String.raw`teku --builder-endpoint=http://mev-boost:18550`}
       
     
@@ -79,6 +75,7 @@ The following flags need to be configured on your chosen consensus client. A fla + Prysm can communicate with a single relay directly:
       
     {String.raw`prysm beacon-chain --http-mev-relay "https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
@@ -86,17 +83,21 @@ The following flags need to be configured on your chosen consensus client. A fla
     
+ Nimbus can communicate with a single relay directly:
       
-        {String.raw`--payload-builder=true --payload-builder-url="https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
+        {String.raw`nimbus_beacon_node \
+        --payload-builder=true \
+        --payload-builder-url="https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
       
     
You should also consider adding --local-block-value-boost 3 as a flag, to favour locally built blocks if they are withing 3% in value of the relay block, to improve the chances of a successful proposal.
+ Lodestar can communicate with a single relay directly:
       
-    {String.raw`--builder --builder.urls "https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
+    {String.raw`node ./lodestar --builder --builder.urls "https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net"`}
       
     
@@ -132,14 +133,14 @@ The following flags need to be configured on your chosen validator client
       
-        {String.raw`--payload-builder=true`}
+    {String.raw`nimbus_validator_client --payload-builder=true`}
       
     
       
-    {String.raw`--builder="true" --builder.selection="builderonly"`}
+    {String.raw`node ./lodestar validator --builder="true" --builder.selection="builderonly"`}
       
     
@@ -149,15 +150,16 @@ The following flags need to be configured on your chosen validator client It can be difficult to confirm everything is configured correctly with your cluster until a proposal opportunity arrives, but here are some things you can check. -When your cluster is running, you should see if charon is logging something like this each epoch: -``` +When your cluster is running, you should see if Charon is logging something like this each epoch: + +```log 13:10:47.094 INFO bcast Successfully submitted validator registration to beacon node {"delay": "24913h10m12.094667699s", "pubkey": "84b_713", "duty": "1/builder_registration"} ``` -This indicates that your charon node is successfully registering with the relay for a blinded block when the time comes. +This indicates that your Charon node is successfully registering with the relay for a blinded block when the time comes. -If you are using the [ultrasound relay](https://relay.ultrasound.money), you can enter your cluster's distributed validator public key(s) into their website, to confirm they also see the validator as correctly registered. +If you are using the [ultrasound relay](https://relay.ultrasound.money), you can enter your cluster's distributed validator public key(s) into their website, to confirm they also see the validator as correctly registered. -You should check that your validator client's logs look healthy, and ensure that you haven't added a `fee-recipient` address that conflicts with what has been selected by your cluster in your cluster-lock file, as that may prevent your validator from producing a signature for the block when the opportunity arises. You should also confirm the same for all of the other peers in your cluster. +You should check that your validator client's logs look healthy, and ensure that you haven't added a `fee-recipient` address that conflicts with what has been selected by your cluster in your cluster-lock file, as that may prevent your validator from producing a signature for the block when the opportunity arises. You should also confirm the same for all of the other peers in your cluster. -Once a proposal has been made, you should look at the `Block Extra Data` field under `Execution Payload` for the block on [Beaconcha.in](https://beaconcha.in/block/18450364), and confirm there is text present, this generally suggests the block came from a builder, and was not a locally constructed block. \ No newline at end of file +Once a proposal has been made, you should look at the `Block Extra Data` field under `Execution Payload` for the block on [Beaconcha.in](https://beaconcha.in/block/18450364), and confirm there is text present, this generally suggests the block came from a builder, and was not a locally constructed block. diff --git a/docs/advanced/quickstart-combine.md b/docs/advanced/quickstart-combine.md index b4ad67a314..8f39a7b572 100644 --- a/docs/advanced/quickstart-combine.md +++ b/docs/advanced/quickstart-combine.md @@ -59,7 +59,7 @@ cluster/ │   ├── keystore-1.json │   └── keystore-1.txt ... -└── node* +└── nodeN ├── charon-enr-private-key ├── cluster-lock.json ├── deposit-data.json @@ -80,13 +80,13 @@ Doing so can potentially cause the combination process to fail. Run the following command: -```sh +```shell # Combine a clusters private keys -docker run --rm -v "$(pwd):/opt/charon" obolnetwork/charon:v0.19.2 combine --cluster-dir /opt/charon/cluster --output-dir /opt/charon/combined +docker run --rm -v "$(pwd):/opt/charon" obolnetwork/charon:v1.0.0 combine --cluster-dir /opt/charon/cluster --output-dir /opt/charon/combined ``` This command will store the combined keys in the `output-dir`, in this case a folder named `combined`. - + ```shell $ tree combined combined @@ -106,7 +106,7 @@ $ jq .distributed_validators[].distributed_public_key cluster/node0/cluster-loc :::info -The generated private keys are in the standard [EIP-2335](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2335.md) format, and can be imported in any Ethereum validator client that supports it. +The generated private keys are in the standard [EIP-2335](https://github.com/ethereum/ercs/blob/master/ERCS/erc-2335.md) format, and can be imported in any Ethereum validator client that supports it. Ensure your distributed validator cluster is completely shut down before starting a replacement validator or you are likely to be slashed. ::: diff --git a/docs/advanced/quickstart-eigenpod.md b/docs/advanced/quickstart-eigenpod.md index db00b65155..e4ce625d2b 100644 --- a/docs/advanced/quickstart-eigenpod.md +++ b/docs/advanced/quickstart-eigenpod.md @@ -16,7 +16,7 @@ This is a walkthrough of creating a distributed validator cluster pointing to an ## Pre-requisites -- The Ethereum addresses or ENS names for the node operators in the cluster. (Currently the DV Launchpad only supports Metamask or equivalent injected web3 browser wallets). +- The Ethereum addresses or ENS names for the node operators in the cluster. (Currently the DV Launchpad only supports Metamask or equivalent injected web3 browser wallets.) - If creating more than one validator, the ability to use the [obol-sdk](./quickstart-sdk.md) is required. ## Create a SAFE to own the EigenPod @@ -61,7 +61,6 @@ With these contracts deployed, you can now create the DV cluster invitation to s
- ## Deposit and restake your Distributed Validator -Once you have completed the DKG ceremony, you can continue the flow on the EigenLayer app to activate these validators and restake them. Consult the EigenLayer [documentation](https://docs.eigenlayer.xyz/eigenlayer/restaking-guides/restaking-user-guide/native-restaking/create-eigenpod-and-set-withdrawal-credentials/enable-restaking) to continue the process. +Once you have completed the DKG ceremony, you can continue the flow on the EigenLayer app to activate these validators and restake them. Consult the EigenLayer [documentation](https://docs.eigenlayer.xyz/eigenlayer/restaking-guides/restaking-user-guide/native-restaking/create-eigenpod-and-set-withdrawal-credentials/enable-restaking) to continue the process. diff --git a/docs/advanced/quickstart-sdk.md b/docs/advanced/quickstart-sdk.md index af8df51d1f..040eb65ade 100644 --- a/docs/advanced/quickstart-sdk.md +++ b/docs/advanced/quickstart-sdk.md @@ -37,7 +37,7 @@ Install the Obol-SDK package into your development environment ## Instantiate the client -The first thing you need to do is create a instance of the Obol SDK client. The client takes two constructor parameters: +The first thing you need to do is create an instance of the Obol SDK client. The client takes two constructor parameters: - The `chainID` for the chain you intend to use. - An ethers.js [signer](https://docs.ethers.org/v6/api/providers/#Signer-signTypedData) object. @@ -88,7 +88,7 @@ console.log( Once the Obol-API returns a `configHash` string from the `createClusterDefinition` method, you can use this identifier to invite the operators to the [Launchpad](../dvl/intro.md) to complete the process 1. Operators navigate to `https://.launchpad.obol.tech/dv?configHash=` and complete the [run a DV with others](../start/quickstart_group.md) flow. -1. Once the DKG is complete, and operators are using the `--publish` flag, the created cluster details will be posted to the Obol API +1. Once the DKG is complete, and operators are using the `--publish` flag, the created cluster details will be posted to the Obol API. 1. The creator will be able to retrieve this data with `obol.getClusterLock(configHash)`, to use for activating the newly created validator. ## Retrieve the created Distributed Validators using the SDK diff --git a/docs/advanced/quickstart-split.md b/docs/advanced/quickstart-split.md index 85fd6d5e09..28ac2442fc 100644 --- a/docs/advanced/quickstart-split.md +++ b/docs/advanced/quickstart-split.md @@ -6,8 +6,6 @@ description: Split existing validator keys # Split validator private keys :::caution -Charon is in a beta state and should be used with caution according to its [Terms of Use](https://obol.tech/terms.pdf). - This process should only be used if you want to split an *existing validator private key* into multiple private key shares for use in a Distributed Validator Cluster. If your existing validator is not properly shut down before the Distributed Validator starts, your validator may be slashed. If you are starting a new validator, you should follow a [quickstart guide](../start/quickstart_overview.md) instead. @@ -17,7 +15,6 @@ If you use MEV-Boost, make sure you turned off your MEV-Boost service for the ti Split an existing Ethereum validator key into multiple key shares for use in an [Obol Distributed Validator Cluster](../int/key-concepts.md#distributed-validator-cluster). - ## Pre-requisites - Ensure you have the existing validator keystores (the ones to split) and passwords. @@ -26,9 +23,9 @@ Split an existing Ethereum validator key into multiple key shares for use in an ## Step 1. Clone the charon repo and copy existing keystore files -Clone the [charon](https://github.com/ObolNetwork/charon) repo. +Clone the [Charon](https://github.com/ObolNetwork/charon) repo. - ```sh +```shell # Clone the repo git clone https://github.com/ObolNetwork/charon.git @@ -37,11 +34,12 @@ Clone the [charon](https://github.com/ObolNetwork/charon) repo. # Create a folder within this checked out repo mkdir split_keys - ``` +``` -Copy the existing validator `keystore.json` files into this new folder. Alongside them, with a matching filename but ending with `.txt` should be the password to the keystore. E.g., `keystore-0.json` `keystore-0.txt` +Copy the existing validator `keystore.json` files into this new folder. Alongside them, with a matching filename but ending with `.txt` should be the password to the keystore (e.g.: `keystore-0.json`, `keystore-0.txt`). At the end of this process, you should have a tree like this: + ```shell ├── split_keys │   ├── keystore-0.json @@ -49,8 +47,8 @@ At the end of this process, you should have a tree like this: │   ├── keystore-1.json │   ├── keystore-1.txt │ ... -│   ├── keystore-*.json -│   ├── keystore-*.txt +│   ├── keystore-N.json +│   ├── keystore-N.txt ``` ## Step 2. Split the keys using the charon docker command @@ -58,13 +56,20 @@ At the end of this process, you should have a tree like this: Run the following docker command to split the keys: ```shell -CHARON_VERSION= # E.g. v0.19.2 +CHARON_VERSION= # E.g. v1.0.0 CLUSTER_NAME= # The name of the cluster you want to create. WITHDRAWAL_ADDRESS= # The address you want to use for withdrawals (this is just for accuracy in your lock file, you can't change a withdrawal address for a validator that has already been deposited) FEE_RECIPIENT_ADDRESS= # The address you want to use for block reward and MEV payments. -NODES= # The number of nodes in the cluster. - -docker run --rm -v $(pwd):/opt/charon obolnetwork/charon:${CHARON_VERSION} create cluster --name="${CLUSTER_NAME}" --withdrawal-addresses="${WITHDRAWAL_ADDRESS}" --fee-recipient-addresses="${FEE_RECIPIENT_ADDRESS}" --split-existing-keys --split-keys-dir=/opt/charon/split_keys --nodes ${NODES} --network mainnet +NODES= # The number of nodes in the cluster. + +docker run --rm -v $(pwd):/opt/charon obolnetwork/charon:${CHARON_VERSION} create cluster \ + --name="${CLUSTER_NAME}" \ + --withdrawal-addresses="${WITHDRAWAL_ADDRESS}" \ + --fee-recipient-addresses="${FEE_RECIPIENT_ADDRESS}" \ + --split-existing-keys \ + --split-keys-dir=/opt/charon/split_keys \ + --nodes ${NODES} \ + --network mainnet ``` The above command will create `validator_keys` along with `cluster-lock.json` in `./cluster` for each node. @@ -74,20 +79,20 @@ Command output: ```shell ***************** WARNING: Splitting keys ********************** Please make sure any existing validator has been shut down for - at least 2 finalised epochs before starting the charon cluster, + at least 2 finalised epochs before starting the Charon cluster, otherwise slashing could occur. **************************************************************** -Created charon cluster: +Created Charon cluster: --split-existing-keys=true ./cluster/ -├─ node[0-*]/ Directory for each node -│ ├─ charon-enr-private-key Charon networking private key for node authentication -│ ├─ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes -│ ├─ validator_keys Validator keystores and password -│ │ ├─ keystore-*.json Validator private share key for duty signing -│ │ ├─ keystore-*.txt Keystore password files for keystore-*.json +├─ node[0-*]/ # Directory for each node +│ ├─ charon-enr-private-key # Charon networking private key for node authentication +│ ├─ cluster-lock.json # Cluster lock defines the cluster lock file which is signed by all nodes +│ ├─ validator_keys # Validator keystores and password +│ │ ├─ keystore-*.json # Validator private share key for duty signing +│ │ ├─ keystore-*.txt # Keystore password files for keystore-*.json ``` -These split keys can now be used to start a charon cluster. +These split keys can now be used to start a Charon cluster. diff --git a/docs/advanced/self-relay.md b/docs/advanced/self-relay.md index 7af35ee894..aabe040aea 100644 --- a/docs/advanced/self-relay.md +++ b/docs/advanced/self-relay.md @@ -7,7 +7,7 @@ description: Self-host a relay If you are experiencing connectivity issues with the Obol hosted relays, or you want to improve your clusters latency and decentralization, you can opt to host your own relay on a separate open and static internet port. -``` +```shell # Figure out your public IP curl v4.ident.me @@ -16,7 +16,7 @@ git clone https://github.com/ObolNetwork/charon-distributed-validator-node.git cd charon-distributed-validator-node -# Replace 'replace.with.public.ip.or.hostname' in relay/docker-compose.yml with your public IPv4 or DNS hostname # Replace 'replace.with.public.ip.or.hostname' in relay/docker-compose.yml with your public IPv4 or DNS hostname +# Replace 'replace.with.public.ip.or.hostname' in relay/docker-compose.yml with your public IPv4 or DNS hostname nano relay/docker-compose.yml @@ -26,7 +26,7 @@ docker compose -f relay/docker-compose.yml up Test whether the relay is publicly accessible. This should return an ENR: `curl http://replace.with.public.ip.or.hostname:3640/enr` -Ensure the ENR returned by the relay contains the correct public IP and port by decoding it with https://enr-viewer.com/. +Ensure the ENR returned by the relay contains the correct public IP and port by decoding it with [ENR viewer](https://enr-viewer.com/). Configure **ALL** charon nodes in your cluster to use this relay: @@ -35,4 +35,4 @@ Configure **ALL** charon nodes in your cluster to use this relay: Note that a local `relay/.charon/charon-enr-private-key` file will be created next to `relay/docker-compose.yml` to ensure a persisted relay ENR across restarts. -A list of publicly available relays that can be used is maintained [here](../faq/risks.md). +A list of publicly available relays that can be used is maintained [here](../faq/risks.md). diff --git a/docs/advanced/test-command.md b/docs/advanced/test-command.md index 6ddf51e59b..950401027a 100644 --- a/docs/advanced/test-command.md +++ b/docs/advanced/test-command.md @@ -12,7 +12,7 @@ import TabItem from '@theme/TabItem'; The charon test command is in alpha state and is still in development. It can not do any harm, but there is no guarantee it is stable and working as expected. ::: -Charon test command evaluates network performance and effectiveness of the machine it is running on and the targeted external service - other Charon peers, beacon node(s) or validator client. It prints a performance report to the standard output (can be omitted by with `quiet` flag) and a machine-readable TOML format of the report if `output-toml` flag is set. +Charon test command evaluates network performance and effectiveness of the machine it is running on and the targeted external service - other Charon peers, beacon node(s), etc.. It prints a performance report to the standard output and a machine-readable TOML format of the report if `output-toml` flag is set. ## Peers @@ -42,7 +42,7 @@ charon alpha test peers \ ### Run with Docker ```shell -docker run -v /Users/obol/charon/.charon:/opt/charon/.charon obolnetwork/charon:v1.0.0-rc1 alpha test peers \ +docker run -v /Users/obol/charon/.charon:/opt/charon/.charon obolnetwork/charon:v1.0.0 alpha test peers \ --enrs="enr:-HW4QNDXi9MzdH9Af65g20jDfelAJ0kJhclitkYYgFziYHXhRFF6JyB_CnVnimB7VxKBGBSkHbmy-Tu8BJq8JQkfptiAgmlkgnY0iXNlY3AyNTZrMaEDBVt5pk6x0A2fjth25pjLOEE9DpqCG-BCYyvutY04TZs,enr:-HW4QO2vefLueTBEUGly5hkcpL7NWdMKWx7Nuy9f7z6XZInCbFAc0IZj6bsnmj-Wi4ElS6jNa0Mge5Rkc2WGTVemas2AgmlkgnY0iXNlY3AyNTZrMaECR9SmYQ_1HRgJmNxvh_ER2Sxx78HgKKgKaOkCROYwaDY" ``` @@ -64,28 +64,6 @@ charon alpha test beacon \ ### Run with Docker ```shell -docker run obolnetwork/charon:v1.0.0-rc1 alpha test beacon \ +docker run obolnetwork/charon:v1.0.0 alpha test beacon \ --endpoints="https://ethereum-holesky-beacon-api.publicnode.com,https://ethereum-sepolia-beacon-api.publicnode.com" ``` - -## Validator - -Run tests towards a validator client, evaluating the effectiveness of a potential connection of a Charon node running on the same machine. - -The default endpoint for pinging a validator client is set to `127.0.0.1:3600` (configurable with `validator-api-address` flag). - -### Pre-requisites - -- Running validator client towards which tests will be executed. - -### Run - -```shell -charon alpha test validator -``` - -### Run with Docker - -```shell -docker run obolnetwork/charon:v1.0.0-rc1 alpha test validator -``` diff --git a/docs/cf/bug-report.md b/docs/cf/bug-report.md index 9a10b3b553..00afb3a516 100644 --- a/docs/cf/bug-report.md +++ b/docs/cf/bug-report.md @@ -18,12 +18,11 @@ If you are experiencing multiple issues, it is best to open each as a separate t An original bug report will very likely be preserved and used as a record and sounding board for users that have similar experiences in the future. Because of this, it is a great service to the community to ensure that reports meet these standards and follow the template closely. - ## The bug report template Below is the standard bug report template used by all of Obol's official repositories. -```sh +```shell ## Expected Behavior @@ -54,4 +53,3 @@ Version(s) used: ## Further Information