Input doesn't have enough data for RLP encoding: encoding advertise a
payload ending at byte 419 but input has size 80
Affected Component: Besu blockchain client (Hyperledger)
Location: Block header extra data parsing (QBFT/BFT consensus)
Cause: Corrupted database or malformed genesis file
The /var/lib/besu directory contains corrupted block data.
Indicators:
- Fresh startup but database exists
- "Compacting database" message in logs
- RLP parsing fails during genesis block initialization
Fix: Wipe and regenerate
# Stop Besu service
docker-compose down # or stop your container
# Clear the corrupted database
sudo rm -rf /var/lib/besu/*
# Restart Besu
docker-compose up -d # or restart containerThe genesis.json has invalid extra data encoding.
Check your genesis file:
# Examine the extra data field
cat /path/to/genesis.json | grep -A2 -B2 "extraData"Valid formats:
{
"config": {
"chainId": 19251925,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"engine": "QBFT" // or "IBFT2" or "ENGINE_CLIQUE"
},
"extraData": "0xf87aa00..." // Must be valid RLP encoded
}Your Besu config says PoA but genesis says QBFT.
Check:
- Besu config file:
--config-file=besu.toml - Genesis file:
consensus.enginefield - Must match!
# 1. Stop Besu
docker-compose down
# 2. Remove corrupted data
sudo rm -rf /var/lib/besu
mkdir -p /var/lib/besu
# 3. Regenerate genesis file
cat > genesis.json << 'EOF'
{
"config": {
"chainId": 19251925,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"londonBlock": 0,
"berlinBlock": 0,
"engine": "CLIQUE"
},
"difficulty": "0x1",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000[VALIDATOR_ADDRESS_WITHOUT_0x]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xffffffffffffff",
"nonce": "0x0",
"number": "0x0",
"timestamp": "0x0",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0x[VALIDATOR_ADDRESS]": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
}
}
}
EOF
# 4. Start Besu with the fresh genesis
docker-compose up -dIf your genesis file is valid but the database is corrupted:
# 1. Backup current state
cp -r /var/lib/besu /var/lib/besu.backup
# 2. Clear only the chain data (keeps key)
rm -rf /var/lib/besu/database/*
rm -rf /var/lib/besu/caches/*
# 3. Restart
docker restart [besu_container_name]# Install jq if needed
apt-get install -y jq
# Validate JSON syntax
jq . genesis.json > /dev/null && echo "✓ JSON valid" || echo "✗ JSON invalid"
# Check critical fields
echo "Checking genesis fields..."
jq '.config.chainId' genesis.json
jq '.config.engine' genesis.json
jq '.extraData' genesis.json | head -c 100If using Proof of Authority instead of QBFT:
{
"config": {
"chainId": 19251925,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"londonBlock": 0,
"berlinBlock": 0,
"engine": "CLIQUE"
},
"difficulty": "0x1",
"extraData": "0x[YOUR_HEX_DATA_HERE]",
"gasLimit": "0xffffffffffffff",
"alloc": {}
}[Node]
# Network ID matches genesis
p2p-port = 30303
rpc-http-enabled = true
rpc-http-port = 8545
rpc-http-api = ["ETH", "NET", "WEB3"]
data-path = "/var/lib/besu"
genesis-file = "/path/to/genesis.json"
[Network]
network-id = 19251925
[Mining]
# Required for PoA (Clique)
miner-enabled = true
miner-coinbase = "0x[VALIDATOR_ADDRESS]"
[Account]
unlock = ["0x[VALIDATOR_ADDRESS]"]
password-file = "/path/to/password.txt" # Optional, for automated unlockingIf using QBFT consensus:
{
"config": {
"chainId": 19251925,
"engine": "QBFT",
"qbft": {
"blockperiodSeconds": 5,
"epochLength": 30000,
"requesttimeoutmilliseconds": 10000,
"messagequalityuamultiplier": 1,
"messagevalidationscheme": "STRICT",
"validatorcontractaddress": null
}
},
"nonce": "0x0",
"timestamp": "0x58ee40ba",
"extraData": "0xf87aa00[RLP_ENCODED_VALIDATOR_DATA]",
"gasLimit": "0x47b760",
"difficulty": "0x1",
"mixHash": "0x63746963616c2062797a616e7469756d20666f726b000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"0x[VALIDATOR_ADDRESS]": {
"balance": "0x200000000000000000000000000000000000000000000000000000000000000"
}
}
}Run these to diagnose the issue:
# 1. Check Besu version
besu --version
# 2. Validate genesis
besu --genesis-file=genesis.json --config-file=besu.toml --data-path=/tmp/test-genesis
# 3. Check database integrity
ls -lah /var/lib/besu/
du -sh /var/lib/besu/
# 4. View Besu logs
docker logs -f [besu_container_name] # If containerized
journalctl -u besu -f # If system service- Genesis file is valid JSON
-
enginefield matches configuration -
extraDatais properly RLP encoded - Network ID matches between config and genesis
- Database directory is writable
- No permission errors on key files
- Sufficient disk space (min 50GB for testnet)
- Correct consensus mechanism selected
Cause: Mismatch between genesis and config
Fix: Set miner-enabled=true in besu.toml for PoA
Cause: Validator address not in genesis.alloc
Fix: Add validator address to genesis alloc section
Cause: Data format incompatibility
Fix: Backup database, clear it, let Besu resync
Cause: Previous instance still running
Fix: Kill process: lsof -ti:8545 | xargs kill -9
/etc/besu/
├── besu.toml # Main configuration
├── genesis.json # Blockchain genesis
├── validator-key # Private key (generated)
├── password.txt # Account password (optional)
└── static-nodes.json # Peer nodes (optional)
/var/lib/besu/
├── database/ # Chain data (auto-generated)
├── key # Public key (auto-generated)
├── caches/ # Cache files (auto-generated)
└── 📋 DO NOT EDIT - Besu manages this
# 1. Wait for Besu to start (3-5 min)
sleep 60
# 2. Test RPC endpoint
curl http://localhost:8545 -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}'
# Expected response:
# {"jsonrpc":"2.0","result":"19251925","id":1}
# 3. Check network is running
curl http://localhost:8545 -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
# Expected: {"jsonrpc":"2.0","result":"0x0","id":1}If the issue persists after trying these solutions:
-
Check Besu logs for detailed error:
docker logs [container_name] 2>&1 | grep -i "rlp\|corrupt\|error"
-
Verify genesis.json syntax:
jq . genesis.json -
Try with minimal genesis: Use the PoA template above with single validator
-
Report to Besu:
- Include error logs
- Include genesis.json (redacted addresses)
- Include Besu version