Quickstart
This guide gets a full Ethereum node running on one machine: an execution client, a Prysm beacon node, and, optionally, a Prysm validator client. Pick your setup below and every command on the page updates to match it.
Install Prysm
Everything goes into an
ethereumfolder in your home directory, on your SSD. The programs live inconsensusandexecution, and everything the clients store goes intoethereum/data, one folder per network. The commands below use this layout:ethereum/ ├── consensus/ ├── execution/ └── data/ └── mainnet/ ├── execution/ └── beacon/Create the folders, then download the Prysm launcher script into
consensus:mkdir -p $HOME/ethereum cd $HOME/ethereum mkdir -p \ consensus \ execution \ data/mainnet/execution \ data/mainnet/beacon cd consensus curl https://raw.githubusercontent.com/OffchainLabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.shprysm.shdownloads the latest release binaries on first run and verifies their checksums and signatures. Pin a release withUSE_PRYSM_VERSION.The registry change enables coloured log output in Windows terminals.
prysm.batdownloads the latest release on first run.Create a JWT secret
The beacon node and execution client authenticate each other with a shared secret. Generate it from the
consensusfolder intoethereum/data, where both clients read it:./prysm.sh beacon-chain generate-auth-secret --output-file=$HOME/ethereum/data/jwt.hexStart your execution client
Install Besu into your
executionfolder, then start it from there:./besu \ --network=mainnet \ --data-path=$HOME/ethereum/data/mainnet/execution \ --engine-jwt-secret=$HOME/ethereum/data/jwt.hexThe execution client waits for a beacon node before it starts syncing, so don't worry if it looks idle. Leave it running in its own terminal.
Start MEV-Boost
Download MEV-Boost from its releases into your
mev-boostfolder, then start it from there:./mev-boost \ -mainnet \ -color \ -relay-check \ -relay https://0xa15b52576bcbf1072f4a011c0f99f9fb6c66f3e1ff321f11f461d15e31b1cb359caa092c71bbded0bae5b5ea401aab7e@aestus.live \ -relay https://0xa7ab7a996c8584251c8f925da3170bdfd6ebc75d50f5ddc4050a6fdc77f2a3b5fce2cc750d0865e05d7228af97d69561@agnostic-relay.net \ -relay https://0xb0b07cd0abef743db4260b0ed50619cf6ad4d82064cb4fbec9d3ec530f7c5e6793d9f286c4e082c0244ffb9f2658fe88@bloxroute.regulated.blxrbdn.com \ -relay https://0x8c4ed5e24fe5c6ae21018437bde147693f68cda427cd1122cf20819c30eda7ed74f72dece09bb313f2a1855595ab677d@global.titanrelay.xyz \ -relay https://0x8c4ed5e24fe5c6ae21018437bde147693f68cda427cd1122cf20819c30eda7ed74f72dece09bb313f2a1855595ab677d@regional.titanrelay.xyz \ -relay https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net \ -relay https://0xa1559ace749633b997cb3fdacffb890aeebdb0f5a3b6aaa7eeeaf1a38af0a8fe88b9e4b1f61f236d2e64d95733327a62@relay.ultrasound.moneyThe command uses the working relays from the EthStaker relay list for mainnet. Relays differ in what they filter and how they share profits; the list describes each one, so remove any you don't want to use. MEV-Boost listens on
localhost:18550. Leave it running in its own terminal.Start your beacon node
From the
consensusfolder, start the beacon node. The first run asks you to accept the terms of use../prysm.sh beacon-chain \ --mainnet \ --datadir=$HOME/ethereum/data/mainnet/beacon \ --jwt-secret=$HOME/ethereum/data/jwt.hex \ --checkpoint-sync-url=https://sync-mainnet.beaconcha.in \ --beacon-db-pruningCheckpoint sync fetches a recent finalized state, so the node follows the chain within minutes. By default, the beacon node doesn't backfill blocks older than the checkpoint; if you need them, add
--enable-backfill.https://sync-mainnet.beaconcha.inis one of several community endpoints; any one you trust works.--beacon-db-pruningdeletes blocks and states older than about 5 months, the oldest data other nodes can still ask for, so the database stops growing. Leave it out if you need the full history.Check progress with
curl http://localhost:3500/eth/v1/node/syncing.Create validator keys
Download the EthStaker deposit CLI, ideally onto a machine that has never been connected to the internet. Generate a mnemonic and your validator keys:
./deposit new-mnemonic --chain=mainnetThe CLI asks how many validators to create and for a withdrawal address. Use an address you control: withdrawals and the stake itself go there when you exit. It also asks you to choose a keystore password; you'll need it in the next step to import the keys into Prysm. Write the 24-word mnemonic down on paper and keep it offline. Anyone who has it controls your validator and its withdrawal. The CLI writes a
validator_keysfolder containing adeposit_data-*.jsonfile and onekeystore-m_*.jsonper validator.Import your keys into Prysm
./prysm.sh validator accounts import \ --mainnet \ --keys-dir=<PATH_TO_VALIDATOR_KEYS> \ --wallet-dir=$HOME/ethereum/data/mainnet/validator/walletReplace
<PATH_TO_VALIDATOR_KEYS>with the path to thevalidator_keysfolder: the directory containing all thekeystore-m_*.jsonfiles created in the previous step.The import first asks you to choose a password for the new wallet:
New wallet password: Confirm password:
You'll need this wallet password later, every time you start the validator client.
It then asks for the password of the keys you're importing:
Enter the password for your imported accounts:
This is the keystore password you chose in the deposit CLI when creating your validator keys. Once the keys are imported, the validator client no longer needs it.
Check your imported keys
List the accounts in the wallet to make sure every key was imported:
./prysm.sh validator accounts list \ --mainnet \ --wallet-dir=$HOME/ethereum/data/mainnet/validator/walletIt asks for the wallet password you just chose, then prints one account per imported key:
(keymanager kind) local wallet Showing 1 validator account Account 0 | <ACCOUNT_NAME> [validating public key] 0x<VALIDATOR_PUBKEY>
Check that the number of accounts matches the number of validators you created, and that each public key matches the
pubkeyof a validator in yourdeposit_data-*.jsonfile (which leaves out the0xprefix).Start your validator client
From the
consensusfolder, start the validator client with the wallet you just created:./prysm.sh validator \ --mainnet \ --datadir=$HOME/ethereum/data/mainnet/validator \ --wallet-dir=$HOME/ethereum/data/mainnet/validator/wallet \ --suggested-fee-recipient=<YOUR_WALLET_ADDRESS> \ --enable-doppelgangerOn startup, it asks for the wallet password:
Wallet password:
Enter the password you chose at the
New wallet password:prompt when importing your keys. To start the validator client without typing the password, pass a file containing it with--wallet-password-file.Until both the beacon node and the execution client are synced, the validator client logs this warning every slot. That's expected:
WARN fallback: No responsive beacon node found tried=[127.0.0.1:4000]
Check the beacon node's sync status:
curl http://localhost:3500/eth/v1/node/syncingEverything is running correctly once the response shows all three of these as
false:"el_offline": false: the execution client is online. This should be the case as soon as it is up and running."is_syncing": false: the beacon node is synced. This takes a few minutes from a checkpoint."is_optimistic": false: the execution client is synced. This takes from a few hours to a few days, depending on your execution client.
Make your deposit
Deposit only once the sync check at the end of the previous step shows all three values as
false.Upload
deposit_data-*.jsonon the Staking Launchpad and follow its checks before depositing 32 ETH.Only use the official launchpadScam sites copy the launchpad and send your deposit to their own contract. Type the address yourself or use a bookmark; never follow links from ads, search results, chats or emails.
- Launchpad: https://launchpad.ethereum.org/
The beacon chain then processes the deposit and puts your validator in the activation queue. Activation takes anywhere from hours to weeks depending on the queue. The validator client logs each stage:
Waiting for deposit to be observed by beacon node Validator deposited, entering activation queue after finalization Waiting for activation... Check validator queue status in a block explorer Validator activated
Keep all your clients running; once active, your validator attests and proposes automatically. To keep them running after a reboot, run them as services with Docker Compose or systemd.
Check that it works
Leave both programs running and open a new terminal. Ask the beacon node whether it has caught up:
curl -s http://localhost:3500/eth/v1/node/syncing
curl -s http://localhost:3500/eth/v1/node/peer_countYour node is ready when the first command shows all three of these:
"is_syncing":false: the beacon node has caught up with the chain."is_optimistic":false: the execution client has caught up too. It staystruewhile the execution client is still syncing, which can take hours."el_offline":false: the beacon node can reach the execution client.
The second command should show a connected count that grows over the first minutes. Tens of peers is normal; Prysm aims for up to 70.
In the beacon node's terminal, a synced node logs one line per block, about every 12 seconds:
INFO blockchain: Synced new block block=0x5b7dd003... epoch=385801 finalizedEpoch=385799 finalizedRoot=0xcdeff59f... sinceSlotStartTime=1.9s slot=12345650
Every minute it also logs Connected peers with the current total. If you see few peers, open your P2P ports: 13000 (TCP and UDP) and 12000 (UDP).