Skip to main content

beacon-chain

The beacon-chain binary runs the Prysm beacon node. For the flags most people set, see Common flags and config file.

Generated from Prysm v7.3.1. Each flag name is a permalink you can share. Press / to filter.

General

--accept-terms-of-use

Accepts Terms and Conditions (for non-interactive environments).

Without this flag the node prompts you to type accept on first start, which fails in systemd, Docker and other non-interactive environments. Once accepted (by flag or prompt), Prysm writes an empty tosaccepted file into --datadir and never asks again for that directory.

--accept-terms-of-use

booleandefault false

--config-file=<string>

Filepath to a yaml file with flag values.

Loads flag values from a YAML file whose keys are flag names without dashes (aliases also work). A flag passed on the command line always wins over the same key in the file. List flags such as bootstrap-node or peer must be written as YAML lists, and durations as strings like 30s.

A comma-separated string for a list flag (for example peer: a,b) is rejected with a type error; use a YAML list instead.

--config-file=/var/lib/ethereum/beacon/config.yaml

string

Beacon node and APIs

--api-timeout=<duration>

Specifies the timeout value for API requests in seconds.

Wraps every Beacon API (HTTP) request in a timeout, except the /eth/v1/events stream. By default there is no timeout. The value is a Go duration, so include a unit (30s, 2m); 0 disables the timeout.

--api-timeout=30s

durationdefault 10s

--chain-config-file=<string>

Path to a YAML file with chain config values.

Runs the node on a custom network defined by a consensus spec config.yaml (the format published with every devnet and testnet). Keys you don't set fall back to mainnet values, or to minimal-preset values if the file declares PRESET_BASE: minimal. Built-in bootnodes are cleared and the deposit contract deployment block is reset to 0, so pass --bootstrap-node and usually --genesis-state too.

It can't be combined with a network flag (--mainnet, --hoodi, --sepolia); the node exits with chain-config-file cannot be passed concurrently with network flag.

--chain-config-file=/data/devnet/config.yaml

string

--e2e-config

Enables the E2E testing config, only for use within end-to-end testing.

Switches to the configuration used by Prysm's own end-to-end test suite (short epochs, test fork schedule). It has no use on a public network.

booleandefault false

--grpc-max-msg-size=<int>

WARNING: The gRPC API will remain the default and fully supported through v8 (expected in 2026) but will be eventually removed in favor of REST API.. Integer to define max receive message call size (in bytes). If serving a public gRPC server, set this to a more reasonable size to avoid resource exhaustion from large messages. Validators with as many as 10000 keys can be run with a max message size of less than 50Mb. The default here is set to a very high value for local users.

Maximum size in bytes of a single message the beacon node's gRPC server accepts from a client (receive side only). The default is 2147483647 bytes (about 2 GiB), which is fine when the validator client is local. Lower it, for example to 50 MB, if you expose gRPC to untrusted clients.

--grpc-max-msg-size=52428800

intdefault 2147483647

--minimal-config

Uses minimal config with parameters as defined in the spec.

Activates the spec's minimal preset (8-slot epochs, small committees) for local devnets and tests. Preset-dependent data structure sizes are fixed when the binary is compiled (the minimal Go build tag), so this flag is meant for binaries built for the minimal preset, not for release binaries on a public network.

booleandefault false

--rpc-max-page-size=<int>

Max number of items returned per page in RPC responses for paginated endpoints.

Caps the page_size accepted by Prysm's paginated gRPC list methods (validators, blocks, attestations, assignments); larger requests fail with Requested page size ... can not be greater than max size. When unset the effective limit is 250, not the 0 shown. --historical-slasher-node raises it to 4096 automatically.

--rpc-max-page-size=1000

intdefault 0

--tls-cert=<string>

Certificate for secure gRPC. Pass this and the tls-key flag in order to use gRPC securely.

PEM certificate for the gRPC server (port --rpc-port). TLS is enabled only when both --tls-cert and --tls-key are set; otherwise the node logs You are using an insecure gRPC server and serves plaintext. It doesn't affect the HTTP Beacon API, which has no built-in TLS. Give the same certificate to the validator client's --tls-cert so it trusts the server.

--tls-cert=/var/lib/ethereum/beacon/tls/beacon.crt

string

--chain-id=<uint64>

Sets the chain id of the beacon chain

Overrides the execution chain ID Prysm expects (1 on mainnet, 560048 on Hoodi, 11155111 on Sepolia). On connection the node calls eth_chainId and refuses the execution client with wanted chain ID X, got Y if they differ; the value is also reported by /eth/v1/config/deposit_contract. You only need it for custom networks, and it takes precedence over DEPOSIT_CHAIN_ID in --chain-config-file.

--chain-id=560048

uint64default 0

--disable-debug-rpc-endpoints

Disables the debug Beacon API namespace.

