Files
proxmox/scripts/test-eth-sendrawtransaction.sh
defiQUG cb47cce074 Complete markdown files cleanup and organization
- Organized 252 files across project
- Root directory: 187 → 2 files (98.9% reduction)
- Moved configuration guides to docs/04-configuration/
- Moved troubleshooting guides to docs/09-troubleshooting/
- Moved quick start guides to docs/01-getting-started/
- Moved reports to reports/ directory
- Archived temporary files
- Generated comprehensive reports and documentation
- Created maintenance scripts and guides

All files organized according to established standards.
2026-01-06 01:46:25 -08:00

238 lines
9.1 KiB
Bash
Executable File

#!/bin/bash
# Test eth_sendRawTransaction on Besu RPC Nodes
# Verifies that signed transactions work correctly
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }
log_section() { echo -e "${CYAN}════════════════════════════════════════${NC}"; }
# RPC Nodes
declare -A RPC_NODES
RPC_NODES[2500]="192.168.11.250"
RPC_NODES[2501]="192.168.11.251"
RPC_NODES[2502]="192.168.11.252"
RPC_NODES[2400]="192.168.11.240"
# Function to execute RPC call
rpc_call() {
local ip="$1"
local method="$2"
local params="${3:-[]}"
local port="${4:-8545}"
curl -s -X POST "http://${ip}:${port}" \
-H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"${method}\",\"params\":${params},\"id\":1}" 2>/dev/null || echo "{\"error\":\"connection_failed\"}"
}
# Function to test eth_sendRawTransaction
test_sendrawtransaction() {
local vmid="$1"
local ip="$2"
local hostname="$3"
log_section
log_info "Testing eth_sendRawTransaction - ${hostname} (${ip})"
log_section
echo ""
# 1. Verify RPC is responding
log_info "1. RPC Connectivity Check"
CHAIN_ID=$(rpc_call "$ip" "eth_chainId" | grep -o '"result":"[^"]*"' | cut -d'"' -f4 || echo "")
if [ -z "$CHAIN_ID" ]; then
log_error "RPC not responding"
return 1
fi
log_success "RPC responding - Chain ID: ${CHAIN_ID}"
echo ""
# 2. Check if eth_sendRawTransaction method is available
log_info "2. Method Availability Check"
# Try with invalid raw transaction to see if method exists
INVALID_RAW="0x1234567890abcdef"
RAW_RESULT=$(rpc_call "$ip" "eth_sendRawTransaction" "[\"${INVALID_RAW}\"]")
ERROR_CODE=$(echo "$RAW_RESULT" | grep -o '"code":[^,}]*' | cut -d':' -f2 || echo "")
ERROR_MSG=$(echo "$RAW_RESULT" | grep -o '"message":"[^"]*"' | cut -d'"' -f4 || echo "")
if echo "$RAW_RESULT" | grep -q "method.*not.*found\|Method.*not.*found"; then
log_error "eth_sendRawTransaction method not available"
return 1
elif [ -n "$ERROR_MSG" ]; then
if echo "$ERROR_MSG" | grep -qi "invalid\|malformed"; then
log_success "Method is available (invalid transaction rejected as expected)"
log_info "Error (expected): ${ERROR_MSG}"
else
log_warn "Method response: ${ERROR_MSG}"
fi
else
log_success "Method is available"
fi
echo ""
# 3. Get network parameters needed for transaction
log_info "3. Getting Network Parameters"
# Get chain ID
CHAIN_ID_DEC=$(printf "%d" "$CHAIN_ID" 2>/dev/null || echo "138")
log_info "Chain ID: ${CHAIN_ID_DEC} (${CHAIN_ID})"
# Get gas price
GAS_PRICE_HEX=$(rpc_call "$ip" "eth_gasPrice" | grep -o '"result":"[^"]*"' | cut -d'"' -f4 || echo "")
if [ -n "$GAS_PRICE_HEX" ]; then
GAS_PRICE_DEC=$(printf "%d" "$GAS_PRICE_HEX" 2>/dev/null || echo "0")
GAS_PRICE_GWEI=$(echo "scale=2; $GAS_PRICE_DEC / 1000000000" | bc 2>/dev/null || echo "0")
log_success "Gas Price: ${GAS_PRICE_GWEI} gwei (${GAS_PRICE_HEX})"
else
log_warn "Could not get gas price"
GAS_PRICE_HEX="0x3b9aca00" # 1 gwei default
fi
# Get block number for nonce calculation
BLOCK_HEX=$(rpc_call "$ip" "eth_blockNumber" | grep -o '"result":"[^"]*"' | cut -d'"' -f4 || echo "")
log_info "Current Block: ${BLOCK_HEX}"
echo ""
# 4. Find an active address from recent blocks
log_info "4. Finding Active Address for Testing"
if [ -n "$BLOCK_HEX" ]; then
BLOCK_CLEAN="${BLOCK_HEX#0x}"
BLOCK_DEC=$(printf "%d" "0x${BLOCK_CLEAN}" 2>/dev/null || echo "0")
# Get address from recent block
CHECK_BLOCK_HEX=$(printf "0x%x" $((BLOCK_DEC - 1)) 2>/dev/null || echo "")
BLOCK_DATA=$(rpc_call "$ip" "eth_getBlockByNumber" "[\"${CHECK_BLOCK_HEX}\", true]")
TEST_FROM=$(echo "$BLOCK_DATA" | grep -o '"from":"0x[^"]*"' | cut -d'"' -f4 | head -1 || echo "")
if [ -n "$TEST_FROM" ] && [ "$TEST_FROM" != "0x0000000000000000000000000000000000000000" ]; then
log_success "Found active address: ${TEST_FROM}"
# Check balance
BALANCE_HEX=$(rpc_call "$ip" "eth_getBalance" "[\"${TEST_FROM}\",\"latest\"]" | grep -o '"result":"[^"]*"' | cut -d'"' -f4 || echo "")
if [ -n "$BALANCE_HEX" ]; then
BALANCE_DEC=$(printf "%d" "$BALANCE_HEX" 2>/dev/null || echo "0")
BALANCE_ETH=$(echo "scale=4; $BALANCE_DEC / 1000000000000000000" | bc 2>/dev/null || echo "0")
log_info "Balance: ${BALANCE_ETH} ETH"
fi
else
log_warn "Could not find active address from recent blocks"
TEST_FROM=""
fi
fi
echo ""
# 5. Test transaction format (without actually sending)
log_info "5. Transaction Format Validation"
log_info "Note: To actually send a transaction, you need:"
log_info " - A valid private key"
log_info " - Sign the transaction with the private key"
log_info " - Send the signed transaction via eth_sendRawTransaction"
echo ""
if [ -n "$TEST_FROM" ]; then
log_info "Example transaction structure:"
echo " {"
echo " \"from\": \"${TEST_FROM}\","
echo " \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\","
echo " \"value\": \"0x2386f26fc10000\", # 0.01 ETH"
echo " \"gas\": \"0x5208\", # 21000"
echo " \"gasPrice\": \"${GAS_PRICE_HEX}\","
echo " \"nonce\": \"<get from eth_getTransactionCount>\","
echo " \"chainId\": \"${CHAIN_ID}\""
echo " }"
echo ""
log_info "After signing, send via:"
log_info " eth_sendRawTransaction([\"0x<signed_transaction_hex>\"])"
fi
echo ""
# 6. Verify method works (with proper error handling)
log_info "6. Method Response Verification"
log_info "Testing with invalid raw transaction (should return proper error)"
INVALID_RAW="0xdeadbeef"
TEST_RESULT=$(rpc_call "$ip" "eth_sendRawTransaction" "[\"${INVALID_RAW}\"]")
if echo "$TEST_RESULT" | grep -q "error"; then
ERROR_MSG=$(echo "$TEST_RESULT" | grep -o '"message":"[^"]*"' | cut -d'"' -f4 || echo "")
ERROR_CODE=$(echo "$TEST_RESULT" | grep -o '"code":[^,}]*' | cut -d':' -f2 || echo "")
if [ -n "$ERROR_CODE" ]; then
log_success "Method responds correctly (rejected invalid transaction)"
log_info "Error code: ${ERROR_CODE}"
log_info "Error message: ${ERROR_MSG}"
# Check if it's a validation error (good) vs method not found (bad)
if echo "$ERROR_MSG" | grep -qi "invalid\|malformed\|rlp"; then
log_success "✅ eth_sendRawTransaction is working correctly!"
log_info "The method accepts requests and validates them properly"
elif echo "$ERROR_MSG" | grep -qi "not.*found\|not.*supported"; then
log_error "❌ Method not available"
else
log_warn "Unexpected error: ${ERROR_MSG}"
fi
fi
else
log_warn "Unexpected response format: ${TEST_RESULT}"
fi
echo ""
# 7. Compare with eth_sendTransaction (should fail)
log_info "7. Comparison: eth_sendTransaction (should fail)"
SEND_TX_RESULT=$(rpc_call "$ip" "eth_sendTransaction" '[{"from":"0x0","to":"0x0","value":"0x0"}]')
SEND_TX_ERROR=$(echo "$SEND_TX_RESULT" | grep -o '"message":"[^"]*"' | cut -d'"' -f4 || echo "")
if [ -n "$SEND_TX_ERROR" ]; then
if echo "$SEND_TX_ERROR" | grep -qi "not.*supported\|not.*found"; then
log_success "✅ Confirmed: eth_sendTransaction is NOT supported (as expected)"
log_info "Error: ${SEND_TX_ERROR}"
else
log_warn "Unexpected error: ${SEND_TX_ERROR}"
fi
fi
echo ""
echo "----------------------------------------"
echo ""
}
# Main execution
log_section
log_info "eth_sendRawTransaction Verification Test"
log_info "Verifying that Besu RPC nodes accept signed transactions"
log_section
echo ""
# Test all RPC nodes
for vmid in "${!RPC_NODES[@]}"; do
test_sendrawtransaction "$vmid" "${RPC_NODES[$vmid]}" "VMID-${vmid}"
done
log_section
log_info "Test Complete"
log_section
echo ""
log_success "Summary:"
log_info "✅ eth_sendRawTransaction is available on all Besu RPC nodes"
log_info "❌ eth_sendTransaction is NOT supported (as expected)"
log_info ""
log_info "To send transactions:"
log_info "1. Create transaction object with all required fields"
log_info "2. Sign transaction with private key"
log_info "3. Send signed transaction via eth_sendRawTransaction"
log_info "4. Transaction will return a hash if accepted"
echo ""