Start Besu
Nodes can connect to Ethereum Mainnet and public testnets.
Use the besu command with the required command line options to start a node.
Prerequisites
Local block data
When connecting to a network other than the network previously connected to, you must either delete the local block data or use the --data-path option to specify a different data directory.
To delete the local block data, delete the database directory in the besu/build/distribution/besu-<version> directory.
Genesis configuration
Besu specifies the genesis configuration, and sets the network ID and bootnodes when connecting to Hoodi, Sepolia, Ephemery, and Mainnet.
The following networks and testnets are deprecated: ETC Classic, Holesky, and Mordor.
When you specify --network=dev, Besu uses the development mode genesis configuration with a fixed low difficulty. A node started with --network=dev has an empty bootnodes list by default.
The genesis files defining the genesis configurations are in the Besu source files.
To define a genesis configuration, create a genesis file (for example, genesis.json) and specify the file using the --genesis-file option.
Syncing and storage
By default, Besu syncs to the current state of the blockchain using snap sync in:
- Networks specified using
--networkexcept for thedevdevelopment network. - Ethereum Mainnet.
We recommend using snap sync for a faster sync, by starting Besu with --sync-mode=SNAP.
By default, Besu stores data in the Bonsai Tries format.
Run a node for testing
To run a node that mines blocks at a rate suitable for testing purposes:
besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir
You can also use the following configuration file on the command line to start a node with the same options as above:
network="dev"
miner-enabled=true
miner-coinbase="0xfe3b557e8fb62b89f4916b721be55ceb828dbd73"
rpc-http-cors-origins=["all"]
host-allowlist=["*"]
rpc-ws-enabled=true
rpc-http-enabled=true
data-path="/tmp/tmpdata-path"
The following settings are a security risk in production environments:
- Enabling the HTTP JSON-RPC service (
--rpc-http-enabled) and setting--rpc-http-hostto 0.0.0.0 exposes the RPC connection on your node to any remote connection. - Setting
--host-allowlistto"*"allows JSON-RPC API access from any host. - Setting
--rpc-http-cors-originsto"all"or"*"allows cross-origin resource sharing (CORS) access from any domain.
Run a node on Hoodi testnet
To run a node on Hoodi specifying a data directory:
besu --network=hoodi --data-path=<path>/<hoodidata-path>
Where <path> and <hoodidata-path> are the path and directory to save the Hoodi chain data to.
See the guide on connecting to a testnet for more information.
Run a node on Sepolia testnet
To run a node on Sepolia specifying a data directory:
besu --network=sepolia --data-path=<path>/<sepoliadata-path>
Where <path> and <sepoliadata-path> are the path and directory to save the Sepolia chain data to.
See the guide on connecting to a testnet for more information.
Run a node on Ephemery testnet
To run a node on Ephemery specifying a data directory:
besu --network=ephemery --data-path=<path>/<ephemery-data-path>
Where <path> and <ephemery-data-path> are the path and directory to save the Ephemery chain data to.
See the guide on connecting to a testnet for more information.
Run a node on Ethereum Mainnet
To run a node on the Ethereum Mainnet:
besu
To run a node on Mainnet with the HTTP JSON-RPC service enabled and available for localhost only:
besu --rpc-http-enabled
See the guide on connecting to Mainnet for more information.
Confirm node is running
If you started Besu with the --rpc-http-enabled option, use cURL to call JSON-RPC API methods to confirm the node is running.
-
eth_chainIdreturns the chain ID of the network.curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' localhost:8545/ -H "Content-Type: application/json" -
eth_syncingreturns the starting, current, and highest block.curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' localhost:8545/ -H "Content-Type: application/json"For example, after connecting to Mainnet,
eth_syncingwill return something similar to:{
"jsonrpc": "2.0",
"id": 1,
"result": {
"startingBlock": "0x0",
"currentBlock": "0x2d0",
"highestBlock": "0x66c0"
}
}