Removes the /eth/*/debug/* Beacon API routes (full states, fork choice dump, heads, data column sidecars) and the Prysm debug gRPC service. These endpoints are enabled by default and can return very large responses, so disable them on nodes whose API is reachable by others.

--disable-debug-rpc-endpoints

booleandefault false

--http-cors-domain=<string>alias --grpc-gateway-corsdomain

Comma separated list of domains from which to accept cross origin requests.

Browser origins allowed to call the Beacon API, split on commas. * allows any origin, and a single * inside an entry acts as a wildcard (https://*.example.com). Needed only for browser-based tools; curl and the validator client ignore CORS. Alias: --grpc-gateway-corsdomain.

Entries are not trimmed, so don't put spaces after the commas: https://a.example never matches. The built-in default is joined with , , so only its first entry (http://localhost:3000) is effective.

--http-cors-domain=http://localhost:3000,https://dashboard.example.com

stringdefault http://localhost:3000, http://0.0.0.0:3000, http://127.0.0.1:3000, http://localhost:4200, http://127.0.0.1:4200, http://0.0.0.0:4200, http://localhost:7500, http://127.0.0.1:7500, http://0.0.0.0:7500

--http-host=<string>alias --grpc-gateway-host

Host on which the HTTP server runs on.

Interface the Beacon API HTTP server binds to. The default 127.0.0.1 accepts only local connections; use 0.0.0.0 to accept connections from other machines or containers, and protect the port with a firewall. Alias: --grpc-gateway-host.

--http-host=0.0.0.0

stringdefault 127.0.0.1

--http-port=<int>alias --grpc-gateway-port

Port on which the HTTP server runs on.

Port of the Beacon API (the standard REST API used by other validator clients, MEV tooling, dashboards and curl). The Prysm validator client uses it when started with --enable-beacon-rest-api, pointing --beacon-rest-api-provider at it. Alias: --grpc-gateway-port.

--http-port=3500

intdefault 3500

--tls-key=<string>

Key for secure gRPC. Pass this and the tls-cert flag in order to use gRPC securely.

PEM private key matching --tls-cert. If either file can't be loaded, the node exits at startup with Could not load TLS keys.

--tls-key=/var/lib/ethereum/beacon/tls/beacon.key

string

--network-id=<uint64>

Sets the network id of the beacon chain.

Overrides the DEPOSIT_NETWORK_ID config value (1 on mainnet, 560048 on Hoodi, 11155111 on Sepolia). Prysm doesn't use it to check the execution client or for anything else at runtime; it only shows up in /eth/v1/config/spec. Use --chain-id for custom networks; this flag is cosmetic.

--network-id=560048

uint64default 0

--rpc-host=<string>

Host on which the RPC server should listen

Interface the gRPC server binds to. The Prysm validator client connects here by default (its --beacon-rpc-provider is 127.0.0.1:4000). Change it to 0.0.0.0 only when the validator client runs on another machine or container, and consider enabling TLS.

--rpc-host=0.0.0.0

stringdefault 127.0.0.1

--rpc-port=<int>

RPC port exposed by a beacon node

Port of the Prysm gRPC API, used by the Prysm validator client unless it runs in REST mode. On startup the node logs Beacon chain gRPC server listening with the address. Prysm plans to replace gRPC with the REST API, but it stays supported through v8.

--rpc-port=4000

intdefault 4000

--batch-verifier-limit=<int>

Maximum number of signatures to batch verify at once for beacon attestation p2p gossip.

Gossip messages that carry signatures (mainly attestations) are queued and verified in one BLS batch, flushed when the queue reaches this size or every 5 ms, whichever comes first. If a batch fails, each signature is re-verified individually. The default suits nearly all nodes; lower it only when experimenting with verification latency.

--batch-verifier-limit=1000

intdefault 1000

--state-diff-exponents=<int list>

A comma-separated list of exponents (of 2) in decreasing order, defining the state diff hierarchy levels. The last exponent must be greater than or equal to 5.

Used only with --enable-state-diff; otherwise it's ignored with a warning. Each exponent n defines a level of the historical-state tree that stores a state every 2^n slots: the first level holds full snapshots, the others hold diffs against the level above. Rules: 1 to 15 values, strictly decreasing, at most 30, last at least 5 (one epoch). The default 21,18,16,13,11,9,5 puts a full snapshot roughly every 291 days of slots.

The exponents are stored in the database when it's created. Starting later with different values fails with state-diff exponents changed; database incompatible, and the only fixes are the original values or a resync.

--state-diff-exponents=21,18,16,13,11,9,5

int listdefault 21, 18, 16, 13, 11, 9, 5

--archive-origin-state=<path>

Path to an ssz-encoded beacon state at an epoch boundary slot, used as the oldest state an archive node will hold. Defaults to the genesis state. Requires --enable-archive.

Path to an SSZ-encoded beacon state to use as the oldest state of an archive node, instead of genesis. The state must be at the first slot of an epoch and belong to the network you run; it can't be newer than the checkpoint the node synced from. It's trusted like a checkpoint state, so take it from a source you trust. Requires --enable-archive.

The origin is stored in the database. Starting later with a different state makes the node refuse to start; delete the database to change it.

--archive-origin-state=/path/to/state.ssz

path

--postpone-shutdown-for-proposals

On a graceful shutdown signal (SIGINT/SIGTERM, e.g. Ctrl-C on Linux), postpone shutdown if a connected validator client must propose a block in the next 2 epochs. Send the signal again to force the node to stop immediately.

On SIGINT or SIGTERM, the node checks whether any validator a connected validator client has subscribed has a proposal in the current or next epoch, and waits until that slot has passed, logging Postponing shutdown: a connected validator client has an upcoming block proposal. A second signal stops it immediately. Useful for planned restarts and upgrades.

Service managers kill processes that don't stop in time (systemd's default TimeoutStopSec is 90 s, Docker's stop timeout is 10 s). Raise those timeouts, or the wait of up to two epochs (about 13 minutes) is cut short.

--postpone-shutdown-for-proposals

booleandefault false

--disable-graffiti-client-append

Disables appending consensus and execution client version information to the block graffiti

By default the beacon node appends short client identifiers after your graffiti when space allows: execution client code and commit plus PM and the Prysm commit, for example Sushi GEabcdPMe4f6, shortened as your text gets longer. The execution client information comes from engine_getClientVersionV1. Set this flag to keep the graffiti exactly as the validator client sends it.

--disable-graffiti-client-append

booleandefault false

Peer-to-peer networking

--bootstrap-node=<string list>

The enr/enode address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated. You can also pass YAML files containing multiple nodes.

Sets the discv5 bootnodes used to find the first peers. The default shown here is the mainnet list; --hoodi and --sepolia load their own lists automatically, so you only need this flag on custom networks or to use your own bootnodes. Passing it replaces the whole built-in list rather than adding to it. Only enr: and enode: records are used (multiaddrs are dropped), and a value ending in .yaml is read as a YAML list of records.

Because the flag replaces the defaults, a single wrong or unreachable ENR leaves the node with no way to discover peers.

--bootstrap-node=enr:-Ku4Q... --bootstrap-node=/path/to/bootnodes.yaml

string listdefault enr:-KG4QNTx85fjxABbSq_Rta9wy56nQ1fHK0PewJbGjLm1M4bMGx5-3Qq4ZX2-iFJ0pys_O90sVXNNOxp2E7afBsGsBrgDhGV0aDKQu6TalgMAAAD__________4JpZIJ2NIJpcIQEnfA2iXNlY3AyNTZrMaECGXWQ-rQ2KZKRH1aOW4IlPDBkY4XDphxg9pxKytFCkayDdGNwgiMog3VkcIIjKA", "enr:-KG4QF4B5WrlFcRhUU6dZETwY5ZzAXnA0vGC__L1Kdw602nDZwXSTs5RFXFIFUnbQJmhNGVU6OIX7KVrCSTODsz1tK4DhGV0aDKQu6TalgMAAAD__________4JpZIJ2NIJpcIQExNYEiXNlY3AyNTZrMaECQmM9vp7KhaXhI-nqL_R0ovULLCFSFTa9CPPSdb1zPX6DdGNwgiMog3VkcIIjKA", "enr:-Ku4QImhMc1z8yCiNJ1TyUxdcfNucje3BGwEHzodEZUan8PherEo4sF7pPHPSIB1NNuSg5fZy7qFsjmUKs2ea1Whi0EBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQOVphkDqal4QzPMksc5wnpuC3gvSC8AfbFOnZY_On34wIN1ZHCCIyg", "enr:-Ku4QP2xDnEtUXIjzJ_DhlCRN9SN99RYQPJL92TMlSv7U5C1YnYLjwOQHgZIUXw6c-BvRg2Yc2QsZxxoS_pPRVe0yK8Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMeFF5GrS7UZpAH2Ly84aLK-TyvH-dRo0JM1i8yygH50YN1ZHCCJxA", "enr:-Ku4QPp9z1W4tAO8Ber_NQierYaOStqhDqQdOPY3bB3jDgkjcbk6YrEnVYIiCBbTxuar3CzS528d2iE7TdJsrL-dEKoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQMw5fqqkw2hHC4F5HZZDPsNmPdB1Gi8JPQK7pRc9XHh-oN1ZHCCKvg", "enr:-Jq4QItoFUuug_n_qbYbU0OY04-np2wT8rUCauOOXNi0H3BWbDj-zbfZb7otA7jZ6flbBpx1LNZK2TDebZ9dEKx84LYBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISsaa0ZiXNlY3AyNTZrMaEDHAD2JKYevx89W0CcFJFiskdcEzkH_Wdv9iW42qLK79ODdWRwgiMo", "enr:-Jq4QN_YBsUOqQsty1OGvYv48PMaiEt1AzGD1NkYQHaxZoTyVGqMYXg0K9c0LPNWC9pkXmggApp8nygYLsQwScwAgfgBhGV0aDKQtTA_KgEAAAD__________4JpZIJ2NIJpcISLosQxiXNlY3AyNTZrMaEDBJj7_dLFACaxBfaI8KZTh_SSJUjhyAyfshimvSqo22WDdWRwgiMo", "enr:-KG4QIH7EyRfHFmXLZaG6j0bMvow18k63nKWPfppuKh6iBHMPGM93HX3W3hl7jZdv_Hz8yd_jXVHX2loStJKOZqNRu0BgmlkgnY0gmlwhNRj2kKDaXA2kCoAHKALAA0CAAAAAAAAAF6Jc2VjcDI1NmsxoQMngQgKvKJR49-jugrZ_05LhAHbUlSCwZ_HyqVCb3SXYoN1ZHCCTrqEdWRwNoJOug", "enr:-KG4QJIyNiCpvXrnK8dugxmFckcIduvuQraNlX0GlKwF-XyPeZ-ZG7_yHhsr08K85X1utedECuRXhXiPYJoMogs8ai4BgmlkgnY0gmlwhIHUpj2DaXA2kCYEqIAABAHQAAAAA2GdUACJc2VjcDI1NmsxoQNQbzy36fddhPGH1I6D5rQyj8zUDGWQAkkWS37qBLB_yIN1ZHCCIyiEdWRwNoIjKA", "enr:-KG4QDU7s2q7Cl_qGr2BucsrhN1bKywwstBqMLUtR6f_pOejVAjXLAQsFBOCSgALH_Oy7eshQ2ic7CbFwRZIxZGIMMsBgmlkgnY0gmlwhJB-_BiDaXA2kCQAYYABAADQAAAAAYEgYAGJc2VjcDI1NmsxoQLACT5Njs8OjnCiL4_11wgqunT0BPxQ5PndoKoF6ICNWYN1ZHCCIyiEdWRwNoIjKA", "enr:-KG4QD_qJswcSJKmI_kjUZ-QbUuLUzniIakQbJKgh4YFzluGEKikFzaVoIbS7jpbw2K9hjmWTn7Ha3zyNIm0Ysu-dSgBgmlkgnY0gmlwhLKc14yDaXA2kCoBBP8A9DxKAAAAAAAAAAGJc2VjcDI1NmsxoQOVp1YSg2ZkGenRZi4iGebFira2xZrER7F_WW55-Rd3boN1ZHCCIyiEdWRwNoIjKA", "enr:-KG4QIFbm7kLOmOeiDwjSxLXEN0Ms4advV742CYLpGUCndm2XvAnM9uKVdWpydb8Gpstk44eFDlZlPDyV2gX7uH7KHgBgmlkgnY0gmlwhAXfXlGDaXA2kCoBBP8C8BytAAAAAAAAAAGJc2VjcDI1NmsxoQIAizAK-MKs-s08GzGzoPVIaBmfdKqosqxSkwxUuV2UnIN1ZHCCIyiEdWRwNoIjKA", "enr:-LK4QA8FfhaAjlb_BXsXxSfiysR7R52Nhi9JBt4F8SPssu8hdE1BXQQEtVDC3qStCW60LSO7hEsVHv5zm8_6Vnjhcn0Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhAN4aBKJc2VjcDI1NmsxoQJerDhsJ-KxZ8sHySMOCmTO6sHM3iCFQ6VMvLTe948MyYN0Y3CCI4yDdWRwgiOM", "enr:-LK4QKWrXTpV9T78hNG6s8AM6IO4XH9kFT91uZtFg1GcsJ6dKovDOr1jtAAFPnS2lvNltkOGA9k29BUN7lFh_sjuc9QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhANAdd-Jc2VjcDI1NmsxoQLQa6ai7y9PMN5hpLe5HmiJSlYzMuzP7ZhwRiwHvqNXdoN0Y3CCI4yDdWRwgiOM

--enable-upnp

Enable the service (Beacon chain or Validator) to use UPnP when possible.

Asks your router, through UPnP/NAT-PMP, to forward the libp2p listening ports (TCP and QUIC) to this machine. Use it on a home network where you can't or don't want to set up manual port forwarding; the router must have UPnP turned on. It does not map the discv5 UDP port (--p2p-udp-port), so forward that one yourself if you want to be discoverable.

booleandefault false

--no-discovery

Enable only local network p2p and do not connect to cloud bootstrap nodes

Turns off discv5 entirely: the node doesn't open the discovery UDP socket, doesn't contact bootnodes, and only connects to peers you list with --peer (and inbound connections from nodes that already know you). Use it for private devnets or a node that must only talk to your own nodes.

On a public network without --peer entries, the node ends up with no peers and can't sync.

--no-discovery --peer=/ip4/10.0.0.5/tcp/13000/p2p/16Uiu2HAm...

booleandefault false

--p2p-allowlist=<string>

The CIDR subnet for allowing only certain peer connections. Using "public" would allow only public subnets. Example: 192.168.0.0/16 would permit connections to peers on your local network only. The default is to accept all connections.

Accepts a single CIDR, or the keywords public or private. With a CIDR (or private), the node only dials and accepts peers whose IP falls in that range and rejects everything else. public works differently: it adds the private ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16) to the deny list, so only public addresses are allowed.

A CIDR such as 192.168.0.0/16 blocks every internet peer; only use it for a node that talks exclusively to nodes on your LAN.

--p2p-allowlist=public

string

--p2p-denylist=<string list>

The CIDR subnets for denying certainty peer connections. Using "private" would deny all private subnets. Example: 192.168.0.0/16 would deny connections from peers on your local network only. The default is to accept all connections.

Rejects dials to and connections from peers in the given CIDR ranges; everything else is still allowed. The keyword private denies all private ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16), which cloud hosts often use to avoid abuse reports for scanning internal networks. Repeat the flag or separate values with commas; a deny rule that conflicts with an allow rule logs Address ... is in conflict with previous rule.

--p2p-denylist=private

string list

--p2p-colocation-whitelist=<string list>

CIDR addresses to exempt from gossip sub IP colocation restrictions. Can be specified multiple times. Example: 192.168.1.1/32 would exempt that specific IP from colocation restrictions.

Prysm treats many peer identities coming from one IP as suspicious: more than 5 peers from the same IP are marked bad, and gossipsub scoring penalizes IPs with more than 10 peers. Addresses in these CIDR ranges are exempt from both checks. Use it when you run several of your own nodes behind one public IP (or on one host) and they peer with each other.

--p2p-colocation-whitelist=10.0.0.0/24

string list

--p2p-host-ip=<string>

The IP address advertised by libp2p. This may be used to advertise an external IP.

Sets the public IP written into your node record (ENR) and advertised to libp2p peers. Without it, discv5 learns your external address from what other peers report, which works on most networks but can be slow or wrong behind NAT. When set, Prysm also tries a TCP connection to this IP and port at startup and logs IP address is not accessible if it fails, a quick way to spot missing port forwarding. The value must be a literal IPv4 or IPv6 address.

--p2p-host-ip=203.0.113.10

string

--p2p-host-dns=<string>

The DNS address advertised by libp2p. This may be used to advertise an external DNS.

Advertises a DNS name instead of an IP, for hosts with a dynamic public IP. The name is resolved once at startup: the first returned IP goes into the ENR, and libp2p advertises /dns4/<name>/tcp/<port> (TCP only). If the IP changes later, restart the node or rely on discv5's address detection.

--p2p-host-dns=node.example.com

string

--p2p-local-ip=<string>

The local ip address to listen for incoming data.

Binds libp2p (TCP and QUIC) and the discv5 UDP socket to one local interface address. By default libp2p listens on the first non-loopback interface address the node finds (IPv4 first), and discv5 listens on all interfaces. Set it on machines with several network interfaces, or when the auto-picked address is the wrong one.

--p2p-local-ip=192.168.1.20

string

--p2p-max-peers=<int>

The max number of p2p peers to maintain.

Target number of connected peers; the node keeps looking for peers until it reaches it and refuses new ones above it. At most 80% of the slots go to inbound connections (with a small buffer of 20), so the rest are always outbound peers the node chose itself. Raise it for better subnet coverage on a well-connected server; lower it (for example to 30-50) to save bandwidth and CPU on a home connection. --min-sync-peers is capped at this value.

--p2p-max-peers=100

intdefault 70

--p2p-priv-key=<string>

The file containing the private key to use in communications with other peers.

Path to a file holding the node's secp256k1 network private key as a hex string. The key determines your peer ID and discv5 node ID (which, from Fulu, also decides which data columns you custody). Without this flag, Prysm uses <datadir>/network-keys if it exists, and otherwise generates a key.

Never share one key between two running nodes: they would claim the same peer ID.

--p2p-priv-key=/var/lib/ethereum/beacon/network-keys

string

--p2p-quic-port=<int>

The QUIC port used by libp2p.

UDP port for libp2p's QUIC transport. QUIC is on by default and advertised in the ENR alongside TCP; open this port as UDP in your firewall and router. It can be the same number as the TCP port because the protocols differ. Turn QUIC off with --disable-quic.

--p2p-quic-port=13000

intdefault 13000

--p2p-static-id

Enables the peer id of the node to be fixed by saving the generated network key to the default key path.

Saves the generated network key to <datadir>/network-keys so the peer ID survives restarts. On networks where Fulu is scheduled (mainnet, Hoodi, Sepolia) Prysm already does this by default, because a changing node ID would change which data columns the node custodies, so the flag only matters on networks without Fulu. To start with a new identity, stop the node and delete that file.

booleandefault false

--p2p-tcp-port=<int>

The TCP port used by libp2p.

TCP port libp2p listens on for peer connections (gossip and req/resp). Forward it to this machine and allow it inbound in your firewall so other nodes can connect to you. If you change it, change your port forwarding to match; the port you set is also the one written into your ENR.

--p2p-tcp-port=13000

intdefault 13000

--p2p-udp-port=<int>

The UDP port used by the discovery service discv5.

UDP port for discv5 peer discovery. Other nodes find you through this port, so forward and allow it (UDP) for good peer counts. UPnP (--enable-upnp) does not open this port for you.

--p2p-udp-port=12000

intdefault 12000

--pubsub-queue-size=<int>

The size of the pubsub validation and outbound queue for the node.

Sets both the gossipsub validation queue and the per-peer outbound queue sizes, in messages. When a queue is full, gossip messages are dropped, which shows up as missed attestations or blocks arriving late on busy machines. The default is fine for most setups; a value of 0 or less is replaced with 600 and logs Invalid pubsub queue size.

--pubsub-queue-size=1000

intdefault 1000

--relay-node=<string>

The address of relay node. The beacon node will connect to the relay node and advertise their address via the relay node to other peers

Multiaddr of a libp2p circuit relay. Prysm connects to it at startup, keeps that connection alive, and additionally advertises /p2p-circuit addresses through it so peers that can't reach you directly can connect through the relay. Relaying is off when this flag is empty. Mostly useful for test setups; public networks don't run public relays for beacon nodes.

--relay-node=/ip4/203.0.113.5/tcp/4001/p2p/16Uiu2HAm...

string

--peer=<string list>

Connect with this peer, this flag may be used multiple times. This peer is recognized as a trusted peer.Accepts enode, multiaddr, and enr formats.

Adds a trusted peer. Prysm dials it at startup, re-dials it whenever the connection drops, never disconnects or prunes it for a bad score, and treats it as a gossipsub direct peer. Repeat the flag or separate addresses with commas. Use it to pair your own nodes, or to always stay connected to a known-good node; the peer's host must also accept your connection (for example, add you as a peer too).

--peer=/ip4/10.0.0.5/tcp/13000/p2p/16Uiu2HAm...

string list

--blob-batch-limit=<int>

The amount of blobs the local peer is bounded to request and respond to in a batch.

Rate limit for serving blob sidecars to peers: the node answers up to this many blobs per second per peer, with bursts up to this value times --blob-batch-limit-burst-factor. It also caps how many blobs are returned for one by-root request. Only relevant for blob sidecars (Deneb and Electra); after Fulu, data columns replace them.

--blob-batch-limit=384

intdefault 384

--blob-batch-limit-burst-factor=<int>

The factor by which blob batch limit may increase on burst.

Multiplier on --blob-batch-limit that sets the burst capacity of the per-peer blob rate limiter, and the maximum number of blobs returned for one by-range request.

--blob-batch-limit-burst-factor=3

intdefault 3

--data-column-batch-limit=<int>

The amount of data columns the local peer is bounded to request and respond to in a batch.

Rate limit for serving PeerDAS data column sidecars: up to this many columns per second per peer, with bursts up to this value times --data-column-batch-limit-burst-factor. It also caps the size of a by-root data column response. Lower it if serving columns to peers uses too much upload bandwidth.

--data-column-batch-limit=4096

intdefault 4096

--data-column-batch-limit-burst-factor=<int>

The factor by which data column batch limit may increase on burst.

Multiplier on --data-column-batch-limit that sets the burst capacity of the per-peer data column rate limiter.

--data-column-batch-limit-burst-factor=4

intdefault 4

--disable-partial-data-columns

Disables cell-level dissemination for PeerDAS data columns, falling back to full column gossip.

Partial data columns are on by default: the node gossips PeerDAS data columns cell by cell instead of as whole columns, so it can send and receive the cells it has, and builds cells from blobs already in the execution client's mempool when the execution client supports it. This flag falls back to gossiping whole columns. --partial-data-columns, which turned the feature on in earlier releases, is deprecated and has no effect.

--disable-partial-data-columns

booleandefault false

--block-batch-limit=<int>

The amount of blocks the local peer is bounded to request and respond to in a batch. Maximum 128

Blocks per request during initial sync, and the per-peer rate (blocks per second) at which the node serves blocks to others. Values above the protocol maximum (MAX_REQUEST_BLOCKS_DENEB, 128) are lowered for requests. Raising it can speed up sync from fast peers at the cost of memory and more bursts of bandwidth.

--block-batch-limit=64

intdefault 64

--block-batch-limit-burst-factor=<int>

The factor by which block batch limit may increase on burst.

Multiplier on --block-batch-limit that sets the burst capacity of the block rate limiter, both for serving peers and for the node's own initial-sync fetcher.

--block-batch-limit-burst-factor=2

intdefault 2

--max-concurrent-dials=<uint64>

Sets the maximum number of peers that a node will attempt to dial with from discovery. By default we will dials as many peers as possible.

Caps how many peers found through discovery the node dials at the same time. The default 0 means no limit. Set a limit if a burst of outgoing connection attempts overwhelms a consumer router (NAT table) or triggers abuse detection at your provider.

--max-concurrent-dials=10

uint64default 0

--minimum-peers-per-subnet=<uint64>

Sets the minimum number of peers that a node will attempt to peer with that are subscribed to a subnet.

For each attestation, sync committee or data column subnet the node needs, it searches discovery for more peers until at least this many connected peers are on the subnet. Raising it improves gossip reliability for your validators' duties but means more discovery work and peer churn; subnets short of peers are logged at debug level as Not enough connected peers.

--minimum-peers-per-subnet=6

uint64default 6

--min-sync-peers=<int>

The required number of valid peers to connect with before syncing.

Number of peers that must agree on the chain before initial sync starts, and the minimum number used when choosing which peers to sync from. It's capped at --p2p-max-peers and, internally, at 15. Setting it to 0 skips initial sync and marks the node synced immediately, which only makes sense for a single-node devnet.

--min-sync-peers=3

intdefault 3

--subscribe-all-subnets

Subscribe to all possible attestation and sync subnets.

Subscribes to all 64 attestation subnets and all sync committee subnets, instead of the 2 long-lived subnets derived from your node ID plus those your validators need. It lets the node see (and aggregate from) every attestation, which helps large validator operators, relays and data collectors, but it uses much more bandwidth and CPU. It does not affect data column custody; use --supernode for that.

Expect several times more gossip traffic; not recommended on home connections.

booleandefault false

--supernode

Custodies all data. Cannot be used with --semi-supernode.

Custodies, stores and serves all 128 data column groups instead of the minimum for your validator count, and subscribes to every data column subnet. It's what you want for a node that serves full blob data (for example, an RPC provider or a node backing a rollup). It needs far more disk and bandwidth. Deprecated alias: --subscribe-all-data-subnets.

The choice is stored in the database: if you remove the flag later, the node logs a warning and keeps acting as a supernode. To go back to normal custody, resync with an empty database.

booleandefault false

--semi-supernode

Custodies just enough data to serve the blobs and blob sidecars beacon API. Cannot be used with --supernode.

Custodies the minimum number of column groups needed to reconstruct all blobs (half of them: 64 of 128), so the Beacon API blob and blob sidecar endpoints can always answer, at roughly half the storage of --supernode. Starting with both --supernode and --semi-supernode fails with cannot set both.

The custody group count stored in the database never decreases. Removing this flag doesn't reduce custody; resync with an empty database to do that.

booleandefault false

Database and storage

--backfill-batch-size=<uint64>

Number of blocks per backfill batch. A larger number will request more blocks at once from peers, but also consume more system memory to hold batches in memory during processing. This has a multiplicative effect with backfill-worker-count.

Blocks requested from a peer per backfill batch. Memory use grows with batch size × worker count × block size, so raise it only if backfill is slow and you have RAM to spare.

--backfill-batch-size=64

uint64default 32

--backfill-worker-count=<int>

Number of concurrent backfill batch requests. A larger number will better utilize network resources, up to a system-dependent limit, but will also consume more system memory to hold batches in memory during processing. Multiply by backfill-batch-size and average block size (~2MB before deneb) to find the right number for your system. This has a multiplicative effect with backfill-batch-size.

Number of backfill batches downloaded in parallel. More workers use more bandwidth and memory; the effect multiplies with --backfill-batch-size.

--backfill-worker-count=4

intdefault 2

--enable-backfill

Backfill will only be enabled when this flag is specified on a node using checkpoint sync.

After a checkpoint sync, downloads the blocks older than the checkpoint (and the blobs and data columns still inside their retention window) in the background, so the node can serve them to peers. By default it goes back MIN_EPOCHS_FOR_BLOCK_REQUESTS (33024 epochs, about 5 months on mainnet); it does nothing on a node synced from genesis. Deprecated alias: --enable-experimental-backfill.

booleandefault false

--clear-db

Prompt for clearing any previously stored data at the data directory.

Asks for confirmation at startup, then deletes the beacon database, the saved genesis state file, blob storage, data column storage and (if --slasher is set) the slasher database, and starts syncing from scratch. Files in the backups directory are kept. Remove the flag after the run you needed it for.

booleandefault false

--datadir=<string>

Data directory for the databases.

Root of everything the beacon node stores: the database in beaconchaindata/beaconchain.db, the genesis state file (genesis-<time>-<root>.ssz), and by default the blobs/ and data-columns/ directories. The default depends on the OS: ~/.eth2 on Linux, ~/Library/Eth2 on macOS, %LOCALAPPDATA%\Eth2 on Windows.

Use a separate --datadir per network. Prysm refuses a database whose stored deposit contract differs from the selected network's (database contract is … but tried to run with …), but mainnet and Hoodi use the same address, so that check doesn't catch a mix-up between those two.

--datadir=/var/lib/ethereum/beacon

stringdefault ~/Library/Eth2

--force-clear-db

Clears any previously stored data at the data directory.

Same as --clear-db, but deletes without asking. Use it in non-interactive setups (systemd, Docker) where there is no terminal to answer the prompt.

If you leave this flag in a service definition, the node wipes its database and resyncs on every restart.

booleandefault false

--restore-source-file=<string>

Filepath to the backed-up database file which will be used to restore the database

Only read by the beacon-chain db restore subcommand; setting it on a normal beacon node run does nothing. Point it at a copy of a beaconchain.db file.

string

--restore-target-dir=<string>

Target directory of the restored database

Only read by the beacon-chain db restore subcommand; setting it on a normal beacon node run does nothing. Use the same value you pass to --datadir.

stringdefault ~/Library/Eth2

--backfill-oldest-slot=<uint64>

Specifies the oldest slot that backfill should download. If this value is greater than current_slot - MIN_EPOCHS_FOR_BLOCK_REQUESTS, it will be ignored with a warning log.

Makes backfill go further back than the spec minimum, down to this slot (for example 1 for the full history). A value newer than current slot - MIN_EPOCHS_FOR_BLOCK_REQUESTS is ignored, with the warning Ignoring user-specified slot > MIN_EPOCHS_FOR_BLOCK_REQUESTS.

--backfill-oldest-slot=1

uint64default 0

--blob-retention-epochs=<uint64>

Override the default blob retention period (measured in epochs). The node will exit with an error at startup if the value is less than the default of 4096 epochs.

How many epochs of blobs and data columns the node keeps before deleting them. The same value applies to both; the minimum is the spec value of 4096 epochs (about 18 days), and a lower value stops the node at startup. Raise it if you run an indexer or L2 tooling that needs older blob data. Deprecated alias: --extend-blob-retention-epoch.

--blob-retention-epochs=8192

uint64default 4096

--beacon-db-pruning

Enables pruning of beacon db beyond MIN_EPOCHS_FOR_BLOCK_REQUESTS duration. This is an opt-in feature, and should only be enabled if operators doesn't require historical data.

Starts a pruner that deletes blocks and states older than the retention window from the database, once per epoch (at mid-epoch), after initial sync and backfill have finished. Blobs and data columns are always pruned by their own retention setting, with or without this flag.

Pruned history is gone: the node can no longer answer API queries for blocks or states before the window. Don't enable it on a node that serves historical data.

booleandefault false

--pruner-retention-epochs=<uint64>

Specifies the retention period for the pruner service in terms of epochs. If this value is less than MIN_EPOCHS_FOR_BLOCK_REQUESTS, it will be ignored.

How many epochs of blocks and states the pruner keeps. Only used with --beacon-db-pruning. The minimum is MIN_EPOCHS_FOR_BLOCK_REQUESTS + 1 (33025 epochs on mainnet); lower values are replaced by the minimum with the warning Retention period too low, ignoring and using minimum required value.

--pruner-retention-epochs=50000

uint64default 0

--slots-per-archive-point=<int>

The slot durations of when an archived state gets saved in the beaconDB.

How often a full finalized state is saved to the database (default every 2048 slots, 64 epochs). Any other historical state is regenerated by replaying blocks from the closest saved one, so a lower value makes historical state queries faster at the cost of much more disk. Not used when --enable-state-diff is on, which stores history differently.

An explicit value also overrides the 128 slots set by --historical-slasher-node.

--slots-per-archive-point=256

intdefault 2048

--blob-storage-layout=<string>

Dictates how to organize the blob directory structure on disk, available options are: flat, by-epoch.

Only affects blob sidecars, which are stored for the Deneb and Electra forks; from Fulu on, data column sidecars are stored separately and this flag doesn't apply to them. by-epoch groups blob files in per-epoch directories, which makes startup and pruning faster; flat is the old one-directory-per-block layout. Without the flag, Prysm detects the layout already on disk and warns if it is flat; set --blob-storage-layout=by-epoch once to migrate it on the next restart.

--blob-storage-layout=by-epoch

stringdefault "by-epoch", unless a different existing layout is detected

--blob-path=<path>

Location for blob storage. Default location will be a 'blobs' directory next to the beacon db.

Directory for blob sidecars (Deneb to Electra); defaults to <datadir>/blobs. Useful to put blobs on a different disk than the database. Since Fulu, new blob data is stored as data columns under --data-column-path instead.

--blob-path=/mnt/bulk/prysm/blobs

path

--data-column-path=<path>

Location for data column storage. Default location will be a 'data-columns' directory next to the beacon db.

Directory for PeerDAS data column sidecars (Fulu onward); defaults to <datadir>/data-columns. How much it holds depends on how many columns the node custodies: a --supernode stores all of them.

--data-column-path=/mnt/bulk/prysm/data-columns

path

Block building and MEV

--local-block-value-boost=<uint64>

A percentage boost for local block construction as a Uint64. This is used to prioritize local block construction over relay/builder block constructionBoost is an additional percentage to multiple local block value. Use builder block if: builder_bid_value * 100 > local_block_value * (local-block-value-boost + 100)

Handicaps builder bids against your locally built block. The beacon node picks the builder block only if builder_bid_gwei * builder_boost_factor > local_value_gwei * (100 + local-block-value-boost), where builder_boost_factor is the per-request value sent by the validator client (default 100). The check runs after --min-builder-bid and --min-builder-to-local-difference, and applies to blocks up to the Fulu fork.

Set it to 0 if you want the builder block whenever it pays more, however slightly. If you also send a non-default builder_boost_factor from the validator client, both boosts apply and the node logs a warning.

--local-block-value-boost=20

uint64default 10

--max-builder-consecutive-missed-slots=<int>

Number of consecutive skip slot to fallback from using relay/builder to local execution engine for block construction

First circuit breaker: if the gap between the proposal slot and the highest slot the node has received a block for reaches this number, the node stops asking the relay and builds the block locally. It protects chain liveness when relays fail. The node logs Circuit breaker activated due to missing consecutive slot when it trips.

--max-builder-consecutive-missed-slots=3

intdefault 3

--max-builder-epoch-missed-slots=<int>

Number of total skip slot to fallback from using relay/builder to local execution engine for block construction in last epoch rolling window

Second circuit breaker: if the number of empty slots in the last 32 slots (a rolling epoch window) reaches this number, the node builds locally instead of using the relay. It logs Circuit breaker activated due to missing enough slots last epoch when it trips.

--max-builder-epoch-missed-slots=5

intdefault 5

--http-mev-relay=<string>

A MEV builder relay string http endpoint, this will be used to interact MEV builder network using API defined in: https://ethereum.github.io/builder-specs/#/Builder

Point this at MEV-Boost (or another Builder API endpoint), not at an individual relay. With it set, the node asks the builder for a bid on proposals from validators that registered with the builder (validator client --enable-builder or the builder section of the proposer settings file); other proposals, and proposals where the circuit breaker is tripped, use the local execution client.

--http-mev-relay=http://127.0.0.1:18550

string

--min-builder-bid=<uint64>

An absolute value in Gwei that the builder bid has to have in order for this beacon node to use the builder's block. Anything less than this value and the beacon will revert to local building.

Floor for builder bids, in Gwei. If a bid is below this value the node uses the local payload and logs Proposer: using local execution payload because min bid not attained. 1 ETH is 1000000000 Gwei. Applies to blocks up to the Fulu fork.

--min-builder-bid=10000000

uint64default 0

--min-builder-to-local-difference=<uint64>

An absolute value in Gwei that the builder bid has to have in order for this beacon node to use the builder's block. Anything less than this value and the beacon will revert to local building.

When the builder bid is below the local block value plus this many Gwei, the node builds locally and logs Proposer: using local execution payload because min difference with local value was not attained. It is checked after --min-builder-bid and before --local-block-value-boost. Applies to blocks up to the Fulu fork.

--min-builder-to-local-difference=5000000

uint64default 0

--builder-header-timeout=<duration>

Timeout to use when fetching a block header from the builder API, as a duration (e.g. 1s, 2s, 2500ms). Must be greater than 0. Only effective up to the Fulu fork.

How long the node waits for the getHeader response from MEV-Boost before giving up and proposing the local block. Accepts Go durations (950ms, 1s). Zero or negative values stop the node at startup, and any override logs a warning at startup.

Raising it delays your block. The default already matches the builder spec's proposal delay tolerance of 1 second; a much higher value risks a missed or orphaned proposal.

--builder-header-timeout=1s

durationdefault 1s

--builder-bid-timeout=<duration>

Timeout to use when fetching execution payload bids from the builder API, as a duration (e.g. 600ms, 1s). Must be greater than 0. Only effective from the Gloas fork onward.

From the Gloas fork on, how long the node waits for execution payload bids from builders when it builds a block. Accepts Go durations (600ms, 1s). Must be greater than 0. Has no effect before Gloas; --builder-header-timeout plays that role for MEV-Boost.

Raising it delays your block, which risks a missed or orphaned proposal.

--builder-bid-timeout=600ms

durationdefault 600ms

--suggested-fee-recipient=<string>

Post bellatrix, this address will receive the transaction fees produced by any blocks from this node. Default to junk whilst bellatrix is in development state. Validator client can override this value through the preparebeaconproposer api.

Fallback fee recipient for blocks proposed through this node. A fee recipient sent by the validator client (from its --suggested-fee-recipient or proposer settings file) takes precedence; this value is used when the validator client sends none or sends the zero address. Without it, the default is the burn address and the node logs a warning at startup; a non-checksummed address is accepted with a warning.

An invalid address is ignored with only a warning (... is not a valid fee recipient address), leaving the burn address as the fallback. Check the Default fee recipient is set to line at startup.

--suggested-fee-recipient=0x0000000000000000000000000000000000000000

stringdefault 0x0000000000000000000000000000000000000000

--disable-builder-ssz

Disables SSZ encoding for Builder API requests and responses, using JSON instead.

By default the node talks SSZ to the Builder API and, if the builder answers 415 or 406, automatically retries in JSON and keeps using JSON for later requests. Use this flag only if your builder or MEV-Boost version misbehaves with SSZ in another way.

booleandefault false

--builder-allowed-failures=<uint64>

Number of payload delivery failures a builder is allowed before this node blacklists it.

From the Gloas fork on, the builder circuit breaker blacklists a builder that wins an auction but doesn't deliver its payload. This sets how many such failures a builder is allowed before it's blacklisted. 0 (default) blacklists it on the first failure.

--builder-allowed-failures=1

uint64default 0

--builder-critical-failures=<uint64>

Failure count at which a builder earns the longer blacklist set by --builder-critical-blacklist-period.

From the Gloas fork on, the failure count at which a builder is blacklisted for the longer --builder-critical-blacklist-period instead of --builder-blacklist-period.

--builder-critical-failures=3

uint64default 2

--builder-blacklist-period=<uint64>

Number of epochs a builder stays blacklisted on its first offense. Must be greater than 0.

From the Gloas fork on, how many epochs a builder stays blacklisted after its first payload delivery failure. Must be greater than 0.

--builder-blacklist-period=2

uint64default 1

--builder-critical-blacklist-period=<uint64>

Number of epochs a builder stays blacklisted once it reaches --builder-critical-failures.

From the Gloas fork on, how many epochs a builder stays blacklisted once it reaches --builder-critical-failures failures. The default, 256 epochs, is a bit more than a day.

--builder-critical-blacklist-period=512

uint64default 256

--builder-relay-blacklist-period=<uint64>

Maximum number of epochs a direct connection endpoint stays banned for serving a builder that failed to reveal a payload. Never exceeds the offending builder's own blacklist.

From the Gloas fork on, the circuit breaker also bans the builder endpoints that served a builder which failed to deliver its payload. This sets the maximum number of epochs an endpoint stays banned; it never exceeds the failing builder's own blacklist.

--builder-relay-blacklist-period=16

uint64default 32

--builder-failure-backoff-period=<uint64>

Number of epochs without a failure after which a builder's failure counter resets to zero.

From the Gloas fork on, the number of epochs without a failure after which a builder's failure count goes back to zero.

--builder-failure-backoff-period=10

uint64default 5

--builder-critical-failed-builders=<uint64>

Number of concurrently blacklisted builders that forces this node to fall back to self-building. Must be greater than 0.

From the Gloas fork on, when this many builders are blacklisted at the same time, the node stops using builders and builds every block locally. Must be greater than 0.

--builder-critical-failed-builders=5

uint64default 7

Sync

--checkpoint-block=<path>

Rather than syncing from genesis, you can start processing from a ssz-serialized BeaconState+Block. This flag allows you to specify a local file containing the checkpoint Block to load.

The block matching --checkpoint-state, as a local SSZ file. Both files must be given together, and the block must be the one the state was built from.

--checkpoint-block=/data/block_mainnet_fulu_12345678-0x….ssz

path

--checkpoint-sync-url=<string>

URL of a synced beacon node to trust in obtaining checkpoint sync data. As an additional safety measure, it is strongly recommended to only use this option in conjunction with --weak-subjectivity-checkpoint flag

Downloads the latest finalized state and its block from this Beacon API (/eth/v2/debug/beacon/states/finalized) and starts from there, so the node is synced in minutes instead of days. It is only used on an empty database: if one already exists, the log shows Origin checkpoint found in the database, ignoring checkpoint sync flags. When --genesis-beacon-api-url is not set, the same URL is also used to fetch the genesis state.

You trust this endpoint to give you the canonical chain. Use a provider you trust, and compare the finalized block root with a second source.

--checkpoint-sync-url=https://hoodi.beaconstate.ethstaker.cc

string

--checkpoint-state=<path>

Rather than syncing from genesis, you can start processing from a ssz-serialized BeaconState+Block. This flag allows you to specify a local file containing the checkpoint BeaconState to load.

Starts from a finalized state stored in a local SSZ file instead of a URL, for example one saved with prysmctl checkpoint-sync download. It needs --checkpoint-block too; the node refuses to start with only one of the two. If --checkpoint-sync-url is also set, the URL wins and the files are ignored.

--checkpoint-state=/data/state_mainnet_fulu_12345678-0x….ssz

path

--weak-subjectivity-checkpoint=<string>

Input in `block_root:epoch_number` format. This guarantees that syncing leads to the given Weak Subjectivity Checkpoint along the canonical chain. If such a sync is not possible, the node will treat it as a critical and irrecoverable failure

A block root and epoch the chain must pass through. Once the node finalizes past that epoch, it checks that the block is in its database and finalized, and logs Weak subjectivity check has passed!!; otherwise it exits with Could not verify weak subjectivity checkpoint. Use it with checkpoint sync to detect a dishonest checkpoint provider. A 0x prefix on the root is accepted.

--weak-subjectivity-checkpoint=0x<BLOCK_ROOT>:<EPOCH>

string

--genesis-beacon-api-url=<string>

URL of a synced beacon node to trust for obtaining genesis state. As an additional safety measure, it is strongly recommended to only use this option in conjunction with --weak-subjectivity-checkpoint flag

Fetches the genesis state from this Beacon API (the debug state endpoint for genesis) when there is none in the data directory. You rarely need it: it defaults to the value of --checkpoint-sync-url, and mainnet's genesis is embedded. Set it for a testnet you sync from genesis without a local genesis file.

--genesis-beacon-api-url=https://hoodi.beaconstate.ethstaker.cc

string

--genesis-state=<path>

Load a genesis state from ssz file. Testnet genesis files can be found in the eth2-clients/eth2-testnets repository on github.

Loads the genesis state from a local SSZ file. Only mainnet's genesis state is built into Prysm; other networks get it from this flag, --genesis-beacon-api-url or --checkpoint-sync-url. It is only needed once: the state is saved in the data directory and reused. This flag takes priority over --genesis-beacon-api-url.

--genesis-state=/data/hoodi/genesis.ssz

path

Execution client connection

--contract-deployment-block=<int>

The eth1 block in which the deposit contract was deployed.

Execution block number where Prysm starts reading deposit contract logs. The default shown is mainnet's; each network flag sets its own value (0 for Hoodi, 1273020 for Sepolia). Only needed for custom networks, and only until EIP-6110 deposit requests are active.

--contract-deployment-block=0

intdefault 11184524

--deposit-contract=<string>

Deposit contract address. Beacon chain node will listen logs coming from the deposit contract to determine when validator is eligible to participate.

Overrides the deposit contract address of the selected network. The default shown is mainnet's; each network flag sets the right address for its network. The address is saved in the database, and the node refuses to start if it later differs (mainnet and Hoodi share the same address, so this doesn't tell those two apart). Only needed for custom networks.

--deposit-contract=0x0000000000000000000000000000000000000000

stringdefault 0x00000000219ab540356cBB839Cbe05303d7705Fa

--engine-endpoint-timeout-seconds=<uint64>

Sets the execution engine timeout (seconds) for execution payload semantics (forkchoiceUpdated, newPayload)

Timeout, in seconds, for engine_newPayload and engine_forkchoiceUpdated calls. When not set, Prysm uses 8 seconds (the Engine API spec value); the 0 shown as default means "not set". Raise it only if a slow execution client times out while importing blocks.

Explicitly setting 0 means a zero timeout, so every call fails.

--engine-endpoint-timeout-seconds=12

uint64default 0

--eth1-header-req-limit=<uint64>

Sets the maximum number of headers that a deposit log query can fetch.

Maximum block range per request when reading deposit contract logs and headers from the execution client; Prysm shrinks the range automatically when requests fail. Lower it if your execution client or provider rejects large log queries. It only matters until the chain uses EIP-6110 deposit requests (Electra): after that, Prysm stops reading deposit logs.

--eth1-header-req-limit=150

uint64default 1000

--execution-endpoint=<string>

An execution client http endpoint. Can contain auth header as well in the format

Engine API endpoint of your execution client, normally its authenticated port 8551. Also accepts an IPC socket path (a plain path or ipc://), which needs no JWT. If the endpoint is down, Prysm keeps retrying and logs Connected to new endpoint once it reconnects. An Authorization suffix after a comma (<URL>,Basic <USER:PASSWORD>) is a legacy option: with --jwt-secret set, Prysm replaces it with JWT authentication.

--execution-endpoint=http://localhost:8551

stringdefault http://localhost:8551

--execution-headers=<string>

A comma separated list of key value pairs to pass as HTTP headers for all execution client calls. Example: --execution-headers=key1=value1,key2=value2

Extra HTTP headers sent with every call to the execution client, for example an API key for an authenticating proxy or hosted endpoint. Pairs are split on , and each key on the first =, so values can contain = but not commas. A pair without = is skipped with a warning. An Authorization header set here is overwritten by the JWT on every request when --jwt-secret is set.

--execution-headers=X-Api-Key=<API_KEY>

string

--jwt-secret=<string>

REQUIRED if connecting to an execution node via HTTP. Provides a path to a file containing a hex-encoded string representing a 32 byte secret used for authentication with an execution node via HTTP. If this is not set, all requests to execution nodes via HTTP for consensus-related calls will fail, which will prevent your validators from performing their duties. This is not required if using an IPC connection.

Path to the file with the shared secret the execution client also uses: 32 bytes as hex, with or without 0x. Whitespace around it is ignored; an empty, unreadable or wrong-length file stops the node at startup. On success it logs Finished reading JWT secret from <path>. Create one with beacon-chain generate-auth-secret or openssl rand -hex 32.

Without it, HTTP calls to the execution client get 401 Unauthorized, and your validators can't do their duties.

--jwt-secret=/var/lib/ethereum/jwt.hex

string

--jwt-id=<string>

JWT claims id. Could be used to identify the client

Sets the optional id claim in every JWT sent to the execution client. It doesn't change authentication; use it to tell several consensus clients apart in the execution client's logs.

--jwt-id=prysm-node-1

string

Monitoring

--disable-monitoring

Disables monitoring service.

Turns off the Prometheus HTTP server on --monitoring-host:--monitoring-port. That also removes /healthz, /goroutinez and /p2p, which are served on the same port, so don't use it if a health check or dashboard depends on them.

booleandefault false

--enable-tracing

Enables OpenTelemetry tracing.

Starts an OpenTelemetry tracer that exports spans over OTLP/HTTP to --tracing-endpoint with service name beacon-chain. It adds CPU and network overhead, so enable it for debugging rather than permanently.

--enable-tracing

booleandefault false

--monitoring-host=<string>

Host used for listening and responding metrics for prometheus.

Interface the metrics server binds to. The same server also serves /healthz, /goroutinez and /p2p. Set 0.0.0.0 only if Prometheus runs on another machine or in another container, and firewall the port.

--monitoring-host=0.0.0.0

stringdefault 127.0.0.1

--trace-sample-fraction=<float64>

Head-sampling ratio applied to every trace started by the process. 1.0 keeps all traces.

Fraction of traces kept, from 0 to 1. It is a head-based ratio sampler on the trace ID, so a trace is kept or dropped as a whole. Lower it on busy nodes to reduce overhead; only used with --enable-tracing.

--trace-sample-fraction=0.05

float64default 0.2

--tracing-endpoint=<string>

OTLP/HTTP endpoint that traces are exported to (e.g. an OpenTelemetry Collector or a Tempo receiver).

Full URL, including the path, that spans are posted to with the OTLP/HTTP exporter. The default points at the old Jaeger collector path; for an OpenTelemetry Collector, Tempo or recent Jaeger, use the OTLP/HTTP receiver, usually port 4318 with path /v1/traces.

--tracing-endpoint=http://127.0.0.1:4318/v1/traces

stringdefault http://127.0.0.1:14268/api/traces

--tracing-process-name=<string>

Name to apply to tracing tag `process_name`.

Adds a process_name resource attribute (and sets service.instance.id) on every exported span, so you can tell several beacon nodes apart in the same tracing backend.

--tracing-process-name=beacon-hoodi-1

string

--monitor-indices=<int list>

List of validator indices to track performance

Starts the validator monitor for these validator indices (not public keys). After initial sync the node logs events such as Proposed beacon block was included, Attestation included and a periodic Aggregated performance since launch, and exports monitor_* Prometheus metrics labeled by validator_index. Pass a comma-separated list or repeat the flag.

--monitor-indices=1234,5678

int list

--monitoring-port=<int>

Port used to listening and respond metrics for Prometheus.

Port of the metrics server. Prometheus scrapes /metrics here; the same port serves /healthz (HTTP 503 if any service reports an error), /goroutinez (goroutine dump) and /p2p (peer summary). If the port is taken, the node keeps running without metrics and logs Port already in use; cannot start prometheus service.

--monitoring-port=8080

intdefault 8080

Slasher

--historical-slasher-node

Enables required flags for serving historical data to a slasher client. Results in additional storage usage

Prepares a beacon node to feed historical data to a slasher: it saves a full state every 4 epochs (128 slots) instead of every 2048 slots, and raises the maximum API page size to 4096 items. This uses much more disk.

An explicit --slots-per-archive-point overrides the 128-slot setting.

booleandefault false

--slasher-datadir=<string>

Directory for the slasher database

Base directory for the slasher database, stored at <dir>/beaconchaindata/slasher.db. Defaults to --datadir, so the slasher database sits next to the beacon database; set it to put the slasher on another disk.

--slasher-datadir=/mnt/slasher

stringdefault ~/Library/Eth2

--slasher

Enables a slasher in the beacon node for detecting slashable offenses.

Runs a slasher inside the beacon node: it watches attestations and blocks from gossip, detects double votes, surround votes and double proposals, and adds the slashings to the pool so they get included in blocks. It starts detecting only after the node has synced (Completed chain sync, starting slashing detection), and needs extra disk, memory and CPU. It is not required to protect your own validators; slashing protection lives in the validator client.

booleandefault false

Logging

--disable-log-colors

Disable color formatting for terminal logs.

Removes ANSI color codes from terminal output in the text format. Useful when stdout goes to a file or log collector that shows escape codes. Files written with --log-file and the debug log file never contain colors.

booleandefault false

--log-format=<string>

Specifies log formatting. Supports: text, json, fluentd, journald.

text (default) is the human-readable format and the only one that honors --log.vmodule. json and fluentd write one JSON object per line to stderr for log shippers. journald sends entries straight to the systemd journal; it works only on Linux, and if the journal isn't reachable the node logs a warning and ignores the setting.

--log-format=json

stringdefault text

--log-file=<string>

Specifies log file name, relative or absolute.

Also writes logs to this file, appending on restart and creating parent directories as needed. With --log-format=text the file gets uncolored Prysm text logs that honor --log.vmodule; with other formats the file is written in logrus's plain key=value format rather than JSON. Prysm does not rotate this file, so use logrotate or similar.

--log-file=/var/log/prysm/beacon.log

string

--verbosity=<string>

Logging verbosity. (trace, debug, info, warn, error, fatal, panic)

Minimum level printed to the terminal and to --log-file. debug is useful for troubleshooting but very noisy; trace is for developers. Independently of this flag, the node keeps a debug-level log file in <datadir>/logs/ unless you pass --disable-ephemeral-log-file.

--verbosity=debug

stringdefault info

--disable-ephemeral-log-file

Disables the creation of a debug log file that keeps 24 hours of logs.

By default the node writes a debug-level, uncolored copy of its logs to <datadir>/logs/beacon-chain.log, whatever --verbosity is set to. The file rotates at 250 MB, keeps one backup, and removes files older than one day. Disable it to save disk writes, at the cost of losing the debug history support usually asks for.

booleandefault false

--log.vmodule=<string list>

Per-package log verbosity. packagePath=level entries separated by commas.

Overrides --verbosity for specific packages. Keys are Prysm package paths without the module prefix, as shown in the package field of JSON logs (for example beacon-chain/sync). An entry also covers its subpackages, and the longest match wins. Wildcards, leading or trailing slashes and duplicates are rejected at startup. Only the text log format honors it.

--log.vmodule=beacon-chain/sync=debug,beacon-chain/p2p=trace

string list

Feature flags

--save-invalid-block-temp

Writes invalid blocks to temp directory.

When a gossiped block fails validation, Prysm writes it as SSZ to the operating system's temp directory ($TMPDIR or /tmp on Linux) as beacon_block_<slot>.ssz and logs Writing invalid block to disk at <path>. Use it to capture a block for a bug report; it is safe in production but files accumulate until you delete them.

booleandefault false

--save-invalid-blob-temp

Writes invalid blobs to temp directory.

When a gossiped blob sidecar fails validation, Prysm writes it as SSZ to the temp directory as blob_sidecar_<block root>_<slot>_<index>.ssz and logs Writing invalid blob sidecar to disk at <path>. A debugging aid for bug reports; files are never cleaned up automatically.

booleandefault false

--disable-grpc-connection-logging

WARNING: The gRPC API will remain the default and fully supported through v8 (expected in 2026) but will be eventually removed in favor of REST API.. Disables displaying logs for newly connected grpc clients.

Suppresses the gRPC client connected to beacon node info log that Prysm prints the first time each gRPC client address connects. Useful when many short-lived clients (or a load balancer) connect and the line floods your logs. It only affects logging.

booleandefault false

--sepolia

Runs Prysm configured for the Sepolia test network.

Loads the Sepolia chain config, bootnodes and deposit contract (deployed at execution block 1273020) and logs Running on the Sepolia Beacon Chain Testnet. Sepolia has a permissioned validator set, so it suits application testing rather than staking practice. Only mainnet's genesis state is embedded: also pass --checkpoint-sync-url, --genesis-beacon-api-url or --genesis-state.

--sepolia --checkpoint-sync-url=<SEPOLIA_BEACON_NODE_URL>

booleandefault false

--hoodi

Runs Prysm configured for the Hoodi test network.

Loads the Hoodi chain config (deposit chain ID 560048), its bootnodes and deposit contract, and logs Running on the Hoodi Beacon Chain Testnet. Hoodi is the public testnet for practicing staking. Only mainnet's genesis state is embedded, so also pass --checkpoint-sync-url (which Prysm also uses to fetch genesis), --genesis-beacon-api-url or --genesis-state. Use the same network flag on the beacon node and the validator client.

--hoodi --checkpoint-sync-url=https://hoodi.beaconstate.ethstaker.cc

booleandefault false

--mainnet

Runs on Ethereum main network. This is the default and can be omitted.

Mainnet is what Prysm runs when no other network flag is given, so this flag changes nothing; it exists so scripts can name the network explicitly. Prysm refuses to start if you pass more than one network flag (for example --mainnet --hoodi). Without a network flag but with --chain-config-file, Prysm runs a custom network and logs a warning instead.

booleandefault true

--disable-peer-scorer

(Danger): Disables P2P peer scorer. Do NOT use this in production!

Turns off peer scoring: gossip scores no longer mark peers as bad, and peer pruning falls back to an older algorithm that ignores scores. Your node then keeps misbehaving peers connected. Only useful for isolating P2P bugs on devnets.

Never use this on mainnet or a public testnet; it removes your node's defense against spamming and faulty peers.

booleandefault false

--disable-broadcast-slashings

Disables broadcasting slashings submitted to the beacon node.

Stops the node from gossiping proposer and attester slashings, both those submitted through the Beacon API (or gRPC) and the proposer slashings it builds when it sees two blocks for the same slot. The slashings still go into the local pool, so your own proposals still include them. Use it on test setups where you don't want slashings to propagate; there is no reason to set it in production.

booleandefault false

--disable-staking-contract-check

Disables checking of staking contract deposits when proposing blocks, useful for devnets.

When proposing, lets the node build eth1_data without looking up the deposit block on the execution client if the chain has no deposit block hash yet (an all-zero hash), which happens on devnets without a deposit contract. On mainnet and public testnets it has no benefit.

booleandefault false

--save-full-execution-payloads

Saves beacon blocks with full execution payloads instead of execution payload headers in the database.

By default Prysm stores blocks blinded (with only the execution payload header) and fetches payloads from the execution client when it needs them, which saves a lot of disk. This flag stores full payloads instead. It only works on a database created with the flag: an existing blinded database makes the node refuse to start, so resync from scratch (for example with checkpoint sync) if you need it.

Once a database stores blinded blocks it can't be switched to full payloads; the node exits with an error until you remove the flag or resync.

booleandefault false

--ignore-unviable-attestations

Ignores attestations whose target state is not viable with respect to the current head (avoid expensive state replay from lagging attesters).

Tightens which blocks fork choice accepts as attestation targets: without the flag, any block from the epoch before the checkpoint epoch counts as viable, which can force expensive state replays when lagging nodes attest to old targets. With it, those attestations are dropped. It replaced --disable-last-epoch-targets; off by default and still considered an advanced tuning option.

booleandefault false

--disable-track-equivocations

Disables recording proposer equivocations observed on gossip into forkchoice.

Prysm records proposer equivocations (two blocks for the same slot and proposer) that arrive early in the slot and feeds them into fork choice. This flag turns that tracking off and returns to the older behavior. Leave it off unless the Prysm team asks you to disable it while diagnosing a problem.

booleandefault false

--enable-full-ssz-data-logging

Enables displaying logs for full ssz data on rejected gossip messages.

Adds the full hex-encoded message (field message) to the Gossip message was rejected log. That log is written at debug level, so this only has an effect with --verbosity=debug or a matching --log.vmodule entry. Use it briefly to capture a bad message for a bug report.

Messages can be large (blocks, blobs, data columns), so this can grow log files quickly.

booleandefault false

--disable-verbose-sig-verification

Disables identifying invalid signatures if batch verification fails when processing block.

By default, when the batched signature check of a block fails, Prysm checks each signature individually so the error says which one is invalid. This flag skips that step: invalid blocks are still rejected, but with a generic batch block signature verification failed error. It saves a little CPU only when invalid blocks arrive, so most operators should leave the default.

booleandefault false

--enable-proposer-preprocessing

Enables proposer pre-processing of blocks before proposing.

When the node computes the state root for a block it is about to propose, it also verifies the block's batched signatures (attestations, RANDAO, BLS-to-execution changes; not the proposer signature, which doesn't exist yet) and fails the proposal if one is invalid. Without the flag the state root is computed without any signature checks. It adds a little CPU work per proposal in exchange for never proposing a block with a bad signature in it.

booleandefault false

--prepare-all-payloads

Informs the engine to prepare all local payloads. Useful for relayers and builders.

Makes the beacon node send payload attributes to the execution client in every forkchoiceUpdated call, so a payload is prepared for every slot, not only for proposers whose validator client is connected. For proposers it doesn't know, it uses --suggested-fee-recipient. It also fires the payload_attributes event stream every slot, which is what block builders and relays need; regular stakers don't need it, and it costs execution client work every slot.

booleandefault false

--disable-resource-manager

Disables running the libp2p resource manager.

Replaces libp2p's resource manager, which caps connections, streams and memory used by peers, with a no-op manager that enforces no limits. Only try it if you see libp2p resource-limit errors that block legitimate peers, and watch memory afterwards.

Without resource limits, a flood of peer connections can exhaust memory or file descriptors.

booleandefault false

--enable-light-client

Enables the light client support in the beacon node

Turns on light client server support: the node builds light client updates for every block after Altair, serves the /eth/v1/beacon/light_client/* Beacon API endpoints, answers the light client P2P requests (bootstrap, updates by range, finality and optimistic updates) and gossips the light client topics. Enable it if you want to serve light clients; it adds some CPU and storage.

booleandefault false

--blob-save-fsync

Forces new blob files to be fysnc'd before continuing, ensuring durable blob writes.

Makes the node call fsync on each new blob file before it counts the blob as available, so a crash or power loss can't leave a blob that the node already considered stored. It applies to blob storage in --blob-path and slows writes on slow disks. Use it where blob durability matters (for example nodes that serve blobs to others).

booleandefault false

--disable-quic

Disables connecting using the QUIC protocol with peers.

QUIC is on by default: the node listens on UDP --p2p-quic-port and advertises a quic-v1 address in its ENR alongside TCP. This flag turns QUIC off so the node only uses TCP. Use it if your network drops or rate-limits UDP traffic on that port, or to rule QUIC out while debugging peering.

booleandefault false

--enable-discovery-reboot

Experimental: Enables the discovery listener to rebooted in the event of connectivity issues.

Every minute the node checks whether its outbound peer count is below target. With this flag, if that stays true for more than five consecutive checks, it restarts the discv5 listener and logs Rebooting discovery listener, reached threshold. Experimental; try it if discovery stalls after network changes (for example a changed public IP) and peers don't recover.

booleandefault false

--enable-experimental-attestation-pool

Enables an experimental attestation pool design.

Replaces Prysm's separate aggregated and unaggregated attestation pools with a single new attestation cache used by gossip handling, fork choice, aggregation, the Beacon API pool endpoints and block packing. Experimental; run it on a testnet first and don't rely on it for production validators.

booleandefault false

--enable-fast-confirmation

Enables the fast confirmation rule (FCR) for rapid block confirmation under synchrony assumptions.

Runs the fast confirmation rule, which confirms blocks within a few slots when the network is behaving synchronously. The confirmed block becomes the safe block hash that Prysm sends to the execution client (instead of the unrealized justified block), and each run emits a fast_confirmation event on the Beacon API event stream. Experimental and off by default.

booleandefault false

--enable-state-diff

Enables the state diff feature.

Stores finalized (cold) states as a hierarchy of snapshots and diffs, controlled by --state-diff-exponents, instead of full states at archive points. It must be enabled on a fresh database: on an existing database created without it, the node logs Disabling state-diff feature and continues without it. Changing --state-diff-exponents later makes the node refuse to start. Overrides --enable-historical-state-representation.

The exponents are fixed when the database is created. To change them you must delete the database and resync.

booleandefault false

--enable-archive

Turns the node into an archive node: backfills blocks down to the archive origin state (see --archive-origin-state, genesis by default) and then regenerates every historical state into the state-diff tree. (Implies --enable-state-diff and --enable-backfill.)

Turns the node into an archive node. Start it with checkpoint sync and an empty data directory: the node follows the chain within minutes, downloads every block back to the archive origin (genesis by default, see --archive-origin-state), then rebuilds every historical state. Implies --enable-state-diff and --enable-backfill. Progress is logged as Archive state regeneration in progress, and a restart resumes where it stopped.

It needs a database created with it, and it can't be combined with --beacon-db-pruning: the node refuses to start.

--enable-archive

booleandefault false

--sync-from=<string>

Forces the head of the beacon chain to a specific block root. Values can be 'head' or a block root. The block root has to be known to the beacon node and correspond to a block newer than the current finalized checkpoint.

By default the node restarts with the justified checkpoint as its head. --sync-from=head restarts from the head block saved in the database instead, and --sync-from=<0x block root> from a specific known block, which helps during long periods of non-finality or to move off a bad fork. If the block is unknown or older than the finalized checkpoint, the node logs an error and starts from the finalized block. Remove the flag after the restart.

--sync-from=head

string

--blacklist-roots=<string list>

A comma-separatted list of 0x-prefixed hexstrings. Declares blocks with the given blockroots to be invalid. It downscores peers that send these blocks.

Treats blocks with the given roots as invalid everywhere: gossip validation rejects them (downscoring the sending peer), initial sync discards them, and block processing refuses them. Use it during an incident to keep your node off a known-bad block. Entries must be 32-byte 0x hex; malformed entries are skipped with a Failed to parse blacklisted root warning.

--blacklist-roots=0x<BLOCK_ROOT_1>,0x<BLOCK_ROOT_2>

string list

--enable-hashtree

(Experimental): Enables the hashtree hashing library.

Switches Merkle hashing (hash tree roots of states and blocks) from the default gohashtree library to the hashtree library, which Prysm builds from source. The results are identical; only speed differs by CPU. Experimental: benchmark it on a testnet node before you use it in production.

booleandefault false

--disable-builder-relay-circuit-breaker

Stops the builder circuit breaker from tracking which builders each direct connection endpoint serves, so a failing builder no longer bans the endpoints serving it.

From the Gloas fork on, stops the circuit breaker from tracking which builders each builder endpoint serves, so a failing builder no longer gets the endpoints that served it banned. Builders themselves are still blacklisted.

booleandefault false

--disable-last-epoch-targetsdeprecated

Deprecated: disables processing of last epoch targets.

Deprecated and has no effect. Prysm still accepts it so existing configs don't break, and doesn't print a warning. Its replacement is --ignore-unviable-attestations. Remove it from your config.

booleandefault false

--enable-historical-state-representation

Enables the beacon chain to save historical states in a space efficient manner. (Warning): Once enabled, this feature migrates your database in to a new schema and there is no going back. At worst, your entire database might get corrupted.

Migrates the database to store validator registries in a separate, deduplicated bucket so historical states take less space. This is a one-way schema migration: once it has run, the node behaves as if the flag is set, even if you remove it. It is pending deprecation (the node warns at startup that the node needs to be resynced after flag removal) and is ignored when --enable-state-diff is set.

The migration can't be undone, and the flag is scheduled for removal. Don't enable it on new nodes; consider --enable-state-diff on a fresh database for space-efficient history.

booleandefault false

deprecated

--dev

Enables experimental features still in development. These features may not be stable.

A shortcut that turns on the feature flags Prysm's developers want tested before they become defaults. In this release it only sets --enable-backfill (unless you set that flag yourself) and logs Enabling development mode flags at startup. The set changes between releases, so don't use it in production; enable the individual flags you want instead. Deprecated: it still works, but will be removed.

booleandefault false

--holesky

Runs Prysm configured for the Holesky test network.

Loads the Holesky chain config, bootnodes and deposit contract (0x4242…4242, chain ID 17000), and logs Running on the Holesky Beacon Chain Testnet. Only the mainnet genesis state is built in, so pass --genesis-state, --genesis-beacon-api-url or --checkpoint-sync-url as well. Deprecated: the Holesky testnet has been shut down. Use --hoodi for test setups.

booleandefault false

--terminal-total-difficulty-override=<string>

Sets the total difficulty to manual overrides the default TERMINAL_TOTAL_DIFFICULTY value. WARNING: This flag should be used only if you have a clear understanding that community has decided to override the terminal difficulty. Incorrect usage will result in your node experience consensus failure.

Overrides TERMINAL_TOTAL_DIFFICULTY, the proof-of-work difficulty at which the Merge happened. Mainnet and the public testnets are past the Merge, so this only matters for a devnet that starts before it. When set, Prysm logs the warning Terminal block difficult overridden. Deprecated, as the Merge is complete; it still works.

A wrong value on a live network causes a consensus failure.

string

--terminal-block-hash-override=<string>

Sets the block hash to manual overrides the default TERMINAL_BLOCK_HASH value. WARNING: This flag should be used only if you have a clear understanding that community has decided to override the terminal block hash. Incorrect usage will result in your node experience consensus failure.

Overrides TERMINAL_BLOCK_HASH, which pins the Merge to a specific proof-of-work block, and logs Terminal block hash overridden. Only relevant to pre-Merge devnets; use it with --terminal-block-hash-epoch-override. Deprecated, as the Merge is complete; it still works.

A wrong value on a live network causes a consensus failure.

string

--terminal-block-hash-epoch-override=<uint64>

Sets the block hash epoch to manual overrides the default TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH value. WARNING: This flag should be used only if you have a clear understanding that community has decided to override the terminal block hash activation epoch. Incorrect usage will result in your node experience consensus failure.

Overrides TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH, the epoch from which the terminal block hash override applies, and logs Terminal block hash activation epoch overridden. Only relevant to pre-Merge devnets. Deprecated, as the Merge is complete; it still works.

A wrong value on a live network causes a consensus failure.

uint64default 0

--subscribe-all-data-subnetsdeprecated

Deprecated alias of --supernode.

Deprecated alias of --supernode. It still works; use --supernode instead.

booleandefault false

--enable-experimental-backfilldeprecated

Deprecated alias of --enable-backfill.

Deprecated alias of --enable-backfill. It still works; use --enable-backfill instead.

booleandefault false

--extend-blob-retention-epoch=<uint64>deprecated

Deprecated alias of --blob-retention-epochs.

Deprecated alias of --blob-retention-epochs. It still works; use --blob-retention-epochs instead.

uint64default 4096

--max-goroutines=<int>deprecated

Deprecated alias of --healthz-max-goroutines.

Deprecated alias of --healthz-max-goroutines. It still works; use --healthz-max-goroutines instead.

intdefault 5000

Debugging and profiling

--healthz-max-goroutines=<int>

The /healthz endpoint reports the node as unhealthy if the average goroutine count during a 10 slots window exceeds this threshold.

Threshold for the blockchain service's health status. If the average goroutine count exceeds it, the service reports an error and /healthz on the monitoring port returns HTTP 503. Raise it if your node is healthy but trips this check under heavy load. --max-goroutines is a deprecated alias.

--healthz-max-goroutines=10000

intdefault 5000

--blockprofilerate=<int>

Turns on block profiling with the given rate.

Sets Go's runtime.SetBlockProfileRate: about one blocking event is sampled per this many nanoseconds spent blocked (1 records every event). 0 (default) leaves block profiling off. Read results from /debug/pprof/block with --pprof.

--blockprofilerate=1

intdefault 0

--memprofilerate=<int>

Turns on memory profiling with the given rate.

Sets Go's runtime.MemProfileRate: one allocation sampled per this many bytes allocated. The default 524288 (512 KiB) is Go's own default. Lower values give more precise heap profiles at a CPU cost; 0 turns heap profiling off.

intdefault 524288

--mutexprofilefraction=<int>

Turns on mutex profiling with the given rate.

Sets Go's runtime.SetMutexProfileFraction: on average one in this many mutex contention events is recorded. 0 (default) leaves mutex profiling off. Read results from /debug/pprof/mutex with --pprof.

--mutexprofilefraction=5

intdefault 0

--pprofaddr=<string>

pprof HTTP server listening interface.

Interface for the pprof server started by --pprof. Keep the default 127.0.0.1: the endpoints are unauthenticated and can be used to trigger expensive profiles.

stringdefault 127.0.0.1

--pprof

Enables the pprof HTTP server.

Starts Go's standard pprof HTTP server at http://<pprofaddr>:<pprofport>/debug/pprof/, for CPU, heap, goroutine, block and mutex profiles (go tool pprof reads them directly). The node logs Starting pprof server with the address. Overhead is negligible until you request a profile.

--pprof

booleandefault false

--pprofport=<int>

pprof HTTP server listening port.

Port for the pprof server. Change it if 6060 is taken, for example when a validator client with --pprof runs on the same host.

--pprofport=6061

intdefault 6060

--gc-percent=<int>

The percentage of freshly allocated data to live data on which the gc will be run again.

Sets Go's garbage collection target (the same as the GOGC environment variable): a GC runs when new allocations reach this percentage of the live heap. Lower values reduce peak memory at the cost of CPU; higher values do the opposite. It is only applied when you set the flag.

--gc-percent=50

intdefault 100

Subcommands

beacon-chain db restore

restores a database from a backup file

--restore-source-file=<altsrc.string>

Filepath to the backed-up database file which will be used to restore the database

Path to the database file to restore. The file is copied as is to <restore-target-dir>/beaconchaindata/beaconchain.db; blobs and data columns are not part of it. Stop the beacon node before restoring.

beacon-chain db restore --restore-source-file=/backups/beaconchain.db --restore-target-dir=/var/lib/ethereum/beacon
--restore-target-dir=<altsrc.string>

Target directory of the restored database

The beacon node data directory to restore into, the same value as --datadir. If a database already exists there, the command asks before overwriting it.

default ~/Library/Eth2

beacon-chain generate-auth-secret

creates a random, 32 byte hex string in a plaintext file to be used for authenticating JSON-RPC requests. If no --output-file flag is defined, the file will be created in the current working directory

creates a random, 32 byte hex string in a plaintext file to be used for authenticating JSON-RPC requests. If no --output-file flag is defined, the file will be created in the current working directory

--output-file=<altsrc.string>

Target file path for outputting a generated JWT secret to be used for JSON-RPC authentication

Where to write the new JWT secret: a 0x-prefixed 64-character hex string (32 random bytes), with 0600 permissions. Without this flag the file is jwt.hex in the current directory; missing parent directories are created. Give the same file to the beacon node (--jwt-secret) and the execution client.

An existing file at that path is overwritten without asking. Restart both clients if the secret changes.

beacon-chain generate-auth-secret --output-file=/var/lib/ethereum/jwt.hex