#!/bin/bash # Usage: CHAIN_DATA_URL=https://gist.githubusercontent.com/samcm/e2da294dab77e93ad0ee0e815580294f/raw/da79a6bd82f6d07e8caca11beb27bdab8b29a7d3/holesky-lighthouse-erigon.json BEACON_NODE_URL=http://localhost:5052 ./check.sh # Default CHAIN_DATA_URL if not provided CHAIN_DATA_URL=${CHAIN_DATA_URL:-"https://gist.githubusercontent.com/samcm/e2da294dab77e93ad0ee0e815580294f/raw/da79a6bd82f6d07e8caca11beb27bdab8b29a7d3/holesky-lighthouse-erigon.json"} # Default BEACON_NODE_URL if not provided BEACON_NODE_URL=${BEACON_NODE_URL:-"http://localhost:5052"} echo "CHAIN_DATA_URL: $CHAIN_DATA_URL" echo "BEACON_NODE_URL: $BEACON_NODE_URL" # Download chain data CHAIN_DATA=$(curl -s "$CHAIN_DATA_URL") if [ $? -ne 0 ]; then echo "❌ Failed to download chain data from $CHAIN_DATA_URL" exit 1 fi # Get highest slot from chain data HIGHEST_SLOT=$(echo "$CHAIN_DATA" | jq -r 'keys | map(tonumber) | max') if [ -z "$HIGHEST_SLOT" ] || [ "$HIGHEST_SLOT" = "null" ]; then echo "❌ No slots found in chain data" exit 1 fi # Calculate highest epoch HIGHEST_EPOCH=$((HIGHEST_SLOT / 32)) echo "🔍 Checking slots starting from $HIGHEST_SLOT (epoch $HIGHEST_EPOCH)..." # Get all slots in descending order SLOTS=$(echo "$CHAIN_DATA" | jq -r 'keys | map(tonumber) | sort | reverse | .[]') # Track if we found a match FOUND_MATCH=false # Track if we found a fork FOUND_FORK=false # Track the fork point FORK_SLOT="" FORK_EPOCH="" FORK_EXPECTED_ROOT="" FORK_NODE_ROOT="" for SLOT in $SLOTS; do # Calculate epoch for this slot CURRENT_EPOCH=$((SLOT / 32)) # Get expected root for this slot EXPECTED_ROOT=$(echo "$CHAIN_DATA" | jq -r --arg SLOT "$SLOT" '.[$SLOT]') # Try to get the block at this slot from the beacon node NODE_DATA=$(curl -s "$BEACON_NODE_URL/eth/v1/beacon/headers/$SLOT") STATUS=$? # Check if request was successful if [ $STATUS -eq 0 ] && [ "$(echo "$NODE_DATA" | jq 'has("data")')" = "true" ]; then # Extract root from node NODE_ROOT=$(echo "$NODE_DATA" | jq -r '.data.root') # Compare roots if [ "$NODE_ROOT" = "$EXPECTED_ROOT" ]; then echo "✅ Matching root at slot $SLOT (epoch $CURRENT_EPOCH): $NODE_ROOT" FOUND_MATCH=true # If we previously found a fork, this is where the chains converge again if [ "$FOUND_FORK" = true ]; then echo "🔀 Chains converge at slot $SLOT (epoch $CURRENT_EPOCH)" break else # If we haven't found a fork and found a match, we're on the right chain break fi else # We found a fork if [ "$FOUND_FORK" = false ]; then # This is the first fork point we found FOUND_FORK=true FORK_SLOT=$SLOT FORK_EPOCH=$CURRENT_EPOCH FORK_EXPECTED_ROOT=$EXPECTED_ROOT FORK_NODE_ROOT=$NODE_ROOT echo "❌ Fork detected at slot $SLOT (epoch $CURRENT_EPOCH)!" echo " Expected root: $EXPECTED_ROOT" echo " Node's root: $NODE_ROOT" echo "🔍 Continuing to search for fork point..." fi fi else echo "⏭️ Slot $SLOT (epoch $CURRENT_EPOCH) not found on node, trying earlier slot..." fi done # Final status report if [ "$FOUND_MATCH" = true ]; then if [ "$FOUND_FORK" = true ]; then echo "🔀 Node is on a different fork that diverged at slot $FORK_SLOT (epoch $FORK_EPOCH)" echo " Expected root: $FORK_EXPECTED_ROOT" echo " Node's root: $FORK_NODE_ROOT" exit 1 else echo "✅ Node is on the correct fork" exit 0 fi elif [ "$FOUND_FORK" = true ]; then echo "❌ Node is on a different fork, and no common ancestor was found" echo " Fork detected at slot $FORK_SLOT (epoch $FORK_EPOCH)" exit 1 else echo "❌ None of the slots in chain data were found on the node" exit 1 fi