Skip to content

Sync_modes

Understanding node synchronization modes is critical for any blockchain infrastructure engineer. When you’re asked to set up a node and make it “fully sync,” you need to understand which sync mode to use and how it works.


When you start a new node, it needs to download and verify the entire blockchain history. This process is called synchronization.

┌─────────────────────────────────────────────────────────────────────────────┐
│ BLOCKCHAIN SYNCHRONIZATION │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ New Node Starts │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ SYNCHRONIZATION PHASES │ │
│ │ │ │
│ │ 1. Connect to Network │ │
│ │ - Discover peers via bootnodes │ │
│ │ - Establish P2P connections │ │
│ │ │ │
│ │ 2. Download Headers │ │
│ │ - Block headers (lightweight verification) │ │
│ │ - Verify chain structure │ │
│ │ │ │
│ │ 3. Download Bodies │ │
│ │ - Full block data (transactions) │ │
│ │ │ │
│ │ 4. Verify State │ │
│ │ - Execute transactions │ │
│ │ - Build state database │ │
│ │ │ │
│ │ 5. Reach Head │ │
│ │ - Synced with network │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ ETHEREUM SYNC MODES │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ FULL SYNC │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ - Downloads and verifies EVERY block │ │ │
│ │ │ - Executes all transactions │ │ │
│ │ │ - Most secure (full verification) │ │ │
│ │ │ - Slowest initial sync (1-2 weeks) │ │ │
│ │ │ - Storage: ~1.2 TB │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ SNAP SYNC (DEFAULT - RECOMMENDED) │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ - Downloads latest state snapshot │ │ │
│ │ │ - Builds historical data from there │ │ │
│ │ │ - Fastest sync (hours instead of weeks) │ │ │
│ │ │ - Same end result as full sync │ │ │
│ │ │ - Storage: ~1.2 TB │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ LIGHT CLIENT │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ - Only downloads block headers │ │ │
│ │ │ - Verifies chain PoW/PoS │ │ │
│ │ │ - Fastest sync (minutes) │ │ │
│ │ │ - Limited: Cannot query historical state │ │ │
│ │ │ - Storage: ~1 GB │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ FULL SYNC PROCESS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: Connect to Network │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Node → Bootnode → Get Peer List → Connect to Peers │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 2: Download Headers (Genesis → Current) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Block 0 → Block 1 → Block 2 → ... → Block N │ │
│ │ (Verify proof-of-work/validators per header) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 3: Download Block Bodies │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ For each block: │ │
│ │ - Get transactions │ │
│ │ - Get uncle hashes │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 4: Execute Transactions │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ For each transaction: │ │
│ │ - Validate signature │ │
│ │ - Update state trie │ │
│ │ - Verify state root │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 5: Build State Database │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Final state: accounts, balances, contract storage │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Time: Days to Weeks │
│ Storage: ~1.2 TB │
│ │
└─────────────────────────────────────────────────────────────────┘
Terminal window
# Geth - Full Sync
geth --syncmode full
# Erigon - Full Sync
erigon --syncmode full
  • ✅ Maximum security required
  • ✅ Validator/authority node
  • ✅ When you don’t trust snapshot data
  • ❌ Not recommended for quick setup

Snap sync is the default and recommended mode for most use cases.

┌─────────────────────────────────────────────────────────────────┐
│ SNAP SYNC PROCESS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: Initial Connection │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Connect to network, find recent peers │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 2: Download State Snapshots │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Recent state: │ │
│ │ - Account balances │ │
│ │ - Contract code │ │
│ │ - Storage slots │ │
│ │ │ │
│ │ Downloaded from multiple peers in parallel! │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 3: Download Recent Blocks │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Download blocks from snapshot state to chain head │ │
│ │ - Execute transactions │ │
│ │ - Verify state changes │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 4: Continue Normal Sync │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Once caught up, continues like full node: │ │
│ │ - Validates new blocks normally │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Time: Hours (vs Weeks for full) │
│ Result: Identical to full sync │
│ │
└─────────────────────────────────────────────────────────────────┘
Terminal window
# Geth - Snap Sync (default)
geth --syncmode snap
# Or just don't specify (snap is default in recent versions)
geth
# Erigon - Snap Sync
erigon --syncmode snap
┌─────────────────────────────────────────────────────────────────────────────┐
│ SNAP SYNC VISUALIZATION │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Current Head: Block #19,000,000 │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ SNAPSHOT STATE (Block #18,950,000) │ │
│ │ - Complete account state │ │
│ │ - Complete contract storage │ │
│ │ - Downloaded in chunks from multiple peers │ │
│ └────────────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ CATCH-UP PHASE │ │
│ │ Block #18,950,000 → Block #18,960,000 → ... → Block #19,000,000 │ │
│ │ Execute all transactions, verify state │ │
│ └────────────────────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ SYNCD! NOW AT HEAD │ │
│ │ Normal block validation begins │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

