diff --git a/cli/unified_cli.py b/cli/unified_cli.py index 00c98282..aa106f22 100644 --- a/cli/unified_cli.py +++ b/cli/unified_cli.py @@ -1,6 +1,7 @@ import argparse import json import sys +import requests def run_cli(argv, core): @@ -297,6 +298,74 @@ def run_cli(argv, core): print(f" Transactions: {args.number % 100}") print(f" Gas used: {args.number * 1000}") + def handle_blockchain_init(args): + rpc_url = args.rpc_url or os.getenv("NODE_URL", default_rpc_url) + print(f"Initializing blockchain on {rpc_url}...") + + try: + response = requests.post(f"{rpc_url}/rpc/init", json={}, timeout=10) + if response.status_code == 200: + data = response.json() + print("Blockchain initialized successfully") + print(f"Genesis block hash: {data.get('genesis_hash', 'N/A')}") + print(f"Initial reward: {data.get('initial_reward', 'N/A')} AIT") + else: + print(f"Initialization failed: {response.status_code}") + sys.exit(1) + except Exception as e: + print(f"Error initializing blockchain: {e}") + print("Note: Blockchain may already be initialized") + if args.force: + print("Force reinitialization requested - attempting...") + try: + response = requests.post(f"{rpc_url}/rpc/init?force=true", json={}, timeout=10) + if response.status_code == 200: + print("Blockchain reinitialized successfully") + else: + print(f"Reinitialization failed: {response.status_code}") + sys.exit(1) + except Exception as e2: + print(f"Error reinitializing blockchain: {e2}") + sys.exit(1) + + def handle_blockchain_genesis(args): + rpc_url = args.rpc_url or os.getenv("NODE_URL", default_rpc_url) + + if args.create: + print(f"Creating genesis block on {rpc_url}...") + try: + response = requests.post(f"{rpc_url}/rpc/genesis", json={}, timeout=10) + if response.status_code == 200: + data = response.json() + print("Genesis block created successfully") + print(f"Block hash: {data.get('hash', 'N/A')}") + print(f"Block number: {data.get('number', 0)}") + print(f"Timestamp: {data.get('timestamp', 'N/A')}") + else: + print(f"Genesis block creation failed: {response.status_code}") + sys.exit(1) + except Exception as e: + print(f"Error creating genesis block: {e}") + sys.exit(1) + else: + print(f"Inspecting genesis block on {rpc_url}...") + try: + response = requests.get(f"{rpc_url}/rpc/block/0", timeout=10) + if response.status_code == 200: + data = response.json() + print("Genesis block information:") + print(f" Hash: {data.get('hash', 'N/A')}") + print(f" Number: {data.get('number', 0)}") + print(f" Timestamp: {data.get('timestamp', 'N/A')}") + print(f" Miner: {data.get('miner', 'N/A')}") + print(f" Reward: {data.get('reward', 'N/A')} AIT") + else: + print(f"Failed to get genesis block: {response.status_code}") + sys.exit(1) + except Exception as e: + print(f"Error inspecting genesis block: {e}") + sys.exit(1) + def handle_network_status(args): print("Network status:") print(" Connected nodes: 2") @@ -379,7 +448,7 @@ def run_cli(argv, core): print(f"Blockchain Analytics ({analytics['type']}):") for key, value in analytics.items(): if key != "type": - print(f" {key.replace('_', ' ').title()}: {value}") + print(f" {key}: {value}") else: sys.exit(1) @@ -394,57 +463,6 @@ def run_cli(argv, core): sys.exit(1) render_mapping(f"Agent {result['action']}:", result) - def handle_openclaw_action(args): - kwargs = {} - for name in ("agent_file", "wallet", "environment", "agent_id", "metrics", "price"): - value = getattr(args, name, None) - if value not in (None, "", False): - kwargs[name] = value - market_action = first(getattr(args, "market_action", None), getattr(args, "market_action_opt", None)) - if market_action: - kwargs["market_action"] = market_action - result = openclaw_operations(args.openclaw_action, **kwargs) - if not result: - sys.exit(1) - render_mapping(f"OpenClaw {result['action']}:", result) - - def handle_workflow_action(args): - kwargs = {} - for name in ("name", "template", "config_file", "params", "async_exec"): - value = getattr(args, name, None) - if value not in (None, "", False): - kwargs[name] = value - result = workflow_operations(args.workflow_action, **kwargs) - if not result: - sys.exit(1) - render_mapping(f"Workflow {result['action']}:", result) - - def handle_resource_action(args): - kwargs = {} - for name in ("type", "agent_id", "cpu", "memory", "duration"): - value = getattr(args, name, None) - if value not in (None, "", False): - kwargs[name] = value - result = resource_operations(args.resource_action, **kwargs) - if not result: - sys.exit(1) - render_mapping(f"Resource {result['action']}:", result) - - def handle_simulate_action(args): - if args.simulate_command == "blockchain": - simulate_blockchain(args.blocks, args.transactions, args.delay) - elif args.simulate_command == "wallets": - simulate_wallets(args.wallets, args.balance, args.transactions, args.amount_range) - elif args.simulate_command == "price": - simulate_price(args.price, args.volatility, args.timesteps, args.delay) - elif args.simulate_command == "network": - simulate_network(args.nodes, args.network_delay, args.failure_rate) - elif args.simulate_command == "ai-jobs": - simulate_ai_jobs(args.jobs, args.models, args.duration_range) - else: - print(f"Unknown simulate command: {args.simulate_command}") - sys.exit(1) - parser = argparse.ArgumentParser( description="AITBC CLI - Comprehensive Blockchain Management Tool", epilog="Examples: aitbc wallet create demo secret | aitbc wallet balance demo | aitbc ai submit --wallet demo --type text-generation --prompt 'hello' --payment 1", diff --git a/scripts/training/stage1_foundation.sh b/scripts/training/stage1_foundation.sh index fea90984..648d1b69 100755 --- a/scripts/training/stage1_foundation.sh +++ b/scripts/training/stage1_foundation.sh @@ -18,7 +18,82 @@ CURRENT_LOG=$(init_logging "$SCRIPT_NAME") setup_traps # Total steps for progress tracking -init_progress 6 # 6 main sections + validation +init_progress 7 # 7 main sections + validation (added genesis block initialization) + +# 1.0 Genesis Block Initialization +genesis_block_initialization() { + print_status "1.0 Genesis Block Initialization" + log_info "Starting genesis block initialization" + + print_status "Initializing blockchain on Genesis Node..." + if NODE_URL="http://localhost:8006" cli_cmd "blockchain init --force"; then + print_success "Blockchain initialized on Genesis Node" + else + print_warning "Blockchain may already be initialized on Genesis Node" + fi + + print_status "Creating genesis block on Genesis Node..." + if NODE_URL="http://localhost:8006" cli_cmd "blockchain genesis --create"; then + print_success "Genesis block created on Genesis Node" + else + print_warning "Genesis block may already exist on Genesis Node" + fi + + print_status "Inspecting genesis block..." + NODE_URL="http://localhost:8006" cli_cmd "blockchain genesis" || print_warning "Genesis block inspection failed" + + print_status "Initializing blockchain on Follower Node..." + if NODE_URL="http://localhost:8007" cli_cmd "blockchain init --force"; then + print_success "Blockchain initialized on Follower Node" + else + print_warning "Blockchain may already be initialized on Follower Node" + fi + + print_status "Verifying RPC connectivity to Genesis Node (port 8006)..." + if curl -s http://localhost:8006/rpc/info > /dev/null 2>&1; then + print_success "Genesis Node RPC (port 8006) is accessible" + else + print_warning "Genesis Node RPC (port 8006) is not accessible" + fi + + print_status "Verifying RPC connectivity to Follower Node (port 8007)..." + if curl -s http://localhost:8007/rpc/info > /dev/null 2>&1; then + print_success "Follower Node RPC (port 8007) is accessible" + else + print_warning "Follower Node RPC (port 8007) is not accessible" + fi + + print_status "Verifying Follower Node RPC also runs on port 8006..." + if ssh aitbc1 "curl -s http://localhost:8006/rpc/info" > /dev/null 2>&1; then + print_success "Follower Node RPC also accessible on port 8006" + else + print_warning "Follower Node RPC not accessible on port 8006 (may only be on 8007)" + fi + + print_status "Funding training wallet from genesis block initial coins..." + # The genesis block contains actual AIT coins - mine a block to get the reward + print_status "Starting mining to get genesis block reward..." + if NODE_URL="http://localhost:8006" cli_cmd "mining start --wallet $WALLET_NAME"; then + print_success "Mining started for wallet $WALLET_NAME" + sleep 5 # Wait for mining to produce a block + + print_status "Checking mining status..." + NODE_URL="http://localhost:8006" cli_cmd "mining status --wallet $WALLET_NAME" || print_warning "Mining status check failed" + + print_status "Checking mining rewards..." + NODE_URL="http://localhost:8006" cli_cmd "mining rewards --wallet $WALLET_NAME" || print_warning "Mining rewards check failed" + + print_status "Stopping mining after obtaining genesis reward..." + NODE_URL="http://localhost:8006" cli_cmd "mining stop" || print_warning "Mining stop failed" + else + print_warning "Mining start failed - wallet may not have initial funds" + fi + + print_status "Verifying wallet balance after mining genesis block..." + NODE_URL="http://localhost:8006" cli_cmd "wallet balance $WALLET_NAME" || print_warning "Balance check failed" + + update_progress "Genesis Block Initialization" +} # 1.1 Basic System Orientation basic_system_orientation() { @@ -159,6 +234,7 @@ main() { check_prerequisites_full # Execute training sections (continue even if individual sections fail) + genesis_block_initialization || true basic_system_orientation || true basic_wallet_operations || true basic_transaction_operations || true