Connect your execution client
Prysm needs an execution layer client (EL), such as Geth or Nethermind, running alongside it; the EL checks transactions in every block. The two connect on port 8551 by default and prove who they are with a shared secret file, the JWT secret.
Before you begin
-
The Prysm launcher script and a folder for each program and for the data. The programs live in
consensusandexecution, and everything the clients store goes intodata, one folder per network. The commands on this page use this layout:~/ethereum/├── consensus/├── execution/└── data/└── mainnet/├── execution/└── beacon/If you don't have it yet, create the folders, then download the Prysm launcher script into
consensus:mkdir -p $HOME/ethereumcd $HOME/ethereummkdir -p \consensus \execution \data/mainnet/execution \data/mainnet/beaconcd consensuscurl https://raw.githubusercontent.com/OffchainLabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh$HOME\ethereum\├── consensus\├── execution\└── data\└── mainnet\├── execution\└── beacon\If you don't have it yet, create the folders, then download the Prysm launcher script into
consensus:mkdir $HOME\ethereumcd $HOME\ethereummkdir `consensus, `execution, `data\mainnet\execution, `data\mainnet\beaconcd consensuscurl.exe https://raw.githubusercontent.com/OffchainLabs/prysm/master/prysm.bat --output prysm.batSee Install Prysm for the other install methods and for verifying the download.
-
Enough disk space for the EL. See System requirements.
Connect the two clients
-
Create the JWT secret. Do this once. Both clients read the same file.
cd ~/ethereum/consensus./prysm.sh beacon-chain generate-auth-secret --output-file=$HOME/ethereum/data/jwt.hexPrysm prints:
INFO jwt: Successfully wrote JSON-RPC authentication secret to file /home/<USER>/ethereum/data/jwt.hexThe file is readable only by you (
0600).cd $HOME\ethereum\consensus.\prysm.bat beacon-chain generate-auth-secret --output-file=$HOME\ethereum\data\jwt.hexPrysm prints:
INFO jwt: Successfully wrote JSON-RPC authentication secret to file C:\Users\<USER>\ethereum\data\jwt.hexThe file holds 64 hex characters, and the same secret serves every network. Running the command again replaces the secret, so don't; you'd have to restart both clients with the new file.
-
Install and start your execution client. The commands keep the EL's data in
ethereum/data, in the folder for your network.Install: see the Besu installation guide. Besu needs Java 25 or later.
To start it:
besu \--network=mainnet \--data-path=$HOME/ethereum/data/mainnet/execution \--engine-jwt-secret=$HOME/ethereum/data/jwt.hexbesu `--network=mainnet `--data-path=$HOME\ethereum\data\mainnet\execution `--engine-jwt-secret=$HOME\ethereum\data\jwt.hexBesu gives the JVM 25% of RAM by default; its memory guide suggests this on machines with 24 GB or more:
export BESU_OPTS=-Xmx8g$env:BESU_OPTS="-Xmx8g"Install: see the Erigon installation guide.
To start it:
erigon \--chain=mainnet \--datadir=$HOME/ethereum/data/mainnet/execution \--externalcl \--authrpc.jwtsecret=$HOME/ethereum/data/jwt.hexerigon `--chain=mainnet `--datadir=$HOME\ethereum\data\mainnet\execution `--externalcl `--authrpc.jwtsecret=$HOME\ethereum\data\jwt.hexAlways pass
--externalcl. Without it, Erigon runs its own built-in consensus client (Caplin), and you'd have two consensus clients driving one EL.Install: see the Ethrex installation guide. On x86-64, Ethrex needs a CPU with AVX2.
Ethrex doesn't publish Windows builds. Pick another execution client, or run the node on Linux or macOS.
To start it:
ethrex \--network mainnet \--datadir $HOME/ethereum/data/mainnet/execution \--authrpc.jwtsecret $HOME/ethereum/data/jwt.hexEthrex adds a subfolder named after the network inside its data directory.
Install: see the Geth installation guide.
To start it:
geth \--mainnet \--datadir=$HOME/ethereum/data/mainnet/execution \--authrpc.jwtsecret=$HOME/ethereum/data/jwt.hexgeth `--mainnet `--datadir=$HOME\ethereum\data\mainnet\execution `--authrpc.jwtsecret=$HOME\ethereum\data\jwt.hexgeth \--mainnet \--datadir=$HOME/ethereum/data/mainnet/executionGeth creates its IPC socket,
geth.ipc, in its data directory.geth `--mainnet `--datadir=$HOME\ethereum\data\mainnet\executionOn Windows, Geth's IPC endpoint is the named pipe
\\.\pipe\geth.ipc.The defaults (snap sync, path-based state) are right for a staking node.
Install: see the Nethermind installation guide.
To start it:
nethermind \-c mainnet \--data-dir $HOME/ethereum/data/mainnet/execution \--jsonrpc-jwtsecretfile $HOME/ethereum/data/jwt.hex \--History.Pruning=Rollingnethermind `-c mainnet `--data-dir $HOME\ethereum\data\mainnet\execution `--jsonrpc-jwtsecretfile $HOME\ethereum\data\jwt.hex `--History.Pruning=RollingInstall: see the Reth installation guide.
Reth doesn't publish Windows builds. Pick another execution client, or run the node on Linux or macOS.
To start it:
reth node \--chain mainnet \--datadir $HOME/ethereum/data/mainnet/execution \--full \--authrpc.jwtsecret $HOME/ethereum/data/jwt.hexPass
--full. Reth runs an archive node by default, which needs far more disk space than a staking node.Always give the EL an absolute path to the secret. Most clients create a new secret when the path doesn’t exist, and Prysm then doesn’t know it.
-
Start the beacon node from the
consensusfolder:./prysm.sh beacon-chain \--mainnet \--datadir=$HOME/ethereum/data/mainnet/beacon \--execution-endpoint=http://localhost:8551 \--jwt-secret=$HOME/ethereum/data/jwt.hex \--checkpoint-sync-url=https://sync-mainnet.beaconcha.in \--beacon-db-pruningAt startup, Prysm logs:
INFO execution: Finished reading JWT secret from /home/<USER>/ethereum/data/jwt.hex.\prysm.bat beacon-chain `--mainnet `--datadir=$HOME\ethereum\data\mainnet\beacon `--execution-endpoint=http://localhost:8551 `--jwt-secret=$HOME\ethereum\data\jwt.hex `--checkpoint-sync-url=https://sync-mainnet.beaconcha.in `--beacon-db-pruningAt startup, Prysm logs:
INFO execution: Finished reading JWT secret from C:\Users\<USER>\ethereum\data\jwt.hex./prysm.sh beacon-chain \--mainnet \--datadir=$HOME/ethereum/data/mainnet/beacon \--execution-endpoint=$HOME/ethereum/data/mainnet/execution/geth.ipc \--checkpoint-sync-url=https://sync-mainnet.beaconcha.in \--beacon-db-pruning.\prysm.bat beacon-chain `--mainnet `--datadir=$HOME\ethereum\data\mainnet\beacon `--execution-endpoint=\\.\pipe\geth.ipc `--checkpoint-sync-url=https://sync-mainnet.beaconcha.in `--beacon-db-pruningThe checkpoint sync URL is one of several community endpoints; any one you trust works.
--beacon-db-pruningdeletes blocks and states older than about five months; the oldest data other nodes can still ask for, so the database stops growing. Leave it out if you need the full history.Running validators? Also add:
--postpone-shutdown-for-proposalsWhen you stop or restart the beacon node, it then waits until your validators' upcoming block proposals are done. For more information refer to the Don't restart just before a proposal page.
The two flags that matter:
| Flag | Default | What to set |
|---|---|---|
--execution-endpoint | http://localhost:8551 | The EL's Engine API address. Leave the default when the EL runs on the same machine with default ports. |
--jwt-secret | none | Path to the same JWT secret file the EL uses. |
The JWT secret is the only protection on the Engine API. Allow port 8551 only from the beacon node's address.
Check that it works
-
Ask the beacon node whether it reaches the EL:
curl -s http://127.0.0.1:3500/eth/v1/node/syncingcurl.exe -s http://127.0.0.1:3500/eth/v1/node/syncing"el_offline":falsemeans the connection works."is_optimistic":truemeans the EL is still syncing; that's normal for the first hours. Once it showsfalse, the EL has caught up. -
Watch the beacon node logs. Once both are synced, Prysm logs a
Synced new blockline for every block. While the EL is still catching up, you seeCalled fork choice updated with optimistic blockinstead.
Troubleshooting
Authentication fails. Prysm logs one of:
HTTP authentication to your execution client is not working
401 Unauthorized
Prysm and the EL read different secrets. Check the EL's startup log for the path it loaded; a line such as Geth's Generated JWT secret or Nethermind's ...was not found or was empty, so it has been automatically created means the path was wrong and the EL made its own. Point both at the same file and restart both. Also check that the clocks are in sync.
The chain IDs don't match. Prysm logs, with your networks' chain IDs:
wanted chain ID 560048, got 1
The two clients are on different networks; here, Prysm is on Hoodi and the EL on mainnet. Start both on the same network.
Prysm can't read the JWT secret. Prysm logs:
could not read JWT secret file for authenticating execution API
Prysm can't read the file, or it doesn't hold exactly 32 bytes of hex. Check the path and permissions.
The EL logs that no beacon client or consensus client is connected. Prysm isn't running, points at the wrong port, or fails authentication. Check the beacon node logs.
The beacon node stays optimistic. The EL is still syncing. That can take hours or days. If it never progresses, check the EL's peers and disk speed.