Light clients only download block headers and verify chain validity.

Terminal window
# Geth - Light Client
geth --syncmode light
# Erigon - Light
erigon --syncmode light
FeatureFull NodeLight Client
Query balances
Query contract state⚠️ (needs proof)
Send transactions
Historical data
Verify specific tx⚠️ (needs help)
Storage~1.2 TB~1 GB

Terminal window
# Attach to Geth
geth attach http://localhost:8545
# Check sync status
eth.syncing
{
currentBlock: 18500000, // Block we're currently processing
highestBlock: 18501234, // Network's current head
knownStates: 50000000, // Total states known
pulledStates: 45000000, // States downloaded
startingBlock: 18000000 // Where we started
}
false
Terminal window
# Check if syncing
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
# Check current block
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

12.7 Making Your Node Fully Sync - Step by Step

Section titled “12.7 Making Your Node Fully Sync - Step by Step”
┌─────────────────────────────────────────────────────────────────────────────┐
│ HOW TO MAKE NODE FULLY SYNC │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ STEP 1: Choose Your Client │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ For most cases: │ │
│ │ - Geth (most popular, well-tested) │ │
│ │ - Erigon (faster, less memory) │ │
│ │ - Nethermind (good for archive queries) │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ STEP 2: Choose Sync Mode │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Recommended: SNAP SYNC (--syncmode snap) │ │
│ │ - Fastest: Hours instead of weeks │ │
│ │ - Result: Identical to full sync │ │
│ │ - Safe: Verified by execution │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ STEP 3: Start the Node │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ geth --syncmode snap --http --http.api eth,net,web3 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ STEP 4: Monitor Progress │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ # Check every few minutes │ │
│ │ curl -X POST http://localhost:8545 \ │ │
│ │ -H "Content-Type: application/json" \ │ │
│ │ -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' │
│ │ │ │
│ │ When it returns "false" → Your node is synced! │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ STEP 5: Verify Synced Status │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ # Compare your block with network │ │
│ │ eth.blockNumber (your node) │ │
│ │ should equal network block height │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ ⏱️ Expected Time: 2-4 hours for snap sync │
│ 💾 Expected Storage: ~1.2 TB │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Terminal window
# OPTION 1: Quickest - Snap Sync (RECOMMENDED)
geth --syncmode snap --http
# OPTION 2: Full Verification - Full Sync (slower)
geth --syncmode full --http
# OPTION 3: Quick Check - Light Sync (limited)
geth --syncmode light --http

ProblemCauseSolution
Stuck at 0Wrong network/discoveryCheck bootnodes, network
Very slowLow resources/peer countIncrease peers, check CPU
Stuck at headerDatabase issueRemove datadir, restart
Peers keep droppingNetwork/firewallCheck port 30303
Terminal window
# Check peer count
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}'
# Check network version
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}'
# Check chain ID (should be 1 for mainnet)
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
Terminal window
# Stop the node
systemctl stop geth
# Remove chaindata (NOT the keystore!)
rm -rf /data/ethereum/geth/chaindata
# Restart
systemctl start geth

QuestionAnswer
What sync mode is fastest?Snap sync (hours vs weeks)
What sync mode is most secure?Full sync (verifies everything)
How to check if node is synced?eth.syncing returns false
Difference between snap and full?Snap downloads state snapshot; full verifies every block

  • Snap Sync: Recommended for most use cases (hours)
  • Full Sync: Maximum security (days to weeks)
  • Light Sync: Quick checks only (minutes)
  • To make node fully sync: Run with --syncmode snap and wait
  • Check sync status with eth.syncing - returns false when synced

In Chapter 13: Cosmos Ecosystem Overview, we’ll explore Cosmos and Tendermint-based chains.


Last Updated: 2026-02-20