From 0c33f188a2f4603bfec9ec340d76c03ff0fd3e58 Mon Sep 17 00:00:00 2001 From: Tekubot Date: Wed, 24 Jan 2024 03:03:01 +0000 Subject: [PATCH 1/3] Version 24.1.1 --- .../version-24.1.1/concepts/architecture.md | 19 + .../concepts/builder-network.md | 29 + .../version-24.1.1/concepts/merge.md | 52 + .../concepts/p2p-private-key.md | 19 + .../version-24.1.1/concepts/proof-of-stake.md | 35 + .../concepts/slashing-protection.md | 93 + .../concepts/weak-subjectivity.md | 63 + .../version-24.1.1/concepts/withdrawals.md | 97 + .../get-started/_category_.json | 7 + .../get-started/checkpoint-start.md | 64 + .../get-started/connect/_category_.json | 8 + .../get-started/connect/mainnet.md | 183 + .../get-started/connect/testnet.md | 227 + .../get-started/install/_category_.json | 8 + .../get-started/install/build-from-source.md | 77 + .../get-started/install/install-binaries.md | 85 + .../get-started/install/run-docker-image.md | 203 + .../get-started/manage-memory.md | 79 + .../get-started/migrate-to-teku.md | 18 + .../version-24.1.1/get-started/start-teku.md | 165 + .../how-to/configure/_category_.json | 8 + .../how-to/configure/builder-network.md | 120 + .../version-24.1.1/how-to/configure/tls.md | 81 + .../how-to/configure/use-config-file.md | 60 + .../configure/use-proposer-config-file.md | 220 + .../how-to/enable-doppelganger-detection.md | 83 + .../how-to/find-and-connect/_category_.json | 8 + .../find-and-connect/improve-connectivity.md | 43 + .../how-to/find-and-connect/specify-nat.md | 29 + .../load-validators-without-restarting.md | 31 + .../version-24.1.1/how-to/migrate-database.md | 101 + .../how-to/monitor/_category_.json | 8 + .../how-to/monitor/configure-logging.md | 87 + .../how-to/monitor/use-metrics.md | 98 + .../version-24.1.1/how-to/prevent-slashing.md | 60 + .../how-to/reconstruct-historical-states.md | 24 + .../how-to/troubleshoot/_category_.json | 8 + .../how-to/troubleshoot/general.md | 150 + .../how-to/troubleshoot/network.md | 184 + .../how-to/update-withdrawal-keys.md | 121 + .../use-external-signer/_category_.json | 8 + .../how-to/use-external-signer/manage-keys.md | 147 + .../use-external-signer/use-web3signer.md | 42 + .../version-24.1.1/how-to/use-rewards-api.md | 149 + .../version-24.1.1/how-to/use-sentry-nodes.md | 74 + .../version-24.1.1/how-to/voluntarily-exit.md | 53 + .../version-24.1.1/images/architecture.png | Bin 0 -> 59013 bytes .../images/execution-consensus-clients.png | Bin 0 -> 108986 bytes .../version-24.1.1/images/favicon.svg | 14 + versioned_docs/version-24.1.1/images/logo.svg | 7 + versioned_docs/version-24.1.1/index.md | 30 + .../version-24.1.1/reference/cli/index.md | 3690 +++++++++++++++++ .../reference/cli/subcommands/admin.md | 631 +++ .../reference/cli/subcommands/development.md | 38 + .../reference/cli/subcommands/index.md | 40 + .../cli/subcommands/migrate-database.md | 178 + .../cli/subcommands/slashing-protection.md | 453 ++ .../cli/subcommands/validator-client.md | 1211 ++++++ .../cli/subcommands/voluntary-exit.md | 538 +++ .../version-24.1.1/reference/rest.md | 93 + .../configure-external-signer-tls.md | 178 + .../version-24.1.1-sidebars.json | 75 + versions-preset.json | 5 +- versions.json | 1 + 64 files changed, 10709 insertions(+), 1 deletion(-) create mode 100644 versioned_docs/version-24.1.1/concepts/architecture.md create mode 100644 versioned_docs/version-24.1.1/concepts/builder-network.md create mode 100644 versioned_docs/version-24.1.1/concepts/merge.md create mode 100644 versioned_docs/version-24.1.1/concepts/p2p-private-key.md create mode 100644 versioned_docs/version-24.1.1/concepts/proof-of-stake.md create mode 100644 versioned_docs/version-24.1.1/concepts/slashing-protection.md create mode 100644 versioned_docs/version-24.1.1/concepts/weak-subjectivity.md create mode 100644 versioned_docs/version-24.1.1/concepts/withdrawals.md create mode 100644 versioned_docs/version-24.1.1/get-started/_category_.json create mode 100644 versioned_docs/version-24.1.1/get-started/checkpoint-start.md create mode 100644 versioned_docs/version-24.1.1/get-started/connect/_category_.json create mode 100644 versioned_docs/version-24.1.1/get-started/connect/mainnet.md create mode 100644 versioned_docs/version-24.1.1/get-started/connect/testnet.md create mode 100644 versioned_docs/version-24.1.1/get-started/install/_category_.json create mode 100644 versioned_docs/version-24.1.1/get-started/install/build-from-source.md create mode 100644 versioned_docs/version-24.1.1/get-started/install/install-binaries.md create mode 100644 versioned_docs/version-24.1.1/get-started/install/run-docker-image.md create mode 100644 versioned_docs/version-24.1.1/get-started/manage-memory.md create mode 100644 versioned_docs/version-24.1.1/get-started/migrate-to-teku.md create mode 100644 versioned_docs/version-24.1.1/get-started/start-teku.md create mode 100644 versioned_docs/version-24.1.1/how-to/configure/_category_.json create mode 100644 versioned_docs/version-24.1.1/how-to/configure/builder-network.md create mode 100644 versioned_docs/version-24.1.1/how-to/configure/tls.md create mode 100644 versioned_docs/version-24.1.1/how-to/configure/use-config-file.md create mode 100644 versioned_docs/version-24.1.1/how-to/configure/use-proposer-config-file.md create mode 100644 versioned_docs/version-24.1.1/how-to/enable-doppelganger-detection.md create mode 100644 versioned_docs/version-24.1.1/how-to/find-and-connect/_category_.json create mode 100644 versioned_docs/version-24.1.1/how-to/find-and-connect/improve-connectivity.md create mode 100644 versioned_docs/version-24.1.1/how-to/find-and-connect/specify-nat.md create mode 100644 versioned_docs/version-24.1.1/how-to/load-validators-without-restarting.md create mode 100644 versioned_docs/version-24.1.1/how-to/migrate-database.md create mode 100644 versioned_docs/version-24.1.1/how-to/monitor/_category_.json create mode 100644 versioned_docs/version-24.1.1/how-to/monitor/configure-logging.md create mode 100644 versioned_docs/version-24.1.1/how-to/monitor/use-metrics.md create mode 100644 versioned_docs/version-24.1.1/how-to/prevent-slashing.md create mode 100644 versioned_docs/version-24.1.1/how-to/reconstruct-historical-states.md create mode 100644 versioned_docs/version-24.1.1/how-to/troubleshoot/_category_.json create mode 100644 versioned_docs/version-24.1.1/how-to/troubleshoot/general.md create mode 100644 versioned_docs/version-24.1.1/how-to/troubleshoot/network.md create mode 100644 versioned_docs/version-24.1.1/how-to/update-withdrawal-keys.md create mode 100644 versioned_docs/version-24.1.1/how-to/use-external-signer/_category_.json create mode 100644 versioned_docs/version-24.1.1/how-to/use-external-signer/manage-keys.md create mode 100644 versioned_docs/version-24.1.1/how-to/use-external-signer/use-web3signer.md create mode 100644 versioned_docs/version-24.1.1/how-to/use-rewards-api.md create mode 100644 versioned_docs/version-24.1.1/how-to/use-sentry-nodes.md create mode 100644 versioned_docs/version-24.1.1/how-to/voluntarily-exit.md create mode 100644 versioned_docs/version-24.1.1/images/architecture.png create mode 100644 versioned_docs/version-24.1.1/images/execution-consensus-clients.png create mode 100644 versioned_docs/version-24.1.1/images/favicon.svg create mode 100644 versioned_docs/version-24.1.1/images/logo.svg create mode 100644 versioned_docs/version-24.1.1/index.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/index.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/development.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/index.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/validator-client.md create mode 100644 versioned_docs/version-24.1.1/reference/cli/subcommands/voluntary-exit.md create mode 100644 versioned_docs/version-24.1.1/reference/rest.md create mode 100644 versioned_docs/version-24.1.1/tutorials/configure-external-signer-tls.md create mode 100644 versioned_sidebars/version-24.1.1-sidebars.json diff --git a/versioned_docs/version-24.1.1/concepts/architecture.md b/versioned_docs/version-24.1.1/concepts/architecture.md new file mode 100644 index 000000000..72624fff9 --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/architecture.md @@ -0,0 +1,19 @@ +--- +title: Architecture +description: Learn about the Teku high-level architecture. +sidebar_position: 1 +--- + +# Teku architecture + +The following diagram outlines the Teku high-level architecture. + +![Architecture](../images/architecture.png) + +Teku contains both a beacon node and validator client implementation. +The beacon node is the primary link to the Beacon Chain. +The validator client performs [validator duties](proof-of-stake.md). + +You can [run the beacon node only](../get-started/start-teku.md#start-the-beacon-node), or [run the beacon node and validator client](../get-started/start-teku.md#start-the-clients-in-a-single-process). + +Read more about the [Ethereum consensus client architecture](https://ethereum.org/en/developers/docs/nodes-and-clients/). For more information about the Teku architecture, contact us on [Teku Discord channel](https://discord.com/invite/consensys). diff --git a/versioned_docs/version-24.1.1/concepts/builder-network.md b/versioned_docs/version-24.1.1/concepts/builder-network.md new file mode 100644 index 000000000..d635ed4ca --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/builder-network.md @@ -0,0 +1,29 @@ +--- +title: Builder network and MEV-Boost +description: Learn about external builders and MEV-Boost. +sidebar_position: 2 +--- + +# Builder network and MEV-Boost + +[Consensus clients](merge.md#consensus-clients) are responsible for proposing +blocks containing an execution payload obtained from their local +[execution clients](merge.md#execution-clients) via the Engine API. + +A consensus client can optionally configure an external builder and delegate the +execution payload construction to it, instead of using the execution client. + +## MEV-Boost + +The most common builder deployment is to run a specialized external software +such as [MEV-Boost](https://github.com/flashbots/mev-boost). +MEV-Boost works by requesting a payload proposal from several entities (called +relays), and selecting the best bid in order to improve validator rewards and +increase the maximal extractable value (MEV). + +Teku allows you to +[configure the beacon node to use a builder network](../how-to/configure/builder-network.md) +to generate execution payloads. +In case of failures or non-timely responses, Teku falls back to the payload +produced by the local execution client specified using +[`--ee-endpoint`](../reference/cli/index.md#ee-endpoint). diff --git a/versioned_docs/version-24.1.1/concepts/merge.md b/versioned_docs/version-24.1.1/concepts/merge.md new file mode 100644 index 000000000..3ba196f0e --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/merge.md @@ -0,0 +1,52 @@ +--- +title: The Merge +description: Learn about The Merge, and execution and consensus clients. +sidebar_position: 4 +--- + +# The Merge + +:::info + +The Merge was executed on **September 15, 2022**. + +::: + +[The Merge](https://ethereum.org/en/upgrades/merge/) was an Ethereum upgrade that merged the [Beacon Chain](https://ethereum.org/en/upgrades/beacon-chain/) into Ethereum Mainnet, turning Mainnet into a combination of an [execution layer and consensus layer](#execution-and-consensus-clients). The Merge transitioned Mainnet from proof of work to [proof of stake consensus](proof-of-stake.md). + +You can run Teku as a consensus client with: + +- Any execution client on Mainnet. +- Any execution client on a testnet. +- Besu on Mainnet. +- Besu on a testnet. + +## Execution and consensus clients + +After The Merge, a full Ethereum Mainnet node is a combination of an execution client (previously called an [Ethereum 1.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client) and a consensus client (previously called an [Ethereum 2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) client). + +Execution and consensus clients communicate with each other using the [Engine API](https://besu.hyperledger.org/development/public-networks/how-to/use-engine-api). + +![Ethereum Merge node](../images/execution-consensus-clients.png) + +### Execution clients + +Execution clients, such as [Besu](https://besu.hyperledger.org/), manage the execution layer, including executing transactions and updating the world state. Execution clients serve [JSON-RPC API](https://besu.hyperledger.org/development/public-networks/reference/api) requests and communicate with each other in a peer-to-peer network. + +### Consensus clients + +Consensus clients, such as Teku, contain beacon node and validator client implementations. The beacon node is the primary link to the [Beacon Chain](https://ethereum.org/en/upgrades/beacon-chain/) (consensus layer). The validator client performs [validator duties](proof-of-stake.md) on the consensus layer. Consensus clients serve [REST API](../reference/rest.md) requests and communicate with each other in a peer-to-peer network. + +## What happened during The Merge + +Before The Merge, the execution and consensus clients' configurations were updated to listen for a certain total terminal difficulty (TTD) to be reached. + +The consensus layer enabled the Merge configuration (Bellatrix) before reaching the TTD. Once the execution layer blocks reached the TTD, the Beacon Chain merged into Ethereum Mainnet, and Ethereum transitioned to a proof of stake network. + +:::tip + +After The Merge, a Mainnet node operator must run both an execution client and a beacon node at the same time. To become a validator, you must also run a validator client (either [in the same process as the beacon node](../get-started/start-teku.md#start-the-clients-in-a-single-process) or [separately](../get-started/start-teku.md#run-the-clients-separately)). + +::: + +After The Merge, validators earn rewards for performing [validator duties](proof-of-stake.md), and fee recipients earn rewards for the inclusion of execution layer transactions. diff --git a/versioned_docs/version-24.1.1/concepts/p2p-private-key.md b/versioned_docs/version-24.1.1/concepts/p2p-private-key.md new file mode 100644 index 000000000..d91084027 --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/p2p-private-key.md @@ -0,0 +1,19 @@ +--- +title: Peer-to-peer private key +description: Learn about the peer-to-peer private key. +sidebar_position: 5 +--- + +# Peer-to-peer private key + +The peer-to-peer (P2P) private key is used to identify the beacon node on the network and secures the information channel between nodes. + +When starting Teku, if the [`--p2p-private-key-file`](../reference/cli/index.md#p2p-private-key-file) option is not specified, and the `generated-node-key.dat` file does not exist in the node's data directory, Teku generates a P2P private key and writes it to the `generated-node-key.dat` file. + +If the `generated-node-key.dat` file exists in the data directory when starting Teku, the node starts using the private stored in the file. + +:::info + +The `generated-node-key.dat` file is stored by default in the `/kvstore` directory, where `` is specified using the [`--data-beacon-path`](../reference/cli/index.md#data-beacon-path) option. + +::: diff --git a/versioned_docs/version-24.1.1/concepts/proof-of-stake.md b/versioned_docs/version-24.1.1/concepts/proof-of-stake.md new file mode 100644 index 000000000..184db3807 --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/proof-of-stake.md @@ -0,0 +1,35 @@ +--- +title: Proof of stake +description: Learn about Ethereum proof of stake consensus. +sidebar_position: 3 +--- + +# Proof of stake + +[The Merge](merge.md) transitioned Ethereum Mainnet to [proof of stake (PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. + +In Ethereum's PoS, you must run a [full node](merge.md#execution-and-consensus-clients) and [stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. + +:::note + +You must run a beacon node and an execution client to operate a node on Mainnet. To become a validator, you must also run a validator client (either [in the same process as the beacon node](../get-started/start-teku.md#start-the-clients-in-a-single-process) or [separately](../get-started/start-teku.md#run-the-clients-separately). + +::: + +The PoS mechanism randomly chooses validators to propose or validate blocks on the [Beacon Chain](https://ethereum.org/en/upgrades/beacon-chain/) in defined time frames. + +Proposers are responsible for proposing new consensus blocks, and non-proposing validators are responsible for validating (attesting to) proposed blocks. Validators are rewarded for proposing and attesting to consensus blocks eventually included in the Beacon Chain, and penalized for malicious behavior. Validators also receive transaction fees for included blocks. + +Each consensus block contains an execution payload, which contains a list of transactions and other data required to execute and validate the payload. + +When a node validates a consensus block, its [consensus client](merge.md#execution-and-consensus-clients) processes the block and sends the execution payload to the [execution client](merge.md#execution-and-consensus-clients), which: + +1. Assembles a block on the execution layer. +1. Verifies pre-conditions. +1. Executes transactions. +1. Verifies post-conditions. +1. Sends the validity result back to the consensus client. + +If the block is valid, the execution client includes it in the execution chain and stores the new state in execution state storage. + +If a consensus block receives attestations backed by enough staked ETH, the block is included in the Beacon Chain. diff --git a/versioned_docs/version-24.1.1/concepts/slashing-protection.md b/versioned_docs/version-24.1.1/concepts/slashing-protection.md new file mode 100644 index 000000000..294222d9c --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/slashing-protection.md @@ -0,0 +1,93 @@ +--- +title: Slashing protection +description: Learn about Teku's slashing protection. +sidebar_position: 6 +--- + +# Slashing protection + +Teku implements slashing protection to prevent validators from signing blocks or attestations based on what it has already signed. + +By default, Teku also locks keystore files listed in the [`--validator-keys`](../reference/cli/index.md#validator-keys) option to prevent other processes from using it. You can enable and disable this functionality using the [`--validators-keystore-locking-enabled`](../reference/cli/index.md#validators-keystore-locking-enabled) option. + +:::warning + +Teku's slashing protection does not provide protection if the same validator key is being used by multiple nodes. + +::: + +To protect validators from slashable offenses, Teku stores a record of the most recently signed blocks for each validator in the `/validator/slashprotection/` directory. One [YAML file is stored per validator] in the format `.yml` (with no `0x` prefix). + +:::note + +Set `` using the [`--data-path`](../reference/cli/index.md#data-path) command line option. + +::: + +Teku provides command line options to [import] or [export] the slashing protection file. + +:::tip + +Teku also supports [doppelganger detection](../how-to/enable-doppelganger-detection.md) to help prevent slashing. This is an early access feature. + +::: + +## Validator slashing protection file + +The slashing protection file records multiple values that protects the validator from incorrectly signing blocks or attestations. + +```yaml title="Example" +--- +genesisValidatorsRoot: "0x9436e8a630e3162b7ed4f449b12b8a5a368a4b95bc46b941ae65c11613bfa4c1" +lastSignedBlockSlot: 71090 +lastSignedAttestationSourceEpoch: 2290 +lastSignedAttestationTargetEpoch: 3247 +``` + +The following rules apply to the file: + +- A validator will not sign a block unless the slot is greater than `lastSignedBlockSlot`. +- A validator will not sign an attestation unless the attestation source is greater than or equal to `lastSignedAttestationSourceEpoch`, and the attestation target epoch is greater than `lastSignedAttestationTargetEpoch`. +- `genesisValidatorsRoot` is a hash of the validators active at genesis, and is used to differentiate between different chains. Teku does not require this field to be present, but if it is present and differs from the required value, then Teku returns an error. + +:::info + +You can obtain the `genesisValidatorsRoot` value by using the [`/eth/v1/beacon/genesis`](https://consensys.github.io/teku/#operation/getEthV1BeaconGenesis) API. + +::: + +These rules guarantee the validator does not sign anything that is slashable. + +## Migrate the slashing protection file + +Use the Teku command line options to [import] or [export] the slashing protection file. Alternatively you can manually migrate or create the database. + +### Between Teku nodes + +If moving a validator from one Teku node to another, you can manually migrate the slashing protection file. + +For example, to manually move the file from node A to node B: + +- Stop Teku node A and confirm the process has fully exited and won't be restarted. +- Remove the validator key from node A, for example from the [`--validator-keys`](../reference/cli/index.md#validator-keys) option. +- Copy the file from `/validators/slashprotection/` to `/validators/slashprotection/`. +- Start node B with the migrated validator key. +- Restart node A if required. + +### From a non-Teku node + +If moving a validator from a different client to Teku, you can either: + +- Manually [create a new slashing protection file] by setting the values based on the validator's last signing details. +- [Import] the slashing protection file. + +To manually create the file, stop the other client to ensure it isn't signing, then set `lastSignedBlockSlot` to the current chain head slot + 1, `lastSignedAttestationSourceEpoch` to the current justified checkpoint, and set `lastSignedAttestationTargetEpoch` to the current epoch + 1. + +Start the Teku node with the validator key. + + + +[YAML file is stored per validator]: #validator-slashing-protection-file +[create a new slashing protection file]: #validator-slashing-protection-file +[import]: ../how-to/prevent-slashing.md#import-a-slashing-protection-file +[export]: ../how-to/prevent-slashing.md#export-a-slashing-protection-file diff --git a/versioned_docs/version-24.1.1/concepts/weak-subjectivity.md b/versioned_docs/version-24.1.1/concepts/weak-subjectivity.md new file mode 100644 index 000000000..44fdf412b --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/weak-subjectivity.md @@ -0,0 +1,63 @@ +--- +title: Weak subjectivity +description: Learn about the weak subjectivity period. +sidebar_position: 7 +--- + +# Weak subjectivity + +The weak subjectivity period refers to how far behind the chain head a node can be before 1/3 of +validators may have exited since the node was last in sync. + +For example, if 1/3 of validators withdraw their stake and continue signing blocks and attestations, +they can form a chain which conflicts with the finalized state. +If your node is far enough behind the chain head not to be aware that they've withdrawn their funds, +these validators can act dishonestly and continue feeding you blocks to lead you down the wrong chain. + +:::note +If a node is aware that a validator has withdrawn its funds, the node will reject the validator's attestations. +::: + +At a high-level, the weak subjectivity period is the period of time that a node can be behind the +chain and trust that it is following the correct chain. +In practice, the weak subjectivity mechanism tells Teku if the latest checkpoint is too old to +continue syncing from it (either when starting a new node or after your node has been offline for a while). + + +## Safely sync your node + +Teku provides three methods to safely sync a node that is new to the network or has been offline for an extended period. + +1. Use [`--checkpoint-sync-url`](../reference/cli/index.md#checkpoint-sync-url) to supply a URL of a + checkpoint state endpoint from which to sync. +2. Use [`--initial-state`](../reference/cli/index.md#initial-state) to supply an SSZ encoded state + file from which to sync. + +We recommend using `--checkpoint-sync-url` on Mainnet. + +:::tip +Use the [`/eth/v2/debug/beacon/states/`](https://consensys.github.io/teku/#operation/getEthV2DebugBeaconStatesWithState_id) +API on an updated node to download a recent finalized state as an SSZ encoded state file. +::: + +Another option is to [reconstruct historical states](../how-to/reconstruct-historical-states.md). +This allows the creation of a full archive node, ensuring that once the node is +up-to-date, the concerns associated with weak subjectivity are cleared. + +## Sync outside the weak subjectivity period + +Originally, Teku's default behavior was to sync from any point in the chain without the weak +subjectivity check, including syncing all the way from the genesis of the chain. +However, this is considered unsafe. + +If you want to allow Teku to sync outside the weak subjectivity period, you can use the +[`--ignore-weak-subjectivity-period-enabled`](../reference/cli/index.md#ignore-weak-subjectivity-period-enabled) +CLI option. + +## Learn more + +See the following resources to learn more about weak subjectivity: + +- [Ethereum weak subjectivity documentation](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/weak-subjectivity/) +- [Proof of Stake: How I Learned to Love Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) +- [Exploring Ethereum 2: Weak Subjectivity Period](https://www.symphonious.net/2019/11/27/exploring-ethereum-2-weak-subjectivity-period/) diff --git a/versioned_docs/version-24.1.1/concepts/withdrawals.md b/versioned_docs/version-24.1.1/concepts/withdrawals.md new file mode 100644 index 000000000..973def0b3 --- /dev/null +++ b/versioned_docs/version-24.1.1/concepts/withdrawals.md @@ -0,0 +1,97 @@ +--- +title: Withdrawals +description: Learn about validator reward withdrawals. +sidebar_position: 8 +--- + +# Withdrawals + +Validators staking ether on Mainnet after [The Merge](merge.md), accrue two +forms of rewards: + +- Execution layer rewards paid directly to a withdrawal address (Ethereum address). +- Consensus layer rewards for performing actions each epoch. + +The +[Capella network upgrade](https://notes.ethereum.org/@launchpad/withdrawals-faq#Q-What-is-ShanghaiCapella) +implements an automated process that allows a validator's rewards to be +transferred from the consensus layer to an Ethereum address on the execution layer. +Before the Capella upgrade, consensus layer rewards were locked, and couldn't be +transferred to an Ethereum address. + +:::caution + +When you create a validator, you can set its withdrawal address to a +[BLS address](https://en.wikipedia.org/wiki/BLS_digital_signature), or an +Ethereum address. +Withdrawal keys configured as BLS keys can't have automated withdrawals executed +for them. + +You can +[update your BLS withdrawal address to an Ethereum address](../how-to/update-withdrawal-keys.md) +after the Capella upgrade. + +::: + +You don't pay gas fees for receiving reward payments. + +## Types of withdrawals + +Two types of automated withdrawals occur once the withdrawal key is set up as an +Ethereum address: [partial withdrawals](#partial-withdrawals) and +[full withdrawals](#full-withdrawals). + +### Partial withdrawals + +Partial withdrawals are for active validators that have a balance exceeding 32 ETH. +The network periodically makes transfers to the associated Ethereum address for +validators with a balance exceeding 32 ETH. +This means that a validator's balance periodically reduces to 32 ETH once +Capella becomes the active fork on the network. + +### Full withdrawals + +Full withdrawals are for validators that have exited the network, and have +waited the necessary time to withdraw their funds. +For these validators, their entire balance is returned to the Ethereum address +associated with the validator key. +The balance can't be transferred until the validator key is associated with an +Ethereum address. + +An exited validator can't become active on the network again, and currently (as +of Capella), there's no mechanism for recycling the validator ID that has been exited. + +## How it works + +From the first Capella slot, block proposers provide up to 16 withdrawals per +proposed block. + +Proposers start from validator 1, and find validators that qualify: must have an +Ethereum address as a withdrawal address, must have an excess balance, or have exited. + +Block proposers select the withdrawals that go into the block. +In each block, up to 16 changes to withdrawal credentials are also allowed, +where an owner of a validator key can +[update their withdrawal key's Ethereum address](../how-to/update-withdrawal-keys.md). +This update is retrieved from a pool, and the order isn't guaranteed. + +## Withdrawal keys + +Withdrawal keys configured as +[BLS keys](https://en.wikipedia.org/wiki/BLS_digital_signature) can't have +automated withdrawals executed for them. +Users must alter their credentials to specify an Ethereum address for their +withdrawal key. + +BLS withdrawal keys are prefixed with `0x00`, whereas Ethereum withdrawal keys +are prefixed with `0x01`. + +To determine the type of withdrawal key your validator uses, you can +[query your validator configuration onchain](../how-to/update-withdrawal-keys.md#determine-the-withdrawal-address-type). + +:::caution + +Don't store your [validator keys](../how-to/use-external-signer/manage-keys.md) and +withdrawal keys in the same location. + +::: diff --git a/versioned_docs/version-24.1.1/get-started/_category_.json b/versioned_docs/version-24.1.1/get-started/_category_.json new file mode 100644 index 000000000..ca01109a1 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Get started", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/versioned_docs/version-24.1.1/get-started/checkpoint-start.md b/versioned_docs/version-24.1.1/get-started/checkpoint-start.md new file mode 100644 index 000000000..3a13f5ef4 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/checkpoint-start.md @@ -0,0 +1,64 @@ +--- +title: Start Teku from a recent state +description: Start Teku from a recent finalized state using checkpoint sync. +sidebar_position: 4 +--- + +# Start Teku from a recent state + +To get Teku up and running in only a few minutes, start Teku from a recent finalized checkpoint +state rather than syncing from genesis. +Using a checkpoint state enables Teku to sync within the +[weak subjectivity](../concepts/weak-subjectivity.md) period. + +When starting from a recent checkpoint, Teku downloads historic chain data in the background. + +:::tip +You need access to a beacon node with [REST API enabled] (for example, Teku) to download the +finalized checkpoint state file. + +Alternatively, you can use a checkpoint state endpoint from +[this community-maintained list of checkpoint state endpoints](https://eth-clients.github.io/checkpoint-sync-endpoints/). +::: + +The following command downloads a recent finalized checkpoint state from a beacon node, and starts Teku: + +```bash +teku --eth1-endpoint=http://localhost:8545 \ +--validator-keys=/Users/me/mainnet/validator/keys:/Users/me/mainnet/validator/passwords \ +--checkpoint-sync-url=https://beaconstate.ethstaker.cc +``` + +The command uses the [`--checkpoint-sync-url`](../reference/cli/index.md#checkpoint-sync-url) option +to download the finalized checkpoint state. + +:::note +You can also download a finalized checkpoint state file, and specify the location using the +[`--initial-state`](../reference/cli/index.md#initial-state) option. +To download the file and name it `state.ssz` run: + +```bash +curl -o state.ssz -H 'Accept: application/octet-stream' http://other-node:5051/eth/v2/debug/beacon/states/finalized +``` + +And to start Teku, run: + +```bash +teku --eth1-endpoint=http://localhost:8545 \ +--validator-keys=/Users/me/mainnet/validator/keys:/Users/me/mainnet/validator/passwords \ +--initial-state=state.ssz +``` + +Another option is to use [`--initial-state`](../reference/cli/index.md#initial-state) with the URL +of the state you want to use: + +```bash +teku --eth1-endpoint=http://localhost:8545 \ +--validator-keys=/Users/me/mainnet/validator/keys:/Users/me/mainnet/validator/passwords \ +--initial-state=http://other-node:5051/eth/v2/debug/beacon/states/finalized +``` +::: + + + +[REST API enabled]: ../reference/cli/index.md#rest-api-enabled diff --git a/versioned_docs/version-24.1.1/get-started/connect/_category_.json b/versioned_docs/version-24.1.1/get-started/connect/_category_.json new file mode 100644 index 000000000..ef3ebd5ae --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/connect/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Connect to a network", + "position": 3, + "link": { + "type": "generated-index", + "slug": "/get-started/connect" + } +} diff --git a/versioned_docs/version-24.1.1/get-started/connect/mainnet.md b/versioned_docs/version-24.1.1/get-started/connect/mainnet.md new file mode 100644 index 000000000..1ed2b87ce --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/connect/mainnet.md @@ -0,0 +1,183 @@ +--- +title: Connect to Mainnet +description: Connect Teku to Ethereum Mainnet. +sidebar_position: 1 +--- + +# Connect to Mainnet + +:::info + +[The Merge](../../concepts/merge.md) was executed on **September 15, 2022**. + +Ethereum is now a [proof of stake](../../concepts/proof-of-stake.md) network, and a full Ethereum node requires both [an execution client and a consensus client](../../concepts/merge.md#execution-and-consensus-clients). + +::: + +Run Teku as a consensus client with any execution client on Ethereum Mainnet. + +If you're using [Hyperledger Besu](https://besu.hyperledger.org/en/stable/) as an execution client, you can follow the [Besu and Teku Mainnet tutorial](https://besu.hyperledger.org/en/latest/public-networks/tutorials/besu-teku-mainnet/). + +## Prerequisites + +- [Teku installed](../install/install-binaries.md). +- An execution client installed. For example, [Besu]. + +## 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Teku and the execution client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.1/src/engine/specification.md). + +## 2. Generate validator keys + +If you're running a beacon node only, skip to the +[next step](#3-start-the-execution-client). + +If you're also running a validator client, have a funded Ethereum address ready +(32 ETH and gas fees for each validator). + +Generate validator keys for one or more validators using the +[Staking Launchpad](https://launchpad.ethereum.org/en/). +Remember the passwords that you use to create the validator keys, because you +need them to [create the validator password files](#create-a-password-file-for-each-validator-key). + +### Create a password file for each validator key + +For each validator key, create a text file containing the password to decrypt the key. + +Teku allows you to specify individual keys and passwords in the command line, or you can specify directories from which to load keys and passwords. If specifying directories, password files must have the same name as the keys, but use the `.txt` extension. + +:::info + +- If the Launchpad creates a key named `keystore-m_12381_3600_0_0_0-1596485378.json`, + then the password file must be named `keystore-m_12381_3600_0_0_0-1596485378.txt`. + +- The password file format follows + [`EIP-2335`](https://eips.ethereum.org/EIPS/eip-2335#password-requirements) + requirements (UTF-8 encoded file, unicode normalization, and control code removal). + +::: + +## 3. Start the execution client + +Refer to your execution client documentation to configure and start the execution client. Make sure you specify the shared secret generated in [step 1]. + +If you're using [Besu], you can follow the [Besu and Teku Mainnet tutorial](https://besu.hyperledger.org/en/stable/public-networks/tutorials/besu-teku-mainnet/). + +## 4. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or [specify the options in a configuration file](../../how-to/configure/use-config-file.md): + +```bash +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url= +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1] using the + [`--ee-jwt-secret-file`](../../reference/cli/index.md#ee-jwt-secret-file) option. +- The URL of a checkpoint sync endpoint using the + [`--checkpoint-sync-url`](../../reference/cli/index.md#checkpoint-sync-url) option. + +Also, in the command: + +- [`--ee-endpoint`](../../reference/cli/index.md#ee-endpoint) is set to the default URL of the execution client's Engine API. +- [`--metrics-enabled`](../../reference/cli/index.md#metrics-enabled) enables the metrics exporter. +- [`--rest-api-enabled`](../../reference/cli/index.md#rest-api-enabled) enables the REST API service. + +You can modify the option values and add other [command line options](../../reference/cli/index.md) as needed. + +### Beacon node and validator client + +You can run the Teku beacon node and validator client as a [single process](#single-process) or as [separate processes](#separate-processes). + +You can check your validator status by searching your Ethereum address on the [Beacon Chain explorer](https://beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + +You can also use [Prometheus and Grafana](../../how-to/monitor/use-metrics.md) to monitor your nodes. + +#### Single process + +To run the Teku beacon node and validator client in a single process, run the following command or [specify the options in the configuration file](../../how-to/configure/use-config-file.md): + +```bash +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url= \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1] using the [`--ee-jwt-secret-file`](../../reference/cli/index.md#ee-jwt-secret-file) option. +- The URL of a checkpoint sync endpoint using the + [`--checkpoint-sync-url`](../../reference/cli/index.md#checkpoint-sync-url) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](../../reference/cli/index.md#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 2](#create-a-password-file-for-each-validator-key) for each validator using the [`--validator-keys`](../../reference/cli/index.md#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. Alternatively, specify paths to directories to load multiple keys and passwords from. + +Also, in the command: + +- [`--ee-endpoint`](../../reference/cli/index.md#ee-endpoint) is set to the default URL of the execution client's Engine API. +- [`--metrics-enabled`](../../reference/cli/index.md#metrics-enabled) enables the metrics exporter. +- [`--rest-api-enabled`](../../reference/cli/index.md#rest-api-enabled) enables the REST API service. + +You can modify the option values and add other [command line options](../../reference/cli/index.md) as needed. + +#### Separate processes + +To run the Teku beacon node and validator client as separate processes, first [start Teku as a beacon node only](#beacon-node-only). + +On a separate machine, run Teku using the [`validator-client`](../../reference/cli/subcommands/validator-client.md) subcommand: + +```bash +teku validator-client \ + --beacon-node-api-endpoint= \ + --validator-keys=:[,:,...] +``` + +Specify: + +- The location of one or more beacon node API endpoints using the [`--beacon-node-api-endpoint`](../../reference/cli/subcommands/validator-client.md#beacon-node-api-endpoint-beacon-node-api-endpoints) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 2](#create-a-password-file-for-each-validator-key) for each validator using the [`--validator-keys`](../../reference/cli/index.md#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. Alternatively, specify paths to directories to load multiple keys and passwords from. + +## 5. Wait for the clients to sync + +After starting the execution client and Teku, your node starts syncing and +connecting to peers. + +If you're running Teku as a beacon node only, you're all set. +If you're also running Teku as a validator client, ensure your clients are fully +synced before submitting your staking deposit in the next step. +Syncing the execution client can take several days. + +## 6. Stake ETH + +Stake your ETH for one or more validators using the +[Staking Launchpad](https://launchpad.ethereum.org/en/). + +You can check your validator status by searching your Ethereum address on the +[Beacon Chain explorer](https://beaconcha.in/). +It may take up to multiple days for your validator to be activated and start +proposing blocks. + + + +[Besu]: https://besu.hyperledger.org/en/stable/ +[step 1]: #1-generate-the-shared-secret diff --git a/versioned_docs/version-24.1.1/get-started/connect/testnet.md b/versioned_docs/version-24.1.1/get-started/connect/testnet.md new file mode 100644 index 000000000..a2c212710 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/connect/testnet.md @@ -0,0 +1,227 @@ +--- +title: Connect to a testnet +description: Connect Teku to a testnet. +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Connect to a testnet + +Run Teku as a consensus client with any execution client on a testnet (for example [Goerli](https://github.com/eth-clients/goerli) or +[Sepolia](https://github.com/eth-clients/sepolia). + +If you're using [Hyperledger Besu](https://besu.hyperledger.org/en/stable/) as an execution client, you can follow the +[Besu and Teku testnet tutorial](https://besu.hyperledger.org/en/latest/public-networks/tutorials/besu-teku-testnet/). + +:::note + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. You can connect your consensus client using the beacon node only, without any validator duties. + +::: + +## Prerequisites + +- [Teku installed](../install/install-binaries.md). +- An execution client installed. For example, [Besu]. + +## 1. Generate the shared secret + +Run the following command: + +```bash +openssl rand -hex 32 | tr -d "\n" > jwtsecret.hex +``` + +You will specify `jwtsecret.hex` when starting Teku and the execution client. This is a shared JWT secret the clients use to authenticate each other when using the [Engine API](https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.1/src/engine/specification.md). + +## 2. Generate validator keys + +If you're running a beacon node only, skip to the [next step](#3-start-the-execution-client). + +If you're also running a validator client, create a test Ethereum address +(you can do this in [MetaMask](https://metamask.zendesk.com/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet)). +Fund this address with testnet ETH (32 ETH and gas fees for each validator) using a faucet. +See the list of [Goerli faucets](https://github.com/eth-clients/goerli#meta-data-g%C3%B6rli) or +[Sepolia faucets](https://github.com/eth-clients/sepolia#meta-data-sepolia). + +:::note + +If you're unable to get ETH using the faucet, you can ask for help on the [EthStaker Discord](https://discord.gg/ethstaker). + +::: + +Generate validator keys for one or more validators using the [Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +Remember the passwords that you use to create the validator keys, because you +need them to [create the validator password files](#create-a-password-file-for-each-validator-key). + +### Create a password file for each validator key + +For each validator key, create a text file containing the password to decrypt the key. + +Teku allows you to specify individual keys and passwords in the command line, or you can specify directories from which to load keys and passwords. If specifying directories, password files must have the same name as the keys, but use the `.txt` extension. + +:::info + +- If the Launchpad creates a key named `keystore-m_12381_3600_0_0_0-1596485378.json`, + then the password file must be named `keystore-m_12381_3600_0_0_0-1596485378.txt`. + +- The password file format follows + [`EIP-2335`](https://eips.ethereum.org/EIPS/eip-2335#password-requirements) + requirements (UTF-8 encoded file, unicode normalization, and control code removal). + +::: + +## 3. Start the execution client + +Refer to your execution client documentation to configure and start the execution client. Make sure you specify the shared secret generated in [step 1]. + +If you're using [Besu], you can follow the [Besu and Teku testnet tutorial](https://besu.hyperledger.org/en/latest/public-networks/tutorials/besu-teku-testnet/). + +## 4. Start Teku + +Open a new terminal window. + +### Beacon node only + +To run Teku as a beacon node only (without validator duties), run the following command or [specify the options in a configuration file](../../how-to/configure/use-config-file.md): + + + + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url= +``` + + + + +```bash +teku \ + --network=sepolia \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url= +``` + + + + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1] using the + [`--ee-jwt-secret-file`](../../reference/cli/index.md#ee-jwt-secret-file) option. +- The URL of a checkpoint sync endpoint using the + [`--checkpoint-sync-url`](../../reference/cli/index.md#checkpoint-sync-url) option. + +You can modify the option values and add other [command line options](../../reference/cli/index.md) as needed. + +### Beacon node and validator client + +You can run the Teku beacon node and validator client as a [single process](#single-process) or as [separate processes](#separate-processes). + +You can check your validator status by searching your Ethereum address on the [Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). It may take up to multiple days for your validator to be activated and start proposing blocks. + +You can also use [Prometheus and Grafana](../../how-to/monitor/use-metrics.md) to monitor your nodes. + +#### Single process + +To run the Teku beacon node and validator client in a single process, run the following command or +[specify the options in the configuration file](../../how-to/configure/use-config-file.md): + + + + +```bash +teku \ + --network=goerli \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file= \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url= \ + --validators-proposer-default-fee-recipient= \ + --validator-keys=:[,:,...] +``` + + + + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + + + + +Specify: + +- The path to the `jwtsecret.hex` file generated in [step 1] using the [`--ee-jwt-secret-file`](../../reference/cli/index.md#ee-jwt-secret-file) option. +- The URL of a checkpoint sync endpoint using the + [`--checkpoint-sync-url`](../../reference/cli/index.md#checkpoint-sync-url) option. +- An Ethereum address you own as the default fee recipient using the [`--validators-proposer-default-fee-recipient`](../../reference/cli/index.md#validators-proposer-default-fee-recipient) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 2](#create-a-password-file-for-each-validator-key) for each validator using the [`--validator-keys`](../../reference/cli/index.md#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. Alternatively, specify paths to directories to load multiple keys and passwords from. + +You can modify the option values and add other [command line options](../../reference/cli/index.md) as needed. + +#### Separate processes + +To run the Teku beacon node and validator client as separate processes, first [start Teku as a beacon node only](#beacon-node-only). + +On a separate machine, run Teku using the [`validator-client`](../../reference/cli/subcommands/validator-client.md) subcommand: + + + + +```bash +teku validator-client \ + --network=goerli \ + --beacon-node-api-endpoint= \ + --validator-keys=:[,:,...] +``` + + + + +Sepolia is a permissioned network and you can't run a validator client on it without [requesting to become a validator](https://notes.ethereum.org/zvkfSmYnT0-uxwwEegbCqg) first. + + + + +Specify: + +- The location of one or more beacon node API endpoints using the [`--beacon-node-api-endpoint`](../../reference/cli/subcommands/validator-client.md#beacon-node-api-endpoint-beacon-node-api-endpoints) option. +- The paths to the keystore `.json` file and password `.txt` file created in [step 2](#create-a-password-file-for-each-validator-key) for each validator using the [`--validator-keys`](../../reference/cli/index.md#validator-keys) option. Separate the `.json` and `.txt` files with a colon, and separate entries for multiple validators with commas. Alternatively, specify paths to directories to load multiple keys and passwords from. + +## 5. Wait for the clients to sync + +After starting the execution client and Teku, your node starts syncing and +connecting to peers. + +If you're running Teku as a beacon node only, you're all set. +If you're also running Teku as a validator client, ensure your clients are fully +synced before submitting your staking deposit in the next step. +Syncing the execution client can take several days. + +## 6. Stake ETH + +Stake your testnet ETH for one or more validators using the +[Goerli Staking Launchpad](https://goerli.launchpad.ethereum.org/). + +You can check your validator status by searching your Ethereum address on the +[Goerli Beacon Chain explorer](https://goerli.beaconcha.in/). +It may take up to multiple days for your validator to be activated and start +proposing blocks. + + + +[Besu]: https://besu.hyperledger.org/en/stable/ +[step 1]: #1-generate-the-shared-secret diff --git a/versioned_docs/version-24.1.1/get-started/install/_category_.json b/versioned_docs/version-24.1.1/get-started/install/_category_.json new file mode 100644 index 000000000..9becce822 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/install/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Install Teku", + "position": 1, + "link": { + "type": "generated-index", + "slug": "/get-started/install" + } +} diff --git a/versioned_docs/version-24.1.1/get-started/install/build-from-source.md b/versioned_docs/version-24.1.1/get-started/install/build-from-source.md new file mode 100644 index 000000000..336a1503f --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/install/build-from-source.md @@ -0,0 +1,77 @@ +--- +title: Build from source +description: Build Teku from source. +sidebar_position: 2 +--- + +# Build from source + +:::caution + +If you want to use the latest development version of Teku or a specific commit, build from source. Otherwise, use the [binary] or [Docker image] for more stable versions. + +::: + +## Prerequisites + +- [Java JDK](https://www.oracle.com/java/technologies/javase-downloads.html) + +:::caution + +Teku requires Java 17+; earlier versions are not supported. + +::: + +- [Git](https://git-scm.com/downloads) or [GitHub Desktop](https://desktop.github.com/) +- [Gradle build tool](https://gradle.org/) + +## Installation on Linux / Unix / MacOS X + +### Clone the Teku repository + +Clone the `Consensys/teku` repository: + +```bash +git clone https://github.com/Consensys/teku.git +``` + +### Build Teku + +After cloning, go to the `teku` directory. + +Build Teku with the Gradle wrapper `gradlew`, as follows: + +```bash +./gradlew distTar installDist +``` + +:::note + +The command produces an expanded distribution, ready to run in `build/install/teku`, and a `.tar` distribution in `build/distribution`. + +::: + +Go to the `teku` directory: + +```bash +cd build/install/teku +``` + +Display the Teku help to confirm installation: + +```bash +bin/teku --help +``` + +:::tip + +To view the list of available Gradle tasks, run `./gradlew tasks` + +::: + +Continue with [Starting Teku](../start-teku.md). + + + +[binary]: install-binaries.md +[Docker image]: run-docker-image.md diff --git a/versioned_docs/version-24.1.1/get-started/install/install-binaries.md b/versioned_docs/version-24.1.1/get-started/install/install-binaries.md new file mode 100644 index 000000000..46f6af9fe --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/install/install-binaries.md @@ -0,0 +1,85 @@ +--- +title: Install binary distribution +description: Install Teku from binary distribution. +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Install binary distribution + +## Linux / Unix / macOS / Windows + +### Prerequisites + +- [Java JDK](https://www.oracle.com/java/technologies/javase-downloads.html) + +:::caution + +Teku requires Java 17+ to compile; earlier versions are not supported. + +::: + + + +- If using Windows, install the [Microsoft Visual C++ 2010 security update](https://www.microsoft.com/en-us/download/details.aspx?id=26999). + +### Install from packaged binaries + +Download the [Teku packaged binaries](https://github.com/ConsenSys/teku/releases). + +Unpack the downloaded files and change into the `teku-` directory. + +Display Teku command line help to confirm installation: + + + + +```bash +./bin/teku --help +``` + + + + +```bat +bin\teku --help +``` + + + + +## macOS with Homebrew + +### Prerequisites + +- [Homebrew](https://brew.sh/) +- Java JDK. + +:::caution + +Teku requires Java 17+ to run. Earlier versions are not supported. You can install Java using `brew install temurin`. Alternatively, you can manually install the [Java JDK](https://www.oracle.com/java/technologies/javase-downloads.html). + +::: + +### Install (or upgrade) using Homebrew + +To install Teku using Homebrew: + +```bash +brew tap ConsenSys/teku +brew install ConsenSys/teku/teku +``` + +To upgrade Teku using Homebrew: + +```bash +brew upgrade ConsenSys/teku/teku +``` + +To display the Teku version and confirm installation: + +```bash +teku --version +``` diff --git a/versioned_docs/version-24.1.1/get-started/install/run-docker-image.md b/versioned_docs/version-24.1.1/get-started/install/run-docker-image.md new file mode 100644 index 000000000..580ba1715 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/install/run-docker-image.md @@ -0,0 +1,203 @@ +--- +title: Run Teku from Docker +description: Run Teku using the official Docker image. +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Run Teku from a Docker image + +Use the Teku Docker image to run a node without installing Teku. + +**Prerequisites**: + +- [Docker](https://docs.docker.com/install/) + +## Run Teku Docker image + +Display the Teku command line help using the Docker image + +```bash +docker run consensys/teku:latest --help +``` + +You can specify [Teku environment variables](../../reference/cli/index.md#teku-environment-variables) with the docker image instead of the command line options. + +```bash title="Example using Environment variables and CLI options" +docker run -d -p 9000:9000/tcp -p 9000:9000/udp -p 5051:5051 -e TEKU_REST_API_ENABLED=true -e TEKU_P2P_PORT=9000 --mount type=bind,source=/Users/user1/teku/,target=/var/lib/teku consensys/teku:latest --network=goerli --eth1-endpoint=http://102.10.10.1:8545 --validator-keys=/var/lib/teku/validator/keys:/var/lib/teku/validator/passwords --data-path=/var/lib/teku --log-destination=CONSOLE +``` + +:::tip + +- If running Docker in the background, set [`--log-destination`](../../reference/cli/index.md#log-destination) to `console` to send all logs to the console and appear in Docker's log output. +- Set [`--data-path`](../../reference/cli/index.md#data-path) to a mount point to ensure Teku data is not lost in the Docker filesystem. +- [Set the Docker user to the UID of the normal user](#allow-multiple-users-to-run-the-docker-image) to ensure read/write access to the required files. + +::: + +## Allow multiple users to run the Docker image + +If using a local volume to mount data, ensure the permissions on the directory allow other users and groups to read/write. + +Use the Docker [`--user`](https://docs.docker.com/engine/reference/commandline/run/) option to run the container for the specified user. Use the UID because the username may not exist inside the docker container. + +```bash title="Example" +docker run -p 9000:9000/tcp -p 9000:9000/udp --user 1001:1001 --mount type=bind,source=/Users/user1/teku/,target=/var/lib/teku consensys/teku:latest --data-base-path=/var/lib/teku --network=goerli --eth1-endpoint=http://102.10.10.1:8545 --validator-keys=/var/lib/teku/validator/keys:/var/lib/teku/validator/passwords +``` + +## Exposing ports + +Expose ports for P2P peer discovery, metrics, and REST APIs. Expose the default ports or the ports specified using: + +- [`--metrics-port`](../../reference/cli/index.md#metrics-port) +- [`--p2p-port`](../../reference/cli/index.md#p2p-port) +- [`--p2p-advertised-port`](../../reference/cli/index.md#p2p-advertised-port) +- [`--rest-api-port`](../../reference/cli/index.md#rest-api-port). + +To run Teku exposing local ports for access: + +```bash +docker run -p :30303/tcp -p :30303/udp -p :5051 consensys/teku:latest --network= --data-base-path= --eth1-endpoint= --validator-keys=: --rest-api-enabled=true +``` + +```bash title="Example" +docker run -p 30303:30303/tcp -p 30303:30303/udp -p 5051:5051 --mount type=bind,source=/Users/user1/teku/,target=/var/lib/teku consensys/teku:latest --network=goerli --data-base-path=/var/lib/teku --eth1-endpoint=http://102.10.10.1:8545 --validator-keys=/var/lib/teku/validator/keys:/var/lib/teku/validator/passwords --rest-api-enabled=true +``` + +## Run Teku using Docker Compose + +**Prerequisites**: + +- [Docker Compose](https://docs.docker.com/compose/) + +The following `docker-compose.yml` file starts a [Hyperledger Besu] and Teku node. + +:::note + +The example assumes the validators specified in [`--validator-keys`](../../reference/cli/index.md#validator-keys) have already been registered in the deposit contract. + +::: + +Run `docker-compose up` in the directory containing the `docker-compose.yml` file to start the container. + + + + +```yaml +--- +version: "3.4" +services: + besu_node: + image: hyperledger/besu:latest + command: + [ + "--network=goerli", + "--data-path=/var/lib/besu/data", + "--host-allowlist=*", + "--sync-mode=FAST", + "--rpc-http-enabled", + "--rpc-http-cors-origins=*", + "--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3", + "--engine-jwt-secret=/var/lib/besu/data/token.txt", + "--engine-host-allowlist=*", + "--engine-rpc-enabled=true", + ] + volumes: + - ./besu:/var/lib/besu/data + ports: + # Map the p2p port(30303), RPC HTTP port(8545), and engine port (8551) + - "8545:8545" + - "8551:8551" + - "30303:30303/tcp" + - "30303:30303/udp" + + teku_node: + environment: + - "JAVA_OPTS=-Xmx4g" + image: consensys/teku:latest + command: + [ + "--network=goerli", + "--data-base-path=/var/lib/teku/data", + "--validators-proposer-default-fee-recipient=YOUR_WALLET", + "--ee-endpoint=http://besu_node:8551", + "--ee-jwt-secret-file=/var/lib/teku/data/token.txt", + "--validator-keys=/var/lib/teku/data/validator/keys:/var/lib/teku/data/validator/passwords", + "--p2p-port=9000", + "--rest-api-enabled=true", + "--rest-api-docs-enabled=true", + ] + depends_on: + - besu_node + volumes: + - ./teku:/var/lib/teku/data + ports: + # Map the p2p port(9000) and REST API port(5051) + - "9000:9000/tcp" + - "9000:9000/udp" + - "5051:5051" +``` + + + + +```yaml +--- +version: "3.4" +services: + besu_node: + image: hyperledger/besu:latest + command: + [ + "--data-path=/var/lib/besu/data", + "--host-allowlist=*", + "--rpc-http-enabled", + "--rpc-http-cors-origins=*", + "--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3", + "--engine-jwt-secret=/var/lib/besu/data/token.txt", + "--engine-host-allowlist=*", + "--engine-rpc-enabled=true", + ] + volumes: + - ./besu:/var/lib/besu/data + ports: + # Map the p2p port(30303), RPC HTTP port(8545), and engine port (8551) + - "8545:8545" + - "8551:8551" + - "30303:30303/tcp" + - "30303:30303/udp" + + teku_node: + environment: + - "JAVA_OPTS=-Xmx4g" + image: consensys/teku:latest + command: + [ + "--data-base-path=/var/lib/teku/data", + "--validators-proposer-default-fee-recipient=YOUR_WALLET", + "--ee-endpoint=http://besu_node:8551", + "--ee-jwt-secret-file=/var/lib/teku/data/token.txt", + "--validator-keys=/var/lib/teku/data/validator/keys:/var/lib/teku/data/validator/passwords", + "--p2p-port=9000", + "--rest-api-enabled=true", + "--rest-api-docs-enabled=true", + ] + depends_on: + - besu_node + volumes: + - ./teku:/var/lib/teku/data + ports: + # Map the p2p port(9000) and REST API port(5051) + - "9000:9000/tcp" + - "9000:9000/udp" + - "5051:5051" +``` + + + + + + +[Hyperledger Besu]: https://besu.hyperledger.org/en/stable/ diff --git a/versioned_docs/version-24.1.1/get-started/manage-memory.md b/versioned_docs/version-24.1.1/get-started/manage-memory.md new file mode 100644 index 000000000..6c923a9c2 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/manage-memory.md @@ -0,0 +1,79 @@ +--- +title: Manage memory +description: Manage Teku's JVM memory usage. +sidebar_position: 5 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Manage memory + +Manage Teku's Java Virtual Machine (JVM) memory usage by setting a maximum heap size using the `JAVA_OPTS` environment variable. + +We recommend setting the maximum heap size to 5GB or more. + +Set the heap size using the environment variable, or using the command line when starting Teku. + + + + +```bash +export JAVA_OPTS=-Xmx5g +``` + + + + +```bash +JAVA_OPTS=-Xmx5g ./teku [options] +``` + + + + +:::note + +The node uses more RAM to perform better if it’s available, especially during periods of non-finalization. + +::: + +## Manage the heap dump + +If an out of memory error occurs, the heap dump file is placed in the directory that Teku runs from. The heap dump file is potentially large (1-2GB), to specify the directory to place the file, set the `-XX:HeapDumpPath` Java option to the required path. + + + + +```bash +export TEKU_OPTS="-XX:HeapDumpPath=/home/me/me_node/dumps" +``` + + + + +```bash +TEKU_OPTS="-XX:HeapDumpPath=/home/me/me_node/dumps" ./teku [options] +``` + + + + +To disable the heap dump file generation, set the `-XX:-HeapDumpOnOutOfMemoryError` Java option. + + + + +```bash +export TEKU_OPTS="-XX:-HeapDumpOnOutOfMemoryError" +``` + + + + +```bash +TEKU_OPTS="-XX:-HeapDumpOnOutOfMemoryError" ./teku [options] +``` + + + diff --git a/versioned_docs/version-24.1.1/get-started/migrate-to-teku.md b/versioned_docs/version-24.1.1/get-started/migrate-to-teku.md new file mode 100644 index 000000000..fdbc64744 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/migrate-to-teku.md @@ -0,0 +1,18 @@ +--- +title: Migrate to Teku +description: Migrate to Teku from a different Ethereum consensus client. +sidebar_position: 6 +--- + +# Migrate to Teku + +Migrate from a different Ethereum consensus client to Teku to contribute to [client diversity](https://clientdiversity.org/). + +When migrating from a different client, consider the following: + +- You can [import a slashing protection database](../reference/cli/subcommands/slashing-protection.md#import). +- You might need to update your [network ports](../how-to/find-and-connect/improve-connectivity.md). +- The way Teku handles [validator keys](../reference/cli/index.md#validator-keys) might differ from your previous client. Teku also supports [using Web3Signer](../how-to/use-external-signer/use-web3signer.md). +- You can skip the long initial sync period by using Teku's [checkpoint start](checkpoint-start.md) capability. + +Find guides to switch from specific clients on the [client diversity website](https://clientdiversity.org/#switch). diff --git a/versioned_docs/version-24.1.1/get-started/start-teku.md b/versioned_docs/version-24.1.1/get-started/start-teku.md new file mode 100644 index 000000000..f90f43e82 --- /dev/null +++ b/versioned_docs/version-24.1.1/get-started/start-teku.md @@ -0,0 +1,165 @@ +--- +title: Start Teku +description: Run Teku as a beacon node and/or validator. +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Start Teku + +You can run Teku as a beacon node and validator in a single process, or as separate processes. + +We recommend you run the beacon node and validator as a [single process] if they are to run on the same machine. + +:::note + +By default, Teku connects to `mainnet`. Use the [`--network`](../reference/cli/index.md#network) command line option to specify an alternate network. + +::: + +## Prerequisites + +- [Teku installed](install/install-binaries.md). +- [An execution client synced](connect/mainnet.md#2-start-the-execution-client). +- [Validator keystores and password files](connect/mainnet.md#3-generate-validator-keys-and-stake-eth). + +## Start the clients in a single process + +Start the beacon node and validator as a single process by specifying the validator options using the [`teku`](../reference/cli/index.md#options) command. + +```bash title="Example" +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file=jwtsecret.hex \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url=https://beaconstate.ethstaker.cc \ + --validators-proposer-default-fee-recipient=0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73 \ + --validator-keys=validator/keys/validator_888eef.json:validator/passwords/validator_888eef.txt +``` + +Use the [`--validator-keys`](../reference/cli/index.md#validator-keys) option to specify the directories or files to load the encrypted keystore file(s) and associated password file(s) from. + +## Run the clients separately + +Validators must connect to a beacon node to publish attestations or propose blocks. The beacon node requires internet access, but the connected validators can run on machines without internet access. + +### Start the beacon node + +Run Teku as a beacon node. + +```bash title="Example" +teku \ + --ee-endpoint=http://localhost:8551 \ + --ee-jwt-secret-file=jwtsecret.hex \ + --metrics-enabled=true \ + --rest-api-enabled=true \ + --checkpoint-sync-url=https://beaconstate.ethstaker.cc \ +``` + +Specify [`--rest-api-enabled`](../reference/cli/index.md#rest-api-enabled) to allow validators to connect to the beacon node. + +:::caution + +Don't pass the validator keys as a command line option to both the beacon node and validator client. This can cause a [slashable offense]. + +::: + +By default, [validator clients] can connect to the beacon node at `http://127.0.0.1:5051`. Use the [`--rest-api-interface`](../reference/cli/index.md#rest-api-interface) and [`--rest-api-port`](../reference/cli/index.md#rest-api-port) options to update the address. + +You can specify [`--rest-api-host-allowlist`](../reference/cli/index.md#rest-api-host-allowlist) to allow access to the REST API from specific hostnames. + +### Start the validator + +To run a validator, connect to a [running beacon node]. + +Use the [`validator-client`](../reference/cli/subcommands/validator-client.md#validator-client-vc) or [`vc`](../reference/cli/subcommands/validator-client.md#validator-client-vc) subcommand to run a Teku as a validator. + +```title="Example" +teku validator-client \ + --beacon-node-api-endpoint=http://192.10.10.101:5051,http://192.140.110.44:5051 \ + --validator-keys=validator/keys:validator/passwords +``` + +:::warning + +Ensure that the validator keys are only provided to the validator. Don't pass the validator keys as command line options to both the beacon node and validator client. This can a cause a [slashable offense]. + +::: + +Specify one or more beacon nodes using the [`--beacon-node-api-endpoint`](../reference/cli/subcommands/validator-client.md#beacon-node-api-endpoint-beacon-node-api-endpoints) option. + +:::info + +You can supply multiple beacon node endpoints to the validator. The first one is used as the primary node, and others as failovers. + +::: + +## Confirm Teku is running + +Use the [`/liveness`](https://consensys.github.io/teku/#operation/getTekuV1AdminLiveness) endpoint to check whether the node is up. + +The endpoint returns the status `200 OK` if the node is up or syncing. + + + + +```bash +curl -I -X GET "http://192.10.10.101:5051/teku/v1/admin/liveness" +``` + + + + +```bash +HTTP/1.1 200 OK +Date: Fri, 05 Feb 2021 03:58:30 GMT +Server: Javalin +Content-Type: application/json +Cache-Control: max-age=0 +Content-Length: 0 +``` + + + + +## Exit Codes + +**Exit Code 1** + +This code indicates a scenario where Teku has exited with a fatal error; however, restarting Teku without changes is a logical step in correcting it. This code represents the error is related to something external to Teku. + +Example: If the beacon chain controller has issues starting P2P services on a particular port, the system will exit with a fatal error code of 1. This could correct itself with a restart. + +Example 2: If the migrate database command does not successfully migrate the database, Teku will exit with a code 1 fatal error. Restarting the system could correct this. + +**Exit Code 2** + +This code indicates a scenario where Teku has exited with a fatal error. Restarting Teku will not correct this. + +Note that most user configuration errors fall into this category. + +Example: If you specify an invalid database version in the migrate database command, Teku will exit with a code 2 fatal error. To correct this, make the appropriate changes to the setup and then restart Teku. + +**Usages** + +The exit codes for Teku are important to understand so that you know how to approach a restart and mitigate the issue. + +The **service unit configuration** file is an example of how status codes can be used. `RestartPreventExitStatus=` and `RestartForceExitStatus=` can be used to automatically restart Teku or stop it in case of failure. + +[systemd.service](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html) File Example +``` +RestartForceExitStatus=1 +RestartPreventExitStatus=2 +``` + + + +[validator clients]: #start-the-validator +[running beacon node]: #start-the-beacon-node +[Validator keystores]: connect/testnet.md#generate-the-validators-and-send-the-deposits +[password files]: connect/testnet.md#create-a-password-file-for-each-validator-key +[slashable offense]: ../concepts/slashing-protection.md +[single process]: #start-the-clients-in-a-single-process diff --git a/versioned_docs/version-24.1.1/how-to/configure/_category_.json b/versioned_docs/version-24.1.1/how-to/configure/_category_.json new file mode 100644 index 000000000..55df0cf5f --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/configure/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Configure", + "position": 1, + "link": { + "type": "generated-index", + "slug": "/how-to/configure" + } +} diff --git a/versioned_docs/version-24.1.1/how-to/configure/builder-network.md b/versioned_docs/version-24.1.1/how-to/configure/builder-network.md new file mode 100644 index 000000000..bb5eb9db4 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/configure/builder-network.md @@ -0,0 +1,120 @@ +--- +title: Configure Teku to use a builder network +description: Connect to a builder network to generate execution payloads. +sidebar_position: 3 +--- + +# Configure Teku to use a builder network + +You can connect to a [builder network](../../concepts/builder-network.md) to generate execution payloads for the [consensus client](../../concepts/merge.md#consensus-clients). + +The builder recommends new blocks that are validated by the consensus client. If the builder goes down, the local execution client proposes a block instead. + +To configure Teku to use a builder network: + +- [Configure Teku to use a builder network](#configure-teku-to-use-a-builder-network) + - [1. Enable blinded block production](#1-enable-blinded-block-production) + - [2. Specify the builder endpoint](#2-specify-the-builder-endpoint) + - [3. Register the validator](#3-register-the-validator) + - [Example builder configurations](#example-builder-configurations) + +## 1. Enable blinded block production + +Enable blinded block production using the [`--validators-proposer-blinded-blocks-enabled`](../../reference/cli/index.md#validators-proposer-blinded-blocks-enabled) command line option. + +:::note + +If [--validators-builder-registration-default-enabled](../../reference/cli/index.md#validators-builder-registration-default-enabled) is set to `true`, then `--validators-proposer-blinded-blocks-enabled` is automatically enabled. + +::: + +## 2. Specify the builder endpoint + +Specify the builder endpoint using the [`--builder-endpoint`](../../reference/cli/index.md#builder-endpoint) command line option. + +```bash title="Example" +--builder-endpoint="https://builder-relay-sepolia.flashbots.net/" +``` + +View the [list of relay endpoints](https://github.com/flashbots/mev-boost#usage) for available endpoints. + +You can also use external software such as [MEV-Boost](https://github.com/flashbots/mev-boost) to connect to multiple relays. + +```bash title="Example" +--builder-endpoint=http://127.0.0.1:18550 +``` + +## 3. Register the validator + +You must register your validator with the builder before proposing a block. Enable registration for all validators using the [`--validators-builder-registration-default-enabled`](../../reference/cli/index.md#validators-builder-registration-default-enabled) command line option. + +To enable registration for specific validators only, use the [`--validators-proposal-config`](../../reference/cli/index.md#validators-proposer-config) option and specify the enabled validators in the `proposer_config` field of the [proposer configuration file](use-proposer-config-file.md). + +```json title="proposerConfig.json" +{ + "proposer_config": { + "0xa057816155ad77931185101128655c0191bd0214c201ca48ed887f6c4c6adf334070efcd75140eada5ac83a92506dd7a": { + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", + "builder": { + "enabled": true, + "gas_limit": "12345654321" + } + } + }, + "default_config": { + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": false + } + } +} +``` + +In this example, validator `0xa057816...` is registered with the builder, but any validator using the default configuration isn't. + +:::note + +If you use a proposer configuration, you must enable blinded block production using [`--validators-proposer-blinded-blocks-enabled`](../../reference/cli/index.md#validators-proposer-blinded-blocks-enabled). + +::: + +## Example builder configurations + +```bash title="Validator client and beacon node in a single process" +teku \ + --validators-proposer-default-fee-recipient="0x6e35733c5af9B61374A128e6F85f553aF09ff89A" \ + --ee-endpoint="http://127.0.0.1:8551" \ + --ee-jwt-secret-file="/etc/jwt-secret.hex" \ + --validators-builder-registration-default-enabled=true \ + --builder-endpoint="http://127.0.0.1:18550" +``` + +```bash title="Validator client parameters" +teku validator-client \ + --validators-proposer-blinded-blocks-enabled=true \ + --validators-proposer-config="/etc/teku/proposerConfig.json" +``` + +```json title="Proposer configuration" +{ + "proposer_config": { + "0xa057816155ad77931185101128655c0191bd0214c201ca48ed887f6c4c6adf334070efcd75140eada5ac83a92506dd7a": { + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3" + } + }, + "default_config": { + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": true + } + } +} +``` + +```bash title="Beacon node parameters" +teku \ + --validators-proposer-default-fee-recipient="0x6e35733c5af9B61374A128e6F85f553aF09ff89A" \ + --ee-endpoint="http://127.0.0.1:8551" \ + --ee-jwt-secret-file="/etc/jwt-secret.hex" \ + --builder-endpoint="http://127.0.0.1:18550" +``` diff --git a/versioned_docs/version-24.1.1/how-to/configure/tls.md b/versioned_docs/version-24.1.1/how-to/configure/tls.md new file mode 100644 index 000000000..6d93aeb92 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/configure/tls.md @@ -0,0 +1,81 @@ +--- +title: Configure TLS +description: Configure TLS communication between Teku and Web3Signer. +sidebar_position: 4 +--- + +# Configure TLS + +You can configure TLS for communication between Teku and an external signer, for example [Web3Signer]. + +:::info + +The [Teku and Web3Signer TLS configuration tutorial] provides instructions to create the required keystores and configuration. + +::: + +## Prerequisites + +**Web3Signer prerequisites**: + +- [Password-protected PKCS12 keystore and password file]. +- [Known clients file]. + +**Teku prerequisites**: + +- [Teku's password-protected PKCS12 or JKS keystore and password file]. +- [Web3Signer's password-protected PKCS12 or JKS truststore and password file]. +- ETH1 client (for example [Hyperledger Besu]) synced to the required network. + +## Start Web3Signer + +Start Web3Signer with the TLS configuration options and specify the keystore and known clients file. + +```bash +web3signer --key-store-path=/Users/me/keyFiles/ \ +--tls-keystore-file=/Users/me/certs/web3signer_keystore.p12 \ +--tls-keystore-password-file=/Users/me/certs/web3signer_keystore_password.txt \ +--tls-known-clients-file=/Users/me/certs/knownClients.txt \ +eth2 +``` + +:::note + +[Slashing protection] is enabled by default when using the `eth2` Web3Signer subcommand. If using Web3Signer slashing protection, ensure you [configure your slashing protection database]. + +::: + +## Start Teku + +Start Teku with the external signer, keystore, and truststore details: + +```bash +teku --network=goerli \ +--eth1-endpoint=http://localhost:8545 \ +--validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b \ +--validators-external-signer-url=https://localhost:9000 \ +--validators-external-signer-truststore=/Users/me/certs/web3signer_truststore.p12 \ +--validators-external-signer-truststore-password-file=/Users/me/certs/truststore_pass.txt \ +--validators-external-signer-keystore=/Users/me/certs/teku_client_keystore.p12 \ +--validators-external-signer-keystore-password-file=/Users/me/certs/teku_keystore_password.txt +``` + +In the command: + +- Specify the JSON-RPC URL of the ETH1 node using [`--eth1-endpoint`](../../reference/cli/index.md#eth1-endpoint-eth1-endpoints). +- Specify the validator's public keys using [`--validators-external-signer-public-keys`](../../reference/cli/index.md#validators-external-signer-public-keys). +- Specify the URL of the running external signer using [`--validators-external-signer-url`](../../reference/cli/index.md#validators-external-signer-url). +- Specify the truststore and password file using [`validators-external-signer-truststore`](../../reference/cli/index.md#validators-external-signer-truststore) and [`validators-external-signer-truststore-password-file`](../../reference/cli/index.md#validators-external-signer-truststore-password-file). +- Specify the keystore and password file using [`validators-external-signer-keystore`](../../reference/cli/index.md#validators-external-signer-keystore) and [`validators-external-signer-keystore-password-file`](../../reference/cli/index.md#validators-external-signer-keystore-password-file). + + + +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[Teku and Web3Signer TLS configuration tutorial]: ../../tutorials/configure-external-signer-tls.md +[Password-protected PKCS12 keystore and password file]: ../../tutorials/configure-external-signer-tls.md#web3signer-keystore-and-password-file +[Known clients file]: ../../tutorials/configure-external-signer-tls.md#3-create-the-known-clients-file +[Teku's password-protected PKCS12 or JKS keystore and password file]: ../../tutorials/configure-external-signer-tls.md#teku-keystore-and-password-file +[Web3Signer's password-protected PKCS12 or JKS truststore and password file]: ../../tutorials/configure-external-signer-tls.md#2-create-the-truststore-and-password-file +[Hyperledger Besu]: https://besu.hyperledger.org/stable/public-networks/get-started/install +[Slashing protection]: https://docs.web3signer.consensys.net/en/latest/concepts/slashing-protection/ +[configure your slashing protection database]: https://docs.web3signer.consensys.net/en/latest/HowTo/Configure-Slashing-Protection/ diff --git a/versioned_docs/version-24.1.1/how-to/configure/use-config-file.md b/versioned_docs/version-24.1.1/how-to/configure/use-config-file.md new file mode 100644 index 000000000..c16c0db24 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/configure/use-config-file.md @@ -0,0 +1,60 @@ +--- +title: Use a configuration file +description: Specify options in the Teku configuration file. +sidebar_position: 1 +--- + +# Use the Teku configuration file + +To specify command line options in a file, use a YAML configuration file. + +To specify the configuration file, use the [`--config-file`](../../reference/cli/index.md#config-file) option. + +To override an option specified in the configuration file, either specify the same option on the command line or as an [environment variable](../../reference/cli/index.md#teku-environment-variables). For options specified in more than one place, the order of precedence is command line, environment variable, configuration file. + +## YAML specification + +The configuration file must be a valid YAML file composed of key/value pairs. Each key is the corresponding command line option name without the leading dashes (`--`). + +Values must conform to YAML specifications for strings, numbers, arrays, and booleans. Specific differences between the command line and the YAML file format are: + +- Comma-separated lists on the command line are string arrays in the YAML file. +- Enclose all string values (including but not limited to file paths, hexadecimal numbers, URLs) in quotes. + +:::tip + +The [command line reference](../../reference/cli/index.md) includes configuration file examples for each option. + +::: + +```yaml title="Sample YAML configuration file" +# network +network: "goerli" + +# p2p +p2p-enabled: true +p2p-port: 9000 + +# validators +validator-keys: "/Users/me/node/goerli/validator/keys:/Users/me/node/goerli/validator/passwords" +validators-graffiti: "Teku validator" + +# Eth 1 +eth1-endpoint: "http://localhost:8545" + +# metrics +metrics-enabled: true +metrics-categories: ["BEACON", "LIBP2P", "NETWORK"] + +# database +data-path: "/Users/me/tekudata" +data-storage-mode: "archive" + +# rest api +rest-api-port: 5051 +rest-api-docs-enabled: true +rest-api-enabled: true + +# logging +log-include-validator-duties-enabled: true +``` diff --git a/versioned_docs/version-24.1.1/how-to/configure/use-proposer-config-file.md b/versioned_docs/version-24.1.1/how-to/configure/use-proposer-config-file.md new file mode 100644 index 000000000..d7370ff98 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/configure/use-proposer-config-file.md @@ -0,0 +1,220 @@ +--- +title: Use a proposer configuration file +description: Define complex fee recipients in a proposer configuration file. +sidebar_position: 2 +--- + +# Use a proposer configuration file + +You can define complex fee recipient and [builder network](builder-network.md) configurations for multiple validators using a proposer configuration file. Specify the proposer configuration file using the [`--validators-proposer-config`](../../reference/cli/index.md#validators-proposer-config) command line option. + +:::note + +To define a single default fee recipient for all validator keys, use the [`--validators-proposer-default-fee-recipient`](../../reference/cli/index.md#validators-proposer-default-fee-recipient) option instead. + +::: + +## Proposer configuration file attributes + +The proposer configuration file is a JSON file that specifies: + +- `default_config` - (required) A default proposer configuration containing all default values to be applied to every validator. These values can be overridden for specific validators in `proposer_config`. +- `proposer_config` - (optional) A proposer configuration for multiple validator public keys. + +Attributes for each proposer configuration are: + +- `fee_recipient` - (optional in `proposer_config` but required in `default_config`) The fee recipient to use when proposing blocks. +- `builder` - (optional) The [builder network configuration](builder-network.md), which includes the following attributes: + - `enabled` - (optional in `proposer_config` but required in `default_config`) Indicates whether to use the [builder endpoint](../../reference/cli/index.md#builder-endpoint) when proposing blocks. The default is `false`. + - `gas_limit` - (optional) Gas limit for the builder. The default is `30000000`. + - `registration_overrides` - (optional) Dedicated overrides to use during the registration process. Useful for distributed validator technology (DVT) and secret shared validator (SSV) technology. The override is specified using the following attributes: + - `timestamp` - (optional) Timestamp to be used (instead of the current time) in the validator registration message. + - `public_key` - (optional in `proposer_config` but forbidden in `default_config`) Public key to be used (instead of the validator's public key) in the validator registration message. + +Each attribute value, for a given validator key, is determined using the following priority: + +1. Specific configuration in `proposer_config` +2. Default configuration in `default_config` +3. Default CLI argument (applicable only to `builder.enabled`) +4. Default value (applicable only to `builder.enabled`) + +```json title="Example configuration file" +{ + "proposer_config": { + "0xa057816155ad77931185101128655c0191bd0214c201ca48ed887f6c4c6adf334070efcd75140eada5ac83a92506dd7a": { + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", + "builder": { + "enabled": true, + "gas_limit": "35000000" + } + }, + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c": { + "builder": { + "enabled": true + } + } + }, + "default_config": { + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": false, + "gas_limit": "25000000" + } + } +} +``` + +In this example, validator `0xa0578...` is configured as: + +```json +"fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", +"builder": { + "enabled": true, + "gas_limit": "35000000" +} +``` + +Validator `0xa99a7...` is configured as: + +```json +"fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", +"builder": { + "enabled": true, + "gas_limit": "25000000" +} +``` + +All other validators are configured as: + +```json +"fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", +"builder": { + "enabled": false, + "gas_limit": "25000000" +} +``` + +## Example configuration file and CLI argument + +The following is an example proposer configuration in conjunction with a CLI argument. + +```json +{ + "proposer_config": { + "0xa057816155ad77931185101128655c0191bd0214c201ca48ed887f6c4c6adf334070efcd75140eada5ac83a92506dd7a": { + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", + "builder": { + "gas_limit": "35000000" + } + }, + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c": { + "builder": { + "enabled": false + } + } + }, + "default_config": { + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A" + } +} +``` + +If [`--validators-builder-registration-default-enabled`](../../reference/cli/index.md#validators-builder-registration-default-enabled) is set to `true`: + +- Validator `0xa0578...` is configured as: + + ```json + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", + "builder": { + "enabled": true, + "gas_limit": "35000000" + } + ``` + +- Validator `0xa99a7...` is configured as: + + ```json + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A" + "builder": { + "enabled": false, + "gas_limit": "30000000" + } + ``` + +- All other validators are configured as: + + ```json + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": true, + "gas_limit": "30000000" + } + ``` + +If [`--validators-builder-registration-default-enabled`](../../reference/cli/index.md#validators-builder-registration-default-enabled) isn't specified (or set to `false`): + +- Validator `0xa0578...` is configured as: + + ```json + "fee_recipient": "0x50155530FCE8a85ec7055A5F8b2bE214B3DaeFd3", + "builder": { + "enabled": false, + "gas_limit": "35000000" + } + ``` + +- Validator `0xa99a7...` is configured as: + + ```json + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": false, + "gas_limit": "30000000" + } + ``` + +- All other validators are configured as: + + ```json + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": false, + "gas_limit": "30000000" + } + ``` + +## Example configuration file using DVT and SSV + +The following is a proposer configuration example using distributed validator technology (DVT) and secret shared validator (SSV) technology. + +```json +{ + "proposer_config": { + "0xa057816155ad77931185101128655c0191bd0214c201ca48ed887f6c4c6adf334070efcd75140eada5ac83a92506dd7a": { + "builder": { + "registration_overrides": { + "public_key": "0xaef9162ee6f29ee82fbfe387756d84f9ac472eb8709217aaf28f5ef0ea273f6210e531496470b30d2b7747216e3672d5" + } + } + }, + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c": { + "builder": { + "registration_overrides": { + "public_key": "0xb53d21a4cfd562c469cc81514d4ce5a6b577d8403d32a394dc265dd190b47fa9f829fdd7963afdf972e5e77854051f6f" + } + } + } + }, + "default_config": { + "fee_recipient": "0x6e35733c5af9B61374A128e6F85f553aF09ff89A", + "builder": { + "enabled": true, + "registration_overrides": { + "timestamp": "1669285248" + } + } + } +} +``` + +In this example, the builder is enabled by default, with `timestamp` registration override. Each validator has its own `public_key` override. All validators use the same `0x6e35733c5af9B61374A128e6F85f553aF09ff89A` as `fee_recipient`. diff --git a/versioned_docs/version-24.1.1/how-to/enable-doppelganger-detection.md b/versioned_docs/version-24.1.1/how-to/enable-doppelganger-detection.md new file mode 100644 index 000000000..3ec4cfb6f --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/enable-doppelganger-detection.md @@ -0,0 +1,83 @@ +--- +title: Enable doppelganger detection +description: Check if your validators' keys are already active. +sidebar_position: 7 +--- + +# Enable doppelganger detection + +Doppelganger detection checks if the validators' keys are already active before scheduling any of their duties (the validators stay inactive for at most two epochs). This can help prevent slashing offences. + +When enabled, doppelganger detection is triggered from two entry points: + +1. At [validator client startup](../get-started/start-teku.md#start-teku): If at least one doppelganger is detected, the validator client shuts down after it finishes the check. +2. When importing keys via the [key manager API](https://ethereum.github.io/keymanager-APIs/): Any detected doppelganger's keys are ignored (not imported). The other keys are imported and the validators start performing their duties after it finishes the check. + +:::warning + +Doppelganger detection is imperfect and might fail to detect doppelgangers. Use this as a last resort option that might prevent validators from being slashed. + +::: + +## Enable doppelganger detection + +Enable doppelganger detection by setting the +[`--doppelganger-detection-enabled`](../reference/cli/index.md#doppelganger-detection-enabled) +option to `true`. + +Your validator client must be connected to a beacon node with validator liveness tracking enabled. +Enable validator liveness tracking by setting the [`--beacon-liveness-tracking-enabled`](../reference/cli/index.md#beacon-liveness-tracking-enabled) option to `true`. + +## Side effects + +Doppelganger detection runs until one of the following occurs: + +- All the loaded keys are detected as active. +- The check runs for two epochs. + +This means that the validators being checked are inactive for at most two epochs. + +:::warning + +Keeping the validators inactive might cause: + +- Missed attestations. +- Missed sync committee contributions. +- Missed block proposals. + +These side effects result in penalties and missed rewards. + +::: + +You might still consider these side effects a worthwhile trade-off of doppelganger detection, since it can prevent slashing. + +## Logs + +When running, doppelganger detection prints various logs. + +```bash title="Example startup logs" +Starting doppelganger detection for public keys: b28ab22, c2bab15, cd26f5e +``` + +```bash title="Example logs when a check is performed (every 12 seconds)" +Performing doppelganger check. Epoch 148220, Public keys b28ab22, c2bab15, cd26f5e +``` + +```bash title="Example logs when a doppelganger is detected" +Detected 2 validators doppelganger: +Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 +``` + +```bash title="Example logs: list of detected doppelgangers" +Detected 5 validators doppelganger: + Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 + Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 + Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 + Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 + Index: xxxxxx, Public key: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005 +``` + +```bash title="Example logs when doppelganger detection ends" +Doppelganger detection check finished. Stopping doppelganger detection for public keys b28ab22, c2bab15, cd26f5e +``` diff --git a/versioned_docs/version-24.1.1/how-to/find-and-connect/_category_.json b/versioned_docs/version-24.1.1/how-to/find-and-connect/_category_.json new file mode 100644 index 000000000..98bebf6b5 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/find-and-connect/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Find and connect to peers", + "position": 3, + "link": { + "type": "generated-index", + "slug": "how-to/find-and-connect" + } +} diff --git a/versioned_docs/version-24.1.1/how-to/find-and-connect/improve-connectivity.md b/versioned_docs/version-24.1.1/how-to/find-and-connect/improve-connectivity.md new file mode 100644 index 000000000..bb2a595ae --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/find-and-connect/improve-connectivity.md @@ -0,0 +1,43 @@ +--- +title: Improve peer-to-peer connectivity +description: Update your network configuration to improve peer counts. +sidebar_position: 1 +--- + +# Improve peer-to-peer connectivity + +The consensus layer relies on peer-to-peer (P2P) networking. By having a good peer count you increase the performance and health of your node. When a Teku node starts up, it looks for participants on the P2P network by listening for incoming connections, and finds and connects to peers. + +While Teku is good at finding peers, changes to your network configuration can help improve your peer count. + +## Advertise your public IP address + +If you are using a NAT, it's easier to get peers by advertising your public address to the network. Use the [`--p2p-advertised-ip`](../../reference/cli/index.md#p2p-advertised-ip) option to advertise the address publicly. + +Additionally, if on a home network, [configure port forwarding](#configuring-ports) on your router. + +:::tip + +Check the [`ip4.me`](http://ip4.me/) website to view your public IP address. + +::: + +## Configure ports + +By default, Teku listens for connections on port `9000` for TCP and UDP. You can configure the port number with the [`--p2p-port`](../../reference/cli/index.md#p2p-port) option. + +Configure port forwarding on your router and firewall to allow incoming and outgoing connections on the listening port for the TCP and UDP protocols. + +View your router or firewall documentation to configure port-forwarding. + +## Check readiness with a peer count + +Check the readiness of your node by using the [`get node readiness` API](https://consensys.github.io/teku/#operation/getTekuV1AdminReadiness). This check helps to prevent a beacon from receiving traffic from validators while the node is not being connected to enough peers. + +You can specify a number in the `target_peer_count` parameter to require a minimum number of peers before the node is considered ready. + +:::note + +Make sure to [enable the REST API service](../../reference/rest.md#enable-the-rest-api-service). + +::: diff --git a/versioned_docs/version-24.1.1/how-to/find-and-connect/specify-nat.md b/versioned_docs/version-24.1.1/how-to/find-and-connect/specify-nat.md new file mode 100644 index 000000000..1f4eb2d48 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/find-and-connect/specify-nat.md @@ -0,0 +1,29 @@ +--- +title: Specify NAT methods +description: Specify the method for handling NAT environments. +sidebar_position: 2 +--- + +# Specify NAT methods + +Use the [`--p2p-nat-method`](../../reference/cli/index.md#p2p-nat-method) option to specify the NAT method. Options are [`NONE`](#none) and [`UPNP`](#upnp). + +You cannot change the NAT method while Teku is running. To change the NAT method restart the node with the [`--p2p-nat-method`](../../reference/cli/index.md#p2p-nat-method) option. + +## UPnP + +Specify `UPNP` to quickly allow inbound peer connections without manual router configuration. Use UPnP in home or small office environments where a wireless router or modem provides NAT isolation. + +UPnP automatically detects if a node is running in a UPnP environment and provides port forwarding. UPnP might introduce delays during node startup, especially on networks without a UPnP gateway device. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, you must explicitly enable UPnP support. + +::: + +## None + +Specify `NONE` to explicitly configure the external IP address and ports advertised using [`--p2p-advertised-ip`](../../reference/cli/index.md#p2p-advertised-ip) and [`--p2p-advertised-port`](../../reference/cli/index.md#p2p-advertised-port) for the P2P service. + +Manually configure your firewall to allow external hosts to create inbound connections to Teku. diff --git a/versioned_docs/version-24.1.1/how-to/load-validators-without-restarting.md b/versioned_docs/version-24.1.1/how-to/load-validators-without-restarting.md new file mode 100644 index 000000000..b02385784 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/load-validators-without-restarting.md @@ -0,0 +1,31 @@ +--- +title: Load validators without restarting +description: Load validators without restarting Teku. +sidebar_position: 5 +--- + +# Load validators without restarting Teku + +You can load validators into a running Teku process, only if you started Teku by: + +- Specifying a directory using [`--validator-keys`](../reference/cli/index.md#validator-keys), or +- Specifying a URL using [`--validators-external-signer-public-keys`](../reference/cli/index.md#validators-external-signer-public-keys). + +:::caution + +- If you started Teku by specifying individual validator key files or external signer public keys, then you must restart Teku. +- You must restart Teku to remove validators. + +::: + +**Prerequisites:** + +- Add the new validators to the directory specified in [`--validator-keys`](../reference/cli/index.md#validator-keys), or ensure the URL supplied in [`--validators-external-signer-public-keys`](../reference/cli/index.md#validators-external-signer-public-keys) contains the new public keys. + +To load the validators in a running Teku instance, send a `SIGHUP` signal to the Teku process. + +```bash +kill -HUP +``` + +Where `` is the process ID of the running Teku instance. diff --git a/versioned_docs/version-24.1.1/how-to/migrate-database.md b/versioned_docs/version-24.1.1/how-to/migrate-database.md new file mode 100644 index 000000000..a6b519290 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/migrate-database.md @@ -0,0 +1,101 @@ +--- +title: Migrate the database +description: Migrate a RocksDB database to a LevelDB2 database. +sidebar_position: 12 +--- + +# Migrate the database + +As of v21.5.0, new Teku installations use a LevelDB2 database. Previous Teku versions use RocksDB which continues to be supported. + +LevelDB2 databases use less memory and proves to be more stable with Teku. + +:::caution + +We recommend Teku nodes running in [archive mode] use the [automatic migration](#automatic-migration) method, and Teku nodes running in [prune mode] use the [manual migration](#manual-migration). + +::: + +## Automatic migration + +Teku nodes running in [archive mode] must resynchronize from genesis to migrate from RocksDB to LevelDB2. Use the [`migrate-database`](../reference/cli/subcommands/migrate-database.md) subcommand to migrate the database. Once migration completes there will be two databases in Teku's data folder. Manually verify that Teku starts and has the expected data before you remove the RocksDB database. + +:::note + +You need double the disk space of the existing Teku storage folder for the migration process. Once you are satisfied with the migration then you can delete the RocksDB to free up space. + +::: + +Ensure that Teku isn't running when using the [`migrate-database`](../reference/cli/subcommands/migrate-database.md) subcommand. The duration of the migration depends on various factors, but principally on the disk speed. Status updates display during the migration process. To migrate the database: + +1. Shut down the local Teku instance. + +2. Run [`migrate-database`](../reference/cli/subcommands/migrate-database.md) to create a LevelDB2 database. Pass your [configuration file](configure/use-config-file.md) or CLI options so that Teku has the correct paths and context. + + ```bash title="Example" + teku migrate-database --data-path /etc/teku/data/ + ``` + + At a minimum, provide the [`--network`](../reference/cli/subcommands/migrate-database.md#network) and [`--data-path`](../reference/cli/subcommands/migrate-database.md#network) options. + + :::note + + If not supplied [`--network`](../reference/cli/subcommands/migrate-database.md#network) defaults to `mainnet`. + + ::: + +3. The migration process informs you if it succeeded, or provides context to errors. If successful, then confirm Teku functions correctly. + + ```bash title="Example" + teku --data-path /etc/teku/data/ + ``` + +4. If Teku is running correctly, remove the `beacon.old` directory from the [`--data-path`](../reference/cli/subcommands/migrate-database.md#network) directory. + +If migration fails, resolve any issues and retry. Contact support on the [Teku Discord channel] if you need help resolving issues. + +## Manual migration + +Users can manually migrate Teku nodes running a RocksDB database to a LevelDB2 database if the Teku node runs in [prune mode]. + +:::caution + +Teku nodes running in [archive mode] must resynchronize from genesis to migrate. Use the [automatic migration](#automatic-migration) to migrate Teku nodes running in [archive mode]. + +::: + +To migrate a RocksDB database in [prune mode] to a LevelDB2 database: + +1. [Download the latest finalized state] from a beacon node: + + ```bash + curl -o state.ssz -H 'Accept: application/octet-stream' http://other-node:5051/eth/v2/debug/beacon/states/finalized + ``` + + :::note + + This step is optional, you can also [supply the finalized checkpoint state] via URL from a beacon chain node or Infura when restarting Teku in the step below. + + ::: + +2. Stop the Teku node you intend to migrate. + +3. Delete the `beacon` directory in your [data path](../reference/cli/index.md#data-base-path-data-path). + + :::warning + + Ensure not to delete the `validator` directory if one is present as this contains your slashing protection data. + + ::: + +4. Restart Teku and specify the downloaded finalized state using the [`--initial-state`](../reference/cli/index.md#initial-state) command. + +Teku creates a LevelDB2 database, and starts from the specified recent state. Teku should be in sync and validating within minutes. + + + +[Download the latest finalized state]: https://consensys.github.io/teku/#operation/getEthV1DebugBeaconStatesWithState_id +[prune mode]: ../reference/cli/index.md#data-storage-mode +[archive mode]: ../reference/cli/index.md#data-storage-mode +[supply the finalized checkpoint state]: ../get-started/checkpoint-start.md +[Teku Discord channel]: https://discord.com/invite/consensys diff --git a/versioned_docs/version-24.1.1/how-to/monitor/_category_.json b/versioned_docs/version-24.1.1/how-to/monitor/_category_.json new file mode 100644 index 000000000..6d6009299 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/monitor/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Monitor nodes", + "position": 4, + "link": { + "type": "generated-index", + "slug": "/how-to/monitor" + } +} diff --git a/versioned_docs/version-24.1.1/how-to/monitor/configure-logging.md b/versioned_docs/version-24.1.1/how-to/monitor/configure-logging.md new file mode 100644 index 000000000..b718e8e7e --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/monitor/configure-logging.md @@ -0,0 +1,87 @@ +--- +title: Configure logging +description: Configure Teku's log level settings and log formatting. +sidebar_position: 2 +--- + +# Configure logging + +Teku uses Log4J2 for logging, and provides multiple methods to configure logging behavior: + +- [Basic](#basic-log-level-settings) - changes the log level. +- [Destination logging](#configure-log-destination) - configures the destination for log output. +- [Custom logging](#advanced-custom-logging) - custom logging to configure the output and format of the logs. + +The default log directory is OS dependent: + +- macOS: `~/Library/teku/logs` +- Unix/Linux: `$XDG_DATA_HOME/teku/logs` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku/logs` +- Windows: `%localappdata%\teku\logs` + +The default Docker image location is `/root/.local/share/teku/logs`. + +## Basic log level settings + +Use the [`--logging`](../../reference/cli/index.md#logging) command line option to specify logging verbosity. The [`--logging`](../../reference/cli/index.md#logging) option changes the volume of events displayed in the log. Valid log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. The default level is `INFO`. + +By default most logging output is sent to the log file, and limited content shown on the console. + +:::tip + +Use the [`log_level`](https://consensys.github.io/teku/#operation/putTekuV1AdminLog_level) API method to change the log level while Teku is running. + +::: + +Additional logging options include: + +- [`--log-color-enabled`](../../reference/cli/index.md#log-color-enabled) displays status and event log messages in different colors on the console +- [`--log-include-events-enabled`](../../reference/cli/index.md#log-include-events-enabled) logs frequent update events. For example, every slot event with validators and attestations. +- [`--log-include-validator-duties-enabled`](../../reference/cli/index.md#log-include-validator-duties-enabled) logs details of validator event duties. + +## Configure log destination + +Use the [`--log-destination`](../../reference/cli/index.md#log-destination) command line option to specify where to output log information. Valid options are `BOTH`, `CONSOLE`, `DEFAULT_BOTH`, `FILE`. Defaults to `DEFAULT_BOTH`. + +When using `BOTH` or `DEFAULT_BOTH`, system updates such as blockchain events are displayed on the console, and errors and other information are logged to a file. Specify the log file with the [`--log-file`](../../reference/cli/index.md#log-file) command-line option. + +Use `DEFAULT_BOTH` when using a [custom Log4J2 configuration file](#advanced-custom-logging). Any other option applies the custom logging changes on top of its default settings. + +:::note + +For production systems we recommend using the `CONSOLE` or `FILE` options to ensure all log information is available in one place. + +::: + +## Advanced custom logging + +You can provide your own logging configuration using the standard Log4J2 configuration mechanisms. + +```xml title="debug.xml" + + + + INFO + + + + + + + + + + + + + +``` + +To use your custom configuration, set the environment variable `LOG4J_CONFIGURATION_FILE` to the location of your configuration file, and ensure [`--log-destination`](../../reference/cli/index.md#log-destination) is not set to `DEFAULT_BOTH`. + +If you have more specific requirements, you can create your own [log4j2 configuration](https://logging.apache.org/log4j/2.x/manual/configuration.html). + +For Bash-based executions, you can set the variable for only the scope of the program execution by setting it before starting Teku. + +```bash title="Example" +LOG4J_CONFIGURATION_FILE=./debug.xml teku [OPTIONS] +``` diff --git a/versioned_docs/version-24.1.1/how-to/monitor/use-metrics.md b/versioned_docs/version-24.1.1/how-to/monitor/use-metrics.md new file mode 100644 index 000000000..50f055363 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/monitor/use-metrics.md @@ -0,0 +1,98 @@ +--- +title: Use metrics +description: Use metrics to monitor Teku's performance. +sidebar_position: 1 +--- + +# Use metrics to monitor performance + +Enable the [Prometheus](https://prometheus.io/) monitoring and alerting service for Teku metrics using the [`--metrics-enabled`](../../reference/cli/index.md#metrics-enabled) option. + +## Install Prometheus + +To use Prometheus with Teku, install the [Prometheus main component](https://prometheus.io/download/). On MacOS, install with [Homebrew](https://formulae.brew.sh/formula/prometheus): + +```bash +brew install prometheus +``` + +## Setting up and running Prometheus with Teku + +To configure Prometheus and run with Teku: + +1. Configure Prometheus to poll Teku. For example, add the following YAML fragment to the `scrape_configs` block of the `prometheus.yml` file: + + ```yaml title="Example configuration" + global: + scrape_interval: 15s + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "teku-dev" + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: ["localhost:8008"] + ``` + +2. Start Teku with the [`--metrics-enabled`](../../reference/cli/index.md#metrics-enabled) option. To start a node for testing with metrics enabled: + + ```bash + teku --eth1-deposit-contract-address=dddddddddddddddddddddddddddddddddddddddd \ + --eth1-endpoint=http://localhost:8545 --validators-key-file=validator_keys \ + --p2p-port=9000 --rest-api-enabled=true --rest-api-docs-enabled=true \ + --metrics-enabled=true --metrics-categories=BEACON,PROCESS,LIBP2P,JVM,NETWORK,PROCESS + ``` + + :::warning + + To avoid DNS rebinding attacks, if running Prometheus on a different host to your Teku node (any host other than `localhost`), ensure you add the hostname that Prometheus uses to connect to Teku to [`--metrics-host-allowlist`](../../reference/cli/index.md#metrics-host-allowlist). + + For example, if Prometheus is configured to get metrics from `http://teku.local:8008/metrics` then `teku.local` has to be in `--metrics-host-allowlist`. + + ::: + + To specify the host and port on which Prometheus accesses Teku, use the [`--metrics-interface`](../../reference/cli/index.md#metrics-interface) and [`--metrics-port`](../../reference/cli/index.md#metrics-port) options. The default host and port are 127.0.0.1 and 8008. + +3. In another terminal, run Prometheus specifying the `prometheus.yml` file: + + ```bash + prometheus --config.file=prometheus.yml + ``` + +4. View the [Prometheus graphical interface](#view-prometheus-graphical-interface). + +:::tip + +Use a log ingestion tool, such as Logstash, to parse the logs and alert you to configured anomalies. + +::: + +## View Prometheus graphical interface + +1. Open a web browser to `http://localhost:9090` to view the Prometheus graphical interface. + +2. Choose **Graph** from the menu bar and click the **Console** tab below. + +3. From the **Insert metric at cursor** drop-down, select a metric such as `libp2p_peers` or `beacon_finalized_epoch` and click **Execute**. The values display. + + :::note + + The available metrics are prefixed with the category type specified using [`--metrics-categories`](../../reference/cli/index.md#metrics-categories). + + The [Beacon Chain metrics] lists the minimum set of metrics implemented by beacon nodes. + + ::: + +Click the **Graph** tab to view the data as a time-based graph. The query string displays below the graph. + +## Visualize collected data + +Use [Grafana] to visualize the collected data. See the sample [Teku Grafana dashboard](https://grafana.com/grafana/dashboards/13457). + + + +[Beacon Chain metrics]: https://github.com/ethereum/beacon-metrics/blob/master/metrics.md +[Grafana]: https://grafana.com/docs/grafana/latest/guides/getting_started/ diff --git a/versioned_docs/version-24.1.1/how-to/prevent-slashing.md b/versioned_docs/version-24.1.1/how-to/prevent-slashing.md new file mode 100644 index 000000000..3c77aa68f --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/prevent-slashing.md @@ -0,0 +1,60 @@ +--- +title: Prevent slashing offenses +description: Use slashing protection to prevent validator slashing offenses. +sidebar_position: 6 +--- + +# Slashing protection + +Teku implements [slashing protection] to prevent validators from signing incorrect blocks or attestations. + +You can import and export the slashing protection file when migrating validator keys between validator clients. Teku supports the [validator client interchange format] when importing or exporting the slashing protection file. + +:::note + +If using an external signer that implements its own slashing protection (for example [Web3Signer]), then you can disable Teku's built-in slashing protection using the [`--validators-external-signer-slashing-protection-enabled`](../reference/cli/index.md#validators-external-signer-slashing-protection-enabled) command line option. + +::: + +:::tip + +You can also [enable doppelganger detection](enable-doppelganger-detection.md) to help prevent slashing. This is an early access feature. + +::: + +## Import a slashing protection file + +When importing the slashing protection file, Teku imports the file to the `/validators/slashprotection/` directory in the format `.yml` (with no 0x prefix). + +```bash title="Example" +teku slashing-protection import --data-path=/home/me/me_node --from=/home/slash/slashing-interchange-format.json +``` + +In the command line: + +- [`--data-path`](../reference/cli/subcommands/slashing-protection.md#data-path) specifies the location of the Teku `data` directory. +- [`--from`](../reference/cli/subcommands/slashing-protection.md#from) specifies the location of the slashing protection file. + +In this example, Teku imports the file to the `/home/me/me_node/data/validators/slashprotection/` directory. + +## Export a slashing protection file + +Export the slashing protection file when migrating a validator to a different Teku, or non-Teku node. + +```bash title="Example" +teku slashing-protection export --data-path=/home/me/me_node --to=/home/slash/slashing-interchange-format-minimal.json +``` + +In the command line: + +- [`--data-path`](../reference/cli/subcommands/slashing-protection.md#data-path_1) specifies the location of the Teku `data` directory. +- [`--to`](../reference/cli/subcommands/slashing-protection.md#to) specifies the file to export the slashing protection data to. + +You can now import the slashing protection file in a Teku, or non-Teku node. + + + +[slashing protection]: ../concepts/slashing-protection.md +[data path directory when starting Teku]: ../reference/cli/index.md#data-path +[validator client interchange format]: https://eips.ethereum.org/EIPS/eip-3076 +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ diff --git a/versioned_docs/version-24.1.1/how-to/reconstruct-historical-states.md b/versioned_docs/version-24.1.1/how-to/reconstruct-historical-states.md new file mode 100644 index 000000000..f1ac1c39e --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/reconstruct-historical-states.md @@ -0,0 +1,24 @@ +--- +title: Reconstruct historical states +description: Reconstruct historical states on an archive node. +sidebar_position: 11 +--- + +# Reconstruct historical states + +An archive node can reconstruct historical states from genesis up to the current +checkpoint, running during startup. +This allows you to create a full archive node while also using checkpoint sync. +Generating states this way is faster as many validations can be safely skipped. +It also avoids [weak subjectivity concerns](../concepts/weak-subjectivity.md). + +## Configuration + +To configure Teku to reconstruct historical states, set +[`--reconstruct-historic-states`](../reference/cli/index.md#reconstruct-historic-states) +to `true` and +[`--data-storage-mode`](../reference/cli/index.md#data-storage-mode) to +`"archive"`. + +You can also set [`--genesis-state`](../reference/cli/index.md#genesis-state). +Otherwise, network defaults are used (such as Mainnet defaults). diff --git a/versioned_docs/version-24.1.1/how-to/troubleshoot/_category_.json b/versioned_docs/version-24.1.1/how-to/troubleshoot/_category_.json new file mode 100644 index 000000000..5e289ac65 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/troubleshoot/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Troubleshoot", + "position": 4, + "link": { + "type": "generated-index", + "slug": "/how-to/troubleshoot" + } +} diff --git a/versioned_docs/version-24.1.1/how-to/troubleshoot/general.md b/versioned_docs/version-24.1.1/how-to/troubleshoot/general.md new file mode 100644 index 000000000..1ea709f13 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/troubleshoot/general.md @@ -0,0 +1,150 @@ +--- +description: Solve common problems encountered with Teku. +sidebar_position: 14 +--- + +# General issues + +## Out of memory error + +If Teku exits with a `java.lang.OutOfMemoryError: Java heap space` error, it could mean that Teku's Java Virtual Machine (JVM) ran out of memory. + +To fix this, you can try [setting a maximum heap size]. + +## P2P port conflicts + +If Teku fails to start with a `P2P Port 9000 (TCP/UDP) is already in use. Check for other processes using this port.` error, it means that Teku is trying to use a network port that is already in use. + +For example, Teku and Lighthouse both use port 9000 by default for P2P traffic. You can change Teku's default port number with the [`--p2p-port`](../../reference/cli/index.md#p2p-port) option. + +## Unable to lock a keystore file + +If Teku fails to start with an `Unexpected error when trying to lock a keystore file` error, this could be because the directory containing the keystores is not writable by Teku. + +Teku uses a file locking mechanism for the keystores to prevent two validator clients using the same keystores at the same time. + +To resolve this issue, try the one of the following: + +- Set the permissions of the directory holding the keystores so that it is writable by Teku. +- Set [`--validators-keystore-locking-enabled`](../../reference/cli/index.md#validators-keystore-locking-enabled) to `false` to disable the locking functionality. + +:::warning + +Ensure no other process or clients are using your keys. If they are, you could get [slashed]. + +::: + +## Keystore file already in use + +If Teku fails to start with a `Keystore file .lock already in use.` error, this could mean the keystore file is already being used by a validator client, or Teku has exited unexpectedly and did not remove the lock. + +Teku uses a file locking mechanism for the keystores to prevent two validator clients using the same keystores at the same time. + +To resolve this issue, try the one of the following: + +- Manually remove the lock files that are created alongside your keystore files, with `.lock` appended to the filename. Take care not to delete your keystores. +- Set [`--validators-keystore-locking-enabled`](../../reference/cli/index.md#validators-keystore-locking-enabled) to `false` to disable the locking functionality. + +:::warning + +Ensure no other process or clients are using your keys. If they are, you could get [slashed]. + +::: + +## Keystore files are loading slowly + +Teku supports `scrypt` or `pbkdf2` formatted keystores. Both keystore formats are supported by [EIP-2335]. + +The `scrypt` formatted keystores load slower and require more memory to load, whereas `pbkdf2` formatted keystores load instantly. + +The `scrypt` formatted keystores are more secure because they require more resources to crack. To improve the loading times of your keystores, you can convert them to the `pbkdf2` format. + +## Unable to read YAML configuration + +If Teku fails to start with the following: + +``` +Unable to read yaml configuration. Invalid yaml file [config.yaml]: +java.io.CharConversionException: Invalid UTF-8 start byte 0x93 (at char #11, byte #-1) at [Source: (File); line: 1, column: 1] +``` + +This could mean that the word processor has inserted smart quotes instead of straight quotes. Use straight quotes only. + +## Validators not making attestations + +Check whether your validator's attestations are being included in blocks at [`BeaconCha.in`](https://beaconcha.in/). + +:::note + +Occasional missed attestations are normal on a P2P network, but they should be a few percent. + +::: + +If all recent attestations are marked as missed, check the following: + +- **Did the validators load correctly?** + + Check the logs when Teku started for the line, `teku-status-log | Loaded N Validators: [, ]`, where `N` is the number of expected validators. Each validator's truncated public key is also listed. + + If the validator did not load, check for any errors loading the validator, and that the [`--validators-keys`](../../reference/cli/index.md#validators-keys) option is correct. + +- **Is the beacon node still syncing?** + + Validators can only attest when the beacon node is in sync. If you see lines similar to, + + `teku-event-log | Syncing *** Target slot: 2017218, Head slot: 123456, Remaining slots: 2015500, Connecting peers: 12`, then the node is still syncing. + + Syncing is complete when the head slot reaches the current slot. If the node is synced, the messages are similar to, `teku-event-log | Slot Event *** Slot: 716614, Block: acef76..c61b, Epoch: 22394...`. + +- **Is the beacon node reporting attestations?** + + Each validator that you run prints the message, `teku-validator-log | Validator *** Published attestation Count: 1, Slot: 48539, Root: 5e1bf5..cee8` once each epoch. If you do not see this for your validator then check that it loaded correctly. + + To see this message, ensure [`log-include-validator-duties-enabled`](../../reference/cli/index.md#log-include-validator-duties-enabled) is `true`. + +- **Do you have peers?** + + The nodes's peer count is printed at the end of each slot event in the log. [Ensure your local network is configured correctly] to allow the node to listen for incoming P2P connections and discover peers. + +## UnsatisfiedLinkError when starting Teku + +If Teku fails to start with the following error: + +```bash +Teku failed to start. +java.util.concurrent.CompletionException: java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni8697586722914603821.so... +``` + +This could be due to your `/tmp` directory being marked non-executable (`noexec`). + +To resolve this, try one of the following: + +- Remove `noexec` on the `/tmp` mount. This can be done permanently in the file systems table (`fstab`), or temporarily using the command `sudo mount /tmp -o remount,exec` + +- Create a new temporary folder for applications to use within the shell. + + ```bash + mkdir tmp + export TMPDIR=`pwd`/tmp + ``` + +## Command line options + +On Linux, shell processing of paths do not work when specified like this: + +```bash +./teku --config-file=~/config.yaml +``` + +The shell does not see the tilde (~) in the command. To fix this, omit the equals sign (=). + +```bash +./teku --config-file ~/config.yaml +``` + + + +[Ensure your local network is configured correctly]: ../find-and-connect/improve-connectivity.md +[EIP-2335]: https://eips.ethereum.org/EIPS/eip-2335 +[slashed]: ../../concepts/slashing-protection.md +[setting a maximum heap size]: ../../get-started/manage-memory.md diff --git a/versioned_docs/version-24.1.1/how-to/troubleshoot/network.md b/versioned_docs/version-24.1.1/how-to/troubleshoot/network.md new file mode 100644 index 000000000..04a2668a2 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/troubleshoot/network.md @@ -0,0 +1,184 @@ +--- +description: Solve common networking problems encountered with Teku. +sidebar_position: 15 +--- + +# Network issues + +## Speed up sync time + +Use [checkpoint sync](../../get-started/checkpoint-start.md) to sync Teku from a recent finalized checkpoint, bypassing +the need to sync from genesis and enabling a quick synchronization process within minutes. To do this, use the +[`--initial-state`](../../reference/cli/index.md#initial-state) CLI option which accepts a URL or file that provides a recent +finalized `BeaconState`. Any synchronized beacon node can provide this from the standard API, and you can view +[the list of public sources](https://eth-clients.github.io/checkpoint-sync-endpoints/). + +The [`--initial-state`](../../reference/cli/index.md#initial-state) option is only used when you first create a database. To +restart an existing sync process with checkpoint sync, do the following: + +- Stop the current Teku sync process +- Delete the `beacon` directory under your [data path](../../reference/cli/index.md#data-base-path-data-path) +- Start teku with the [`--initial-state`](../../reference/cli/index.md#initial-state) option + + +Teku will sync within a few minutes, and downloads historic blocks in the background, so it can +help any peers that are syncing from genesis. Teku can run validators and attest while while historic blocks are being downloaded. + +## Locate the multiaddress and/or ENR of a Teku beacon node + +Teku outputs its Ethereum Name Record (ENR) to the logs at startup. You can also access the info via the API: + +```bash +curl "http://127.0.0.1:5051/eth/v1/node/identity" | jq +``` + +You can decode the ENR by using the [ENR Viewer website](https://enr-viewer.com/). + +## Resolve peering issues + +### Peer connection issues + +By default, Teku attempts to get 100 peers. You can increase the number of peers to improve performance, but this does +lead to increased network traffic and a higher number of messages requiring validation. + +Teku's attempt to connect with peers is influenced by two CLI options: [`--p2p-peer-lower-bound`](../../reference/cli/index.md#p2p-peer-lower-bound) (default is 64) +and [`--p2p-peer-upper-bound`](../../reference/cli/index.md#p2p-peer-upper-bound) (default is 100). If you notice a +decline in your beacon node's participation after reducing these parameters, consider increasing them to enhance performance. + + +### Firewall connection issues + +To determine the number of inbound and outbound peers via the beacon node's REST API, you can send a request to the peers +endpoint. This gathers data and organizes it based on the direction, either inbound or outbound. + +```bash +curl http://127.0.0.1:5051/eth/v1/node/peers |jq '.data | group_by(.direction)[] | {direction: .[0].direction, count: length}' +``` + +If only outbound peers are displayed, it indicates that peers cannot connect to your infrastructure from the outside. +Networks typically have a firewall at the entry point (router / modem / gateway) that blocks incoming data by default. + +To resolve this, update the firewall to include a rule that allows access to the [`--p2p-port`](../../reference/cli/index.md#p2p-port) (9000 by default) +for both `UDP` and `TCP` traffic. Subsequently, forward this port (TCP and UDP) to the internal IP address of the machine running the +beacon node. Some operating systems also have local firewalls that should be updated to permit communication through this port. + +:::info + +View the [Prysm guide](https://docs.prylabs.network/docs/prysm-usage/p2p-host-ip/) for more information on this topic, but you need to substitute your `--p2p-port` (9000 by default) for the port numbers. + +::: + +### Advertised IP address issues + +A possible reason for incoming peers being unable to connect could be an incorrect address specified using the +[`--p2p-advertised-ip`](../../reference/cli/index.md#p2p-advertised-ip) option. Teku auto-detects the address to use by +default, so most users won't need to use this option. If you're experiencing issues with incoming peers despite having +correct firewall and forwarding settings, this could potentially be the cause. + + +### Network gateway issues + +A potential reason for incoming peers not being able to connect could be the use of a different port on your network +gateway (router or modem). +This usually happens because only one service can listen on a port. Therefore, if you're running multiple beacon nodes, you'll +need to open multiple ports on your gateway. The simplest solution is to use the same port on your gateway as specified +in your [`--p2p-port`](../../reference/cli/index.md#p2p-port) (9000 by default). However, if necessary, users can also +update the advertised port using the [`--p2p-advertised-port`](../../reference/cli/index.md#p2p-advertised-port) command. + +## Resolve poor attestation performance + +Troubleshooting poor attestation performance is complicated, and the solution requires you to identify the root cause. + +[This video](https://www.symphonious.net/2020/09/08/exploring-eth2-attestation-inclusion/) is a little old, but the general picture is still relevant. + +Common issues include: + +* **The CPU is overloaded and Teku is lagging**. Monitor CPU stats, and watch the terminal for frequent `regenerating state` + messages, common during Teku's struggle. In this context, enabling [`--p2p-subscribe-all-subnets`](../../reference/cli/index.md#p2p-subscribe-all-subnets-enabled) can worsen the situation by raising CPU usage. A typical problem arises when JVM lacks adequate heap allocation, causing + aggressive garbage collection. Ensure an environment variable like `JAVA_OPTS=-Xmx5g` is set, with + `5g` (five gigabytes of heap) as an optimal value; `4g` is acceptable, while anything much lower may lead to problems. + +* **Time sync on your server is poor**. Ensure `ntpd` or `chrony` is configured correctly. + +* **Low numbers of peers, or poor quality peers**. Refer to the [peering troubleshooting topic](#how-many-peers-do-i-need-or-other-peering-issues) + for more information to resolve this. + +* **Poor internet speed**. An example is someone was on an ADSL link with only about 2.5 Mbps upstream which led to + misses, typically anything over 10 Mbps upstream is acceptable. + + +## Address missing attestations or non-inclusion issues + +* No peers might have been present on the attestation subnet. Check for a log message when attempting to + publish without subscribed peers: `Failed to publish ... for slot ... due to missing peers on the required gossip topic`. +* Several factors could contribute, such as delayed blocks past your inclusion slot causing ripple effects. Thus, examining + epochs where your attestation was scheduled and checking for late block import warnings would be beneficial. +* Also, consider specific times of day and concurrent network activities. It's possible that message transmission could + be hindered by factors like bandwidth limitations. + +## Invalid signer public key configuration + +You may see log error messages similar to: + +```bash +Caused by: java.lang.IllegalArgumentException: Expected 48 bytes but received 58. +``` + +This arises if `validators-external-signer-public-keys` is in the config file without proper quotation for public keys. +In YAML, `0x` prefixed values are treated as numbers, leading the parser to convert them to an unexpected binary format +in Teku. Previous Teku versions had a YAML parser that didn't perform this conversion, making both quoted and unquoted +forms functional. + +**Incorrect:** +```yaml +validators-external-signer-public-keys: + - 0x8f9335f7d6b19469d5c8880df50bf41c01f476411d5b69a8b121255347f1c0b8400ba31a63010b229080240589ad2423 + - 0xb3f3faa8dfa1030714559b95cb0107e53c9ee9c6f2b4b11f29e60417dbc4462052ff2d2dbbe98d808e3093858a3acdcc + - 0xb2f1e6c00c6716d4cd5cb02b42678ff481e3ae1525cdfc33e4a1711eeb2878da10ebeacdcdc2ef2049410fc60fe5cfe5 + - 0xb7d6cb9ce7397c33b89ec57de0de383c7c294687b8963f92cc60f59bb1de46c56623cd24c9cc1e407db92d1a79920887 + - 0xaf3eab6962987321bdf81e7a10239b91316c643cca64babe81d68e9f9030a6a7b91681168df5a02a9ac3433b8332a712 +``` + +**Correct:** +```yaml +validators-external-signer-public-keys: + - "0x8f9335f7d6b19469d5c8880df50bf41c01f476411d5b69a8b121255347f1c0b8400ba31a63010b229080240589ad2423" + - "0xb3f3faa8dfa1030714559b95cb0107e53c9ee9c6f2b4b11f29e60417dbc4462052ff2d2dbbe98d808e3093858a3acdcc" + - "0xb2f1e6c00c6716d4cd5cb02b42678ff481e3ae1525cdfc33e4a1711eeb2878da10ebeacdcdc2ef2049410fc60fe5cfe5" + - "0xb7d6cb9ce7397c33b89ec57de0de383c7c294687b8963f92cc60f59bb1de46c56623cd24c9cc1e407db92d1a79920887" + - "0xaf3eab6962987321bdf81e7a10239b91316c643cca64babe81d68e9f9030a6a7b91681168df5a02a9ac3433b8332a712" +``` + +## Teku crashes with SIGILL + +The BLST library might erroneously use the optimized library version instead of the portable one. This could stem from CPU +auto-detection errors, in which case, obtaining the CPU details from `/proc/cpuinfo` on Linux or `/usr/sbin/sysctl -a` on macOS +will help us to improve it. Alternatively, users might have intentionally set BLST to optimal. + +You can specifically request the portable version of BLST (overriding CPU detection) with the following: + +```bash +JAVA_OPTS="-Dteku.portableBlst=true" +``` + +If the user has already set `-Dteku.portableBlst=false` it should be changed to `true`. + +## Force Teku to use the optimized BLST library + +Check the Teku logs at startup for `Using optimized BLST library` if it was able to detect a compatible CPU, or +`Using portable BLST library` if it could not. + +You can force Teku to use the optimized version by setting the environment variable `TEKU_OPTS="-Dteku.portableBlst=false"`. +If you're already setting `TEKU_OPTS` or `JAVA_OPTS`, append `-Dteku.portableBlst=false` to the existing variable. If +you use the optimized library on a CPU that doesn't support it, Teku will crash with a `SIGILL`, in which case you should +switch back to the portable version (`TEKU_OPTS="-Dteku.portableBlst=true"`). + +## Configure an archive node + +Set [`--data-storage-mode`](../../reference/cli/index.md#data-storage-mode) to `archive`, and provide an +[`--initial-state`](../../reference/cli/index.md#initial-state), you can also use +[`--reconstruct-historic-states`](../../reference/cli/index.md#reconstruct-historic-states) to rebuild +all the old states once blocks have been downloaded. + +It will take a while to build up the node, but you'll be able to access all state an block information back to genesis +after it is completed. diff --git a/versioned_docs/version-24.1.1/how-to/update-withdrawal-keys.md b/versioned_docs/version-24.1.1/how-to/update-withdrawal-keys.md new file mode 100644 index 000000000..f1659fdfa --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/update-withdrawal-keys.md @@ -0,0 +1,121 @@ +--- +title: Update your withdrawal credentials +description: Update your BLS withdrawal address to an Ethereum address. +sidebar_position: 12 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Update your withdrawal credentials + +When you create a validator, it’s possible to set its +[withdrawal](../concepts/withdrawals.md) address to a BLS address, or an +Ethereum address. + +You can update your BLS withdrawal address to an Ethereum address after the +Capella upgrade. + +## Determine the withdrawal address type + +**Prerequisites**: + +- Access to the beacon node API endpoint. + The default is `localhost:5051`. +- [`curl`](https://curl.se/) and [`jq`](https://stedolan.github.io/jq/) installed. + +The following shell script allows you to determine the withdrawal address of a +given validator ID. + + + + +```bash +VALIDATOR= \ +curl http://localhost:5051/eth/v1/beacon/states/finalized/validators/$VALIDATOR | jq '.data | .validator.withdrawal_credentials' +``` + + + +``` +"0x00fc40352b0a186d83267fc1342ec5da49dbb78e1099a4bd8db16d2c0d223594" +``` + + + + +In the script, specify the `` (for example, `1`) that was +provided when you joined the network. +Alternatively, you can specify the validator's public key. + +In the output, the first four characters of the string, in this case `0x00`, +indicates the key is a BLS withdrawal key. + +## Update your withdrawal address + +:::caution + +Don't store your [validator keys](use-external-signer/manage-keys.md) and withdrawal +keys in the same location. + +::: + +### From a BLS withdrawal address to an Ethereum address + +:::caution + +Teku doesn't offer functionality to create a signed withdrawal credential change. +Tools such as +[`staking-deposit-cli`](https://github.com/ethereum/staking-deposit-cli#generate-bls-to-execution-change-arguments) +allow you to generate this signed message, which can be submitted directly to +your beacon node if your REST API is active. + +::: + +If your withdrawal address is a BLS key (starts with `0x00`), the Capella fork +provides a process to update your withdrawal address to a `0x01` withdrawal key +(Ethereum address). +You must have the BLS withdrawal address private key, or the seed phrase +(mnemonic) to sign the request to prove that you have access to the BLS +withdrawal key. + +Tools such as +[`staking-deposit-cli`](https://github.com/ethereum/staking-deposit-cli#generate-bls-to-execution-change-arguments) or [`ethdo`](https://github.com/wealdtech/ethdo/blob/master/docs/changingwithdrawalcredentials.md) can sign the request correctly. You can then submit the signed withdrawal credential change to your own beacon node using the [`bls_to_execution_changes`](https://consensys.github.io/teku/#tag/Beacon/operation/postBlsToExecutionChange) API, or broadcast it using [`beaconcha.in`](https://beaconcha.in/tools/broadcast). + +:::caution Important information about changing withdrawal credentials + +- Once you update a validator to use a `0x01` withdrawal key (Ethereum address), + you can't change it again. +- Updating your withdrawal credentials isn't available until the Capella fork is + active. +- Ensure you update to the expected Ethereum address because the change is permanent. + +::: + +A maximum of 16 validator keys can update their withdrawal credentials per +block, so the process may be congested initially. +If you submit a request to update your key, and it hasn't been done in a period +of time, you might consider re-submitting the request. +It might take several epochs for the change to be included in a block, depending +on the number of requests in the queue. + +Query the +[`bls_to_execution_changes`](https://consensys.github.io/teku/#tag/Beacon/operation/getBlsToExecutionChanges) +API see if your request is still in the pool. + +### Update your Ethereum address + +If your withdrawal credentials are set to an Ethereum address, and you wish to +update it to a different address, you must create a new validator key. +You can exit your current validator key as a voluntary exit, and use the funds +from the full withdrawal of that to create the new validator key. + +The voluntary exit process takes while to complete, and the exiting validator +must remain active during that time to avoid inactivity penalties. + +:::caution + +Ensure that you own the current Ethereum address before exiting, otherwise you +can't access your funds. + +::: diff --git a/versioned_docs/version-24.1.1/how-to/use-external-signer/_category_.json b/versioned_docs/version-24.1.1/how-to/use-external-signer/_category_.json new file mode 100644 index 000000000..2a9c96b97 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/use-external-signer/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Use an external signer", + "position": 2, + "link": { + "type": "generated-index", + "slug": "/how-to/use-external-signer" + } +} diff --git a/versioned_docs/version-24.1.1/how-to/use-external-signer/manage-keys.md b/versioned_docs/version-24.1.1/how-to/use-external-signer/manage-keys.md new file mode 100644 index 000000000..e01b83148 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/use-external-signer/manage-keys.md @@ -0,0 +1,147 @@ +--- +title: Manage validator signing keys +description: Manage validator keys using the key manager API endpoints. +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Manage validator signing keys + +You can manage the signing keys of validators using the +[key manager API endpoints](https://ethereum.github.io/keymanager-APIs/). +You can list keys, import keystores, and delete keys with the API. + +## Enable validator client API + +To use the key manager API endpoints, +[enable the validator client API](../../reference/rest.md#enable-the-validator-client-api) +using the [`--validator-api-enabled`](../../reference/cli/index.md#validator-api-enabled) +option. +You must also [create a keystore](#create-a-keystore) to enable access. + +### Create a keystore + +When enabling the validator client API, you must create a keystore. + +1. Use a tool such as + [keytool](https://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html) + or [openSSL](https://www.openssl.org/) to generate a keystore. + Note that the `CN` value must be set to the domain name or IP used to access + the validator API. + Keytool sets this based on the answer to `What is your first and last name?`. + + + + + ```bash + keytool -genkeypair -keystore -storetype PKCS12 -storepass + ``` + + + + + ```bash + keytool -genkeypair -keystore validator_keystore.p12 -storetype PKCS12 -storepass changeit + ``` + + + + +2. Create a plain text file (for example, `validator_keystore_pass.txt`) that + stores the password you defined in the keystore. + +3. Start Teku using + [`--validator-api-keystore-file`](../../reference/cli/index.md#validator-api-keystore-file) + to define the keystore file and + [`--validator-api-keystore-password-file`](../../reference/cli/index.md#validator-api-keystore-password-file) + to define the password file. + + ```bash title="Example" + teku --validator-api-enabled --validator-api-keystore-file=validator_keystore.p12 --validator-api-keystore-password-file=validator_keystore_pass.txt + ``` + +:::caution + +Don't store your validator keys and +[withdrawal keys](../../concepts/withdrawals.md#withdrawal-keys) in the same +location. + +::: + +#### Support multiple domains and IPs + +When the key manager API is accessible using different domain names or IP +addresses, each domain or IP must be listed in the SSL certificate to be +accepted as valid. +Multiple addresses can be specified when using openSSL to generate the certificate. + +1. Create a file named `openssl.cnf` containing the configuration required for + the certificate. + + ```ini title="openssl.cnf" + [req] + distinguished_name = req_distinguished_name + x509_extensions = v3_req + prompt = no + + [req_distinguished_name] + countryName = US + stateOrProvinceName = CA + localityName = San Francisco + organizationName = My Organization Name + organizationalUnitName = My Department Name + + [v3_req] + subjectKeyIdentifier = hash + authorityKeyIdentifier = keyid,issuer + basicConstraints = CA:TRUE + subjectAltName = @alt_names + + [alt_names] + DNS.1 = mydomain.com + DNS.2 = localhost + IP.1 = 127.0.0.1 + IP.2 = 10.0.0.6 + ``` + + You should adjust the `req_distinguised_name` and `alt_names` sections to + match your needs. + +2. Create a plain text file (for example, `validator_keystore_pass.txt`) that + stores the password you defined in the keystore. + +3. Generate an x509 certificate from the configuration and convert it to PKCS12 + format: + + + + + ```bash + openssl req -x509 -nodes -days -newkey rsa:2048 -config openssl.cnf | openssl pkcs12 -export -out -passout file: + ``` + + + + + ```bash + openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -config openssl.cnf | openssl pkcs12 -export -out validator_keystore.p12 -passout file:validator_keystore_pass.txt + ``` + + + + +### Authentication + +Authentication verifies user access to requested validator client methods. + +Upon startup of the validator client, Teku creates an API token at the path +`/opt/teku/data/validator/key-manager`. +When calling an endpoint that requires authorization, you must send the +generated token in the `Authorization` request header field with the `Bearer` +authentication scheme. + +```bash title="Example" +curl -H "Authorization: Bearer " -X GET https://localhost:5052/eth/v1/keystores +``` diff --git a/versioned_docs/version-24.1.1/how-to/use-external-signer/use-web3signer.md b/versioned_docs/version-24.1.1/how-to/use-external-signer/use-web3signer.md new file mode 100644 index 000000000..11105336d --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/use-external-signer/use-web3signer.md @@ -0,0 +1,42 @@ +--- +title: Use Web3Signer +description: Use the Web3Signer external signing client. +sidebar_position: 1 +--- + +# Use Web3Signer + +Teku supports the [Web3Signer] external signing client. + +**Prerequisites**: + +- Web3Signer installed and running. +- [Signing key configuration files]. + +## Start Teku + +Start Teku and specify the external signer options. + +```bash +teku --network=goerli \ +--eth1-endpoint=http://localhost:8545 \ +--validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b \ +--validators-external-signer-url=http://localhost:9000 +``` + +The command line: + +- Specifies the validator public keys for which Web3Signer signs attestations and blocks using [`--validators-external-signer-public-keys`](../../reference/cli/index.md#validators-external-signer-public-keys). +- Specifies the URL of the Web3Signer client using [`--validators-external-signer-url`](../../reference/cli/index.md#validators-external-signer-url). + +:::note + +You need a [signing key configuration file] for each public key specified using [`--validators-external-signer-public-keys`](../../reference/cli/index.md#validators-external-signer-public-keys). + +::: + + + +[Web3Signer]: https://docs.web3signer.consensys.net/ +[Signing key configuration files]: https://docs.web3signer.consensys.net/HowTo/Use-Signing-Keys/ +[signing key configuration file]: https://docs.web3signer.consensys.net/en/latest/HowTo/Use-Signing-Keys/ diff --git a/versioned_docs/version-24.1.1/how-to/use-rewards-api.md b/versioned_docs/version-24.1.1/how-to/use-rewards-api.md new file mode 100644 index 000000000..35ff96b07 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/use-rewards-api.md @@ -0,0 +1,149 @@ +--- +description: Use the rewards API to view validator rewards. +sidebar_position: 13 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# View block rewards + +Use the [rewards API](https://consensys.github.io/teku/#tag/Rewards) to view the validator rewards. + +:::note + +You cannot query attestation rewards for the latest epoch. + +::: + +Enable the rewards API with the [`--rest-api-enabled`](../reference/cli/index.md#rest-api-enabled) command line option. + +:::tip + +A [Swagger interface is also available](../reference/rest.md#enable-the-rest-api-service). Use the [`--rest-api-docs-enabled`](../reference/cli/index.md#rest-api-docs-enabled) command line option to enable the web interface. + +::: + +## Limitations + +The following limitations apply: + +- The rewards API currently supports the `altair` fork upgrade and later. + +- The rewards API relies on state and block data to retrieve the reward information, meaning you'll receive limited data if the beacon node being queried is not an archive node. + +- You can only query blocks from finalized to head if you are in `prune` storage mode. + +## Impact of data storage modes + +:::tip + +You can change the [`data-storage-mode`](../reference/cli/index.md#data-storage-mode) without re-initializing your database. + +You can change the frequency that states are stored by specifying [`data-storage-archive-frequency`](../reference/cli#data-storage-archive-frequency), but it will only affect the state storage from the time that the change has been made. It will also directly impact the amount of disk space required by Teku. + +::: + +Consider using a beacon node with `archive` mode storage if you frequently call the rewards API on finalized data. However, this may produce slow results due to having to replay blocks due to the infrequent storage of states on disk (every 2048 slots by default). + +You can consider tuning your data storage to access data quicker, by storing more states (at the cost of disk space), for example, [setting the archive frequency](../reference/cli/index.md#data-storage-archive-frequency) to `256` or even `64`, and replaying less blocks. + +## Examples + +Query all the rewards from the block currently at head. + + + + +```bash +curl http://localhost:5051/eth/v1/beacon/rewards/blocks/head |jq +``` + + + + +```json +{ + "execution_optimistic": false, + "finalized": false, + "data": { + "proposer_index": "555552", + "total": "1217168", + "attestations": "0", + "sync_aggregate": "1217168", + "proposer_slashings": "0", + "attester_slashings": "0" + } +} +``` + + + + +Query all the sync committee rewards from the block at head for validator index 1. + + + + +```bash +curl -X POST \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + http://localhost:5051/eth/v1/beacon/rewards/sync_committee/head \ + -d '["1"]' |jq +``` + + + + +```json +{ + "execution_optimistic": false, + "finalized": false, + "data": [ + { + "validator_index": "1", + "reward": "16778" + } + ] +} +``` + + + + +Query attestation rewards from epoch 204644, just for validator index 0. + + + + +```bash +curl -X POST \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + http://localhost:5051/eth/v1/beacon/rewards/attestations/204648 \ + -d '["0"]' |jq +``` + + + + +```json + { + "execution_optimistic": false, + "finalized": true, + "data": { + "ideal_rewards": [...], + "total_rewards": [ + { + "validator_index": "0", + "head": "3125", + "target": "6005", + "source": "3236" + } + ] + } +} +``` + + \ No newline at end of file diff --git a/versioned_docs/version-24.1.1/how-to/use-sentry-nodes.md b/versioned_docs/version-24.1.1/how-to/use-sentry-nodes.md new file mode 100644 index 000000000..b839d6411 --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/use-sentry-nodes.md @@ -0,0 +1,74 @@ +--- +title: Use sentry beacon nodes +description: Mitigate DoS attacks by using sentry nodes. +sidebar_position: 9 +--- + +# Use sentry beacon nodes + +You can calculate future block proposers ahead of time, which opens up an attack vector. +A DoS attack on a validator's beacon node can cause the validator to miss its block proposal, thereby losing the block proposal reward. +You can mitigate this issue by using sentry nodes. + +:::info + +Only [validators executed separately](../get-started/start-teku.md#run-the-clients-separately) from beacon nodes (remote validators) can use sentry nodes + +::: + +When you configure your remote validator to use sentry beacon nodes, each beacon node (or cluster of beacon nodes) can be assigned a role. Each role determines which beacon node the remote validator sends request to when performing a task. + +Sentry nodes support three roles: + +- `duties_provider` - Beacon node used for requesting attestations and block duties. +- `block_handler` - Beacon node used for block creation and publishing. +- `attestation_publisher` - Beacon node used for publishing attestations. + +Only the `duties_provider` role is mandatory. You can assign multiple beacon node endpoints for each role. + +## Configure sentry nodes + +:::info + +The CLI option `--sentry-config-file=` cannot be used with [`--beacon-node-api-endpoint`](../reference/cli/subcommands/validator-client.md#beacon-node-api-endpoint). + +::: + +Configure your sentry nodes in a JSON configuration file. To configure your remote validator to use the sentry node configuration, use the `--sentry-config-file=` CLI option. + +The configuration file (in this example, `/etc/sentry-node-config.json`) uses the following format: + +```json +{ + "beacon_nodes": { + "duties_provider": { + "endpoints": ["http://duties:9051"] + }, + "block_handler": { + "endpoints": ["http://block:9051"] + }, + "attestation_publisher": { + "endpoints": ["http://attestation:9051"] + } + } +} +``` + +Start your remote validator with the `--sentry-config-file` option, for example: + +```bash +teku validator --sentry-config-file=/etc/sentry-node-config.json +``` + +During startup the logs display output similar to: + +```bash +... +DEBUG | SentryNodesConfigLoader | 2022-10-03 01:31:48.260 INFO - Loading sentry nodes configuration from /etc/sentry-node-config.json +DEBUG | SentryNodesConfigLoader | 2022-10-03 01:31:48.277 INFO - Duty provider beacon nodes: http://duties:9051 +DEBUG | SentryNodesConfigLoader | 2022-10-03 01:31:48.277 INFO - Block handler beacon nodes: http://block:9051 +DEBUG | SentryNodesConfigLoader | 2022-10-03 01:31:48.278 INFO - Attestation publisher beacon nodes: http://attestation:9051 +... +``` + +At this point, the remote validator knows what beacon nodes should be used for its tasks and no further configuration is required. diff --git a/versioned_docs/version-24.1.1/how-to/voluntarily-exit.md b/versioned_docs/version-24.1.1/how-to/voluntarily-exit.md new file mode 100644 index 000000000..f81ad959e --- /dev/null +++ b/versioned_docs/version-24.1.1/how-to/voluntarily-exit.md @@ -0,0 +1,53 @@ +--- +title: Voluntarily exit +description: Voluntarily exit a validator from the Beacon Chain. +sidebar_position: 10 +--- + +# Voluntarily exit a validator + +A voluntary exit is when a validator chooses to stop performing its duties, and exits the Beacon Chain permanently. + +To voluntarily exit, the validator must continue performing its validator duties until successfully exited to avoid penalties. + +:::caution + +To voluntarily exit, you must have a running beacon node with the [REST API enabled]. + +::: + +:::warning + +A validator **cannot** rejoin the network once it voluntarily exits. You can set up a new validator with the withdrawn funds. + +::: + +## Initiate a voluntary exit + +Use the [`voluntary-exit`](../reference/cli/subcommands/voluntary-exit.md) subcommand to initiate a voluntary exit for specified validators. + +```bash title="Example" +teku voluntary-exit --beacon-node-api-endpoint=http://127.0.0.1:5051 \ +--validator-keys=validator/keys/validator_1e9f2a.json:validator/passwords/validator_1e9f2a.txt +``` + +In the command: + +- Specify the location of the beacon node using [`--beacon-node-api-endpoint`](../reference/cli/subcommands/voluntary-exit.md#beacon-node-api-endpoint). +- Specify the validators to exit using the [`--validator-keys`](../reference/cli/subcommands/voluntary-exit.md#validator-keys) option. +- Specify the earliest epoch at which to exit using the [`--epoch`](../reference/cli/subcommands/voluntary-exit.md#epoch) option. If not specified, this defaults to the current epoch. You cannot specify a future epoch. + +If using an external signer such as [Web3Signer], then specify the external signer URL and public key of the exiting validator: + +```bash title="Example" +teku voluntary-exit --beacon-node-api-endpoint=http://127.0.0.1:5051 \ +--validators-external-signer-public-keys=1e9f2afcc0737f4502e8d4238e4fe82d45077b2a549902b61d65367acecbccba \ +--validators-external-signer-url=http://localhost:9000 +``` + +Use the [`/eth/v1/beacon/pool/voluntary_exits`](https://consensys.github.io/teku/#operation/getEthV1BeaconPoolVoluntary_exits) API to check the pending exit queue. + + + +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[REST API enabled]: ../reference/cli/index.md#rest-api-enabled diff --git a/versioned_docs/version-24.1.1/images/architecture.png b/versioned_docs/version-24.1.1/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..6c76dc2a34c530657f9d0271a8919a0aec71d8a3 GIT binary patch literal 59013 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Ö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�P|_doufAuA#C>zj-c+0}2-2@yg1tX55mU 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 L)z4*}Q$iB}0j;+t literal 0 HcmV?d00001 diff --git a/versioned_docs/version-24.1.1/images/execution-consensus-clients.png b/versioned_docs/version-24.1.1/images/execution-consensus-clients.png new file mode 100644 index 0000000000000000000000000000000000000000..9d56ceb37e102b2a3904782970ef8c4a4197d992 GIT binary patch literal 108986 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 KcT3eRU;ZDk9U}Aq literal 0 HcmV?d00001 diff --git a/versioned_docs/version-24.1.1/images/favicon.svg b/versioned_docs/version-24.1.1/images/favicon.svg new file mode 100644 index 000000000..1ed75f708 --- /dev/null +++ b/versioned_docs/version-24.1.1/images/favicon.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/versioned_docs/version-24.1.1/images/logo.svg b/versioned_docs/version-24.1.1/images/logo.svg new file mode 100644 index 000000000..79f090561 --- /dev/null +++ b/versioned_docs/version-24.1.1/images/logo.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/versioned_docs/version-24.1.1/index.md b/versioned_docs/version-24.1.1/index.md new file mode 100644 index 000000000..7989bd247 --- /dev/null +++ b/versioned_docs/version-24.1.1/index.md @@ -0,0 +1,30 @@ +--- +title: Introduction +slug: introduction +--- + +# Teku + +Teku is an open source Ethereum consensus client (previously called an +[Ethereum 2.0](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) +client) written in Java. +Teku contains a full beacon node implementation and a validator client for +participating in [proof of stake consensus](concepts/proof-of-stake.md). + +## What can you do with Teku? + +Teku supports the following features: + +- Running the beacon node synchronization and consensus. +- Proposing and attesting to blocks. +- Enterprise-focused metrics using Prometheus. +- A REST API for managing consensus layer node operations. +- External key management for managing validator signing keys. + +## New to Teku? + +Get started by running Teku with Docker or installing Teku. You can: + +- [Run Teku from a Docker image.](get-started/install/run-docker-image.md) +- [Install the binary distribution.](get-started/install/install-binaries.md) +- [Build from source.](get-started/install/build-from-source.md) diff --git a/versioned_docs/version-24.1.1/reference/cli/index.md b/versioned_docs/version-24.1.1/reference/cli/index.md new file mode 100644 index 000000000..d94b02168 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/index.md @@ -0,0 +1,3690 @@ +--- +title: Command line options +description: Teku command line interface reference +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Teku command line options + +This reference describes the syntax of the Teku command line interface (CLI) options. + +:::caution + +The CLI options are currently under development and may change. + +::: + +## Specify options + +You can specify Teku options: + +- On the command line. + + ```bash + teku [OPTIONS] [COMMAND] + ``` + +- As an environment variable. For each command line option, the equivalent environment variable is: + + - Uppercase. + - `-` is replaced by `_`. + - Has a `TEKU_` prefix. + +- In a [YAML configuration file](../../how-to/configure/use-config-file.md). + +If an option is specified in multiple places, the order of priority is command line, environment variable, configuration file. + +## Using autocomplete + +If using Bash or Z shell, you can enable autocomplete support by navigating to the `build` folder and running: + +```bash +source teku.autocomplete.sh +``` + +Autocomplete allows you to view option suggestions by entering `--` and pressing the Tab key twice. + +```bash +teku --Tab+Tab +``` + +## Options + +### `beacon-liveness-tracking-enabled` + + + + +```bash +--beacon-liveness-tracking-enabled[=] +``` + + + + +```bash +--beacon-liveness-tracking-enabled=true +``` + + + + +```bash +TEKU_BEACON_LIVENESS_TRACKING_ENABLED=true +``` + + + + +```bash +beacon-liveness-tracking-enabled: true +``` + + + + +Enables or disables validator liveness tracking. Used by [doppelganger detection](../../how-to/enable-doppelganger-detection.md). The default is `false`. + +### `builder-bid-compare-factor` + + + + +```bash +--builder-bid-compare-factor= +``` + + + + +```bash +--builder-bid-compare-factor=50 +``` + + + + +```bash +TEKU_BUILDER_BID_COMPARE_FACTOR=50 +``` + + + + +```bash +builder-bid-compare-factor: 50 +``` + + + + +The builder bid compare factor. The default is 100 (100%). + +Execution layer clients in [Capella-enabled networks](https://notes.ethereum.org/@launchpad/withdrawals-faq#Q-What-is-ShanghaiCapella) provide the execution payload and the payload value. The beacon node compares this value against the builder bid to maximize the validator's profit or decrease network censorship at a low or no cost. + +Use this option to set the compare factor applied to the builder bid value when comparing it to the locally produced payload. The factor is expressed in a percentage. For example, a builder bid compare factor of `80` means the local payload is chosen when its value is at least 80% of the builder bid value. + +Set this option to `BUILDER_ALWAYS` to always use the builder bid, unless the bid is invalid. + +### `builder-endpoint` + + + + +```bash +--builder-endpoint= +``` + + + + +```bash +--builder-endpoint=http://127.0.0.1:18550 +``` + + + + +```bash +TEKU_BUILDER_ENDPOINT=http://127.0.0.1:18550 +``` + + + + +```bash +builder-endpoint: "http://127.0.0.1:18550" +``` + + + + +The address for an external [builder endpoint](../../how-to/configure/builder-network.md). + +### `builder-set-user-agent-header` + + + + +```bash +--builder-set-user-agent-header[=] +``` + + + + +```bash +--builder-set-user-agent-header=true +``` + + + + +```bash +TEKU_BUILDER_SET_USER_AGENT_HEADER=true +``` + + + + +```bash +builder-set-user-agent-header: true +``` + + + + +Set the User-Agent header to `teku/v` (for example, `teku/v23.4.0`) when making a builder bid request to help builders identify clients and versions. The default is `true`. + +### `checkpoint-sync-url` + + + + +```bash +--checkpoint-sync-url= +``` + + + + +```bash +--checkpoint-sync-url="https://beaconstate.ethstaker.cc" +``` + + + + +```bash +TEKU_CHECKPOINT_SYNC_URL="https://beaconstate.ethstaker.cc" +``` + + + + +```bash +checkpoint-sync-url: "https://beaconstate.ethstaker.cc" +``` + + + + +URL of a [Checkpointz](https://github.com/ethpandaops/checkpointz) endpoint used to [start Teku from a recent state](../../get-started/checkpoint-start.md). + +By default, Teku tries to download the finalized state from the endpoint. +If it can't download the finalized state, it tries to download the genesis state. + +:::tip +See [this community-maintained list of checkpoint state endpoints](https://eth-clients.github.io/checkpoint-sync-endpoints/). +::: + +When this option is set, and `--deposit-snapshot-enabled` is also not set or disabled, +the `--checkpoint-sync-url` value will be used to determine the deposit snapshot. + +### `config-file` + + + + +```bash +--config-file= +``` + + + + +```bash +--config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the [YAML configuration file](../../how-to/configure/use-config-file.md). The default is `none`. + +### `data-base-path`, `data-path` + + + + +```bash +--data-base-path= +``` + + + + +```bash +--data-base-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BASE_PATH=/home/me/me_node +``` + + + + +```bash +data-base-path: "/home/me/me_node" +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +The default Docker image location is `/root/.local/share/teku`. + +### `data-beacon-path` + + + + +```bash +--data-beacon-path= +``` + + + + +```bash +--data-beacon-path=/home/me/me_beacon +``` + + + + +```bash +TEKU_DATA_BEACON_PATH=/home/me/me_beacon +``` + + + + +```bash +data-beacon-path: "/home/me/me_beaon" +``` + + + + +Path to the beacon node data. The default is `/beacon` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +### `data-storage-archive-frequency` + + + + +```bash +--data-storage-archive-frequency= +``` + + + + +```bash +--data-storage-archive-frequency=1028 +``` + + + + +```bash +TEKU_DATA_STORAGE_ARCHIVE_FREQUENCY=1028 +``` + + + + +```bash +data-storage-archive-frequency: 1028 +``` + + + + +Set the frequency (in slots) at which to store finalized states to disk. The default is 2048. + +This option is ignored if [`--data-storage-mode`](#data-storage-mode) is not set to `archive`. + +:::note + +Specifying a larger number of slots as the archive frequency has a potentially higher overhead for retrieving finalized states since more states may need to be regenerated to get to the requested state. Specifying a lower number of slots as the frequency increases the disk space usage. + +::: + +For example, `--data-storage-archive-frequency=1` uses maximum disk space but has the lowest response time for retrieving a finalized state since each slot state is saved, whereas `--data-storage-archive-frequency=2048` uses less disk space, but may need to regenerate the state because every 2048th slot state is saved. + +### `data-storage-mode` + + + + +```bash +--data-storage-mode= +``` + + + + +```bash +--data-storage-mode=archive +``` + + + + +```bash +TEKU_DATA_STORAGE_MODE=archive +``` + + + + +```bash +data-storage-mode: "archive" +``` + + + + +Set the strategy for handling historical chain data. Valid options are: + +- `minimal` - Stores the minimal required data to follow the chain and run validators. Finalized states and historic blocks are pruned. +- `prune` - Stores all blocks, but finalized states are pruned. +- `archive` - Stores all blocks and states. + +The default is `minimal`. + +### `data-storage-non-canonical-blocks-enabled` + + + + +```bash +--data-storage-non-canonical-blocks-enabled[=] +``` + + + + +```bash +--data-storage-non-canonical-blocks-enabled=true +``` + + + + +```bash +TEKU_DATA_STORAGE_NON_CANONICAL_BLOCKS_ENABLED=true +``` + + + + +```bash +data-storage-non-canonical-blocks-enabled: true +``` + + + + +Specify whether to store non-canonical blocks and blob sidecars. The default is `false`. + +### `data-validator-path` + + + + +```bash +--data-validator-path= +``` + + + + +```bash +--data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + + +### `deposit-snapshot-enabled` + + + + +```bash +--deposit-snapshot-enabled[=] +``` + + + + +```bash +--deposit-snapshot-enabled=false +``` + + + + +```bash +TEKU_DEPOSIT_SNAPSHOT_ENABLED=false +``` + + + + +```bash +deposit-snapshot-enabled: false +``` + + + + +Enables or disables using a bundled deposit contract tree snapshot and persisting the tree after finalization. The default is `true`. + +Normally, at sync, Teku requests all deposit logs from the execution layer up to the head. At each startup, Teku +loads all deposits from the disk and replays them to recreate the merkle tree. Both operations consume peer resources +and delay node availability on restart. The feature enabled by this option dramatically decreases the time of both +operations by bundling deposit tree snapshots in the Teku distribution for all major +networks (Mainnet, Gnosis, Goerli, and Sepolia) and persisting the current tree after finalization. Instead of +replaying thousands of deposits on startup, Teku loads the bundled tree or a saved one, whichever is the latest. + +:::info Security considerations +If a malicious peer changes the bundled tree, Teku throws `InvalidDepositEventsException` on the next deposit received +from the execution layer. The malicious peer can't follow up the chain, and so can't propose with an incorrect +deposit tree snapshot. +::: + +When this option is not set or is disabled, the `--checkpoint-sync-url` value will be used if provided to find the deposit snapshot URL. + +### `doppelganger-detection-enabled` + + + + +```bash +--doppelganger-detection-enabled[=] +``` + + + + +```bash +--doppelganger-detection-enabled=true +``` + + + + +```bash +TEKU_DOPPELGANGER_DETECTION_ENABLED=true +``` + + + + +```bash +doppelganger-detection-enabled: true +``` + + + + +Enables or disables [doppelganger detection](../../how-to/enable-doppelganger-detection.md). The default is `false`. + +### `ee-endpoint` + + + + +```bash +--ee-endpoint= +``` + + + + +```bash +--ee-endpoint=http://localhost:8550 +``` + + + + +```bash +TEKU_EE_ENDPOINT=http://localhost:8550 +``` + + + + +```bash +ee-endpoint: "http://localhost:8550" +``` + + + + +URL of the [execution client's](../../concepts/merge.md#execution-clients) Engine JSON-RPC APIs. This replaces [`eth1-endpoint`](#eth1-endpoint-eth1-endpoints) after [The Merge](../../concepts/merge.md). + +### `ee-jwt-claim-id` + + + + +```bash +--ee-jwt-claim-id= +``` + + + + +```bash +--ee-jwt-claim-id=foobar +``` + + + + +```bash +TEKU_EE_JWT_CLAIM_ID=foobar +``` + + + + +```bash +ee-jwt-claim-id: "foobar" +``` + + + + +A unique identifier for the consensus layer client. When using the JSON-RPC API engine, this identifier is added to JWT claims as an `id` claim. + +### `ee-jwt-secret-file` + + + + +```bash +--ee-jwt-secret-file= +``` + + + + +```bash +--ee-jwt-secret-file=ee-jwt-secret.hex +``` + + + + +```bash +TEKU_EE_JWT_SECRET_FILE=ee-jwt-secret.hex +``` + + + + +```bash +ee-jwt-secret-file: "ee-jwt-secret.hex" +``` + + + + +Shared secret used to authenticate [execution clients](../../concepts/merge.md#execution-and-consensus-clients) when using the Engine JSON-RPC API. Contents of file must be 32 hex-encoded bytes. May be a relative or absolute path. See an [example of how to generate this](../../get-started/connect/mainnet.md#1-generate-the-shared-secret). + +### `eth1-deposit-contract-address` + + + + +```bash +--eth1-deposit-contract-address=
+``` + + + + +```bash +--eth1-deposit-contract-address=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +TEKU_ETH1_DEPOSIT_CONTRACT_ADDRESS=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +eth1-deposit-contract-address: "0x77f7bED277449F51505a4C54550B074030d989bC" +``` + + + + +The address of the deposit contract. Only required when creating a custom network. + +The deposit contract address can also be defined in: + +- The genesis file specified using [`--initial-state`](#initial-state) +- The predefined network supplied using [`--network`](#network). + +### `eth1-deposit-contract-max-request-size` + + + + +```bash +--eth1-deposit-contract-max-request-size= +``` + + + + +```bash +--eth1-deposit-contract-max-request-size=8000 +``` + + + + +```bash +TEKU_ETH1_DEPOSIT_CONTRACT_MAX_REQUEST_SIZE=8000 +``` + + + + +```bash +eth1-deposit-contract-max-request-size: 8000 +``` + + + + +The maximum number of blocks to request deposit contract event logs for in a single request. The default is 10000. + +Setting a smaller max size may help if your ETH1 node is slow at loading deposit event logs, or when receiving warnings that the ETH1 node is unavailable. + +### `eth1-endpoint`, `eth1-endpoints` + + + + +```bash +--eth1-endpoint=[,...]... +``` + + + + +```bash +--eth1-endpoint=http://localhost:8545,https://mainnet.infura.io/v3/d0e21ccd0b1e4eef7784422eabc51111 +``` + + + + +```bash +TEKU_ETH1_ENDPOINT=http://localhost:8545,https://mainnet.infura.io/v3/d0e21ccd0b1e4eef7784422eabc51111 +``` + + + + +```bash +eth1-endpoint: ["http://localhost:8545","https://mainnet.infura.io/v3/d0e21ccd0b1e4eef7784422eabc51111"] +``` + + + + +Comma-separated list of JSON-RPC URLs of execution layer (Ethereum 1.0) nodes. Each time Teku makes a call, it finds the first provider in the list that is available, on the right chain, and in sync. This option must be specified if running a validator. + +If not specified (that is, you're running a beacon node only), then provide an initial state using the [`--initial-state`](#initial-state) option, or start Teku from an existing database using [`--data-path`](#data-base-path-data-path), which provides the initial state to work from. You do not need to provide an initial state if running a public network which has already started (for example, Mainnet or Goerli). + +If using a cloud-based service such as [Infura], then set the endpoint to the supplied URL. For example, `https://goerli.infura.io/v3/`. + +:::caution + +After [The Merge](../../concepts/merge.md), you can't use `eth1-endpoint` to specify an external execution layer provider. This option is replaced by [`ee-endpoint`](#ee-endpoint) for each beacon node. + +::: + +### `exchange-capabilities-monitoring-enabled` + + + + +```bash +--exchange-capabilities-monitoring-enabled[=] +``` + + + + +```bash +--exchange-capabilities-monitoring-enabled=true +``` + + + + +```bash +TEKU_EXCHANGE_CAPABILITIES_MONITORING_ENABLED=true +``` + + + + +```bash +exchange-capabilities-monitoring-enabled: true +``` + + + + +Enables or disables querying the [execution client](../../concepts/merge.md#execution-clients) periodically for the Engine API methods it supports. If enabled and incompatibility is detected, a warning is raised in the logs. The default is `true`. + +### `exit-when-no-validator-keys-enabled` + + + + +```bash +--exit-when-no-validator-keys-enabled[=] +``` + + + + +```bash +--exit-when-no-validator-keys-enabled=true +``` + + + + +```bash +TEKU_EXIT_WHEN_NO_VALIDATOR_KEYS_ENABLED=true +``` + + + + +```bash +exit-when-no-validator-keys-enabled: true +``` + + + + +The default setting is `false`. +If this option is set to `false`, Teku continues running even when no validator keys are loaded. + +If this option is set to `true`, Teku automatically exits if no validator keys are loaded, or there are no active validators. + +:::important + +If running the validator client and beacon node separately, set this option only on the validator client side. This setting is meant for the client that loads and handles the validator keys. + +::: + +### `genesis-state` + + + + +```bash +--genesis-state= +``` + + + + +```bash +--genesis-state=/home/me/genesis.ssz +``` + + + + +```bash +TEKU_GENESIS_STATE=/home/me/genesis.ssz +``` + + + + +```bash +genesis-state: "/home/me/genesis.ssz" +``` + + + + +Path or URL to an SSZ-encoded state file. The state file can be used to specify the genesis state, or a [recent finalized checkpoint state from which to sync]. + +This option does not need to be specified if the genesis state is provided by the network specified using the [`--network`](#network) option. It also is not required if the Reconstruct Historical States Service is not being utilised. + +:::note + +If overriding the genesis state in a custom network, you must supply the genesis state file at each restart. + +::: + +:::tip + +[Infura](https://infura.io/) can be used as the source of initial states with `--genesis-state https://{projectid}:{secret}@eth2-beacon-mainnet.infura.io/eth/v2/debug/beacon/states/genesis` + +::: + +### `help` + +```bash title="Syntax" +-h, --help +``` + +Show the help message and exit. + +### `ignore-weak-subjectivity-period-enabled` + + + + +```bash +--ignore-weak-subjectivity-period-enabled[=] +``` + + + + +```bash +--ignore-weak-subjectivity-period-enabled=true +``` + + + + +```bash +TEKU_IGNORE_WEAK_SUBJECTIVITY_PERIOD_ENABLED=true +``` + + + + +```bash +ignore-weak-subjectivity-period-enabled: true +``` + + + + +Ignores the [weak subjectivity](../../concepts/weak-subjectivity.md) period verification that Teku +performs at startup. +The default is `false`. + +:::caution +Syncing from outside the weak subjectivity period is considered unsafe. +::: + +### `initial-state` + + + + +```bash +--initial-state= +``` + + + + +```bash +--initial-state=/home/me/genesis.ssz +``` + + + + +```bash +TEKU_INITIAL_STATE=/home/me/genesis.ssz +``` + + + + +```bash +initial-state: "/home/me/genesis.ssz" +``` + + + + +Path or URL to an SSZ-encoded state file. The state file can be used to specify the genesis state, or a [recent finalized checkpoint state from which to sync]. + +This option does not need to be specified if the genesis state is provided by the network specified using the [`--network`](#network) option. + +:::note + +If overriding the initial state in a custom network, you must supply the initial state file at each restart. + +::: + +:::tip + +See [this community-maintained list of checkpoint state endpoints](https://eth-clients.github.io/checkpoint-sync-endpoints/). + +::: + +### `log-color-enabled` + + + + +```bash +--log-color-enabled[=] +``` + + + + +```bash +--log-color-enabled=false +``` + + + + +```bash +TEKU_LOG_COLOR_ENABLED=false +``` + + + + +```bash +log-color-enabled: false +``` + + + + +Specify whether status and event log messages include a console color display code. The default is `true`. + +### `log-destination` + + + + +```bash +--log-destination= +``` + + + + +```bash +--log-destination=CONSOLE +``` + + + + +```bash +TEKU_LOG_DESTINATION=CONSOLE +``` + + + + +```bash +log-destination: "CONSOLE" +``` + + + + +Specify where to output log information. Valid options are: + +- `BOTH` +- `CONSOLE` +- `DEFAULT_BOTH` +- `FILE` + +The default is `DEFAULT_BOTH`. When using `BOTH` or `DEFAULT_BOTH`, system updates such as blockchain events are displayed on the console, and errors and other information are logged to a file. Specify the log file with the [`--log-file`](#log-file) command-line option. + +For production systems we recommend using the `CONSOLE` or `FILE` options to ensure all log information is available in one place. + +:::note + +Use `DEFAULT_BOTH` when using a [custom Log4J2 configuration file](../../how-to/monitor/configure-logging.md#advanced-custom-logging). Any other option applies the custom logging changes on top of its default settings. + +::: + +### `log-file` + + + + +```bash +--log-file= +``` + + + + +```bash +--log-file=teku_2020-01-01.log +``` + + + + +```bash +TEKU_LOG_FILE=teku_2020-01-01.log +``` + + + + +```bash +log-file: "teku_2020-01-01.log" +``` + + + + +Relative or absolute location, and filename of the log file. + +The default directory is OS-dependent: + +- macOS: `~/Library/teku/logs` +- Unix/Linux: `$XDG_DATA_HOME/teku/logs` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku/logs` +- Windows: `%localappdata%\teku\logs` + +The default Docker image location is `/root/.local/share/teku/logs`. + +### `log-file-name-pattern` + + + + +```bash +--log-file-name-pattern= +``` + + + + +```bash +--log-file-name-pattern=tekuL_%d{yyyy-MM-dd}.log +``` + + + + +```bash +TEKU_LOG_FILE_NAME_PATTERN=tekuL_%d{yyyy-MM-dd}.log +``` + + + + +```bash +log-file-name-pattern: "tekuL_%d{yyyy-MM-dd}.log" +``` + + + + +Filename pattern to apply when creating log files. The default pattern is `teku_%d{yyyy-MM-dd}.log` + +### `log-include-events-enabled` + + + + +```bash +--log-include-events-enabled[=] +``` + + + + +```bash +--log-include-events-enabled=false +``` + + + + +```bash +TEKU_LOG_INCLUDE_EVENTS_ENABLED=false +``` + + + + +```bash +log-include-events-enabled: false +``` + + + + +Specify whether to log frequent update events. For example every slot event with validators and attestations. The default is `true`. + +### `log-include-validator-duties-enabled` + + + + +```bash +--log-include-validator-duties-enabled[=] +``` + + + + +```bash +--log-include-validator-duties-enabled=false +``` + + + + +```bash +TEKU_LOG_INCLUDE_VALIDATOR_DUTIES_ENABLED=false +``` + + + + +```bash +log-include-validator-duties-enabled: false +``` + + + + +Specify whether to log details of validator event duties. The default is `true`. + +:::note + +Logs could become noisy when running many validators. + +::: + +### `logging` + + + + +```bash +-l, --logging= +``` + + + + +```bash +--logging=DEBUG +``` + + + + +```bash +TEKU_LOGGING=DEBUG +``` + + + + +```bash +logging: "DEBUG" +``` + + + + +Sets the logging verbosity. Log levels are `OFF`, `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`, `ALL`. Default is `INFO`. + +### `metrics-block-timing-tracking-enabled` + + + + +```bash +--metrics-block-timing-tracking-enabled[=] +``` + + + + +```bash +--metrics-block-timing-tracking-enabled=false +``` + + + + +```bash +TEKU_METRICS_BLOCK_TIMING_TRACKING_ENABLED=false +``` + + + + +```bash +metrics-block-timing-tracking-enabled: false +``` + + + + +Enables or disables block timing metrics. The default is `true`. + +### `metrics-categories` + + + + +```bash +--metrics-categories=[,...]... +``` + + + + +```bash +--metrics-categories=BEACON,JVM,PROCESS +``` + + + + +```bash +TEKU_METRICS_CATEGORIES=BEACON,JVM,PROCESS +``` + + + + +```bash +metrics-categories: ["BEACON", "JVM", "PROCESS"] +``` + + + + +Categories for which to track metrics. Options are `JVM`, `PROCESS`, `BEACON`, `DISCOVERY`, `EVENTBUS`, `EXECUTOR`, `LIBP2P`, `NETWORK`, `STORAGE`, `STORAGE_HOT_DB`, `STORAGE_FINALIZED_DB`, `REMOTE_VALIDATOR`, `VALIDATOR`, `VALIDATOR_PERFORMANCE`, `VALIDATOR_DUTY`. All but `VALIDATOR_DUTY` categories are enabled by default. + +When `metrics-categories` is used, only the categories specified in this option are enabled (all other categories are disabled). + +### `metrics-enabled` + + + + +```bash +--metrics-enabled[=] +``` + + + + +```bash +--metrics-enabled=true +``` + + + + +```bash +TEKU_METRICS_ENABLED=true +``` + + + + +```bash +metrics-enabled: true +``` + + + + +Set to `true` to enable the metrics exporter. The default is `false`. + +### `metrics-host-allowlist` + + + + +```bash +--metrics-host-allowlist=[,...]... or "*" +``` + + + + +```bash +--metrics-host-allowlist=medomain.com,meotherdomain.com +``` + + + + +```bash +TEKU_METRICS_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + + + + +```bash +metrics-host-allowlist: ["medomain.com", "meotherdomain.com"] +``` + + + + +A comma-separated list of hostnames to allow access to the [Teku metrics]. By default, Teku accepts access from `localhost` and `127.0.0.1`. + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +### `metrics-interface` + + + + +```bash +--metrics-interface= +``` + + + + +```bash +--metrics-interface=192.168.10.101 +``` + + + + +```bash +TEKU_METRICS_INTERFACE=192.168.10.101 +``` + + + + +```bash +metrics-interface: "192.168.10.101" +``` + + + + +Host on which Prometheus accesses Teku metrics. The default is `127.0.0.1`. + +### `metrics-port` + + + + +```bash +--metrics-port= +``` + + + + +```bash +--metrics-port=6174 +``` + + + + +```bash +TEKU_METRICS_PORT=6174 +``` + + + + +```bash +metrics-port: 6174 +``` + + + + +Specifies the port (TCP) on which [Prometheus](https://prometheus.io/) accesses Teku metrics. The default is `8008`. + +### `metrics-publish-endpoint` + + + + +```bash +--metrics-publish-endpoint= +``` + + + + +```bash +--metrics-publish-endpoint=https://beaconcha.in/api/v1/client/metrics?apikey={apikey} +``` + + + + +```bash +TEKU_METRICS_PUBLISH_ENDPOINT=https://beaconcha.in/api/v1/client/metrics?apikey={apikey} +``` + + + + +```bash +metrics-publish-endpoint: "https://beaconcha.in/api/v1/client/metrics?apikey={apikey}" +``` + + + + +Endpoint URL of an external service such as [beaconcha.in](https://beaconcha.in/) to which Teku publishes metrics for node monitoring. + +### `metrics-publish-interval` + + + + +```bash +--metrics-publish-interval= +``` + + + + +```bash +--metrics-publish-interval=60 +``` + + + + +```bash +TEKU_METRICS_PUBLISH_INTERVAL=60 +``` + + + + +```bash +metrics-publish-interval: "60" +``` + + + + +Interval between metric publications to the external service defined in [metrics-publish-endpoint](#metrics-publish-endpoint), measured in seconds. The default is `60`. + +### `network` + + + + +```bash +--network= +``` + + + + +```bash +--network=mainnet +``` + + + + +```bash +TEKU_NETWORK=mainnet +``` + + + + +```bash +network: "mainnet" +``` + + + + +Predefined network configuration. Accepts a predefined network name, or file path or URL to a YAML configuration file. See the [consensus specification] for examples. + +The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Description | +| :-- | :-- | :-- | :-- | +| `mainnet` | Consensus layer | Production | Main network | +| `minimal` | Consensus layer | Test | Used for local testing and development networks | +| `goerli` | Consensus layer | Test | Multi-client testnet | +| `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | +| `holesky` | Consensus layer | Test | Multi-client testnet | +| `sepolia` | Consensus layer | Test | Multi-client testnet | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | + +Predefined networks can provide defaults such as the initial state of the network, bootnodes, and the address of the deposit contract. + +### `p2p-advertised-ip` + + + + +```bash +--p2p-advertised-ip= +``` + + + + +```bash +--p2p-advertised-ip=192.168.1.132 +``` + + + + +```bash +TEKU_P2P_ADVERTISED_IP=192.168.1.132 +``` + + + + +```bash +p2p-advertised-ip: "192.168.1.132" +``` + + + + +Advertised peer-to-peer IP address. The default is `127.0.0.1`. + +### `p2p-advertised-port` + + + + +```bash +--p2p-advertised-port= +``` + + + + +```bash +--p2p-advertised-port=1789 +``` + + + + +```bash +TEKU_P2P_ADVERTISED_PORT=1789 +``` + + + + +```bash +p2p-advertised-port: 1789 +``` + + + + +The advertised P2P port. The default is the port specified in [`--p2p-port`](#p2p-port). + +The advertised port can differ from the [`--p2p-port`](#p2p-port). For example, you can set the advertised port to 9010, and the `--p2p-port` value to 9009, then manually configure the firewall to forward external incoming requests on port 9010 to port 9009 on the Teku node. + +### `p2p-advertised-udp-port` + + + + +```bash +--p2p-advertised-udp-port= +``` + + + + +```bash +--p2p-advertised-udp-port=1789 +``` + + + + +```bash +TEKU_P2P_ADVERTISED_UDP_PORT=1789 +``` + + + + +```bash +p2p-advertised-udp-port: 1789 +``` + + + + +The advertised UDP port to external peers. The default is the port specified in [`--p2p-advertised-port`](#p2p-advertised-port) if it is set. Otherwise, the default is the port specified in [`--p2p-port`](#p2p-port). + + +### `p2p-discovery-bootnodes` + + + + +```bash +--p2p-discovery-bootnodes=[,...]... +``` + + + + +```bash +--p2p-discovery-bootnodes=enr:-Iu4QG...wgiMo,enr:-Iu4QL...wgiMo +``` + + + + +```bash +TEKU_P2P_DISCOVERY_BOOTNODES=enr:-Iu4QG...wgiMo,enr:-Iu4QL...wgiMo +``` + + + + +```bash +p2p-discovery-bootnodes: ["enr:-Iu4QG...wgiMo", + "enr:-Iu4QL...wgiMo"] +``` + + + + +List of comma-separated Ethereum Node Records (ENRs) for P2P discovery bootstrap. + + + +### `p2p-discovery-enabled` + + + + +```bash +--p2p-discovery-enabled[=] +``` + + + + +```bash +--p2p-discovery-enabled=false +``` + + + + +```bash +TEKU_P2P_DISCOVERY_ENABLED=false +``` + + + + +```bash +p2p-discovery-enabled: false +``` + + + + +Enables or disables P2P peer discovery. If disabled, [`p2p-static-peers`](#p2p-static-peers) defines the peer connections. The default is `true`. + +### `p2p-discovery-site-local-addresses-enabled` + + + + +```bash +--p2p-discovery-site-local-addresses-enabled[=] +``` + + + + +```bash +--p2p-discovery-site-local-addresses-enabled +``` + + + + +```bash +TEKU_P2P_DISCOVERY_SITE_LOCAL_ADDRESSES_ENABLED=true +``` + + + + +```bash +p2p-discovery-site-local-addresses-enabled: true +``` + + + + +Enables or disables discovery of the following local network (RFC1918) addresses. The default is `false`. + +```text +10.0.0.0 - 10.255.255.255 (10/8 prefix) +172.16.0.0 - 172.31.255.255 (172.16/12 prefix) +192.168.0.0 - 192.168.255.255 (192.168/16 prefix) +``` + +Normal Teku operation shouldn't send traffic to these local network addresses. + +In test or private networks, operators might need to enable discovery of local addresses. For example, when you run multiple consensus layer nodes in one local network, these nodes are not discovered on the public internet and are advertised with local (RFC1918) addresses. + +### `p2p-enabled` + + + + +```bash +--p2p-enabled[=] +``` + + + + +```bash +--p2p-enabled=false +``` + + + + +```bash +TEKU_P2P_ENABLED=false +``` + + + + +```bash +p2p-enabled: false +``` + + + + +Enables or disables all P2P communication. The default is `true`. + +### `p2p-interface` + + + + +```bash +--p2p-interface= +``` + + + + +```bash +--p2p-interface=192.168.1.132 +``` + + + + +```bash +TEKU_P2P_INTERFACE=192.168.1.132 +``` + + + + +```bash +p2p-interface: "192.168.1.132" +``` + + + + +Specifies the network interface on which the node listens for P2P communication. The default is `0.0.0.0` (all interfaces). + +### `p2p-nat-method` + + + + +```bash +--p2p-nat-method= +``` + + + + +```bash +--p2p-nat-method=UPNP +``` + + + + +```bash +TEKU_P2P_NAT_METHOD=UPNP +``` + + + + +```bash +p2p-nat-method: "UPNP" +``` + + + + +Specify the method for handling [NAT environments](../../how-to/find-and-connect/specify-nat.md). Valid options are `NONE` and `UPNP`. + +The default is `NONE`, which disables NAT functionality. + +:::tip + +UPnP support is often disabled by default in networking firmware. If disabled by default, explicitly enable UPnP support. + +::: + +### `p2p-peer-lower-bound` + + + + +```bash +--p2p-peer-lower-bound= +``` + + + + +```bash +--p2p-peer-lower-bound=25 +``` + + + + +```bash +TEKU_P2P_PEER_LOWER_BOUND=25 +``` + + + + +```bash +p2p-peer-lower-bound: 25 +``` + + + + +Lower bound on the target number of peers. Teku will actively seek new peers if the number of peers falls below this value. The default is `64`. + +### `p2p-peer-upper-bound` + + + + +```bash +--p2p-peer-upper-bound= +``` + + + + +```bash +--p2p-peer-upper-bound=40 +``` + + + + +```bash +TEKU_P2P_PEER_UPPER_BOUND=40 +``` + + + + +```bash +p2p-peer-upper-bound: 40 +``` + + + + +Upper bound on the target number of peers. Teku will refuse new peer requests that would cause the number of peers to exceed this value. The default is `100`. + +### `p2p-port` + + + + +```bash +--p2p-port= +``` + + + + +```bash +# to listen on port 1789 +--p2p-port=1789 +``` + + + + +```bash +# to listen on port 1789 +TEKU_P2P_PORT=1789 +``` + + + + +```bash +p2p-port: 1789 +``` + + + + +Specifies the P2P listening ports (UDP and TCP). The default is `9000`. + + +### `p2p-private-key-file` + + + + +```bash +--p2p-private-key-file= +``` + + + + +```bash +--p2p-private-key-file=/home/me/me_node/key +``` + + + + +```bash +TEKU_P2P_PRIVATE_KEY_FILE=/home/me/me_node/key +``` + + + + +```bash +p2p-private-key-file: "/home/me/me_node/key" +``` + + + + +File containing the [node's private key](../../concepts/p2p-private-key.md). + +### `p2p-static-peers` + + + + +```bash +--p2p-static-peers=
[,
...]... +``` + + + + +```bash +--p2p-static-peers=/ip4/151.150.191.80/tcp/9000/p2p/16Ui...aXRz,/ip4/151.150.191.80/tcp/9000/p2p/16Ui...q6f1 +``` + + + + +```bash +TEKU_P2P_STATIC_PEERS=/ip4/151.150.191.80/tcp/9000/p2p/16Ui...aXRz,/ip4/151.150.191.80/tcp/9000/p2p/16Ui...q6f1 +``` + + + + +```bash +p2p-static-peers: ["/ip4/151.150.191.80/tcp/9000/p2p/16Ui...aXRz", + "/ip4/151.150.191.80/tcp/9000/p2p/16Ui...q6f1"] +``` + + + + +List of comma-separated [multiaddresses](https://docs.libp2p.io/concepts/appendix/glossary/#multiaddr) of static peers. + +### `p2p-subscribe-all-subnets-enabled` + + + + +```bash +--p2p-subscribe-all-subnets-enabled= +``` + + + + +```bash +--p2p-subscribe-all-subnets-enabled=true +``` + + + + +```bash +TEKU_P2P_SUBSCRIBE_ALL_SUBNETS_ENABLED=true +``` + + + + +```bash +p2p-subscribe-all-subnets-enabled: true +``` + + + + +Forces the beacon node to stay subscribed to all subnets regardless of the number of validators. The default is `false`. + +When set to `false`, Teku subscribes to two persistent subnets regardless of the number of validators. Teku also subscribes and unsubscribes from subnets as needed for the running validators. + +This option is primarily for users running an external validator client and load balancing it across multiple beacon nodes. Without this flag, depending on how requests are load balanced, the beacon nodes may not have subscribed to the required subnets and be unable to produce aggregates. + +:::caution + +When set to `true`, Teku uses more CPU and bandwidth, and for most users there’s no need to use this option. + +::: + +### `p2p-udp-port` + + + + +```bash +--p2p-udp-port= +``` + + + + +```bash +--p2p-udp-port=1789 +``` + + + + +```bash +TEKU_P2P_UDP_PORT=1789 +``` + + + + +```bash +p2p-udp-port: 1789 +``` + + + + +The UDP port used for discovery. The default is the port specified in [`--p2p-port`](#p2p-port). + +### `reconstruct-historic-states` + + + + +```bash +--reconstruct-historic-states= +``` + + + + +```bash +--reconstruct-historic-states=true +``` + + + + +```bash +TEKU_RECONSTRUCT_HISTORIC_STATES=true +``` + + + + +```bash +reconstruct-historic-states: true +``` + + + + +When set to `true` the [Reconstruct Historical States Service](../../how-to/reconstruct-historical-states.md), is enabled where an archive node is able to reconstruct historical states from genesis up to the current checkpoint, running during start up. + +When set to `false` this service is not enabled. + +### `rest-api-cors-origins` + + + + +```bash +--rest-api-cors-origins[=[,...]...] or "*" +``` + + + + +```bash +--rest-api-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + + + + +```bash +TEKU_REST_API_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + + + + +```bash +rest-api-cors-origins: ["http://medomain.com","https://meotherdomain.com"] +``` + + + + +A list of domain URLs for CORS validation. You must enclose the URLs in double quotes and separate them with commas. + +Listed domains can access the node using HTTP REST API calls. If your client interacts with Teku using a browser app (such as a block explorer), add the client domain to the list. + +The default is "none." If you don't list any domains, browser apps can't interact with your Teku node. + +:::tip + +For testing and development purposes, use `*` to accept requests from any domain. We don’t recommend accepting requests from any domain for production environments. + +::: + +### `rest-api-docs-enabled` + + + + +```bash +--rest-api-docs-enabled[=] +``` + + + + +```bash +--rest-api-docs-enabled=true +``` + + + + +```bash +TEKU_REST_API_DOCS_ENABLED=true +``` + + + + +```bash +rest-api-docs-enabled: true +``` + + + + +Set to `true` to enable the REST API documentation. The default is `false`. + +The documentation can be accessed at `http://:/swagger-ui` where: + +- `interface` is specified using [`--rest-api-interface`](#rest-api-interface) +- `port` is specified using [`--rest-api-port`](#rest-api-port) + +### `rest-api-enabled` + + + + +```bash +--rest-api-enabled[=] +``` + + + + +```bash +--rest-api-enabled=true +``` + + + + +```bash +TEKU_REST_API_ENABLED=true +``` + + + + +```bash +rest-api-enabled: true +``` + + + + +Set to `true` to enable the [REST API service](../rest.md). The default is `false`. + +If set to `true`, then use [`--rest-api-host-allowlist`](#rest-api-host-allowlist) to limit access to trusted parties. + +### `rest-api-host-allowlist` + + + + +```bash +--rest-api-host-allowlist=[,...]... or "*" +``` + + + + +```bash +--rest-api-host-allowlist=medomain.com,meotherdomain.com +``` + + + + +```bash +TEKU_REST_API_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + + + + +```bash +rest-api-host-allowlist: ["medomain.com", "meotherdomain.com"] +``` + + + + +A comma-separated list of hostnames to allow access to the REST API. By default, Teku accepts access from `localhost` and `127.0.0.1`. + +:::warning + +Only trusted parties should access the REST API. Do not directly expose these APIs publicly on production nodes. + +We don't recommend allowing all hostnames (`"*"`) for production environments. + +::: + +### `rest-api-interface` + + + + +```bash +--rest-api-interface= +``` + + + + +```bash +# to listen on all interfaces +--rest-api-interface=0.0.0.0 +``` + + + + +```bash +TEKU_REST_API_INTERFACE=0.0.0.0 +``` + + + + +```bash +rest-api-interface: "0.0.0.0" +``` + + + + +Specifies the interface on which the REST API listens. The default is `127.0.0.1`. + +### `rest-api-port` + + + + +```bash +--rest-api-port= +``` + + + + +```bash +# to listen on port 3435 +--rest-api-port=3435 +``` + + + + +```bash +TEKU_REST_API_PORT=3435 +``` + + + + +```bash +rest-api-port: 3435 +``` + + + + +Specifies REST API listening port (HTTP). The default is 5051. + +### `sentry-config-file` + + + + +```bash +--sentry-config-file= +``` + + + + +```bash +--sentry-config-file=/etc/sentry-node-config.json +``` + + + + +```bash +TEKU_SENTRY_CONFIG_FILE=/etc/sentry-node-config.json +``` + + + + +```bash +sentry-config-file: "/etc/sentry-node-config.json" +``` + + + + +Path to the [sentry node](../../how-to/use-sentry-nodes.md) configuration file. The default is `none`. + +:::caution + +This option can't be used with [`--beacon-node-api-endpoint`](subcommands/validator-client.md#beacon-node-api-endpoint-beacon-node-api-endpoints). + +::: + +### `validator-api-cors-origins` + + + + +```bash +--validator-api-cors-origins=""[,"",...] or "*" +``` + + + + +```bash +--validator-api-cors-origins="http://medomain.com","https://meotherdomain.com" +``` + + + + +```bash +TEKU_VALIDATOR_API_CORS_ORIGINS="http://medomain.com","https://meotherdomain.com" +``` + + + + +```bash +validator-api-cors-origins: ["http://medomain.com","https://meotherdomain.com"] +``` + + + + +A comma-separated list of domain URLs for CORS validation. + +Listed domains can access the node using validator API calls. If your client interacts with Teku using a browser app (such as a block explorer), add the client domain to the list. + +The default is "none." If you don't list any domains, browser apps can't interact with your Teku node. + +:::tip + +For testing and development purposes, use `*` to accept requests from any domain. We don’t recommend accepting requests from any domain for production environments. + +::: + +### `validator-api-docs-enabled` + + + + +```bash +--validator-api-docs-enabled[=] +``` + + + + +```bash +--validator-api-docs-enabled=true +``` + + + + +```bash +TEKU_VALIDATOR_API_DOCS_ENABLED=true +``` + + + + +```bash +validator-api-docs-enabled: true +``` + + + + +Set to `true` to enable the [validator REST API documentation](../rest.md#enable-the-validator-client-api). The default is `false`. + +When enabling the API documentation endpoint, you must also specify: + +- `interface` by using [`--validator-api-interface`](#validator-api-interface). +- `port` by using [`--validator-api-port`](#validator-api-port). + +### `validator-api-enabled` + + + + +```bash +--validator-api-enabled[=] +``` + + + + +```bash +--validator-api-enabled=true +``` + + + + +```bash +TEKU_VALIDATOR_API_ENABLED=true +``` + + + + +```bash +validator-api-enabled: true +``` + + + + +Set to `true` to enable the [validator client API](../rest.md#enable-the-validator-client-api). The default is `false`. + +If set to `true`, then use [`--validator-api-host-allowlist`](#validator-api-host-allowlist) to limit access to trusted parties. + +### `validator-api-host-allowlist` + + + + +```bash +--validator-api-host-allowlist=[,...]... or "*" +``` + + + + +```bash +--validator-api-host-allowlist=medomain.com,meotherdomain.com +``` + + + + +```bash +TEKU_VALIDATOR_API_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + + + + +```bash +validator-api-host-allowlist: ["medomain.com", "meotherdomain.com"] +``` + + + + +A comma-separated list of hostnames to allow access to the [validator REST API](../rest.md#enable-the-validator-client-api). By default, Teku accepts access from `localhost` and `127.0.0.1`. + +:::warning + +Only trusted parties should access the API. Do not directly expose these APIs publicly on production nodes. + +We don't recommend allowing all hostnames (`"*"`) for production environments. + +::: + +### `validator-api-interface` + + + + +```bash +--validator-api-interface= +``` + + + + +```bash +# to listen on all interfaces +--validator-api-interface=0.0.0.0 +``` + + + + +```bash +TEKU_VALIDATOR_API_INTERFACE=0.0.0.0 +``` + + + + +```bash +validator-api-interface: "0.0.0.0" +``` + + + + +The interface on which the [validator REST API](../rest.md#enable-the-validator-client-api) listens. The default is `127.0.0.1`. + +### `validator-api-keystore-file` + + + + +```bash +--validator-api-keystore-file= +``` + + + + +```bash +--validator-api-keystore-file=validator_keystorstore.p12 +``` + + + + +```bash +TEKU_VALIDATOR_API_KEYSTORE_FILE=validator_keystore.p12 +``` + + + + +```bash +validator-api-keystore-file: "validator_keystore.p12" +``` + + + + +Keystore file for the [validator REST API](../rest.md#enable-the-validator-client-api). Teku can use PKCS12 or JKS keystore types. You must [create a keystore](../../how-to/use-external-signer/manage-keys.md#create-a-keystore) to enable access. + +### `validator-api-keystore-password-file` + + + + +```bash +--validator-api-keystore-password-file= +``` + + + + +```bash +--validator-api-keystore-password-file=validator_keystore_pass.txt +``` + + + + +```bash +TEKU_VALIDATOR_API_KEYSTORE_PASSWORD_FILE=validator_keystore_pass.txt +``` + + + + +```bash +validator-api-keystore-password-file: "validator_keystore_pass.txt" +``` + + + + +Password used to decrypt the keystore for the [validator REST API](../rest.md#enable-the-validator-client-api). + +### `validator-api-port` + + + + +```bash +--validator-api-port= +``` + + + + +```bash +--validator-api-port=5052 +``` + + + + +```bash +TEKU_VALIDATOR_API_PORT=5052 +``` + + + + +```bash +validator-api-port: 5052 +``` + + + + +The [validator REST API](../rest.md#enable-the-validator-client-api) listening port (HTTP). The default is 5052. + + +### `validators-builder-registration-default-enabled` + + + + +```bash +--validators-builder-registration-default-enabled[=] +``` + + + + +```bash +--validators-builder-registration-default-enabled=true +``` + + + + +```bash +TEKU_VALIDATORS_BUILDER_REGISTRATION_DEFAULT_ENABLED=true +``` + + + + +```bash +validators-builder-registration-default-enabled: true +``` + + + + +Set to `true` to have all validators managed by the validator client register to the [builder endpoint](../../how-to/configure/builder-network.md) when proposing a block. + +### `validators-early-attestations-enabled` + + + + +```bash +--validators-early-attestations-enabled[=] +``` + + + + +```bash +--validators-early-attestations-enabled=false +``` + + + + +```bash +TEKU_VALIDATORS_EARLY_ATTESTATIONS_ENABLED=false +``` + + + + +```bash +validators-early-attestations-enabled: false +``` + + + + +Specify whether to use Teku's built-in early attestation production, which creates an attestation as soon as a block is received. The default is `true`. + +Set this option to `false` if running a validator client connected to a load balanced beacon node (including most hosted beacon nodes such as [Infura]), and validator effectiveness is poor. + +:::note + +Delaying attestation production increases the chances of generating a correct attestation when using a load balanced beacon node, but it increases the risk of inclusion delays. + +::: + +### `validators-external-signer-keystore` + + + + +```bash +--validators-external-signer-keystore= +``` + + + + +```bash +--validators-external-signer-keystore=teku_client_keystore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE=teku_client_keystore.p12 +``` + + + + +```bash +validators-external-signer-keystore: "teku_client_keystore.p12" +``` + + + + +The keystore that Teku presents to the external signer for TLS authentication. Teku can use PKCS12 or JKS keystore types. + +Use the PKCS12 keystore type if connecting to Web3Signer. + +### `validators-external-signer-keystore-password-file` + + + + +```bash +--validators-external-signer-keystore-password-file= +``` + + + + +```bash +--validators-external-signer-keystore-password-file=keystore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE_PASSWORD_FILE=keystore_pass.txt +``` + + + + +```bash +validators-external-signer-keystore-password-file: "keystore_pass.txt" +``` + + + + +Password file used to decrypt the keystore. + +### `validators-external-signer-public-keys` + + + + +```bash +--validators-external-signer-public-keys=[,...] +``` + + + + +```bash +--validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_PUBLIC_KEYS=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +validators-external-signer-public-keys: ["0xa99a...e44c","0xb89b...4a0b"] +``` + + + + +List or URL of validator public keys used by an external signer (for example, Web3Signer). + +Use the URL to load the public keys from a remote service. For example: + +```bash +--validators-external-signer-public-keys=http://localhost:9900/api/v1/eth2/publicKeys +``` + +Use the value `external-signer` to load all public keys managed by the external signer. Teku automatically queries the external signer's [public keys endpoint](https://consensys.github.io/web3signer/web3signer-eth2.html#tag/Public-Key). + +```bash +--validators-external-signer-public-keys=external-signer +``` + +:::tip + +You can [load new validators without restarting Teku] if you specify a URL from which to load the public keys. + +::: + +Ensure the external signer is running before starting Teku. + +### `validators-external-signer-slashing-protection-enabled` + + + + +```bash +--validators-external-signer-slashing-protection-enabled[=] +``` + + + + +```bash +--validators-external-signer-slashing-protection-enabled=false +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_SLASHING_PROTECTION_ENABLED=false +``` + + + + +```bash +validators-external-signer-slashing-protection-enabled: false +``` + + + + +Specify whether to use Teku's built-in [slashing protection] when using an external signer such as [Web3Signer]. The default is `true`. + +Set this option to `false` if using the slashing protection implemented by an external signer. + +:::warning + +Ensure the external signer has slashing protection enabled before disabling Teku slashing protection, otherwise a validator may get slashed. + +::: + +Built-in slashing protection can only be disabled for validators using external signers. Validators using Teku to sign blocks and attestations always uses its built-in slashing protection. + +### `validators-external-signer-timeout` + + + + +```bash +--validators-external-signer-timeout= +``` + + + + +```bash +--validators-external-signer-timeout=2000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_TIMEOUT=2000 +``` + + + + +```bash +validators-external-signer-timeout: 2000 +``` + + + + +Timeout in milliseconds for requests to the external signer. The default is 5000. + +### `validators-external-signer-truststore` + + + + +```bash +--validators-external-signer-truststore= +``` + + + + +```bash +--validators-external-signer-truststore=websigner_truststore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE=websigner_truststore.p12 +``` + + + + +```bash +validators-external-signer-truststore: "websigner_truststore.p12" +``` + + + + +PKCS12 or JKS keystore used to trust external signer's self-signed certificate or CA certificate which signs the external signer's certificate. + +### `validators-external-signer-truststore-password-file` + + + + +```bash +--validators-external-signer-truststore-password-file= +``` + + + + +```bash +--validators-external-signer-truststore-password-file=truststore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE_PASSWORD_FILE=truststore_pass.txt +``` + + + + +```bash +validators-external-signer-truststore-password-file: "truststore_pass.txt" +``` + + + + +Password file used to decrypt the keystore. + +### `validators-external-signer-url` + + + + +```bash +--validators-external-signer-url= +``` + + + + +```bash +--validators-external-signer-url=http://localhost:9000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_URL=http://localhost:9000 +``` + + + + +```bash +validators-external-signer-url: "http://localhost:9000" +``` + + + + +URL on which the external signer (for example, Web3Signer) is running. + +### `validators-graffiti` + + + + +```bash +--validators-graffiti= +``` + + + + +```bash +--validators-graffiti="Teku validator" +``` + + + + +```bash +TEKU_VALIDATORS_GRAFFITI="Teku validator" +``` + + + + +```bash +validators-graffiti: "Teku validator" +``` + + + + +Graffiti to add when creating a block. Gets converted to bytes and padded to Bytes32. + +The same graffiti is used for all validators started with this beacon node. + +[`--validators-graffiti-file`](#validators-graffiti-file) takes precedence if both options are set. + +### `validators-graffiti-file` + + + + +```bash +--validators-graffiti-file= +``` + + + + +```bash +--validators-graffiti-file=/Users/me/mynode/graffiti.txt +``` + + + + +```bash +TEKU_VALIDATORS_GRAFFITI_FILE=/Users/me/mynode/graffiti.txt +``` + + + + +```bash +validators-graffiti-file: "/Users/me/mynode/graffiti.txt" +``` + + + + +File containing the validator graffiti to add when creating a block. The file contents is converted to `bytes` and padded to `Bytes32`. The same graffiti is used for all validators started with this beacon node. + +You can overwrite the file while Teku is running to update the graffiti. + +This option takes precedence over [`--validators-graffiti`](#validators-graffiti). + +### `validator-keys` + + + + +```bash +--validator-keys=: | :[,: | :...]... +``` + + + + +```bash +--validator-keys=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +--validator-keys=/home/validator/keys/validator_217179e.json:/home/validator/passwords/validator_217179e.txt +``` + + + + +```bash +TEKU_VALIDATOR_KEYS=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +validator-keys: "/home/validator/keys:home/validator/passwords" +``` + + + + +Directory or file to load the encrypted keystore file(s) and associated password file(s) from. Keystore files must use the `.json` file extension, and password files must use the `.txt` file extension. + +When specifying directories, Teku expects to find identically named keystore and password files. For example `validator_217179e.json` and `validator_217179e.txt`. + +:::tip + +You can [load new validators without restarting Teku] if you specify a directory from which to load the keystore files. + +::: + +When specifying file names, Teku expects that the files exist. + +:::note + +The path separator is operating system dependent, and should be `;` in Windows rather than `:`. + +::: + +### `validators-keystore-locking-enabled` + + + + +```bash +--validators-keystore-locking-enabled= +``` + + + + +```bash +--validators-keystore-locking-enabled=true +``` + + + + +```bash +TEKU_VALIDATORS_KEYSTORE_LOCKING_ENABLED=true +``` + + + + +```bash +validators-keystore-locking-enabled: true +``` + + + + +Locks the keystore files listed in [`--validator-keys`](#validator-keys). The default is `true`. + +Attempts to lock all keystores in a directory if a directory is specified in [`--validator-keys`](#validator-keys). + +### `validators-performance-tracking-mode` + + + + +```bash +--validators-performance-tracking-mode= +``` + + + + +```bash +--validators-performance-tracking-mode=LOGGING +``` + + + + +```bash +TEKU_VALIDATORS_PERFORMANCE_TRACKING_MODE=LOGGING +``` + + + + +```bash +validators-performance-tracking-mode: LOGGING +``` + + + + +Set the validator performance tracking strategy. Valid options are `LOGGING`, `METRICS`, `ALL`, and `NONE`. The default is `ALL`. + +When `LOGGING` is enabled, attestation and block performance is reported as log messages. When `METRICS` is enabled, attestation and block performance is reported using [metrics] in the [`VALIDATOR_PERFORMANCE`](#metrics-categories) metrics category. + +### `validators-proposer-blinded-blocks-enabled` + + + + +```bash +--validators-proposer-blinded-blocks-enabled[=] +``` + + + + +```bash +--validators-proposer-blinded-blocks-enabled=true +``` + + + + +```bash +TEKU_VALIDATORS_PROPOSER_BLINDED_BLOCKS_ENABLED=true +``` + + + + +```bash +validators-proposer-blinded-blocks-enabled: true +``` + + + + +Set to `true` to enable blinded blocks production, a prerequisite for the [builder network](../../how-to/configure/builder-network.md). When [`--validators-builder-registration-default-enabled`](#validators-builder-registration-default-enabled) is enabled this option is enabled automatically. The default is `false`. + +### `validators-proposer-config` + + + + +```bash +--validators-proposer-config= +``` + + + + +```bash +--validators-proposer-config=/home/me/node/proposerConfig.json +``` + + + + +```bash +TEKU_VALIDATORS_PROPOSER_CONFIG=/home/me/node/proposerConfig.json +``` + + + + +```bash +validators-proposer-config: "/home/me/node/proposerConfig.json" +``` + + + + +Remote URL or local file path to the [proposer configuration file](../../how-to/configure/use-proposer-config-file.md). + +### `validators-proposer-config-refresh-enabled` + + + + +```bash +--validators-proposer-config-refresh-enabled[=] +``` + + + + +```bash +--validators-proposer-config-refresh-enabled=true +``` + + + + +```bash +TEKU_VALIDATORS_PROPOSER_CONFIG_REFRESH_ENABLED=true +``` + + + + +```bash +validators-proposer-config-refresh-enabled: true +``` + + + + +Set to `true` to enable reloading the [proposer configuration](../../how-to/configure/use-proposer-config-file.md) on every proposer preparation (once per epoch). The default is `false`. + +### `validators-proposer-default-fee-recipient` + + + + +```bash +--validators-proposer-default-fee-recipient=
+``` + + + + +```bash +--validators-proposer-default-fee-recipient=0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73 +``` + + + + +```bash +TEKU_VALIDATORS_PROPOSER_DEFAULT_FEE_RECIPIENT=0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73 +``` + + + + +```bash +validators-proposer-default-fee-recipient: "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73" +``` + + + + +Default recipient of transaction fees for all validator keys. When running a validator, this is an alternative to the `fee_recipient` in the [default proposer configuration](../../how-to/configure/use-proposer-config-file.md). + +:::tip + +We recommend using this option when running a beacon node serving APIs to other validator clients. + +The specified fee recipient is used in rare cases when a validator requests a block production but its fee recipient is still unknown for the beacon node. + +::: + +### `version` + +```bash title="Syntax" +-V, --version +``` + +Displays the version and exits. + +### `ws-checkpoint` + + + + +```bash +--ws-checkpoint=: +``` + + + + +```bash +--ws-checkpoint=0x5a642bb8f367e98c0d11426d98d28c465f8988fc960500886cb49faf0372883a:3600 +``` + + + + +```bash +TEKU_WS_CHECKPOINT=0x5a642bb8f367e98c0d11426d98d28c465f8988fc960500886cb49faf0372883a:3600 +``` + + + + +```bash +ws-checkpoint: "0x5a642bb8f367e98c0d11426d98d28c465f8988fc960500886cb49faf0372883a:3600" +``` + + + + +A recent checkpoint within the [weak subjectivity period]. +Accepts the checkpoint using `:`, where `` must start with `0x`. + +The weak subjectivity checkpoint is a recent, finalized checkpoint on the correct chain. +By supplying a weak subjectivity checkpoint, you ensure that nodes that have been offline for a long +period follow the correct chain. +It protects the node from long-range attacks by malicious actors. + +Use the [`admin weak-subjectivity`](subcommands/admin.md#weak-subjectivity) subcommand to display or +clear your weak subjectivity settings. + + + +[Infura]: https://infura.io/ +[Teku metrics]: ../../how-to/monitor/use-metrics.md +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[slashing protection]: ../../concepts/slashing-protection.md +[weak subjectivity period]: ../../concepts/weak-subjectivity.md +[load new validators without restarting Teku]: ../../how-to/load-validators-without-restarting.md +[recent finalized checkpoint state from which to sync]: ../../get-started/checkpoint-start.md +[consensus specification]: https://github.com/ethereum/consensus-specs/tree/master/configs +[metrics]: ../../how-to/monitor/use-metrics.md diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md new file mode 100644 index 000000000..de2ac2629 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md @@ -0,0 +1,631 @@ +--- +title: admin +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# `admin` + +Used to perform administrative tasks. + +## `weak-subjectivity` + +Display or clear weak subjectivity configuration. + +### `clear-state` + +Clears the stored weak subjectivity configuration. + +#### `config-file` + + + + +```bash +teku admin weak-subjectivity clear-state --config-file= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +#### `data-base-path`, `data-path` + + + + +```bash +teku admin weak-subjectivity clear-state --data-base-path= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --data-base-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BASE_PATH=/home/me/me_node +``` + + + + +```bash +data-base-path: "/home/me/me_node" +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +The default Docker image location is `/root/.local/share/teku`. + +#### `data-beacon-path` + + + + +```bash +teku admin weak-subjectivity clear-state --data-beacon-path= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --data-beacon-path=/home/me/me_beacon +``` + + + + +```bash +TEKU_DATA_BEACON_PATH=/home/me/me_beacon +``` + + + + +```bash +data-beacon-path: "/home/me/me_beaon" +``` + + + + +Path to the beacon node data. The default is `/beacon` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +#### `data-storage-archive-frequency` + + + + +```bash +teku admin weak-subjectivity clear-state --data-storage-archive-frequency= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --data-storage-archive-frequency=1028 +``` + + + + +```bash +TEKU_DATA_STORAGE_ARCHIVE_FREQUENCY=1028 +``` + + + + +```bash +data-storage-archive-frequency: 1028 +``` + + + + +Set the frequency (in slots) at which to store finalized states to disk. The default is 2048. + +This option is ignored if [`--data-storage-mode`](#data-storage-mode) is set to `prune`. + +:::note + +Specifying a larger number of slots as the archive frequency has a potentially higher overhead for retrieving finalized states since more states may need to be regenerated to get to the requested state. Specifying a lower number of slots as the frequency increases the disk space usage. + +::: + +For example, `--data-storage-archive-frequency=1` uses maximum disk space but has the lowest response time for retrieving a finalized state since each slot state is saved, whereas `--data-storage-archive-frequency=2048` uses less disk space, but may need to regenerate the state because every 2048th slot state is saved. + +#### `data-storage-mode` + + + + +```bash +teku admin weak-subjectivity clear-state --data-storage-mode= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --data-storage-mode=archive +``` + + + + +```bash +TEKU_DATA_STORAGE_MODE=archive +``` + + + + +```bash +data-storage-mode: "archive" +``` + + + + +Set the strategy for handling historical chain data. Valid options are `minimal`, `prune` and `archive`. The default is `prune`. + +#### `data-validator-path` + + + + +```bash +teku admin weak-subjectivity clear-state --data-validator-path= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +#### `eth1-deposit-contract-address` + + + + +```bash +teku admin weak-subjectivity clear-state --eth1-deposit-contract-address=
+``` + + + + +```bash +teku admin weak-subjectivity clear-state --eth1-deposit-contract-address=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +TEKU_ETH1_DEPOSIT_CONTRACT_ADDRESS=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +eth1-deposit-contract-address: "0x77f7bED277449F51505a4C54550B074030d989bC" +``` + + + + +The address of the deposit contract. Only required when creating a custom network. + +#### `network` + + + + +```bash +teku admin weak-subjectivity clear-state --network= +``` + + + + +```bash +teku admin weak-subjectivity clear-state --network=mainnet +``` + + + + +```bash +TEKU_NETWORK=mainnet +``` + + + + +```bash +network: "mainnet" +``` + + + + +Predefined network configuration. Accepts a predefined network name, or file path or URL to a YAML configuration file. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Description | +| --- | --- | --- | --- | +| `mainnet` | Consensus layer | Production | Main network | +| `minimal` | Consensus layer | Test | Used for local testing and development networks | +| `holesky` | Consensus layer | Test | Multi-client testnet | +| `goerli` | Consensus layer | Test | Multi-client testnet | +| `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | +| `sepolia` | Consensus layer | Test | Multi-client testnet | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | + +Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract. + +### `display-state` + +Displays the stored weak subjectivity configuration. + +#### `config-file` + + + + +```bash +teku admin weak-subjectivity display-state --config-file= +``` + + + + +```bash +teku admin weak-subjectivity display-state --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +#### `data-base-path`, `data-path` + + + + +```bash +teku admin weak-subjectivity display-state --data-base-path= +``` + + + + +```bash +teku admin weak-subjectivity display-state --data-base-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BASE_PATH=/home/me/me_node +``` + + + + +```bash +data-base-path: "/home/me/me_node" +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +The default Docker image location is `/root/.local/share/teku`. + +#### `data-beacon-path` + + + + +```bash +teku admin weak-subjectivity display-state --data-beacon-path= +``` + + + + +```bash +teku admin weak-subjectivity display-state --data-beacon-path=/home/me/me_beacon +``` + + + + +```bash +TEKU_DATA_BEACON_PATH=/home/me/me_beacon +``` + + + + +```bash +data-beacon-path: "/home/me/me_beacon" +``` + + + + +Path to the beacon node data. The default is `/beacon` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +#### `data-storage-archive-frequency` + + + + +```bash +teku admin weak-subjectivity display-state --data-storage-archive-frequency= +``` + + + + +```bash +teku admin weak-subjectivity display-state --data-storage-archive-frequency=1028 +``` + + + + +```bash +TEKU_DATA_STORAGE_ARCHIVE_FREQUENCY=1028 +``` + + + + +```bash +data-storage-archive-frequency: 1028 +``` + + + + +Set the frequency (in slots) at which to store finalized states to disk. The default is 2048. + +This option is ignored if [`--data-storage-mode`](#data-storage-mode) is not set to `archive`. + +:::note + +Specifying a larger number of slots as the archive frequency has a potentially higher overhead for retrieving finalized states since more states may need to be regenerated to get to the requested state. Specifying a lower number of slots as the frequency increases the disk space usage. + +::: + +For example, `--data-storage-archive-frequency=1` uses maximum disk space but has the lowest response time for retrieving a finalized state since each slot state is saved, whereas `--data-storage-archive-frequency=2048` uses less disk space, but may need to regenerate the state because every 2048th slot state is saved. + +#### `data-storage-mode` + + + + +```bash +teku admin weak-subjectivity display-state --data-storage-mode= +``` + + + + +```bash +teku admin weak-subjectivity display-state --data-storage-mode=archive +``` + + + + +```bash +TEKU_DATA_STORAGE_MODE=archive +``` + + + + +```bash +data-storage-mode: "archive" +``` + + + + +Set the strategy for handling historical chain data. Valid options are `minimal`, `prune` and `archive`. The default is `minimal`. + +#### `data-validator-path` + + + + +```bash +teku admin weak-subjectivity display-state --data-validator-path= +``` + + + + +```bash +teku admin weak-subjectivity display-state --data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +#### `eth1-deposit-contract-address` + + + + +```bash +teku admin weak-subjectivity display-state --eth1-deposit-contract-address=
+``` + + + + +```bash +teku admin weak-subjectivity display-state --eth1-deposit-contract-address=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +TEKU_ETH1_DEPOSIT_CONTRACT_ADDRESS=0x77f7bED277449F51505a4C54550B074030d989bC +``` + + + + +```bash +eth1-deposit-contract-address: "0x77f7bED277449F51505a4C54550B074030d989bC" +``` + + + + +The address of the deposit contract. Only required when creating a custom network. + +#### `network` + + + + +```bash +teku admin weak-subjectivity display-state --network= +``` + + + + +```bash +teku admin weak-subjectivity display-state --network=mainnet +``` + + + + +```bash +TEKU_NETWORK=mainnet +``` + + + + +```bash +network: "mainnet" +``` + + + + +Predefined network configuration. Accepts a predefined network name, or file path or URL to a YAML configuration file. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Description | +| --- | --- | --- | --- | +| `mainnet` | Consensus layer | Production | Main network | +| `minimal` | Consensus layer | Test | Used for local testing and development networks | +| `goerli` | Consensus layer | Test | Multi-client testnet | +| `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | +| `holesky` | Consensus layer | Test | Multi-client testnet | +| `sepolia` | Consensus layer | Test | Multi-client testnet | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | + +Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract. diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/development.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/development.md new file mode 100644 index 000000000..e05bf85e2 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/development.md @@ -0,0 +1,38 @@ +--- +title: Development and testing +description: Teku command line interface subcommands +sidebar_position: 7 +--- + +# Development and testing subcommands + +The following subcommands are used for development and testing purposes. + +## `genesis` + +Generate a genesis state for a network. + +```bash +teku genesis +``` + + + +[environment variables]: ../index.md##teku-environment-variables +[configuration file]: ../../../how-to/configure/use-config-file.md + +## `peer` + +Generate a list of peer IDs, including the private key, public key, and peer ID. + +```bash +teku peer +``` + +## `transition` + +Manually run state transitions for blocks or slots for debugging. + +```bash +teku transition +``` \ No newline at end of file diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/index.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/index.md new file mode 100644 index 000000000..e05c6cc79 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/index.md @@ -0,0 +1,40 @@ +--- +title: Subcommands +description: Teku subcommands overview +sidebar_position: 1 +--- + +# Teku subcommands + +This reference describes the syntax of the Teku subcommands. + +To start a Teku node using subcommands, run: + +```bash +teku [OPTIONS] [SUBCOMMANDS] [SUBCOMMAND OPTIONS] +``` + +You can also supply the subcommand options using [environment variables or a configuration file](../index.md#specifying-options). + +The available subcommands are: + +- [`admin`](admin.md) +- [`migrate-database`](migrate-database.md) +- [`slashing-protection`](slashing-protection.md) +- [`validator-client`](validator-client.md) +- [`voluntary-exit`](voluntary-exit.md) +- [Development and testing subcommands](development.md) + +## Using autocomplete + +If using Bash or Z shell, you can enable autocomplete support by navigating to the `build` folder and running: + +```bash +source teku.autocomplete.sh +``` + +Autocomplete allows you to view subcommand suggestions by pressing the Tab key twice. + +```bash +teku Tab+Tab +``` diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md new file mode 100644 index 000000000..5b4320662 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md @@ -0,0 +1,178 @@ +--- +title: migrate-database +description: Database migration subcommand options +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# `migrate-database` + +[Migrate the database to a LevelDB2 database](../../../how-to/migrate-database.md). + +:::note + +As of v21.5.0, new Teku installations use a LevelDB2 database. Previous Teku versions use RocksDB which continue to be supported. + +::: + +:::caution + +Before running the database migration, you must shut down the local Teku instance and confirm the process has fully exited and won't be restarted. + +::: + +## `config-file` + + + + +```bash +teku migrate-database --config-file= +``` + + + + +```bash +teku migrate-database --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the [YAML configuration file](../../../how-to/configure/use-config-file.md). The default is `none`. + +## `data-base-path`, `data-path` + + + + +```bash +teku migrate-database --data-base-path= +``` + + + + +```bash +teku migrate-database --data-base-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BASE_PATH=/home/me/me_node +``` + + + + +```bash +data-base-path: "/home/me/me_node" +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku` + +The default Docker image location is `/root/.local/share/teku`. + +## `data-beacon-path` + + + + +```bash +teku migrate-database --data-beacon-path= +``` + + + + +```bash +teku migrate-database --data-beacon-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BEACON_PATH=/home/me/me_node +``` + + + + +```bash +data-beacon-path: "/home/me/me_node" +``` + + + + +Path to the beacon node data. The default is `/beacon` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +## `network` + + + + +```bash +teku migrate-database --network= +``` + + + + +```bash +teku migrate-database --network=mainnet +``` + + + + +```bash +TEKU_NETWORK=mainnet +``` + + + + +```bash +network: "mainnet" +``` + + + + +Predefined network configuration. Accepts a predefined network name, or file path or URL to a YAML configuration file. See the [consensus specification](https://github.com/ethereum/consensus-specs/tree/master/configs) for examples. + +The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Description | +| :-- | :-- | :-- | :-- | +| `mainnet` | Consensus layer | Production | Main network | +| `minimal` | Consensus layer | Test | Used for local testing and development networks | +| `goerli` | Consensus layer | Test | Multi-client testnet | +| `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | +| `holesky` | Consensus layer | Test | Multi-client testnet | +| `sepolia` | Consensus layer | Test | Multi-client testnet | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md new file mode 100644 index 000000000..dd78a9fc5 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md @@ -0,0 +1,453 @@ +--- +title: slashing-protection +sidebar_position: 4 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# `slashing-protection` + +Manage the local [slashing protection data] used by the validator. + +## `export` + +Exports the slashing protection database in the [validator client interchange format] format. + +### `config-file` + + + + +```bash +teku slashing-protection export --config-file= +``` + + + + +```bash +teku slashing-protection export --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +### `data-path` + + + + +```bash +teku slashing-protection export --data-path= +``` + + + + +```bash +teku slashing-protection export --data-path=/home/me/me_node +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +### `data-validator-path` + + + + +```bash +teku slashing-protection export --data-validator-path= +``` + + + + +```bash +teku slashing-protection export --data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-path`](#data-path). + +:::info + +Teku exports slashing protection data from the `slashprotection` directory under the validator client data directory. + +::: + +### `to` + + + + +```bash +teku slashing-protection export --to= +``` + + + + +```bash +teku slashing-protection export --to=/home/slash/b845...23bed.json +``` + + + + +The file to export the slashing protection database to. + +Exports the database in the [validator client interchange format] format. + +## `import` + +Imports the slashing protection database using the [validator client interchange format]. + +:::caution + +Before running the import, you must stop the validator and confirm the process has fully exited and won't be restarted. + +::: + +### `config-file` + + + + +```bash +teku slashing-protection import --config-file= +``` + + + + +```bash +teku slashing-protection import --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +### `data-path` + + + + +```bash +teku slashing-protection import --data-path= +``` + + + + +```bash +teku slashing-protection import --data-path=/home/me/me_node +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +### `data-validator-path` + + + + +```bash +teku slashing-protection import --data-validator-path= +``` + + + + +```bash +teku slashing-protection import --data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-path`](#data-path). + +:::info + +Teku imports slashing protection data into a `slashprotection` directory under the validator client data directory. + +::: + +### `from` + + + + +```bash +teku slashing-protection import --from= +``` + + + + +```bash +teku slashing-protection import --from=/home/slash/b845...23bed.json +``` + + + + +The file to import the slashing protection database from. + +Teku imports the file to the `/validators/slashprotection/` directory in the format `.yml` (with no 0x prefix). + +`` is defined using [`--data-path`](#data-path). + + +## `repair` + +Repairs corrupted slashing protection data files used by Teku. + +### `check-only-enabled` + + + + +```bash +teku slashing-protection repair --checking-only-enabled[=] +``` + + + + +```bash +teku slashing-protection repair --checking-only-enabled=false +``` + + + + +Reads and reports potential slashing protection file problems, but doesn't update any files. You can specify which files are checked using [`--config-file`](#config-file_2), [`--data-base-path`](#data-base-path-data-path). + +### `config-file` + + + + +```bash +teku slashing-protection repair --config-file= +``` + + + + +```bash +teku slashing-protection repair --config-file=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +### `data-path` + + + + +```bash +teku slashing-protection repair --data-path= +``` + + + + +```bash +teku slashing-protection repair --data-path=/home/me/me_node +``` + + + + +Path to the Teku data directory. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku` + +The default Docker image location is `/root/.local/share/teku`. + +### `data-validator-path` + + + + +```bash +teku slashing-protection repair --data-validator-path= +``` + + + + +```bash +teku slashing-protection repair --data-validator-path=/home/me/me_validator +``` + + + + +Path to validator client data. The default is `/validator` where `` is specified using [`--data-path`](#data-path). + +:::info + +The slashing protection data is stored in a `slashprotection` directory under the validator client data directory. + +::: + +### `network` + + + + +```bash +teku slashing-protection repair --network= +``` + + + + +```bash +teku slashing-protection repair --network=mainnet +``` + + + + +Predefined network configuration. Accepts a predefined network name, or file path or URL to a YAML configuration file. The default is `mainnet`. + +Possible values are: + +| Network | Chain | Type | Description | +| --- | --- | --- | --- | +| `mainnet` | Consensus layer | Production | Main network | +| `minimal` | Consensus layer | Test | Used for local testing and development networks | +| `goerli` | Consensus layer | Test | Multi-client testnet | +| `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | +| `holesky` | Consensus layer | Test | Multi-client testnet | +| `sepolia` | Consensus layer | Test | Multi-client testnet | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | + +Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract. + +### `slot` + + + + +```bash +teku slashing-protection repair --slot= +``` + + + + +```bash +teku slashing-protection repair --slot=1028 +``` + + + + +Updates slashing protection files to contain the specified slot as a minimum. The value should be a future slot, or after when the validators stopped performing duties. + +:::note + +This can be automatically calculated for most networks, and is generally not required. + +::: + +### `update-all-enabled` + + + + +```bash +teku slashing-protection repair --update-all-enabled[=] +``` + + + + +```bash +teku slashing-protection repair --update-all-enabled=false +``` + + + + +Enables all slashing protection records to be updated. The default is `false`. + + + +[slashing protection data]: ../../../concepts/slashing-protection.md +[validator client interchange format]: https://eips.ethereum.org/EIPS/eip-3076 +[environment variables or a configuration file]: ../index.md#specifying-options +[recent finalized checkpoint state from which to sync]: ../../../get-started/checkpoint-start.md diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/validator-client.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/validator-client.md new file mode 100644 index 000000000..f3c69789f --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/validator-client.md @@ -0,0 +1,1211 @@ +--- +title: validator-client, vc +sidebar_position: 5 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# `validator-client`, `vc` + +Run a validator client that connects to a remote beacon node. + +## `beacon-node-api-endpoint`, `beacon-node-api-endpoints` + + + + +```bash +teku vc --beacon-node-api-endpoint=[,...]... +``` + + + + +```bash +teku vc --beacon-node-api-endpoint=http://192.138.10.12:5051,http://192.140.11.44:5051 +``` + + + + +```bash +TEKU_BEACON_NODE_API_ENDPOINT=http://192.138.10.12,http://192.140.11.44:5051 +``` + + + + +```bash +beacon-node-api-endpoint: ["http://192.138.10.12","http://192.140.11.44:5051"] +``` + + + + +Endpoint of the beacon node's REST API. You can configure multiple beacon nodes by providing a comma-separated list of beacon node API endpoints. + +If multiple beacon node endpoints are configured, the first one is used as primary and others as failovers. + +:::note + +This option cannot be used with the [sentry beacon nodes early access feature](../../../how-to/use-sentry-nodes.md). + +::: + +The default is `http://127.0.0.1:5051`. + +## `beacon-node-ssz-blocks-enabled` + + + + +```bash +teku vc --beacon-node-ssz-blocks-enabled= +``` + + + + +```bash +teku vc --beacon-node-ssz-blocks-enabled=false +``` + + + + +```bash +TEKU_BEACON_NODE_SSZ_BLOCKS_ENABLED=false +``` + + + + +```bash +beacon-node-ssz-blocks-enabled: false +``` + + + + +Enable or disable the use of SSZ encoding for API requests to the beacon node to create blocks. The default is `true`. + +## `config-file` + + + + +```bash +teku vc --config-file= +``` + + + + +```bash +teku vc --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +## `data-base-path`, `data-path` + + + + +```bash +teku vc --data-base-path= +``` + + + + +```bash +teku vc --data-base-path=/home/me/me_node +``` + + + + +```bash +TEKU_DATA_BASE_PATH=/home/me/me_node +``` + + + + +```bash +data-base-path: "/home/me/me_node" +``` + + + + +Path to the Teku base directory for storage. The default directory is OS-dependent: + +- macOS: `~/Library/teku` +- Unix/Linux: `$XDG_DATA_HOME/teku` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku` +- Windows: `%localappdata%\teku`. + +The default Docker image location is `/root/.local/share/teku`. + +## `data-validator-path` + + + + +```bash +teku vc --data-validator-path= +``` + + + + +```bash +teku vc --data-validator-path=/home/me/me_validator +``` + + + + +```bash +TEKU_DATA_VALIDATOR_PATH=/home/me/me_validator +``` + + + + +```bash +data-validator-path: "/home/me/me_validator" +``` + + + + +Path to the validator client data. The default is `/validator` where `` is specified using [`--data-base-path`](#data-base-path-data-path). + +## `log-color-enabled` + + + + +```bash +teku vc --log-color-enabled[=] +``` + + + + +```bash +teku vc --log-color-enabled=false +``` + + + + +```bash +TEKU_LOG_COLOR_ENABLED=false +``` + + + + +```bash +log-color-enabled: false +``` + + + + +Specify whether status and event log messages include a console color display code. The default is `true`. + +## `log-destination` + + + + +```bash +teku vc --log-destination= +``` + + + + +```bash +teku vc --log-destination=CONSOLE +``` + + + + +```bash +TEKU_LOG_DESTINATION=CONSOLE +``` + + + + +```bash +log-destination: "CONSOLE" +``` + + + + +Specify where to output log information. Valid options are: + +- `BOTH` +- `CONSOLE` +- `DEFAULT_BOTH` +- `FILE` + +The default is `DEFAULT_BOTH`. When using `BOTH` or `DEFAULT_BOTH`, system updates such as blockchain events are displayed on the console, and errors and other information are logged to a file. Specify the log file with the [`--log-file`](#log-file) command-line option. + +For production systems we recommend using the `CONSOLE` or `FILE` options to ensure all log information is available in one place. + +:::note + +Use `DEFAULT_BOTH` when using a [custom Log4J2 configuration file](../../../how-to/monitor/configure-logging.md#advanced-custom-logging). Any other option applies the custom logging changes on top of its default settings. + +::: + +## `log-file` + + + + +```bash +teku vc --log-file= +``` + + + + +```bash +teku vc --log-file=teku_2020-01-01.log +``` + + + + +```bash +TEKU_LOG_FILE=teku_2020-01-01.log +``` + + + + +```bash +log-file: "teku_2020-01-01.log" +``` + + + + +Relative or absolute location, and filename of the log file. + +The default directory is OS-dependent: + +- macOS: `~/Library/teku/logs` +- Unix/Linux: `$XDG_DATA_HOME/teku/logs` if `$XDG_DATA_HOME` is set; otherwise `~/.local/share/teku/logs` +- Windows: `%localappdata%\teku\logs` + +The default Docker image location is `/root/.local/share/teku/logs`. + +## `log-file-name-pattern` + + + + +```bash +teku vc --log-file-name-pattern= +``` + + + + +```bash +teku vc --log-file-name-pattern=tekuL_%d{yyyy-MM-dd}.log +``` + + + + +```bash +TEKU_LOG_FILE_NAME_PATTERN=tekuL_%d{yyyy-MM-dd}.log +``` + + + + +```bash +log-file-name-pattern: "tekuL_%d{yyyy-MM-dd}.log" +``` + + + + +Filename pattern to apply when creating log files. The default pattern is `teku_%d{yyyy-MM-dd}.log` + +## `log-include-events-enabled` + + + + +```bash +teku vc --log-include-events-enabled[=] +``` + + + + +```bash +teku vc --log-include-events-enabled=false +``` + + + + +```bash +TEKU_LOG_INCLUDE_EVENTS_ENABLED=false +``` + + + + +```bash +log-include-events-enabled: false +``` + + + + +Specify whether to log frequent update events. For example every slot event with validators and attestations. The default is `true`. + +## `log-include-validator-duties-enabled` + + + + +```bash +teku vc --log-include-validator-duties-enabled[=] +``` + + + + +```bash +teku vc --log-include-validator-duties-enabled=true +``` + + + + +```bash +TEKU_LOG_INCLUDE_VALIDATOR_DUTIES_ENABLED=true +``` + + + + +```bash +log-include-validator-duties-enabled: true +``` + + + + +Specify whether to log details of validator event duties. The default is `true`. + +:::note + +Logs could become noisy when running many validators. + +::: + +## `metrics-categories` + + + + +```bash +teku vc --metrics-categories=[,...]... +``` + + + + +```bash +teku vc --metrics-categories=BEACON,JVM,PROCESS +``` + + + + +```bash +TEKU_METRICS_CATEGORIES=BEACON,JVM,PROCESS +``` + + + + +```bash +metrics-categories: ["BEACON", "JVM", "PROCESS"] +``` + + + + +Categories for which to track metrics. Options are `JVM`, `PROCESS`, `BEACON`, `DISCOVERY`, `EVENTBUS`, `EXECUTOR`, `LIBP2P`, `NETWORK`, `STORAGE`, `STORAGE_HOT_DB`, `STORAGE_FINALIZED_DB`, `REMOTE_VALIDATOR`, `VALIDATOR`, `VALIDATOR_PERFORMANCE`, `VALIDATOR_DUTY`. All but `VALIDATOR_DUTY` categories are enabled by default. + +When `metrics-categories` is used, only the categories specified in this option are enabled (all other categories are disabled). + +## `metrics-enabled` + + + + +```bash +teku vc --metrics-enabled[=] +``` + + + + +```bash +teku vc --metrics-enabled=true +``` + + + + +```bash +TEKU_METRICS_ENABLED=true +``` + + + + +```bash +metrics-enabled: true +``` + + + + +Set to `true` to enable the metrics exporter. The default is `false`. + +## `metrics-host-allowlist` + + + + +```bash +teku vc --metrics-host-allowlist=[,...]... or "*" +``` + + + + +```bash +teku vc --metrics-host-allowlist=medomain.com,meotherdomain.com +``` + + + + +```bash +TEKU_METRICS_HOST_ALLOWLIST=medomain.com,meotherdomain.com +``` + + + + +```bash +metrics-host-allowlist: ["medomain.com", "meotherdomain.com"] +``` + + + + +A comma-separated list of hostnames to allow access to the [Teku metrics]. By default, Teku accepts access from `localhost` and `127.0.0.1`. + +:::tip + +To allow all hostnames, use `"*"`. We don't recommend allowing all hostnames for production environments. + +::: + +## `metrics-interface` + + + + +```bash +teku vc --metrics-interface= +``` + + + + +```bash +teku vc --metrics-interface=192.168.10.101 +``` + + + + +```bash +TEKU_METRICS_INTERFACE=192.168.10.101 +``` + + + + +```bash +metrics-interface: "192.168.10.101" +``` + + + + +Host on which Prometheus accesses Teku metrics. The default is `127.0.0.1`. + +## `metrics-port` + + + + +```bash +teku vc --metrics-port= +``` + + + + +```bash +teku vc --metrics-port=6174 +``` + + + + +```bash +TEKU_METRICS_PORT=6174 +``` + + + + +```bash +metrics-port: 6174 +``` + + + + +Specifies the port (TCP) on which [Prometheus](https://prometheus.io/) accesses Teku metrics. The default is `8008`. + +## `network` + + + + +```bash +teku vc --network= +``` + + + + +```bash +teku vc --network=auto +``` + + + + +```bash +TEKU_NETWORK=auto +``` + + + + +```bash +network: "auto" +``` + + + + +Predefined network configuration. The default is `mainnet`. + +Use `auto` to fetch the network configuration from the beacon node endpoint directly. + +## `validator-keys` + + + + +```bash +teku vc --validator-keys=: | :[,: | :...]... +``` + + + + +```bash +teku vc --validator-keys=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +teku vc --validator-keys=/home/validator/keys/validator_217179e.json:/home/validator/passwords/validator_217179e.txt +``` + + + + +```bash +TEKU_VALIDATOR_KEYS=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +validator-keys: "/home/validator/keys:home/validator/passwords" +``` + + + + +Directory or file to load the encrypted keystore file(s) and associated password file(s) from. Keystore files must use the `.json` file extension, and password files must use the `.txt` file extension. + +When specifying directories, Teku expects to find identically named keystore and password files. For example `validator_217179e.json` and `validator_217179e.txt`. + +When specifying file names, Teku expects that the files exist. + +:::note + +The path separator is operating system dependent, and should be `;` in Windows rather than `:`. + +::: + +## `validators-early-attestations-enabled` + + + + +```bash +teku vc --validators-early-attestations-enabled[=] +``` + + + + +```bash +teku vc --validators-early-attestations-enabled=false +``` + + + + +```bash +TEKU_VALIDATORS_EARLY_ATTESTATIONS_ENABLED=false +``` + + + + +```bash +validators-early-attestations-enabled: false +``` + + + + +Specify whether to use Teku's built-in early attestation production, which creates an attestation once a block is received. The default is `true`. + +Set this option to `false` if running a validator client connected to a load balanced beacon node (including most hosted beacon nodes such as [Infura]), and validator effectiveness is poor. + +:::note + +Delaying attestation production increases the chances of generating a correct attestation when using a load balanced beacon node, but it increases the risk of inclusion delays. + +::: + +## `validators-external-signer-keystore` + + + + +```bash +teku vc --validators-external-signer-keystore= +``` + + + + +```bash +teku vc --validators-external-signer-keystore=teku_client_keystore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE=teku_client_keystore.p12 +``` + + + + +```bash +validators-external-signer-keystore: "teku_client_keystore.p12" +``` + + + + +The keystore that Teku presents to the external signer for TLS authentication. Teku can use PKCS12 or JKS keystore types. + +Use the PKCS12 keystore type if connecting to Web3Signer. + +## `validators-external-signer-keystore-password-file` + + + + +```bash +teku vc --validators-external-signer-keystore-password-file= +``` + + + + +```bash +teku vc --validators-external-signer-keystore-password-file=keystore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE_PASSWORD_FILE=keystore_pass.txt +``` + + + + +```bash +validators-external-signer-keystore-password-file: "keystore_pass.txt" +``` + + + + +Password file used to decrypt the keystore. + +## `validators-external-signer-public-keys` + + + + +```bash +teku vc --validators-external-signer-public-keys=[,...] +``` + + + + +```bash +teku vc --validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_PUBLIC_KEYS=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +validators-external-signer-public-keys: ["0xa99a...e44c","0xb89b...4a0b"] +``` + + + + +List or URL of validator public keys used by an external signer (for example, [Web3Signer]). + +Use the URL to load the public keys from a remote service. For example: + +```bash +--validators-external-signer-public-keys=http://localhost:9900/api/v1/eth2/publicKeys +``` + +Use the value `external-signer` to load all public keys managed by the external signer. Teku automatically queries the external signer's [public keys endpoint](https://consensys.github.io/web3signer/web3signer-eth2.html#tag/Public-Key). + +```bash +--validators-external-signer-public-keys=external-signer +``` + +## `validators-external-signer-slashing-protection-enabled` + + + + +```bash +teku vc --validators-external-signer-slashing-protection-enabled[=] +``` + + + + +```bash +teku vc --validators-external-signer-slashing-protection-enabled=false +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_SLASHING_PROTECTION_ENABLED=false +``` + + + + +```bash +validators-external-signer-slashing-protection-enabled: false +``` + + + + +Specify whether to use Teku's built-in [slashing protection] when using an external signer such as [Web3Signer]. The default is `true`. + +Set this option to `false` if using the slashing protection implemented by an external signer. + +:::warning + +Ensure the external signer has slashing protection enabled before disabling Teku slashing protection, otherwise a validator may get slashed. + +::: + +Built-in slashing protection can only be disabled for validators using external signers. Validators using Teku to sign blocks and attestations always uses its built-in slashing protection. + +## `validators-external-signer-timeout` + + + + +```bash +teku vc --validators-external-signer-timeout= +``` + + + + +```bash +teku vc --validators-external-signer-timeout=2000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_TIMEOUT=2000 +``` + + + + +```bash +validators-external-signer-timeout: 2000 +``` + + + + +Timeout in milliseconds for requests to the external signer. The default is 5000. + +## `validators-external-signer-truststore` + + + + +```bash +teku vc --validators-external-signer-truststore= +``` + + + + +```bash +teku vc --validators-external-signer-truststore=websigner_truststore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE=websigner_truststore.p12 +``` + + + + +```bash +validators-external-signer-truststore: "websigner_truststore.p12" +``` + + + + +PKCS12 or JKS keystore used to trust external signer's self-signed certificate or CA certificate which signs the external signer's certificate. + +## `validators-external-signer-truststore-password-file` + + + + +```bash +teku vc --validators-external-signer-truststore-password-file= +``` + + + + +```bash +teku vc --validators-external-signer-truststore-password-file=truststore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE_PASSWORD_FILE=truststore_pass.txt +``` + + + + +```bash +validators-external-signer-truststore-password-file: "truststore_pass.txt" +``` + + + + +Password file used to decrypt the [keystore](#validators-external-signer-truststore). + +## `validators-external-signer-url` + + + + +```bash +teku vc --validators-external-signer-url= +``` + + + + +```bash +teku vc --validators-external-signer-url=http://localhost:9000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_URL=http://localhost:9000 +``` + + + + +```bash +validators-external-signer-url: "http://localhost:9000" +``` + + + + +URL on which the external signer (for example, Web3Signer) is running. + +## `validators-graffiti` + + + + +```bash +teku vc --validators-graffiti= +``` + + + + +```bash +teku vc --validators-graffiti="Teku validator" +``` + + + + +```bash +TEKU_VALIDATORS_GRAFFITI="Teku validator" +``` + + + + +```bash +validators-graffiti: "Teku validator" +``` + + + + +Graffiti to add when creating a block. Gets converted to bytes and padded to Bytes32. + +The same graffiti is used for all validators started with this beacon node. + +## `validators-graffiti-file` + + + + +```bash +teku vc --validators-graffiti-file= +``` + + + + +```bash +teku vc --validators-graffiti-file=/Users/me/mynode/graffiti.txt +``` + + + + +```bash +TEKU_VALIDATORS_GRAFFITI_FILE=/Users/me/mynode/graffiti.txt +``` + + + + +```bash +validators-graffiti-file: "/Users/me/mynode/graffiti.txt" +``` + + + + +File containing the validator graffiti to add when creating a block. The file content is converted to `bytes` and padded to `Bytes32`. The same graffiti is used for all validators started with this beacon node. + +You can overwrite the file while Teku is running to update the graffiti. + +This option takes precedence over [`--validators-graffiti`](#validators-graffiti). + +## `validators-keystore-locking-enabled` + + + + +```bash +teku vc --validators-keystore-locking-enabled= +``` + + + + +```bash +teku vc --validators-keystore-locking-enabled=true +``` + + + + +```bash +TEKU_VALIDATORS_KEYSTORE_LOCKING_ENABLED=true +``` + + + + +```bash +validators-keystore-locking-enabled: true +``` + + + + +Locks the keystore files listed in [`--validator-keys`](#validator-keys). The default is `true`. + +Attempts to lock all keystores in a directory if a directory is specified in [`--validator-keys`](#validator-keys). + +## `validators-performance-tracking-mode` + + + + +```bash +teku vc --validators-performance-tracking-mode= +``` + + + + +```bash +teku vc --validators-performance-tracking-mode=LOGGING +``` + + + + +```bash +TEKU_VALIDATORS_PERFORMANCE_TRACKING_MODE=LOGGING +``` + + + + +```bash +validators-performance-tracking-mode: LOGGING +``` + + + + +Set the validator performance tracking strategy. Valid options are `LOGGING`, `METRICS`, `ALL`, and `NONE`. The default is `ALL`. + +When `LOGGING` is enabled, attestation and block performance is reported as log messages. When `METRICS` is enabled, attestation and block performance is reported using [metrics] in the [`VALIDATOR_PERFORMANCE`](#metrics-categories) metrics category. + + + +[environment variables or a configuration file]: ../index.md#specifying-options +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[slashing protection]: ../../../concepts/slashing-protection.md +[recent finalized checkpoint state from which to sync]: ../../../get-started/checkpoint-start.md +[metrics]: ../../../how-to/monitor/use-metrics.md diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/voluntary-exit.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/voluntary-exit.md new file mode 100644 index 000000000..9616c15e1 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/voluntary-exit.md @@ -0,0 +1,538 @@ +--- +title: voluntary-exit +sidebar_position: 6 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# `voluntary-exit` + +Create and sign a [voluntary exit] for the specified validator or set of validators. +This subcommand can be run as a separate Teku process. + +:::caution + +To submit a voluntary exit, you must have a running beacon node with the [REST API enabled]. + +::: + +## `beacon-node-api-endpoint` + + + + +```bash +teku voluntary-exit --beacon-node-api-endpoint= +``` + + + + +```bash +teku voluntary-exit --beacon-node-api-endpoint=http://192.138.10.12 +``` + + + + +```bash +TEKU_BEACON_NODE_ENDPOINT=http://192.138.10.12 +``` + + + + +```bash +beacon-node-api-endpoint: "http://192.138.10.12" +``` + + + + +Endpoint of the beacon node's REST API. The default is `http://127.0.0.1:5051`. + +## `config-file` + + + + +```bash +teku voluntary-exit --config-file= +``` + + + + +```bash +teku voluntary-exit --config-file=/home/me/me_node/config.yaml +``` + + + + +```bash +TEKU_CONFIG_FILE=/home/me/me_node/config.yaml +``` + + + + +Path to the YAML configuration file. The default is `none`. + +## `confirmation-enabled` + + + + +```bash +teku voluntary-exit --confirmation-enabled= +``` + + + + +```bash +teku voluntary-exit --confirmation-enabled=false +``` + + + + +```bash +TEKU_CONFIRMATION_ENABLED=false +``` + + + + +```bash +confirmation-enabled: false +``` + + + + +Specify whether to request confirmation when exiting a validator. The default is `true`. + +:::warning + +If you set `--confirmation-enabled` to `false`, exits are generated immediately without any prompt. + +::: + +## `epoch` + + + + +```bash +teku voluntary-exit --epoch= +``` + + + + +```bash +teku voluntary-exit --epoch=24500 +``` + + + + +```bash +TEKU_EPOCH=24500 +``` + + + + +Earliest epoch that the voluntary exit can be processed. The specified epoch can be a past epoch, or current epoch. You cannot specify a future epoch. The default is the current epoch. + +:::note + +If there is a high number of validators that are queued to exit, then the validator exit may be processed at a later epoch. + +::: + +## `include-keymanager-keys` + + + + +```bash +teku voluntary-exit --include-keymanager-keys= +``` + + + + +```bash +teku voluntary-exit --include-keymanager-keys=true +``` + + + + +Include validator keys managed using the [key manager APIs](../../../how-to/use-external-signer/manage-keys.md). The default is `false`. + +## `network` + + + + +```bash +teku voluntary-exit --network= +``` + + + + +```bash +teku voluntary-exit --network=mainnet +``` + + + + +```bash +TEKU_NETWORK=mainnet +``` + + + + +```bash +network: "mainnet" +``` + + + + +Predefined network configuration. There is no default value, because Teku reads the network specification from the Beacon API unless specified. + +## `validator-keys` + + + + +```bash +teku voluntary-exit --validator-keys=: | :[,: | :...]... +``` + + + + +```bash +teku voluntary-exit --validator-keys=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +teku voluntary-exit --validator-keys=/home/validator/keys/validator_217179e.json:/home/validator/passwords/validator_217179e.txt +``` + + + + +```bash +TEKU_VALIDATOR_KEYS=/home/validator/keys:home/validator/passwords +``` + + + + +```bash +validator-keys: "/home/validator/keys:home/validator/passwords" +``` + + + + +Directory or file to load the encrypted keystores and passwords of the validators that you wish to exit. Keystore files must use the `.json` file extension, and password files must use the `.txt` file extension. + +When specifying directories, Teku expects to find identically named keystore and password files. For example `validator_217179e.json` and `validator_217179e.txt`. + +When specifying file names, Teku expects that the files exist. + +:::note + +The path separator is operating system dependent, and should be `;` in Windows rather than `:`. + +::: + +## `validator-public-keys` + + + + +```bash +teku voluntary-exit --validator-public-keys=[,...]... +``` + + + + +```bash +teku voluntary-exit --validator-public-keys=0xc7931ac6937f6c776d8dfe84918f7b26d986f2e45af5869085839b8817db2705,0x179a0e2768621eede9ce961cf8ee4f0ece5be9a1795c294269b69b85c765f3cc +``` + + + + +Restrict the exit command to a specified list of public keys. When the parameter is not used, all keys will be exited. + +## `validators-external-signer-keystore` + + + + +```bash +teku voluntary-exit --validators-external-signer-keystore= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-keystore=teku_client_keystore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE=teku_client_keystore.p12 +``` + + + + +```bash +validators-external-signer-keystore: "teku_client_keystore.p12" +``` + + + + +The keystore that Teku presents to the external signer for TLS authentication. Teku can use PKCS12 or JKS keystore types. + +Use the PKCS12 keystore type if connecting to Web3Signer. + +## `validators-external-signer-keystore-password-file` + + + + +```bash +teku voluntary-exit --validators-external-signer-keystore-password-file= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-keystore-password-file=keystore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_KEYSTORE_PASSWORD_FILE=keystore_pass.txt +``` + + + + +```bash +validators-external-signer-keystore-password-file: "keystore_pass.txt" +``` + + + + +Password file used to decrypt the keystore. + +## `validators-external-signer-public-keys` + + + + +```bash +teku voluntary-exit --validators-external-signer-public-keys=[,...] +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_PUBLIC_KEYS=0xa99a...e44c,0xb89b...4a0b +``` + + + + +```bash +validators-external-signer-public-keys: ["0xa99a...e44c","0xb89b...4a0b"] +``` + + + + +List of public keys of validators that you wish to voluntarily exit when using an external signer (for example, [Web3Signer]). + +## `validators-external-signer-timeout` + + + + +```bash +teku voluntary-exit --validators-external-signer-timeout= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-timeout=2000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_TIMEOUT=2000 +``` + + + + +```bash +validators-external-signer-timeout: 2000 +``` + + + + +Timeout in milliseconds for requests to the external signer. The default is 5000. + +## `validators-external-signer-truststore` + + + + +```bash +teku voluntary-exit --validators-external-signer-truststore= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-truststore=websigner_truststore.p12 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE=websigner_truststore.p12 +``` + + + + +```bash +validators-external-signer-truststore: "websigner_truststore.p12" +``` + + + + +PKCS12 or JKS keystore used to trust external signer's self-signed certificate or CA certificate which signs the external signer's certificate. + +## `validators-external-signer-truststore-password-file` + + + + +```bash +teku voluntary-exit --validators-external-signer-truststore-password-file= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-truststore-password-file=truststore_pass.txt +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_TRUSTSTORE_PASSWORD_FILE=truststore_pass.txt +``` + + + + +```bash +validators-external-signer-truststore-password-file: "truststore_pass.txt" +``` + + + + +Password file used to decrypt the keystore. + +## `validators-external-signer-url` + + + + +```bash +teku voluntary-exit --validators-external-signer-url= +``` + + + + +```bash +teku voluntary-exit --validators-external-signer-url=http://localhost:9000 +``` + + + + +```bash +TEKU_VALIDATORS_EXTERNAL_SIGNER_URL=http://localhost:9000 +``` + + + + +```bash +validators-external-signer-url: "http://localhost:9000" +``` + + + + +URL of the external signer (for example, [Web3Signer]). + + + +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[REST API enabled]: ../index.md#rest-api-enabled +[voluntary exit]: ../../../how-to/voluntarily-exit.md diff --git a/versioned_docs/version-24.1.1/reference/rest.md b/versioned_docs/version-24.1.1/reference/rest.md new file mode 100644 index 000000000..eb8458f75 --- /dev/null +++ b/versioned_docs/version-24.1.1/reference/rest.md @@ -0,0 +1,93 @@ +--- +description: Teku RESTful API +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Use the REST API + +:::tip View the REST API +View the [REST API documentation] for information about the available API methods. +::: + +## Enable the REST API service + +Enable the REST API service from the command line by setting the [`--rest-api-enabled`](cli/index.md#rest-api-enabled) command line option to `true`. + +You can also interact with APIs using Swagger UI by enabling the API documentation endpoint. + +:::warning + +Only trusted parties should access the REST API. Do not directly expose these APIs publicly on production nodes. + +::: + +Interact with Teku APIs using the web browser by setting the [`--rest-api-docs-enabled`](cli/index.md#rest-api-docs-enabled) command line option to `true`. + +Access the APIs at `http::/swagger-ui` where: + +- `interface` is specified using [`--rest-api-interface`](cli/index.md#rest-api-interface) +- `port` is specified using [`--rest-api-port`](cli/index.md#rest-api-port) + +The default location is `http://localhost:5051/swagger-ui`. + +You can also use tools such as [Postman] or [cURL] to interact with Teku APIs. + + + + + +```bash +curl -X GET "http://localhost:5051/eth/v1/node/identity" +``` + + + + +```json +{ + "data": { + "peer_id": "16Uiu2HAkuWPWqF4W3aw9oo5Yw79v5muzBaaGTGKumuXR8qkSVq6y", + "enr": "enr:-KG4QJ3PlL-XIRZCBq3L-uZ4wovEVEvxUMmvv75YDk9imb21clm0x3V2J5Vf9Zz3tLDpTplhG68_kzZPOxcU0ttwNDAEhGV0aDKQtTA_KgAAAAD__________4JpZIJ2NIJpcIS5a1YhiXNlY3AyNTZrMaECATVJhRqBrqyo8l6JKz6HidWL82kQcDmtKWuQZLDmZmqDdGNwgiMog3VkcILZIg", + "p2p_addresses": [ + "/ip4/10.0.0.42/tcp/9000/p2p/16Uiu2HAkuWPWqF4W3aw9oo5Yw79v5muzBaaGTGKumuXR8qkSVq6y" + ], + "discovery_addresses": [ + "/ip4/10.0.0.42/udp/55586/p2p/16Uiu2HAkuWPWqF4W3aw9oo5Yw79v5muzBaaGTGKumuXR8qkSVq6y" + ], + "metadata": { + "seq_number": "0", + "attnets": "0x0000000000000000" + } + } +} +``` + + + + +## Enable the validator client API + +The [validator client API](../how-to/use-external-signer/manage-keys.md) allows you to call the [key manager API endpoints](https://ethereum.github.io/keymanager-APIs/) and is enabled separately from the REST API methods. + +Enable the validator client API service from the command line by including the [`--validator-api-enabled`](cli/index.md#validator-api-enabled) command line option. + +When enabling the validator client API, you must [create a keystore](../how-to/use-external-signer/manage-keys.md#create-a-keystore). Set the keystore using [`--validator-api-keystore-file`](cli/index.md#validator-api-keystore-file) and the password file for the keystore using [`--validator-api-keystore-password-file`](cli/index.md#validator-api-keystore-password-file). + +```bash title="Example" +teku --validator-api-enabled --validator-api-keystore-file=validator_keystore.p12 --validator-api-keystore-password-file=validator_keystore_pass.txt +``` + +The [OpenAPI specifications](https://swagger.io/specification/) for the validator client API are available at `/swagger-docs` when the [`--validator-api-docs-enabled`](cli/index.md#validator-api-docs-enabled) option is set to `true`. The `/swagger-docs` endpoint defines the API if code generators are in use. + +When enabling the API documentation endpoint, specify: + +- `interface` using the [`--validator-api-interface`](cli/index.md#validator-api-interface) option. +- `port` using the [`--validator-api-port`](cli/index.md#validator-api-port) option. + + + +[REST API documentation]: https://consensys.github.io/teku/ +[Postman]: https://www.postman.com/ +[cURL]: https://curl.haxx.se/ diff --git a/versioned_docs/version-24.1.1/tutorials/configure-external-signer-tls.md b/versioned_docs/version-24.1.1/tutorials/configure-external-signer-tls.md new file mode 100644 index 000000000..a98cd8989 --- /dev/null +++ b/versioned_docs/version-24.1.1/tutorials/configure-external-signer-tls.md @@ -0,0 +1,178 @@ +--- +title: Configure TLS communication with an external signer +description: Configure TLS communication between Teku and Web3Signer. +sidebar_position: 1 +--- + +# Configure TLS communication + +Configure TLS communication with an external signer such as [Web3Signer] which accepts connections from clients that use trusted CA certificates or self-signed certificates. + +This tutorial configures TLS between Teku and Web3Signer, and use the [`keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html) utility to generate keystores and the truststore that contain self-signed certificates. + +:::info + +`keytool` is available with the JDK or JRE installation, you can also use OpenSSL. + +::: + +**Prerequisites**: + +- [Web3Signer installed](https://docs.web3signer.consensys.net/en/latest/HowTo/Get-Started/Install-Binaries/). +- [Web3Signer signing key files](https://docs.web3signer.consensys.net/en/latest/HowTo/Use-Signing-Keys/) for validators on the testnet. +- [Teku Installed](../get-started/install/install-binaries.md). +- [Java `keytool`](https://docs.oracle.com/en/java/javase/12/tools/keytool.html). +- A running execution client such as [Hyperledger Besu], or cloud-based service such as [Infura] synced to the Goerli testnet. + +This tutorial connects to an ETH2 testnet, and uses [Infura] to access the Goerli ETH1 testnet. You can sign up for a free [Infura] account, or you can start your own [ETH1 Goerli node]. + +## 1. Create keystores + +A keystore contains the certificate and private key used to authenticate yourself during TLS mutual authentication. + +Teku can use either the PKCS12 or JKS keystore type, whereas Web3Signer only uses a PKCS12 keystore. + +For each keystore you must create a plain text file containing the password to decrypt the keystore. + +### Web3Signer keystore and password file + +1. Generate the Web3Signer keystore. + + ```bash + keytool -genkeypair -keystore web3signer_keystore.p12 -storetype PKCS12 -storepass changeit -alias web3signer -keyalg RSA -keysize 2048 -validity 109500 -dname "CN=localhost, OU=PegaSys, O=ConsenSys, L=Brisbane, ST=QLD, C=AU" -ext san=dns:localhost,ip:127.0.0.1 + ``` + + :::info + + Common name (`CN`) is generally the fully qualified name of Web3Server, you can use `-ext san` to add additional hostnames or IP addresses. This allows the same certificate to be used for more than one hostname or IP address if Web3Signer is running on a different machine to Teku with multiple hostnames. + + ::: + +2. Create a plain text file (for example `web3signer_keystore_password.txt`) that stores the password used to create the keystore. + + ```bash title="web3signer_keystore_password.txt" + changeit + ``` + +You now have the `web3signer_keystore.p12` and `web3signer_keystore_password.txt` files that must be supplied when [starting Web3Signer](#4-start-web3signer). + +### Teku keystore and password file + +Teku presents the keystore to Web3Signer for TLS mutual authentication. We recommend using PKCS12. + +1. Generate the Teku keystore. + + ```bash + keytool -genkeypair -keystore teku_client_keystore.p12 -storetype PKCS12 -storepass changeit -alias teku_client -keyalg RSA -keysize 2048 -validity 109500 -dname "CN=teku, OU=PegaSys, O=ConsenSys, L=Brisbane, ST=QLD, C=AU" + ``` + + :::info + + For Teku as a client, `CN` doesn't need to have a hostname, however it must be a lowercase value, such as `CN=teku`. + + ::: + +2. Create a plain text file (for example `teku_keystore_password.txt`) that stores the password used to create the keystore. + + ```bash title="teku_keystore_password.txt" + changeit + ``` + +You now have the `teku_client_keystore.p12` and `teku_keystore_password.txt` files that must be supplied when [starting Teku](#5-start-teku). + +## 2. Create the truststore and password file + +The truststore contains certificates that you are willing to trust. Create the truststore to trust the Web3Signer certificate during TLS mutual authentication. + +To create the truststore: + +1. Export the Web3Signer public certificate from the Web3Signer keystore to `PEM` format. + + ```bash + keytool -exportcert -keystore ./web3signer_keystore.p12 -alias web3signer -rfc -file web3signer.pem + ``` + +2. Import the public certificate into a truststore to be used by Teku, and type `yes` if asked to trust the certificate. + + ```bash + keytool -importcert -storetype PKCS12 -keystore web3signer_truststore.p12 -alias web3signer -trustcacerts -storepass changeit -file ./web3signer.pem + ``` + +3. Create a plain text file (for example `truststore_pass.txt`) that stores the password used to create the keystore. + + ```bash title="truststore_pass.txt" + changeit + ``` + +You now have the `web3signer_truststore.p12` and `truststore_pass.txt` files that must be supplied when [starting Teku](#5-start-teku). + +## 3. Create the known clients file + +Web3Signer uses a known clients file to trust client certificates. + +1. Retrieve the `CN` and `SHA256` details from the Teku keystore. + + ```bash + keytool -list -v -keystore teku_client_keystore.p12 + ``` + +2. Create a plain text file (in this case `knownClients.txt`) and add the `CN` and `SHA256` details in one line (separated by a single space). + + ```bash + teku 67:89:C8:95:70:E0:38:10:2F:AB:7E:A3:75:4A:8C:29:C1:64:52:37:E5:E9:CD:EF:CD:27:C2:88:BF:84:3A:A1 + ``` + +:::info + +You can add multiple known clients to the file by adding the `CN` and `SHA256` details on a new line. + +::: + +You now have the `knownClients.txt` file that must be supplied when [starting Web3Signer](#4-start-web3signer). + +## 4. Start Web3Signer + +:::warning + +This example disables [Web3Signer slashing protection], this is not recommended on Mainnet. + +::: + +Start Web3Signer using the [keystore and password](#web3signer-keystore-and-password-file), and [known clients file](#3-create-the-known-clients-file) created earlier. + +```bash +web3signer --key-store-path=/Users/me/keyFiles/ \ +--tls-keystore-file=/Users/me/certs/web3signer_keystore.p12 \ +--tls-keystore-password-file=/Users/me/certs/web3signer_keystore_password.txt \ +--tls-known-clients-file=/Users/me/certs/knownClients.txt \ +eth2 --slashing-protection-enabled=false +``` + +## 5. Start Teku + +Start Teku and specify the [keystore](#teku-keystore-and-password-file) and [truststore](#2-create-the-truststore-and-password-file) created earlier, with the accompanying password files. + +:::caution + +This example connects to an [Infura] ETH1 endpoint, if running your own client, like [Hyperledger Besu], then add the JSON-RPC URL of the ETH1 node to the [`--eth1-endpoint`](../reference/cli/index.md#eth1-endpoint-eth1-endpoints) command line option. + +::: + +```bash +teku --network=goerli \ +--eth1-endpoint=https://goerli.infura.iov3/d0f36ceb0c324eef9984422efbc51f21 \ +--validators-external-signer-public-keys=0xa99a...e44c,0xb89b...4a0b \ +--validators-external-signer-url=https://localhost:9000 \ +--validators-external-signer-truststore=/Users/me/certs/web3signer_truststore.p12 \ +--validators-external-signer-truststore-password-file=/Users/me/certs/truststore_pass.txt \ +--validators-external-signer-keystore=/Users/me/certs/teku_client_keystore.p12 \ +--validators-external-signer-keystore-password-file=/Users/me/certs/teku_keystore_password.txt +``` + + + +[Web3Signer]: https://docs.web3signer.consensys.net/en/latest/ +[Hyperledger Besu]: https://besu.hyperledger.org/development/public-networks/get-started/install +[Infura]: https://infura.io/ +[ETH1 Goerli node]: https://besu.hyperledger.org/development/public-networks/get-started/start-node#run-a-node-on-goerli-testnet +[Web3Signer slashing protection]: https://docs.web3signer.consensys.net/en/latest/concepts/slashing-protection/ diff --git a/versioned_sidebars/version-24.1.1-sidebars.json b/versioned_sidebars/version-24.1.1-sidebars.json new file mode 100644 index 000000000..0722adbcd --- /dev/null +++ b/versioned_sidebars/version-24.1.1-sidebars.json @@ -0,0 +1,75 @@ +{ + "docSidebar": [ + "index", + { + "type": "category", + "label": "Get started", + "collapsed": false, + "link": { + "type": "generated-index", + "slug": "/get-started" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "get-started" + } + ] + }, + { + "type": "category", + "label": "How to", + "link": { + "type": "generated-index", + "slug": "/how-to" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "how-to" + } + ] + }, + { + "type": "category", + "label": "Concepts", + "link": { + "type": "generated-index", + "slug": "/concepts" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "concepts" + } + ] + }, + { + "type": "category", + "label": "Tutorials", + "link": { + "type": "generated-index", + "slug": "tutorials" + }, + "items": [ + { + "type": "autogenerated", + "dirName": "tutorials" + } + ] + } + ], + "referenceSidebar": [ + { + "type": "category", + "label": "Teku command line", + "items": [ + { + "type": "autogenerated", + "dirName": "reference/cli" + } + ] + }, + "reference/rest" + ] +} diff --git a/versions-preset.json b/versions-preset.json index 9a57e9ec5..1e2598741 100644 --- a/versions-preset.json +++ b/versions-preset.json @@ -1,6 +1,9 @@ { + "24.1.1": { + "label": "stable (24.1.1)" + }, "24.1.0": { - "label": "stable (24.1.0)" + "label": "24.1.0" }, "23.12.1": { "label": "23.12.1" diff --git a/versions.json b/versions.json index 0339dee3f..639519ecd 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ [ + "24.1.1", "24.1.0", "23.12.1", "23.12.0", From 1626f6d40e85a50e361ff9c95c649de5c40b7643 Mon Sep 17 00:00:00 2001 From: bgravenorst Date: Wed, 24 Jan 2024 16:18:08 +1000 Subject: [PATCH 2/3] Fix broken links. Signed-off-by: bgravenorst --- versioned_docs/version-24.1.1/concepts/proof-of-stake.md | 3 ++- versioned_docs/version-24.1.1/reference/cli/index.md | 2 +- .../version-24.1.1/reference/cli/subcommands/admin.md | 2 +- .../reference/cli/subcommands/migrate-database.md | 2 +- .../reference/cli/subcommands/slashing-protection.md | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/versioned_docs/version-24.1.1/concepts/proof-of-stake.md b/versioned_docs/version-24.1.1/concepts/proof-of-stake.md index 184db3807..8b2a6b117 100644 --- a/versioned_docs/version-24.1.1/concepts/proof-of-stake.md +++ b/versioned_docs/version-24.1.1/concepts/proof-of-stake.md @@ -8,7 +8,8 @@ sidebar_position: 3 [The Merge](merge.md) transitioned Ethereum Mainnet to [proof of stake (PoS)](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) consensus. -In Ethereum's PoS, you must run a [full node](merge.md#execution-and-consensus-clients) and [stake 32 ETH](https://ethereum.org/en/staking/) to become a validator. +In Ethereum's PoS, you must run a [full node](merge.md#execution-and-consensus-clients) and +[stake 32 ETH](https://ethereum.org/staking) to become a validator. :::note diff --git a/versioned_docs/version-24.1.1/reference/cli/index.md b/versioned_docs/version-24.1.1/reference/cli/index.md index d94b02168..b63429035 100644 --- a/versioned_docs/version-24.1.1/reference/cli/index.md +++ b/versioned_docs/version-24.1.1/reference/cli/index.md @@ -1652,7 +1652,7 @@ Possible values are: | `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | | `holesky` | Consensus layer | Test | Multi-client testnet | | `sepolia` | Consensus layer | Test | Multi-client testnet | -| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/concepts/networks/chiado) | | `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | Predefined networks can provide defaults such as the initial state of the network, bootnodes, and the address of the deposit contract. diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md index de2ac2629..e9b7f6bc6 100644 --- a/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md @@ -317,7 +317,7 @@ Possible values are: | `goerli` | Consensus layer | Test | Multi-client testnet | | `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | | `sepolia` | Consensus layer | Test | Multi-client testnet | -| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/concepts/networks/chiado) | | `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract. diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md index 5b4320662..94de6ec65 100644 --- a/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/migrate-database.md @@ -174,5 +174,5 @@ Possible values are: | `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | | `holesky` | Consensus layer | Test | Multi-client testnet | | `sepolia` | Consensus layer | Test | Multi-client testnet | -| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/concepts/networks/chiado) | | `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md index dd78a9fc5..ec0d9a3a9 100644 --- a/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/slashing-protection.md @@ -392,7 +392,7 @@ Possible values are: | `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | | `holesky` | Consensus layer | Test | Multi-client testnet | | `sepolia` | Consensus layer | Test | Multi-client testnet | -| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/concepts/networks/chiado) | | `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract. From ddf6f6f83379b4e5f8d15bc33119206f70702921 Mon Sep 17 00:00:00 2001 From: bgravenorst Date: Wed, 24 Jan 2024 16:37:34 +1000 Subject: [PATCH 3/3] Fix broken links. Signed-off-by: bgravenorst --- .../version-24.1.1/reference/cli/subcommands/admin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md index e9b7f6bc6..a8bb35c15 100644 --- a/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md +++ b/versioned_docs/version-24.1.1/reference/cli/subcommands/admin.md @@ -625,7 +625,7 @@ Possible values are: | `gnosis` | Consensus layer | Production | Network for the [Gnosis chain](https://www.gnosis.io/) | | `holesky` | Consensus layer | Test | Multi-client testnet | | `sepolia` | Consensus layer | Test | Multi-client testnet | -| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/about/networks/chiado/) | +| `chiado` | Consensus layer | Test | Gnosis [testnet](https://docs.gnosischain.com/concepts/networks/chiado) | | `lukso` | Consensus layer | Production | Network for the [Lukso chain](https://lukso.network/) | Predefined networks can provide defaults such the initial state of the network, bootnodes, and the address of the deposit contract.