291 lines
13 KiB
Bash
291 lines
13 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Comprehensive Network Diagnostic Script
|
||
|
|
# Checks all aspects of network permissions and contract deployment issues
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
|
||
|
|
source "$PROJECT_ROOT/.env" 2>/dev/null || source "$PROJECT_ROOT/../.env" 2>/dev/null || true
|
||
|
|
|
||
|
|
RPC_URL_CORE="${RPC_URL_138:-http://192.168.11.250:8545}"
|
||
|
|
RPC_URL_PERM="http://192.168.11.251:8545"
|
||
|
|
RPC_URL_PUBLIC="http://192.168.11.252:8545"
|
||
|
|
DEPLOYER=$(cast wallet address "$PRIVATE_KEY" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ -z "$DEPLOYER" ]; then
|
||
|
|
echo "Error: PRIVATE_KEY not set or invalid"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
|
|
echo "║ COMPREHENSIVE NETWORK DIAGNOSTIC ║"
|
||
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
|
|
echo ""
|
||
|
|
echo "Deployer: $DEPLOYER"
|
||
|
|
echo "Date: $(date)"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 1. RPC Endpoint Connectivity
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "1. RPC ENDPOINT CONNECTIVITY"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
for RPC_NAME in "CORE" "PERM" "PUBLIC"; do
|
||
|
|
eval RPC_URL=\$RPC_URL_${RPC_NAME}
|
||
|
|
echo "Testing: $RPC_NAME ($RPC_URL)"
|
||
|
|
BLOCK=$(cast block-number --rpc-url "$RPC_URL" 2>/dev/null || echo "ERROR")
|
||
|
|
CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "ERROR")
|
||
|
|
if [ "$BLOCK" != "ERROR" ] && [ "$CHAIN_ID" != "ERROR" ]; then
|
||
|
|
BALANCE=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
|
||
|
|
BALANCE_ETH=$(cast --from-wei "$BALANCE" ether 2>/dev/null || echo "0")
|
||
|
|
echo " ✅ Connected"
|
||
|
|
echo " Block: $BLOCK"
|
||
|
|
echo " ChainID: $CHAIN_ID"
|
||
|
|
echo " Deployer Balance: $BALANCE_ETH ETH"
|
||
|
|
else
|
||
|
|
echo " ❌ Failed to connect"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
done
|
||
|
|
|
||
|
|
# 2. Account Permissioning Configuration
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "2. ACCOUNT PERMISSIONING CONFIGURATION"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
CONFIG_DIRS=(
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138/config"
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138-proxmox/config"
|
||
|
|
)
|
||
|
|
|
||
|
|
PERM_ACCOUNTS_FILE=""
|
||
|
|
for dir in "${CONFIG_DIRS[@]}"; do
|
||
|
|
if [ -f "$dir/permissions-accounts.toml" ]; then
|
||
|
|
PERM_ACCOUNTS_FILE="$dir/permissions-accounts.toml"
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ -n "$PERM_ACCOUNTS_FILE" ]; then
|
||
|
|
echo "Found: $PERM_ACCOUNTS_FILE"
|
||
|
|
echo ""
|
||
|
|
if grep -q "accounts-allowlist=\[\]" "$PERM_ACCOUNTS_FILE" || ! grep -q "^accounts-allowlist=\[" "$PERM_ACCOUNTS_FILE"; then
|
||
|
|
echo "✅ Allowlist is EMPTY - All accounts are allowed"
|
||
|
|
else
|
||
|
|
if grep -qi "$DEPLOYER" "$PERM_ACCOUNTS_FILE"; then
|
||
|
|
echo "✅ Deployer is in allowlist"
|
||
|
|
else
|
||
|
|
echo "⚠️ Deployer is NOT in allowlist"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo "⚠️ permissions-accounts.toml not found"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 3. RPC Node Configuration Analysis
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "3. RPC NODE CONFIGURATION ANALYSIS"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
RPC_CONFIG_FILES=(
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138/config/config-rpc-core.toml"
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138/config/config-rpc-perm.toml"
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138/config/config-rpc-public.toml"
|
||
|
|
)
|
||
|
|
|
||
|
|
for config_file in "${RPC_CONFIG_FILES[@]}"; do
|
||
|
|
if [ -f "$config_file" ]; then
|
||
|
|
echo "File: $(basename "$config_file")"
|
||
|
|
if grep -q "permissions-accounts-config-file-enabled=true" "$config_file"; then
|
||
|
|
echo " ⚠️ Account permissioning: ENABLED"
|
||
|
|
PERM_FILE=$(grep "permissions-accounts-config-file=" "$config_file" | cut -d'"' -f2 || echo "")
|
||
|
|
if [ -n "$PERM_FILE" ]; then
|
||
|
|
echo " Config file: $PERM_FILE"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ✅ Account permissioning: DISABLED"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
# 4. Network Genesis Analysis
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "4. NETWORK GENESIS ANALYSIS"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
GENESIS_FILES=(
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138-proxmox/config/genesis.json"
|
||
|
|
"$PROJECT_ROOT/../smom-dbis-138/config/genesis.json"
|
||
|
|
)
|
||
|
|
|
||
|
|
for genesis_file in "${GENESIS_FILES[@]}"; do
|
||
|
|
if [ -f "$genesis_file" ]; then
|
||
|
|
echo "Found: $genesis_file"
|
||
|
|
CHAIN_ID=$(jq -r '.config.chainId // empty' "$genesis_file" 2>/dev/null || echo "")
|
||
|
|
GAS_LIMIT=$(jq -r '.gasLimit // empty' "$genesis_file" 2>/dev/null || echo "")
|
||
|
|
CONSENSUS=$(jq -r '.config.qbft // .config.clique // .config.ethash // "unknown"' "$genesis_file" 2>/dev/null || echo "")
|
||
|
|
echo " ChainID: $CHAIN_ID"
|
||
|
|
echo " Gas Limit: $GAS_LIMIT"
|
||
|
|
echo " Consensus: $CONSENSUS"
|
||
|
|
if [ "$CONSENSUS" != "unknown" ] && [ "$CONSENSUS" != "null" ]; then
|
||
|
|
BLOCK_PERIOD=$(jq -r '.config.qbft.blockperiodseconds // empty' "$genesis_file" 2>/dev/null || echo "")
|
||
|
|
EPOCH_LENGTH=$(jq -r '.config.qbft.epochlength // empty' "$genesis_file" 2>/dev/null || echo "")
|
||
|
|
if [ -n "$BLOCK_PERIOD" ]; then
|
||
|
|
echo " Block Period: $BLOCK_PERIOD seconds"
|
||
|
|
fi
|
||
|
|
if [ -n "$EPOCH_LENGTH" ]; then
|
||
|
|
echo " Epoch Length: $EPOCH_LENGTH blocks"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
# 5. Recent Transaction Analysis
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "5. RECENT TRANSACTION ANALYSIS"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ -n "$RPC_URL_CORE" ]; then
|
||
|
|
echo "Analyzing recent transactions from deployer..."
|
||
|
|
CURRENT_BLOCK=$(cast block-number --rpc-url "$RPC_URL_CORE" 2>/dev/null || echo "0")
|
||
|
|
SUCCESS_COUNT=0
|
||
|
|
FAIL_COUNT=0
|
||
|
|
CONTRACT_CREATION_COUNT=0
|
||
|
|
|
||
|
|
for i in $(seq 0 49); do
|
||
|
|
BLOCK_NUM=$((CURRENT_BLOCK - i))
|
||
|
|
if [ "$BLOCK_NUM" -lt 0 ]; then break; fi
|
||
|
|
|
||
|
|
BLOCK=$(cast block "$BLOCK_NUM" --rpc-url "$RPC_URL_CORE" --json 2>/dev/null || echo "")
|
||
|
|
if [ -n "$BLOCK" ]; then
|
||
|
|
TXS=$(echo "$BLOCK" | jq -r '.transactions[]? // empty' 2>/dev/null || echo "")
|
||
|
|
if [ -n "$TXS" ]; then
|
||
|
|
for tx in $TXS; do
|
||
|
|
if [ ${#tx} -eq 66 ]; then
|
||
|
|
TX_DATA=$(cast tx "$tx" --rpc-url "$RPC_URL_CORE" --json 2>/dev/null || echo "")
|
||
|
|
if [ -n "$TX_DATA" ]; then
|
||
|
|
FROM=$(echo "$TX_DATA" | jq -r '.from // empty' 2>/dev/null || echo "")
|
||
|
|
if [ "${FROM,,}" = "${DEPLOYER,,}" ]; then
|
||
|
|
RECEIPT=$(cast receipt "$tx" --rpc-url "$RPC_URL_CORE" --json 2>/dev/null || echo "")
|
||
|
|
if [ -n "$RECEIPT" ]; then
|
||
|
|
STATUS=$(echo "$RECEIPT" | jq -r '.status // empty' 2>/dev/null || echo "")
|
||
|
|
CONTRACT=$(echo "$RECEIPT" | jq -r '.contractAddress // empty' 2>/dev/null || echo "")
|
||
|
|
TO=$(echo "$TX_DATA" | jq -r '.to // empty' 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ "$STATUS" = "0x1" ]; then
|
||
|
|
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
|
||
|
|
else
|
||
|
|
FAIL_COUNT=$((FAIL_COUNT + 1))
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ -z "$TO" ] || [ "$TO" = "null" ]; then
|
||
|
|
CONTRACT_CREATION_COUNT=$((CONTRACT_CREATION_COUNT + 1))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
echo " Successful transactions: $SUCCESS_COUNT"
|
||
|
|
echo " Failed transactions: $FAIL_COUNT"
|
||
|
|
echo " Contract creation attempts: $CONTRACT_CREATION_COUNT"
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 6. Minimal Contract Deployment Test
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "6. MINIMAL CONTRACT DEPLOYMENT TEST"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ -n "$RPC_URL_CORE" ]; then
|
||
|
|
TEMP_DIR=$(mktemp -d)
|
||
|
|
cd "$TEMP_DIR"
|
||
|
|
forge init --no-git --force . > /dev/null 2>&1
|
||
|
|
cat > src/TestMinimal.sol << 'EOF'
|
||
|
|
// SPDX-License-Identifier: MIT
|
||
|
|
pragma solidity ^0.8.19;
|
||
|
|
contract TestMinimal { uint256 public x = 1; }
|
||
|
|
EOF
|
||
|
|
forge build > /dev/null 2>&1
|
||
|
|
|
||
|
|
echo "Deploying minimal contract (204 bytes) on Core RPC..."
|
||
|
|
DEPLOY_OUTPUT=$(forge create src/TestMinimal.sol:TestMinimal \
|
||
|
|
--rpc-url "$RPC_URL_CORE" \
|
||
|
|
--private-key "$PRIVATE_KEY" \
|
||
|
|
--gas-price 20000000000 \
|
||
|
|
--gas-limit 2000000 \
|
||
|
|
--legacy \
|
||
|
|
--broadcast 2>&1) || true
|
||
|
|
|
||
|
|
TX_HASH=$(echo "$DEPLOY_OUTPUT" | grep -oE "0x[0-9a-f]{64}" | head -1 || echo "")
|
||
|
|
if [ -n "$TX_HASH" ]; then
|
||
|
|
echo " Transaction: $TX_HASH"
|
||
|
|
echo " Waiting for confirmation..."
|
||
|
|
sleep 10
|
||
|
|
RECEIPT=$(cast receipt "$TX_HASH" --rpc-url "$RPC_URL_CORE" --json 2>/dev/null || echo "")
|
||
|
|
if [ -n "$RECEIPT" ]; then
|
||
|
|
STATUS=$(echo "$RECEIPT" | jq -r '.status // empty' 2>/dev/null || echo "")
|
||
|
|
CONTRACT=$(echo "$RECEIPT" | jq -r '.contractAddress // empty' 2>/dev/null || echo "")
|
||
|
|
GAS_USED=$(echo "$RECEIPT" | jq -r '.gasUsed // empty' 2>/dev/null || echo "")
|
||
|
|
if [ "$STATUS" = "0x1" ]; then
|
||
|
|
echo " ✅ SUCCESS - Contract: $CONTRACT"
|
||
|
|
CODE=$(cast code "$CONTRACT" --rpc-url "$RPC_URL_CORE" 2>/dev/null || echo "")
|
||
|
|
if [ -n "$CODE" ] && [ "$CODE" != "0x" ] && [ ${#CODE} -gt 100 ]; then
|
||
|
|
echo " ✅ Contract verified on-chain"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ❌ FAILED - Status: $STATUS"
|
||
|
|
echo " Gas Used: $GAS_USED"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ⏳ Transaction not yet mined"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ❌ Deployment failed - No transaction hash"
|
||
|
|
fi
|
||
|
|
|
||
|
|
cd "$PROJECT_ROOT"
|
||
|
|
rm -rf "$TEMP_DIR"
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 7. Summary and Recommendations
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "7. SUMMARY AND RECOMMENDATIONS"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "Key Findings:"
|
||
|
|
echo " 1. Core RPC (192.168.11.250): Account permissioning DISABLED"
|
||
|
|
echo " 2. Permissioned RPC (192.168.11.251): Account permissioning ENABLED"
|
||
|
|
echo " 3. Public RPC (192.168.11.252): Account permissioning DISABLED"
|
||
|
|
echo " 4. permissions-accounts.toml: EMPTY (all accounts allowed)"
|
||
|
|
echo ""
|
||
|
|
echo "Recommendations:"
|
||
|
|
echo " 1. Verify RPC node configuration matches expected settings"
|
||
|
|
echo " 2. Check Besu logs for deployment errors"
|
||
|
|
echo " 3. Verify network allows contract creation"
|
||
|
|
echo " 4. Contact network administrators if issue persists"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "Diagnostic Complete"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
|