Spaces:
Running
Running
| # ============================================================================ | |
| # MorphGuard - Ethereum Node Setup Script | |
| # ============================================================================ | |
| # This script installs and configures a local Ethereum node (Geth) for | |
| # blockchain-based evidence logging. It uses Sepolia Testnet by default. | |
| # | |
| # Usage: | |
| # ./scripts/setup_ethereum_node.sh [--mainnet|--sepolia|--local] | |
| # | |
| # Options: | |
| # --sepolia Connect to Ethereum Sepolia Testnet (default, free) | |
| # --mainnet Connect to Ethereum Mainnet (requires ETH for gas) | |
| # --local Start a local development chain (Ganache) | |
| # | |
| # Prerequisites: | |
| # - Ubuntu/Debian-based system | |
| # - sudo access | |
| # - ~50GB disk space for Sepolia, ~500GB for Mainnet | |
| # ============================================================================ | |
| set -e | |
| # Colors | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| BLUE='\033[0;34m' | |
| NC='\033[0m' # No Color | |
| NETWORK="${1:-sepolia}" | |
| GETH_DATA_DIR="${MORPHGUARD_GETH_DATA_DIR:-$HOME/.ethereum}" | |
| MORPHGUARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" | |
| echo -e "${BLUE}" | |
| echo "╔══════════════════════════════════════════════════════════════════╗" | |
| echo "║ MorphGuard - Ethereum Node Setup ║" | |
| echo "║ Immutable Evidence Logging Infrastructure ║" | |
| echo "╚══════════════════════════════════════════════════════════════════╝" | |
| echo -e "${NC}" | |
| # ============================================================================ | |
| # Helper Functions | |
| # ============================================================================ | |
| log_info() { | |
| echo -e "${GREEN}[INFO]${NC} $1" | |
| } | |
| log_warn() { | |
| echo -e "${YELLOW}[WARN]${NC} $1" | |
| } | |
| log_error() { | |
| echo -e "${RED}[ERROR]${NC} $1" | |
| } | |
| check_disk_space() { | |
| local required_gb=$1 | |
| local available_gb=$(df -BG "$HOME" | awk 'NR==2 {print $4}' | tr -d 'G') | |
| if [ "$available_gb" -lt "$required_gb" ]; then | |
| log_error "Insufficient disk space. Need ${required_gb}GB, have ${available_gb}GB." | |
| exit 1 | |
| fi | |
| log_info "Disk space check passed (${available_gb}GB available)" | |
| } | |
| # ============================================================================ | |
| # Install Geth (Go Ethereum) | |
| # ============================================================================ | |
| install_geth() { | |
| if command -v geth &> /dev/null; then | |
| local version=$(geth version | head -n1) | |
| log_info "Geth already installed: $version" | |
| return 0 | |
| fi | |
| log_info "Installing Geth (Go Ethereum Client)..." | |
| # Add Ethereum PPA | |
| sudo add-apt-repository -y ppa:ethereum/ethereum | |
| sudo apt-get update | |
| # Install Geth | |
| sudo apt-get install -y ethereum | |
| if command -v geth &> /dev/null; then | |
| log_info "Geth installed successfully: $(geth version | head -n1)" | |
| else | |
| log_error "Geth installation failed." | |
| exit 1 | |
| fi | |
| } | |
| # ============================================================================ | |
| # Install Ganache (Local Development Chain) | |
| # ============================================================================ | |
| install_ganache() { | |
| if command -v ganache &> /dev/null; then | |
| log_info "Ganache already installed." | |
| return 0 | |
| fi | |
| log_info "Installing Ganache (Local Development Blockchain)..." | |
| # Check for npm | |
| if ! command -v npm &> /dev/null; then | |
| log_warn "npm not found. Installing Node.js..." | |
| curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - | |
| sudo apt-get install -y nodejs | |
| fi | |
| # Install Ganache globally | |
| sudo npm install -g ganache | |
| if command -v ganache &> /dev/null; then | |
| log_info "Ganache installed successfully." | |
| else | |
| log_error "Ganache installation failed." | |
| exit 1 | |
| fi | |
| } | |
| # ============================================================================ | |
| # Generate Wallet (if needed) | |
| # ============================================================================ | |
| generate_wallet() { | |
| local keystore_dir="$GETH_DATA_DIR/keystore" | |
| if [ -d "$keystore_dir" ] && [ "$(ls -A $keystore_dir 2>/dev/null)" ]; then | |
| log_info "Existing wallet found in $keystore_dir" | |
| return 0 | |
| fi | |
| log_info "Generating new Ethereum wallet..." | |
| # Create a new account with a random password | |
| local password=$(openssl rand -base64 32) | |
| echo "$password" > "$MORPHGUARD_DIR/.eth_wallet_password" | |
| chmod 600 "$MORPHGUARD_DIR/.eth_wallet_password" | |
| mkdir -p "$keystore_dir" | |
| geth account new --datadir "$GETH_DATA_DIR" --password "$MORPHGUARD_DIR/.eth_wallet_password" | |
| # Extract wallet address | |
| local wallet_file=$(ls "$keystore_dir" | head -n1) | |
| local wallet_address="0x$(echo "$wallet_file" | grep -oP '(?<=--)[a-fA-F0-9]{40}')" | |
| log_info "Wallet generated: $wallet_address" | |
| echo "$wallet_address" > "$MORPHGUARD_DIR/.eth_wallet_address" | |
| log_warn "IMPORTANT: Fund this wallet with Sepolia ETH from a faucet:" | |
| echo " https://sepoliafaucet.com/" | |
| echo " https://faucet.sepolia.dev/" | |
| } | |
| # ============================================================================ | |
| # Configure Environment | |
| # ============================================================================ | |
| configure_env() { | |
| local endpoint=$1 | |
| local network=$2 | |
| log_info "Configuring MorphGuard environment for $network..." | |
| local env_file="$MORPHGUARD_DIR/.env" | |
| # Read wallet address | |
| local wallet_address="" | |
| if [ -f "$MORPHGUARD_DIR/.eth_wallet_address" ]; then | |
| wallet_address=$(cat "$MORPHGUARD_DIR/.eth_wallet_address") | |
| fi | |
| # Append or update blockchain settings | |
| if [ -f "$env_file" ]; then | |
| # Remove old blockchain settings | |
| sed -i '/^BLOCKCHAIN_/d' "$env_file" | |
| sed -i '/^MORPHGUARD_ETH_/d' "$env_file" | |
| fi | |
| cat >> "$env_file" << EOF | |
| # ============================================================================ | |
| # Blockchain Configuration (Auto-generated by setup_ethereum_node.sh) | |
| # ============================================================================ | |
| BLOCKCHAIN_ENABLED=true | |
| BLOCKCHAIN_NETWORK=$network | |
| BLOCKCHAIN_ENDPOINT=$endpoint | |
| MORPHGUARD_ETH_WALLET_ADDRESS=$wallet_address | |
| MORPHGUARD_ETH_KEYSTORE_DIR=$GETH_DATA_DIR/keystore | |
| EOF | |
| log_info "Environment configured in $env_file" | |
| } | |
| # ============================================================================ | |
| # Create Systemd Service (for production) | |
| # ============================================================================ | |
| create_systemd_service() { | |
| local network=$1 | |
| log_info "Creating systemd service for Geth..." | |
| sudo tee /etc/systemd/system/morphguard-geth.service > /dev/null << EOF | |
| [Unit] | |
| Description=MorphGuard Ethereum Node (Geth) | |
| After=network.target | |
| [Service] | |
| Type=simple | |
| User=$USER | |
| ExecStart=/usr/bin/geth --$network --http --http.addr 0.0.0.0 --http.port 8545 --http.api eth,net,web3,personal --http.corsdomain "*" --datadir $GETH_DATA_DIR --syncmode snap | |
| Restart=always | |
| RestartSec=10 | |
| [Install] | |
| WantedBy=multi-user.target | |
| EOF | |
| sudo systemctl daemon-reload | |
| log_info "Systemd service created: morphguard-geth.service" | |
| } | |
| # ============================================================================ | |
| # Main Setup Logic | |
| # ============================================================================ | |
| case "$NETWORK" in | |
| --sepolia|sepolia) | |
| log_info "Setting up Ethereum Sepolia Testnet..." | |
| check_disk_space 50 | |
| install_geth | |
| generate_wallet | |
| create_systemd_service "sepolia" | |
| configure_env "http://localhost:8545" "ethereum-sepolia" | |
| echo "" | |
| echo -e "${GREEN}Setup Complete!${NC}" | |
| echo "" | |
| echo "To start the Ethereum node:" | |
| echo " sudo systemctl start morphguard-geth" | |
| echo " sudo systemctl enable morphguard-geth # Auto-start on boot" | |
| echo "" | |
| echo "To check sync status:" | |
| echo " geth attach http://localhost:8545 --exec 'eth.syncing'" | |
| echo "" | |
| log_warn "Initial sync may take 2-6 hours depending on network speed." | |
| ;; | |
| --mainnet|mainnet) | |
| log_info "Setting up Ethereum Mainnet..." | |
| log_warn "Mainnet requires real ETH for gas fees!" | |
| check_disk_space 500 | |
| install_geth | |
| generate_wallet | |
| create_systemd_service "mainnet" | |
| configure_env "http://localhost:8545" "ethereum-mainnet" | |
| echo "" | |
| echo -e "${GREEN}Setup Complete!${NC}" | |
| echo "" | |
| log_warn "Mainnet sync can take 1-3 days and requires 500GB+ storage." | |
| ;; | |
| --local|local) | |
| log_info "Setting up Local Development Chain (Ganache)..." | |
| install_ganache | |
| # Start Ganache in background | |
| log_info "Starting Ganache..." | |
| ganache --detach --port 8545 --mnemonic "morphguard test mnemonic do not use in production" > /dev/null 2>&1 & | |
| # Use pre-funded test account from Ganache | |
| local test_wallet="0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1" | |
| echo "$test_wallet" > "$MORPHGUARD_DIR/.eth_wallet_address" | |
| configure_env "http://localhost:8545" "local-ganache" | |
| echo "" | |
| echo -e "${GREEN}Setup Complete!${NC}" | |
| echo "" | |
| echo "Ganache is running on http://localhost:8545" | |
| echo "Test accounts are pre-funded with 1000 ETH each." | |
| echo "" | |
| echo "To restart Ganache:" | |
| echo " ganache --port 8545" | |
| ;; | |
| *) | |
| echo "Usage: $0 [--sepolia|--mainnet|--local]" | |
| echo "" | |
| echo "Options:" | |
| echo " --sepolia Ethereum Sepolia Testnet (default, free)" | |
| echo " --mainnet Ethereum Mainnet (requires ETH)" | |
| echo " --local Local Ganache development chain" | |
| exit 1 | |
| ;; | |
| esac | |
| echo "" | |
| echo -e "${BLUE}Next Steps:${NC}" | |
| echo "1. Start MorphGuard: ./start_morphguard.sh" | |
| echo "2. Enable blockchain logging in Admin Panel > Forensic Evidence" | |
| echo "3. Check connection status in the UI" | |
| echo "" | |