🛒 Marketplace Testing Enhancement:
• Add complete marketplace workflow test with 6-step scenario
• Test GPU bidding from aitbc server to marketplace
• Test bid confirmation and job creation by aitbc1
• Test Ollama AI task submission and execution monitoring
• Test blockchain payment processing and transaction mining
• Add balance verification for both parties after payment
• Add marketplace status
187 lines
5.3 KiB
Bash
Executable File
187 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# AITBC Bulk Sync Script
|
|
# Detects large sync differences and performs bulk synchronization
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
GENESIS_NODE="10.1.223.40"
|
|
GENESIS_PORT="8006"
|
|
LOCAL_PORT="8006"
|
|
MAX_SYNC_DIFF=100 # Trigger bulk sync if difference > 100 blocks
|
|
BULK_BATCH_SIZE=500 # Process 500 blocks at a time
|
|
|
|
echo "=== 🔄 AITBC BULK SYNC DETECTOR ==="
|
|
echo "Timestamp: $(date)"
|
|
echo ""
|
|
|
|
# Colors for output
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Function to get blockchain height
|
|
get_height() {
|
|
local url=$1
|
|
curl -s "$url/rpc/head" | jq -r .height 2>/dev/null || echo "0"
|
|
}
|
|
|
|
# Function to import a block
|
|
import_block() {
|
|
local block_data=$1
|
|
curl -s -X POST "http://localhost:$LOCAL_PORT/rpc/importBlock" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$block_data" | jq -r .accepted 2>/dev/null || echo "false"
|
|
}
|
|
|
|
# Function to get blocks range
|
|
get_blocks_range() {
|
|
local start=$1
|
|
local end=$2
|
|
curl -s "http://$GENESIS_NODE:$GENESIS_PORT/rpc/blocks-range?start=$start&end=$end" | jq -r '.blocks[]' 2>/dev/null
|
|
}
|
|
|
|
echo "1. 🔍 DETECTING SYNC DIFFERENCE"
|
|
echo "=============================="
|
|
|
|
# Get current heights
|
|
local_height=$(get_height "http://localhost:$LOCAL_PORT")
|
|
genesis_height=$(get_height "http://$GENESIS_NODE:$GENESIS_PORT")
|
|
|
|
echo "Local height: $local_height"
|
|
echo "Genesis height: $genesis_height"
|
|
|
|
# Calculate difference
|
|
if [ "$local_height" -eq 0 ] || [ "$genesis_height" -eq 0 ]; then
|
|
echo -e "${RED}❌ ERROR: Cannot get blockchain heights${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
diff=$((genesis_height - local_height))
|
|
echo "Sync difference: $diff blocks"
|
|
|
|
# Determine if bulk sync is needed
|
|
if [ "$diff" -le $MAX_SYNC_DIFF ]; then
|
|
echo -e "${GREEN}✅ Sync difference is within normal range ($diff <= $MAX_SYNC_DIFF)${NC}"
|
|
echo "Normal sync should handle this difference."
|
|
exit 0
|
|
fi
|
|
|
|
echo -e "${YELLOW}⚠️ LARGE SYNC DIFFERENCE DETECTED${NC}"
|
|
echo "Difference ($diff) exceeds threshold ($MAX_SYNC_DIFF)"
|
|
echo "Initiating bulk sync..."
|
|
|
|
echo ""
|
|
echo "2. 🔄 INITIATING BULK SYNC"
|
|
echo "=========================="
|
|
|
|
# Calculate sync range
|
|
start_height=$((local_height + 1))
|
|
end_height=$genesis_height
|
|
|
|
echo "Sync range: $start_height to $end_height"
|
|
echo "Batch size: $BULK_BATCH_SIZE blocks"
|
|
|
|
# Process in batches
|
|
current_start=$start_height
|
|
total_imported=0
|
|
total_failed=0
|
|
|
|
while [ "$current_start" -le "$end_height" ]; do
|
|
current_end=$((current_start + BULK_BATCH_SIZE - 1))
|
|
if [ "$current_end" -gt "$end_height" ]; then
|
|
current_end=$end_height
|
|
fi
|
|
|
|
echo ""
|
|
echo "Processing batch: $current_start to $current_end"
|
|
|
|
# Get blocks from genesis node
|
|
blocks_json=$(curl -s "http://$GENESIS_NODE:$GENESIS_PORT/rpc/blocks-range?start=$current_start&end=$current_end")
|
|
|
|
if [ $? -ne 0 ] || [ -z "$blocks_json" ]; then
|
|
echo -e "${RED}❌ Failed to get blocks range${NC}"
|
|
break
|
|
fi
|
|
|
|
# Process each block in the batch
|
|
batch_imported=0
|
|
batch_failed=0
|
|
|
|
# Extract blocks and import them
|
|
echo "$blocks_json" | jq -c '.blocks[]' 2>/dev/null | while read -r block; do
|
|
if [ -n "$block" ] && [ "$block" != "null" ]; then
|
|
# Extract block data for import
|
|
block_height=$(echo "$block" | jq -r .height)
|
|
block_hash=$(echo "$block" | jq -r .hash)
|
|
parent_hash=$(echo "$block" | jq -r .parent_hash)
|
|
proposer=$(echo "$block" | jq -r .proposer)
|
|
timestamp=$(echo "$block" | jq -r .timestamp)
|
|
tx_count=$(echo "$block" | jq -r .tx_count)
|
|
|
|
# Create import request
|
|
import_request=$(cat << EOF
|
|
{
|
|
"height": $block_height,
|
|
"hash": "$block_hash",
|
|
"parent_hash": "$parent_hash",
|
|
"proposer": "$proposer",
|
|
"timestamp": "$timestamp",
|
|
"tx_count": $tx_count
|
|
}
|
|
EOF
|
|
)
|
|
|
|
# Import block
|
|
result=$(import_block "$import_request")
|
|
|
|
if [ "$result" = "true" ]; then
|
|
echo -e " ${GREEN}✅${NC} Imported block $block_height"
|
|
((batch_imported++))
|
|
else
|
|
echo -e " ${RED}❌${NC} Failed to import block $block_height"
|
|
((batch_failed++))
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Update counters
|
|
total_imported=$((total_imported + batch_imported))
|
|
total_failed=$((total_failed + batch_failed))
|
|
|
|
echo "Batch complete: $batch_imported imported, $batch_failed failed"
|
|
|
|
# Move to next batch
|
|
current_start=$((current_end + 1))
|
|
|
|
# Brief pause to avoid overwhelming the system
|
|
sleep 1
|
|
done
|
|
|
|
echo ""
|
|
echo "3. 📊 SYNC RESULTS"
|
|
echo "================"
|
|
|
|
# Final verification
|
|
final_local_height=$(get_height "http://localhost:$LOCAL_PORT")
|
|
final_diff=$((genesis_height - final_local_height))
|
|
|
|
echo "Initial difference: $diff blocks"
|
|
echo "Final difference: $final_diff blocks"
|
|
echo "Blocks imported: $total_imported"
|
|
echo "Blocks failed: $total_failed"
|
|
|
|
# Determine success
|
|
if [ "$final_diff" -le $MAX_SYNC_DIFF ]; then
|
|
echo -e "${GREEN}✅ BULK SYNC SUCCESSFUL${NC}"
|
|
echo "Sync difference is now within normal range."
|
|
else
|
|
echo -e "${YELLOW}⚠️ PARTIAL SYNC${NC}"
|
|
echo "Some blocks may still need to sync normally."
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== 🔄 BULK SYNC COMPLETE ==="
|