From dc8668c0c2b22f2258b0dfeb043cdd269a936ef4 Mon Sep 17 00:00:00 2001
From: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
Date: Mon, 3 Feb 2025 16:16:27 +0100
Subject: [PATCH] small docs updates (#524)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* updating Charon networking graphic
* adding new Ethereum roadmap
* making error page hyperlink-able
* updating how and where to run dvs page
* moving mev page
* updating obol vs others
* fixing links to errors page since it's just an md now, not an mdx. Also the MEV builder page since it got moved
* fixing redirect
* fixing link
* updating how and where to run DVs, also versioned v1.2 page
* new workflow image
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* Update docs/adv/troubleshooting/errors.md
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
* implemented Kalo's comments
* replacing n`t with n't
---------
Signed-off-by: Max Sherwood <63233138+slugmann321@users.noreply.github.com>
Co-authored-by: “Max <“max@obol.tech”>
Co-authored-by: Kaloyan Tanev <24719519+KaloyanTanev@users.noreply.github.com>
---
.../advanced}/quickstart-builder-api.mdx | 0
.../troubleshooting/client_configurations.md | 6 +-
docs/adv/troubleshooting/errors.md | 291 ++++++++
docs/adv/troubleshooting/errors.mdx | 694 ------------------
docs/learn/charon/networking.mdx | 2 +-
docs/learn/futher-reading/ethereum_and_dvt.md | 2 +-
docs/learn/intro/faq.mdx | 12 +-
docs/learn/intro/obol-vs-others.md | 6 -
docs/run/prepare/deployment-best-practices.md | 2 +-
docs/run/prepare/how_where_DVs.md | 24 +-
docs/run/running/activate-dv.mdx | 11 -
docs/run/start/quickstart_group.mdx | 2 +-
docusaurus.config.js | 4 +
static/img/CharonProtocolLayers.png | Bin 0 -> 2156820 bytes
static/img/EthereumRoadmapDec2023.jpeg | Bin 0 -> 240897 bytes
static/img/ObolvsOthers.png | Bin 702863 -> 334926 bytes
static/img/workflow.jpg | Bin 33420 -> 228846 bytes
.../run/prepare/how_where_DVs.md | 25 +-
18 files changed, 330 insertions(+), 751 deletions(-)
rename docs/{run/start => adv/advanced}/quickstart-builder-api.mdx (100%)
create mode 100644 docs/adv/troubleshooting/errors.md
delete mode 100644 docs/adv/troubleshooting/errors.mdx
create mode 100644 static/img/CharonProtocolLayers.png
create mode 100644 static/img/EthereumRoadmapDec2023.jpeg
diff --git a/docs/run/start/quickstart-builder-api.mdx b/docs/adv/advanced/quickstart-builder-api.mdx
similarity index 100%
rename from docs/run/start/quickstart-builder-api.mdx
rename to docs/adv/advanced/quickstart-builder-api.mdx
diff --git a/docs/adv/troubleshooting/client_configurations.md b/docs/adv/troubleshooting/client_configurations.md
index b0416404af..49b52c23d8 100644
--- a/docs/adv/troubleshooting/client_configurations.md
+++ b/docs/adv/troubleshooting/client_configurations.md
@@ -14,7 +14,7 @@ Many execution, consensus, and validator clients need custom flags or parameters
### Consensus Client
-Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../../run/start/quickstart-builder-api.mdx#consensus-clients).
+Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../advanced/quickstart-builder-api.mdx#consensus-clients).
### Validator Client
@@ -27,7 +27,7 @@ Required flags:
### Consensus Client
-Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../../run/start/quickstart-builder-api.mdx#consensus-clients).
+Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../advanced/quickstart-builder-api.mdx#consensus-clients).
### Validator Client
@@ -56,7 +56,7 @@ Required flags:
### Consensus Client
-Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../../run/start/quickstart-builder-api.mdx#consensus-clients).
+Nothing specific for distributed validators is required. If you are configuring MEV-boost, consult the settings you need [here](../advanced/quickstart-builder-api.mdx#consensus-clients).
### Validator Client
diff --git a/docs/adv/troubleshooting/errors.md b/docs/adv/troubleshooting/errors.md
new file mode 100644
index 0000000000..2c1310becd
--- /dev/null
+++ b/docs/adv/troubleshooting/errors.md
@@ -0,0 +1,291 @@
+---
+sidebar_position: 1
+description: Errors & Resolutions
+---
+
+# Errors & Resolutions
+
+All operators should try to restart their nodes and should check if they are on the latest stable version before attempting anything other configuration change. You can restart and update with the following commands:
+
+```shell
+docker compose down
+git pull
+docker compose up
+```
+
+You can check your logs using
+```shell
+docker compose logs
+```
+
+## ENRs & Keys
+
+### How do I get my ENR if I want to generate it again?
+
+`cd` to the directory where your private keys are located (ex: `cd /path/to/charon/enr/private/key`)
+
+Run `docker run --rm -v "$(pwd):/opt/charon" obolnetwork/charon:v1.2.0 enr`. This prints the ENR on your screen.
+
+### What do I do if lose my `charon-enr-private-key`?
+
+For now, ENR rotation/replacement is not supported, it will be supported in a future release. Therefore, its advised to always keep a backup of your `charon-enr-private-key ` in a secure location (ex: cloud storage, USB Flash drive, etc.).
+
+### I can't find the keys anywhere
+The `charon-enr-private-key` is generated inside a hidden folder `.charon`. To view it, run `ls -al` in your terminal. This step may be a bit different for Windows.
+Else, if you are on macOS, press `Cmd + Shift + .` to view the `.charon` folder in the Finder application.
+
+
+## Lighthouse
+
+
+### Lighthouse says "downloading historical blocks"
+
+This means that Lighthouse is still syncing which will throw a lot of errors down the line. Wait for the sync before moving further.
+
+
+### Lighthouse gives the error `failed to request attester duties`
+
+This indicates there is something wrong with your Lighthouse beacon node. This might be because the request buffer is full as your node is never starting consensus since it never gets the duties.
+
+
+### Lighthouse gives the error `not enough time for a discovery seach`
+
+This could be linked to a internet connection being too slow or relying on a slow third-party service such as Infura.
+
+
+## Beacon Node
+
+### `Error communicating with Beacon Node API` & `Error while connecting to beacon node event stream`
+
+This is likely due to Lighthouse not done syncing, wait and try again once synced. Can also be linked to Teku keystore issue.
+
+### Clock sync issues
+Either your clock server time is off, or you are talking to a remote beacon client that is super slow (this is why we advise against using services like Infura).
+
+
+### My beacon node API is flaky with lots of errors and timeouts
+
+A good quality beacon node API is critical to validator performance. It is always advised to run your own beacon node to ensure low latencies to boost validator performance.
+Using 3rd party services like Infura's beacon node API has significant disadvantages since the quality is often low. Requests often return 500s or timeout. This results in lots of warnings and errors and failed duties. Running a local beacon node is always preferred.
+
+## Charon Errors
+
+### `Attester failed in consensus component`
+
+The required number of operators defined in your cluster-lock file is
+probably not online to sign successfully. Make sure all operators are
+running the latest version of Charon. To check if some peers are not online:
+`docker logs charon-distributed-validator-node-charon-1 2>&1 | grep 'absent'`
+
+### `Load private key`
+
+Make sure you have successfully run a DKG before running the node. The key
+should be created and placed in the right directory during the ceremony.
+Also, make sure you are working in the right directory:
+`charon-distributed-validator-node`.
+
+### `Failed to confirm node connection`
+Wait for Teku & Lighthouse sync to be complete.
+
+
+### `Reserve relay circuit: reservation failed`
+
+`RESERVATION_REFUSED` is returned by the libp2p relay when some maximum
+limit has been reached. This is most often due to "maximum reservations per IP/peer".
+This is when your Charon node is restarting or in some error loop and constantly
+attempting to create new relay reservations reaching the maximum.
+
+To fix this error, stop your Charon node for 30mins before restarting it.
+This should allow the relay enough time to reset your IP/peer limits and
+should then allow new reservations. This could also be due to the relay
+being overloaded in general, so reaching a server wide "maximum connections"
+limit. This is an issue with relay scalability and we are working in a long
+term fix for this.
+
+### `Error opening relay circuit: NO_RESERVATION`
+
+Error opening relay circuit NO_RESERVATION (204)` indicates the peer
+isn't connected to the relay, so the the Charon client cannot connect to the
+peer via the relay. That might be because the peer is offline or the peer is
+configured to connect to a different relay.
+
+To fix this error, ensure the peer is online and configured with the exact
+same `--p2p-relays` flag.
+
+### `Couldnt fetch duty data from the beacon node`
+
+`msgFetcher` indicates a duty failed in the fetcher component when
+it failed to fetch the required data from the beacon node API. This indicates
+a problem with the upstream beacon node.
+
+### `Couldnt aggregate attestation due to failed attester duty`
+
+`msgFetcherAggregatorNoAttData` indicates an attestation aggregation
+duty failed in the fetcher component since it couldn't fetch the prerequisite
+attestation data. This indicates the associated attestation duty failed to obtain
+a cluster agreed upon value.
+
+### `Couldnt aggregate attestation due to insufficient partial v2 committee subscriptions`
+
+`msgFetcherAggregatorZeroPrepares` indicates an attestation aggregation
+duty failed in the fetcher component since it couldn't fetch the prerequisite
+aggregated v2 committee subscription. This indicates the associated prepare aggregation
+duty failed due to no partial v2 committee subscription submitted by the cluster
+validator clients.
+
+### `Couldnt aggregate attestation due to failed prepare aggregator duty`
+
+`msgFetcherAggregatorFailedPrepare` indicates an attestation aggregation
+duty failed in the fetcher component since it couldn't fetch the prerequisite
+aggregated v2 committee subscription. This indicates the associated prepare aggregation
+duty failed.
+
+### `Couldnt propose block due to insufficient partial randao signatures`
+
+`msgFetcherProposerFewRandaos` indicates a block proposer duty failed
+in the fetcher component since it couldn't fetch the prerequisite aggregated
+RANDAO. This indicates the associated randao duty failed due to insufficient
+partial randao signatures submitted by the cluster validator clients.
+
+### `Couldnt propose block due to zero partial randao signatures`
+
+`msgFetcherProposerZeroRandaos` indicates a block proposer duty failed
+in the fetcher component since it couldn't fetch the prerequisite aggregated
+RANDAO. This indicates the associated randao duty failed due to no partial randao
+signatures submitted by the cluster validator clients.
+
+### `Couldnt propose block due to failed randao duty`
+
+`msgFetcherProposerZeroRandaos` indicates a block proposer duty failed
+in the fetcher component since it couldn't fetch the prerequisite aggregated
+RANDAO. This indicates the associated randao duty failed.
+
+### `Consensus algorithm didn't complete`
+
+`msgConsensus` indicates a duty failed in consensus component. This
+could indicate that insufficient honest peers participated in consensus or p2p
+network connection problems.
+
+### `Signed duty not submitted by local validator client` error
+
+`msgValidatorAPI` indicates that partial signature were never submitted
+by the local validator client. This could indicate that the local validator client
+is offline, or has connection problems with Charon, or has some other problem.
+See validator client logs for more details.
+
+### `Bug: partial signature database didn't trigger partial signature exchange`
+
+`msgParSigDBInternal` indicates a bug in the partial signature database
+as it is unexpected.
+
+### `No partial signatures received from peers`
+
+`msgParSigEx` indicates that no partial signature for the duty was
+received from any peer. This indicates all peers are offline or p2p network connection
+problems.
+
+### `Insufficient partial signatures received, minimum required threshold not reached`
+
+`msgParSigDBThreshold` indicates that insufficient partial signatures
+for the duty was received from peers. This indicates problems with peers or p2p
+network connection problems.
+
+### `Bug: threshold aggregation of partial signatures failed due to inconsistent signed data`
+
+`msgSigAgg` indicates that BLS threshold aggregation of sufficient
+partial signatures failed. This indicates inconsistent signed data. This indicates
+a bug in Charon as it is unexpected.
+
+### `Existing private key lock file found, another charon instance may be running on your machine`
+
+When you turn on the `--private-key-file-lock` option in Charon, it
+checks for a special file called the private key lock file. This file has the
+same name as the ENR private key file but with a `.lock` extension.
+If the private key lock file exists and is not older than 5 seconds, Charon won't
+run. It doesn't allow running multiple Charon instances with the same ENR private
+key. If the private key lock file has a timestamp older than 5 seconds, Charon
+will replace it and continue with its work. If you`re sure that no other Charon
+instances are running, you can delete the private key lock file.
+
+### `Validator api 5xx response: mismatching validator client key share index, Mth key share submitted to Nth charon peer`
+
+The issue revolves around an invalid setup or deployment, where the
+validators private key shares don't match the ENR private key. There may
+have been a mix-up during deployment, leading to a mismatching validator
+client key share index.
+
+For example:Imagine node N is Alice, and node M is Bob, the error would read:
+` mismatching validator client key share index, Bob`s key share submitted to Alice`s charon node `
+Bob`s private key share(s) are imported to a VC that is connected to
+Alice`s Charon node. This is a invalid setup/deployment.
+Alice`s Charon node should only be connected to Alice`s VC.
+
+Check the partial public key shares of each node inside
+cluster-lock.json and see that matches with the public key inside
+`node(num)/validator_keys/keystore-0.json`.
+
+## Grafana
+
+### How to fix the Grafana dashboard?
+
+Sometimes, Grafana dashboard doesn't load any data first time around.
+You can solve this by following the steps below:
+- Click the Wheel Icon > Datasources.
+- Click prometheus.
+- Change the "Access" field from `Server (default)` to `Browser`. Press "Save & Test". It should fail.
+- Change the "Access" field back to `Server (default)` and press "Save & Test". You should be presented with a green success icon saying "Data source is working" and you can return to the dashboard page.
+
+### `N/A` & `No data` in validator info panel
+Can be linked to a Teku keystore issue.
+
+
+## Prometheus
+
+### `Unauthorized: authentication error: invalid token`
+ You can ignore this error unless you have been contacted by the Obol Team
+ with monitoring credentials. In that case, follow [Monitoring your Node](../../run/running/monitoring.md) in our guides. It does not affect cluster performance or prevent the cluster from running.
+
+
+## Docker
+
+### How to fix `permission denied` errors?
+
+Permission denied errors can come up in a variety of manners, particularly
+on Linux and WSL for Windows systems. In the interest of security, the
+charon docker image runs as a non-root user, and this user often does not
+have the permissions to write in the directory you have checked out the code
+to. This can be generally be fixed with some of the following:
+- Running docker commands with `sudo`, if you haven't [setup docker to be run as a non-root user](https://docs.docker.com/engine/install/linux-postinstall/)
+- Changing the permissions of the `.charon` folder with the commands:
+ - `mkdir .charon` (if it doesn't already exist);
+ - `sudo chmod -R 666 .charon`.
+
+### I see a lot of errors after running `docker compose up`
+ It`s because both Nethermind and Lighthouse start syncing and so there's
+ connectivity issues among the containers. Simply let the containers run for
+ a while. You won't observe frequent errors when Nethermind finishes syncing. You
+ can also add a second beacon node endpoint for something like Infura by
+ adding a comma separated API URL to the end of
+ `CHARON_BEACON_NODE_ENDPOINTS` in the docker-compose.yml.
+
+### How do I fix the `plugin "loki" not found` error?
+ If you get the following error when calling `docker compose up`:
+
+`Error response from daemon: error looking up logging plugin loki: plugin "loki" not found`.
+
+Then it probably means that the Loki docker driver isn't installed. In that case, run the following command to install loki:
+
+`docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions`.
+
+
+## Relay
+
+### ` Resolve IP of p2p external host flag: lookup replace.with.public.ip.or.hostname:no such host`
+
+Replace `replace.with.public.ip.or.hostname` in the
+relay/docker-compose.yml with your real public IP or DNS hostname.
+
+### ` Timeout resolving bootnode ENR: context deadline exceeded`
+The relay you are trying to connect to your peers via is offline or
+unreachable.
+
diff --git a/docs/adv/troubleshooting/errors.mdx b/docs/adv/troubleshooting/errors.mdx
deleted file mode 100644
index 1f93600b70..0000000000
--- a/docs/adv/troubleshooting/errors.mdx
+++ /dev/null
@@ -1,694 +0,0 @@
----
-sidebar_position: 1
-description: Errors & Resolutions
----
-
-# Errors & Resolutions
-
-All operators should try to restart their nodes and should check if they are on the latest stable version before attempting anything other configuration change as we are still in beta and frequently releasing fixes. You can restart and update with the following commands:
-
-```shell
-docker compose down
-git pull
-docker compose up
-```
-
-You can check your logs using
-
-```shell
-docker compose logs
-```
-
-
-
- ENRs & Keys
-
-
-
- What is an ENR?
-
-
- An ENR is shorthand for an{" "}
- Ethereum Node Record.
- It is a way to represent a node on a public network, with a reliable
- mechanism to update its information.
-
-
- At Obol we use ENRs to identify Charon nodes to one another such that they
- can form clusters with the right Charon nodes and not impostors. ENRs have
- private keys they use to sign updates to the
- data contained
- in their ENR. This private key is by default found at
- .charon/charon-enr-private-key
-
, and should be kept secure, and not checked into version control.
-
-
- An ENR looks something like this:
-
-
- enr:-JG4QAgAOXjGFcTIkXBO30aUMzg2YSo1CYV0OH8Sf2s7zA2kFjVC9ZQ_jZZItdE8gA-tUXW-rWGDqEcoQkeJ98Pw7GaGAYFI7eoegmlkgnY0gmlwhCKNyGGJc2VjcDI1NmsxoQI6SQlzw3WGZ_VxFHLhawQFhCK8Aw7Z0zq8IABksuJEJIN0Y3CCPoODdWRwgj6E
-
-
-
-
-
-
-
- How do I get my ENR if I want to generate it again?
-
-
-
- -
-
cd
to the directory where your private keys are located
- (ex: cd /path/to/charon/enr/private/key
)
-
- -
- Run{" "}
-
- docker run --rm -v "$(pwd):/opt/charon" obolnetwork/charon:v1.2.0 enr
-
- . This prints the ENR on your screen.{" "}
-
- -
- Please note that this ENR is not the same as the one generated when you
- created it for the first time. This is because the process of generating
- ENRs includes the current timestamp.
-
-
-
-
-
-
- {" "}
- What do I do if lose my charon-enr-private-key
?{" "}
-
-
-
- -
- {" "}
- For now, ENR rotation/replacement is not supported, it will be supported
- in a future release.{" "}
-
- -
- {" "}
- Therefore, it's advised to always keep a backup of your
- charon-enr-private-key
-
in a secure location (ex: cloud storage, USB Flash drive, etc.).{" "}
-
-
-
-
-
- I can't find the keys anywhere
-
-
- -
- The
charon-enr-private-key
is generated inside a hidden
- folder .charon
.{" "}
-
- -
- To view it, run
ls -al
in your terminal.{" "}
-
- -
- You can then copy the key to your
~/Downloads
folder for
- easy access by running{" "}
- cp .charon/charon-enr-private-key ~/Downloads
. This step
- maybe a bit different for Windows.{" "}
-
- -
- Else, if you are on macOS, press
Cmd + Shift + .
to view
- the .charon
folder in the Finder application.{" "}
-
-
-
-
-
-
- Lighthouse
-
-
-
- Downloading historical blocks
-
-
- This means that Lighthouse is still syncing which will throw a lot of
- errors down the line. Wait for the sync before moving further.
-
-
-
-
-
- Failed to request attester duties
error
-
-
-
- Indicates there is something wrong with your Lighthouse beacon node. This
- might be because the request buffer is full as your node is never starting
- consensus since it never gets the duties.
-
-
-
-
-
- Not enough time for a discovery seach
error
-
-
-
- This could be linked to a internet connection being too slow or relying on
- a slow third-party service such as Infura.
-
-
-
-
-
- Beacon Node
-
-
-
-
- Error communicating with Beacon Node API
&{" "}
- Error while connecting to beacon node event stream
-
-
{" "}
- This is likely due to Lighthouse not done syncing, wait and try again once
- synced. Can also be linked to Teku keystore issue.
-
-
-
- Clock sync issues
-
{" "}
- Either your clock server time is off, or you are talking to a remote beacon
- client that is super slow (this is why we advise against using services like
- Infura).
-
-
-
-
- My beacon node API is flaky with lots of errors and timeouts
-
-
- A good quality beacon node API is critical to validator performance. It is always
- advised to run your own beacon node to ensure low latencies to boost validator
- performance.
-
-
- Using 3rd party services like Infura's beacon node API has significant
- disadvantages since the quality is often low. Requests often return 500s or
- timeout (Charon times out after 2s). This results in lots of warnings and
- errors and failed duties. Running a local beacon node is always preferred.
- We are not yet considering increasing the 2s timeout since that can have
- knock-on effects.
-
-
-
-
- Charon
-
-
-
-
- Attester failed in consensus component
error
-
-
{" "}
- The required number of operators defined in your cluster-lock file is
- probably not online to sign successfully. Make sure all operators are
- running the latest version of Charon. To check if some peers are not online:{" "}
-
- {" "}
- docker logs charon-distributed-validator-node-charon-1 2>&1 | grep 'absent'{" "}
-
-
-
-
-
- Load private key
error
-
-
{" "}
- Make sure you have successfully run a DKG before running the node. The key
- should be created and placed in the right directory during the ceremony.
- Also, make sure you are working in the right directory:{" "}
- charon-distributed-validator-node
.
-
-
-
-
- Failed to confirm node connection
error
-
-
{" "}
- Wait for Teku & Lighthouse sync to be complete.
-
-
-
-
- Reserve relay circuit: reservation failed
error
-
-
- RESERVATION_REFUSED
is returned by the libp2p relay when some maximum
- limit has been reached. This is most often due to "maximum reservations per IP/peer".
- This is when your Charon node is restarting or in some error loop and constantly
- attempting to create new relay reservations reaching the maximum.
-
-
- To fix this error, stop your Charon node for 30mins before restarting it.
- This should allow the relay enough time to reset your IP/peer limits and
- should then allow new reservations. This could also be due to the relay
- being overloaded in general, so reaching a server wide "maximum connections"
- limit. This is an issue with relay scalability and we are working in a long
- term fix for this.
-
-
-
-
- Error opening relay circuit: NO_RESERVATION
error
-
-
- Error opening relay circuit NO_RESERVATION (204)
indicates the peer
- isn't connected to the relay, so the the Charon client cannot connect to the
- peer via the relay. That might be because the peer is offline or the peer is
- configured to connect to a different relay.
-
-
- To fix this error, ensure the peer is online and configured with the exact
- same --p2p-relays
flag.
-
-
-
-
- Couldn't fetch duty data from the beacon node
error
-
-
- msgFetcher
indicates a duty failed in the fetcher component when
- it failed to fetch the required data from the beacon node API. This indicates
- a problem with the upstream beacon node.
-
-
-
-
- Couldn't aggregate attestation due to failed attester duty
{" "}
- error
-
-
- msgFetcherAggregatorNoAttData
indicates an attestation aggregation
- duty failed in the fetcher component since it couldn't fetch the prerequisite
- attestation data. This indicates the associated attestation duty failed to obtain
- a cluster agreed upon value.
-
-
-
-
-
- Couldn't aggregate attestation due to insufficient partial v2
- committee subscriptions
-
{" "}
- error
-
-
- msgFetcherAggregatorZeroPrepares
indicates an attestation aggregation
- duty failed in the fetcher component since it couldn't fetch the prerequisite
- aggregated v2 committee subscription. This indicates the associated prepare aggregation
- duty failed due to no partial v2 committee subscription submitted by the cluster
- validator clients.
-
-
-
-
-
- Couldn't aggregate attestation due to failed prepare aggregator duty
-
{" "}
- error
-
-
- msgFetcherAggregatorFailedPrepare
indicates an attestation aggregation
- duty failed in the fetcher component since it couldn't fetch the prerequisite
- aggregated v2 committee subscription. This indicates the associated prepare aggregation
- duty failed.
-
-
-
-
-
- Couldn't propose block due to insufficient partial randao signatures
-
{" "}
- error
-
-
- msgFetcherProposerFewRandaos
indicates a block proposer duty failed
- in the fetcher component since it couldn't fetch the prerequisite aggregated
- RANDAO. This indicates the associated randao duty failed due to insufficient
- partial randao signatures submitted by the cluster validator clients.
-
-
-
-
-
- Couldn't propose block due to zero partial randao signatures
-
{" "}
- error
-
-
- msgFetcherProposerZeroRandaos
indicates a block proposer duty failed
- in the fetcher component since it couldn't fetch the prerequisite aggregated
- RANDAO. This indicates the associated randao duty failed due to no partial randao
- signatures submitted by the cluster validator clients.
-
-
-
-
- Couldn't propose block due to failed randao duty
error
-
-
- msgFetcherProposerZeroRandaos
indicates a block proposer duty failed
- in the fetcher component since it couldn't fetch the prerequisite aggregated
- RANDAO. This indicates the associated randao duty failed.
-
-
-
-
- Consensus algorithm didn't complete
error
-
-
- msgConsensus
indicates a duty failed in consensus component. This
- could indicate that insufficient honest peers participated in consensus or p2p
- network connection problems.
-
-
-
-
- Signed duty not submitted by local validator client
error
-
-
- msgValidatorAPI
indicates that partial signature were never submitted
- by the local validator client. This could indicate that the local validator client
- is offline, or has connection problems with Charon, or has some other problem.
- See validator client logs for more details.
-
-
-
-
-
- Bug: partial signature database didn't trigger partial signature
- exchange
-
{" "}
- error
-
-
- msgParSigDBInternal
indicates a bug in the partial signature database
- as it is unexpected.
-
-
-
-
- No partial signatures received from peers
error
-
-
- msgParSigEx
indicates that no partial signature for the duty was
- received from any peer. This indicates all peers are offline or p2p network connection
- problems.
-
-
-
-
-
- Insufficient partial signatures received, minimum required threshold
- not reached
-
{" "}
- error
-
-
- msgParSigDBThreshold
indicates that insufficient partial signatures
- for the duty was received from peers. This indicates problems with peers or p2p
- network connection problems.
-
-
-
-
-
- Bug: threshold aggregation of partial signatures failed due to
- inconsistent signed data
-
{" "}
- error
-
-
- msgSigAgg
indicates that BLS threshold aggregation of sufficient
- partial signatures failed. This indicates inconsistent signed data. This indicates
- a bug in Charon as it is unexpected.
-
-
-
-
-
- Existing private key lock file found, another charon instance may be
- running on your machine
-
{" "}
- error
-
-
- When you turn on the --private-key-file-lock
option in Charon, it
- checks for a special file called the private key lock file. This file has the
- same name as the ENR private key file but with a .lock
extension.
- If the private key lock file exists and is not older than 5 seconds, Charon won't
- run. It doesn't allow running multiple Charon instances with the same ENR private
- key. If the private key lock file has a timestamp older than 5 seconds, Charon
- will replace it and continue with its work. If you're sure that no other Charon
- instances are running, you can delete the private key lock file.
-
-
-
-
-
- Validator api 5xx response: mismatching validator client key share
- index, Mth key share submitted to Nth charon peer
-
{" "}
- error
-
-
-
- The issue revolves around an invalid setup or deployment, where the
- validators private key shares don't match the ENR private key. There may
- have been a mix-up during deployment, leading to a mismatching validator
- client key share index.
-
- For example:
-
- -
-
- Imagine node N is Alice, and node M is Bob, the error would read:{" "}
-
- mismatching validator client key share index, Bob's key share
- submitted to Alice's charon node
-
- .
-
-
- -
- Bob's private key share(s) are imported to a VC that is connected to
- Alice's Charon node. This is a invalid setup/deployment. Alice's Charon
- node should only be connected to Alice's VC.
-
- -
- Check the partial public key shares of each node inside
- cluster-lock.json and see that matches with the public key inside{" "}
-
node(num)/validator_keys/keystore-0.json
.
-
-
-
-
-
-
- Teku
-
-
-
-
- Teku keystore file
error{" "}
-
-
{" "}
- Teku sometimes logs an error which looks like{" "}
-
- Keystore file /opt/charon/validator_keys/keystore-0.json.lock already in
- use
-
- . This can be solved by deleting the file(s) ending with .lock
in
- the folder .charon/validator_keys
. It is caused by an unsafe shut
- down of Teku (usually by double pressing Ctrl+C
to shutdown containers
- faster).
-
-
-
-
- Grafana
-
-
-
-
- {" "}
- How to fix the Grafana dashboard?{" "}
-
-
{" "}
- Sometimes, Grafana dashboard doesn't load any data first time around. You
- can solve this by following the steps below:{" "}
-
- - Click the Wheel Icon > Datasources.
- - Click prometheus.
- -
- Change the "Access" field from
Server (default)
to{" "}
- Browser
. Press "Save & Test". It should fail.{" "}
-
- -
- Change the "Access" field back to
Server (default)
and
- press "Save & Test". You should be presented with a green success icon
- saying "Data source is working" and you can return to the dashboard
- page.{" "}
-
-
-
-
-
-
- N/A
& No data
in validator info panel
-
-
{" "}
- Can be linked to a Teku keystore issue.
-
-
-
-
- Prometheus
-
-
-
-
- Unauthorized: authentication error: invalid token
-
-
{" "}
- You can ignore this error unless you have been contacted by the Obol Team
- with monitoring credentials. In that case, follow{" "}
- Getting Started Monitoring your Node in
- our advanced guides. It does not affect cluster performance or prevent the
- cluster from running.
-
-
-
-
- Docker
-
-
-
-
- {" "}
- How to fix permission denied
errors?{" "}
-
-
{" "}
- Permission denied errors can come up in a variety of manners, particularly
- on Linux and WSL for Windows systems. In the interest of security, the
- charon docker image runs as a non-root user, and this user often does not
- have the permissions to write in the directory you have checked out the code
- to. This can be generally be fixed with some of the following:{" "}
-
- -
- Running docker commands with
sudo
, if you haven't{" "}
-
- setup docker to be run as a non-root user
-
- .{" "}
-
- -
- Changing the permissions of the
.charon
folder with the
- commands:{" "}
-
-
- -
-
mkdir .charon
(if it doesn't already exist);
-
- -
-
sudo chmod -R 666 .charon
.
-
-
-
-
-
-
-
- {" "}
- I see a lot of errors after running docker compose up
-
-
{" "}
- It's because both Geth and Lighthouse start syncing and so there's
- connectivity issues among the containers. Simply let the containers run for
- a while. You won't observe frequent errors when Geth finishes syncing. You
- can also add a second beacon node endpoint for something like Infura by
- adding a comma separated API URL to the end of{" "}
- CHARON_BEACON_NODE_ENDPOINTS
in the docker-compose.yml.
-
-
-
-
- {" "}
- How do I fix the plugin "loki" not found
error?
-
-
{" "}
- If you get the following error when calling docker compose up
:
-
-
- Error response from daemon: error looking up logging plugin loki: plugin
- "loki" not found
-
- .
- Then it probably means that the Loki docker driver isn't installed. In that
- case, run the following command to install loki:
-
-
- docker plugin install grafana/loki-docker-driver:latest --alias loki
- --grant-all-permissions
-
- .
-
-
-
-
- Relay
-
-
-
-
-
- {" "}
- Resolve IP of p2p external host flag: lookup replace.with.public.ip.or.hostname:
- no such host{" "}
-
{" "}
- error
-
-
{" "}
- Replace replace.with.public.ip.or.hostname
in the
- relay/docker-compose.yml with your real public IP or DNS hostname.
-
-
-
-
- Timeout resolving bootnode ENR: context deadline exceeded
{" "}
- error
-
-
{" "}
- The relay you are trying to connect to your peers via is offline or
- unreachable.
-
-
-
-
- Lodestar
-
-
-
-
- warn: Potential next epoch attester duties reorg
error
-
-
{" "}
- Lodestar logs these warnings because Charon is not able to return proper{" "}
- dependent_root
value in getAttesterDuties
API
- response whenever Lodestar calls this API. This is because Charon uses{" "}
- go-eth2-client
for all the beacon API calls and it doesn't
- provide dependent_root
value in responses. We have reported
- this to them{" "}
- here.
-
-
diff --git a/docs/learn/charon/networking.mdx b/docs/learn/charon/networking.mdx
index 16eb429cac..ad54d53cc7 100644
--- a/docs/learn/charon/networking.mdx
+++ b/docs/learn/charon/networking.mdx
@@ -11,7 +11,7 @@ This document describes Charon's networking model which can be divided into two
## Internal Validator Stack
-
+
Charon is a middleware DVT client and is therefore connected to an upstream beacon node and a downstream validator client is connected to it.
Each operator should run the whole validator stack (all 4 client software types), either on the same machine or on different machines. The networking between
diff --git a/docs/learn/futher-reading/ethereum_and_dvt.md b/docs/learn/futher-reading/ethereum_and_dvt.md
index 7a62ccaa77..873b4895c5 100644
--- a/docs/learn/futher-reading/ethereum_and_dvt.md
+++ b/docs/learn/futher-reading/ethereum_and_dvt.md
@@ -26,7 +26,7 @@ The Ethereum website serves as a hub for all things Ethereum, catering to indivi
If you haven’t yet heard, Distributed Validator Technology, or DVT, is the next big thing on The Merge section of the Ethereum roadmap. Learn more about this in our blog post: [What is DVT and How Does It Improve Staking on Ethereum?](https://blog.obol.tech/what-is-dvt-and-how-does-it-improve-staking-on-ethereum/)
-
+
***Vitalik's Ethereum Roadmap***
diff --git a/docs/learn/intro/faq.mdx b/docs/learn/intro/faq.mdx
index a3acf5e448..27681baee1 100644
--- a/docs/learn/intro/faq.mdx
+++ b/docs/learn/intro/faq.mdx
@@ -134,6 +134,16 @@ A cluster is a group of nodes that act together as one or several validators whi
It is possible to migrate your Charon node to another machine running the same config by moving the `.charon` folder with its contents to your new machine. Make sure the EL and CL on the new machine are synced before proceeding to the move to minimize downtime.
+### What is an ENR?
+
+An ENR is shorthand for an [Ethereum Node Record](https://eips.ethereum.org/EIPS/eip-778). It is a way to represent a node on a public network, with a reliable mechanism to update its information.
+
+At Obol we use ENRs to identify Charon nodes to one another such that they can form clusters with the right Charon nodes and not impostors. ENRs have private keys they use to sign updates to the [data contained in their ENR](https://enr-viewer.com/). This private key is by default found at `.charon/charon-enr-private-key`, and should be kept secure, and not checked into version control.
+
+An ENR looks something like this:
+`enr:-JG4QAgAOXjGFcTIkXBO30aUMzg2YSo1CYV0OH8Sf2s7zA2kFjVC9ZQ_jZZItdE8gA-tUXW-rWGDqEcoQkeJ98Pw7GaGAYFI7eoegmlkgnY0gmlwhCKNyGGJc2VjcDI1NmsxoQI6SQlzw3WGZ_VxFHLhawQFhCK8Aw7Z0zq8IABksuJEJIN0Y3CCPoODdWRwgj6E`
+
+
## Distributed Key Generation
### What are the min and max numbers of operators for a Distributed Validator?
@@ -186,4 +196,4 @@ Another aspect to be aware of is how the splitting of principal from rewards wor
You can check if the containers on your node are outputting errors by running `docker compose logs` on a machine with a running cluster.
-Diagnose some common errors and view their resolutions [here](../../adv/troubleshooting/errors.mdx).
+Diagnose some common errors and view their resolutions [here](../../adv/troubleshooting/errors.md).
diff --git a/docs/learn/intro/obol-vs-others.md b/docs/learn/intro/obol-vs-others.md
index f9dde57760..5283ff5e21 100644
--- a/docs/learn/intro/obol-vs-others.md
+++ b/docs/learn/intro/obol-vs-others.md
@@ -21,12 +21,6 @@ In an Obol DV cluster, nodes use LibP2P to communicate directly with each other,
![Cluster Independence](/img/ClusterIndependence.png)
-## Cluster independance: No reliance on a common P2P gossip network
-
-In an Obol DV cluster, nodes use LibP2P to communicate directly with each other, and communications are end-to-end encrypted with TSL. This direct communication of nodes within a cluster improves latency, and makes cluster communications harder to attack with a denial of service (DOS) attack. It also allows an Obol DV cluster to be run within a private network. This may allow cost savings on data egress costs, for operators running cluster nodes across multiple locations of a single cloud provider, for example.
-
-![Gossip Network](/img/GossipNetwork.png)
-
## Works with existing validator clients and PKI
We built Obol’s DV implementation as a secure and trust-minimised middleware architecture. Our middleware client, Charon, doesn’t replace anything in the client stack, instead it sits between the consensus and validator clients. Node operators integrating the Charon DVT middleware into their stack can continue to use the same clients and private key infrastructure as before, albeit with a different key generation method.
diff --git a/docs/run/prepare/deployment-best-practices.md b/docs/run/prepare/deployment-best-practices.md
index fc998c791d..a6808a5857 100644
--- a/docs/run/prepare/deployment-best-practices.md
+++ b/docs/run/prepare/deployment-best-practices.md
@@ -70,7 +70,7 @@ Cluster sizes that allow for Byzantine Fault Tolerance are recommended as they a
## MEV-Boost Relays
-MEV relays are configured at the Consensus Layer or MEV-boost client level. Refer to our [guide](../../run/start/quickstart-builder-api.mdx) to ensure all necessary configuration has been applied to your clients. As with all validators, low latency during proposal opportunities is extremely important. By default, MEV-Boost waits for all configured relays to return a bid, or will timeout if any have not returned a bid within 950ms. This default timeout is generally too slow for a distributed cluster (think of this time as additive to the time it takes the cluster to come to consensus, both of which need to happen within a 2 second window for optimal proposal broadcasting). It is likely better to only list relays that are located geographically near your node, so that once all relays respond (e.g. in < 50ms) your cluster will move forward with the proposal.
+MEV relays are configured at the Consensus Layer or MEV-boost client level. Refer to our [guide](../../adv/advanced/quickstart-builder-api.mdx) to ensure all necessary configuration has been applied to your clients. As with all validators, low latency during proposal opportunities is extremely important. By default, MEV-Boost waits for all configured relays to return a bid, or will timeout if any have not returned a bid within 950ms. This default timeout is generally too slow for a distributed cluster (think of this time as additive to the time it takes the cluster to come to consensus, both of which need to happen within a 2 second window for optimal proposal broadcasting). It is likely better to only list relays that are located geographically near your node, so that once all relays respond (e.g. in < 50ms) your cluster will move forward with the proposal.
Use Charon's [`test mev` command](../../run/prepare/test-command.mdx#test-mev-relay) to test a number of your preferred relays, and select the two or three relays with the lowest latency to your node(s), you do not need to have the same relays on each node in a cluster.
diff --git a/docs/run/prepare/how_where_DVs.md b/docs/run/prepare/how_where_DVs.md
index cdecdde8e1..648a64569c 100644
--- a/docs/run/prepare/how_where_DVs.md
+++ b/docs/run/prepare/how_where_DVs.md
@@ -20,7 +20,6 @@ description: How and where to run DVs
## Quickstart Guides
- [Run a DV alone](../start/quickstart_alone.mdx)
- [Run a DV as a group](../start/quickstart_group.mdx)
-- [Run a DV using the SDK](../../adv/advanced/quickstart-sdk.mdx)
## CL+VC Combinations:
@@ -31,19 +30,12 @@ description: How and where to run DVs
- 🟠: Duties may fail for this combination
- 🔴: One or more duties fails consistently
-| Consensus 👇 Validator 👉 | Teku v24.8.0 | Lighthouse v5.3.0[^lhagg] | Lodestar v1.20.2 | Nimbus v24.7.0 | Prysm [PR](https://github.com/prysmaticlabs/prysm/pull/13995) | Remarks |
-|-------------------------|--------------|-------------------|------------------|----------------|---------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|
-| Teku v24.8.0 | 🟡 | 🟡 | ✅ | ✅ | 🟠 | Teku `bn` needs the `--validators-graffiti-client-append-format=DISABLED` flag in order to produce blocks properly. Teku `vc` are only failing aggregation duties 50% of the time, which are not directly penalised but impact network density at high scale.|
-| Lighthouse v5.3.0 | 🟡 | 🟡 | ✅ | ✅ | 🟠 | Lighthouse `vc` are only failing aggregation duties, which are not directly penalised but impact network density at high scale. |
-| Nimbus v24.7.0 | 🟡 | 🟡 | ✅ | ✅ | ✅ | Nimbus beacon nodes requires that you add the following flag to **charon run**: `charon run --feature-set-enable=json_requests` |
-| Prysm v5.0.3 | 🟡 | 🟡 | ✅ | ✅ | ✅ | Prysm `validator` needs a particular [pull request](https://github.com/prysmaticlabs/prysm/pull/13995) merged and released for aggregation duties to succeed. |
-| Lodestar v1.20.2 | 🟡 | 🟡 | ✅ | ✅ | 🔴 | |
+| Validator 👉 Consensus 👇 | Teku v24.10.3 | Lighthouse v5.3.0 | Lodestar v1.23.0 | Nimbus v24.10.0 | Prysm v5.1.2 | Remarks |
+|---------------------------|---------------|-------------------|------------------|-----------------|--------------|---------|
+| Teku v24.10.3 | ✅ | 🟡 | ✅ | ✅ | 🟠 | Teku `beacon node` needs the `--validators-graffiti-client-append-format=DISABLED` flag in order to produce blocks properly. Teku `validator client` is only failing aggregation duties 50% of the time, which are not directly penalised but impact network density at high scale. |
+| Lighthouse v5.3.0 | ✅ | 🟡 | ✅ | ✅ | ✅ | Lighthouse `validator client` is only failing aggregation duties, which are not directly penalised but impact network density at high scale. |
+| Lodestar v1.23.0 | ✅ | 🟡 | ✅ | ✅ | 🟠 | |
+| Nimbus v24.10.0 | ✅ | 🟡 | ✅ | ✅ | 🟠 | |
+| Prysm v5.1.2 | ✅ | 🟡 | ✅ | ✅ | ✅ | Prysm `validator client` is failing aggregation duties 50% of the time, which are not directly penalised but impact network density at high scale. In some combinations rare failures of attestation and proposal duties were observed (0-2% per epoch). |
-[^lhagg]: sync committee and aggregator duties are not yet supported in a DV setup by Lighthouse, all other duties work as expected.
-
-
-### Note:
-
- - Blinded beacon block proposals are only supported from cluster lock version v1.7 and charon release v0.17.0 onwards.
- - Prysm VC support is added from prysm version v5.0.0 onwards.
-
\ No newline at end of file
+Note: for the most recent compatability information, please see the [release notes](https://github.com/ObolNetwork/charon/releases/) from the most recent release of Charon.
\ No newline at end of file
diff --git a/docs/run/running/activate-dv.mdx b/docs/run/running/activate-dv.mdx
index f1627775fd..f3732606f7 100644
--- a/docs/run/running/activate-dv.mdx
+++ b/docs/run/running/activate-dv.mdx
@@ -22,16 +22,5 @@ Use any of the following tools to deposit. Please use the third-party tools at y
* Obol Distributed Validator Launchpad
* ethereum.org Staking Launchpad
-* From a SAFE Multisig:
-(Repeat these steps for every validator to deposit in your cluster)
- * From the SAFE UI, click on New Transaction
then Transaction Builder
to create a new custom transaction
- * Enter the beacon chain contract for Deposit on mainnet - you can find it here
- * Fill the transaction information
- * Set amount to 32
in ETH
- * Use your deposit-data.json
to fill the required data : pubkey
,withdrawal credentials
,signature
,deposit_data_root
. Make sure to prefix the input with 0x
to format them in bytes
- * Click on Add transaction
- * Click on Create Batch
- * Click on Send Batch
, you can click on Simulate
to check if the transaction will execute successfully
- * Get the minimum threshold of signatures from the other addresses and execute the custom transaction
The activation process can take a minimum of 16 hours, with the maximum time to activation being dictated by the length of the activation queue, which can be weeks.
diff --git a/docs/run/start/quickstart_group.mdx b/docs/run/start/quickstart_group.mdx
index c6f7fa197a..7acd44d5c3 100644
--- a/docs/run/start/quickstart_group.mdx
+++ b/docs/run/start/quickstart_group.mdx
@@ -44,7 +44,7 @@ Please make sure to create a backup of the private key at `.charon/charon-enr-pr
:::
:::tip
-If instead of being shown your `enr` you see an error saying `permission denied` then you may need to [update your docker permissions](../../adv/troubleshooting/errors.mdx#docker-permission-denied-error) to allow the command to run successfully.
+If instead of being shown your `enr` you see an error saying `permission denied` then you may need to [update your docker permissions](../../adv/troubleshooting/errors.md#docker-permission-denied-error) to allow the command to run successfully.
:::
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 6270ebd574..19433966cf 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -233,6 +233,10 @@ const config = {
to: '/sdk',
from: '/docs/sdk',
},
+ {
+ to: 'next/docs/adv/advanced/quickstart-builder-api',
+ from: '/docs/run/start/quickstart-builder-api',
+ },
//Redirect from multiple old paths to the new path
// {
// to: '/docs/newDoc2',
diff --git a/static/img/CharonProtocolLayers.png b/static/img/CharonProtocolLayers.png
new file mode 100644
index 0000000000000000000000000000000000000000..11f57d6b6e93ca2fbea12baacea2ac8391d4db64
GIT binary patch
literal 2156820
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