Files
wownero/utils/block_size_average.sh
2026-01-17 02:55:36 +00:00

108 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
RPC_URL="http://127.0.0.1:34568/json_rpc"
MAX_RETRIES=3
SLEEP_BETWEEN_REQUESTS=0.1
BLOCK_RANGE_SIZE=10000
OUTPUT_FILE="average_block_sizes.txt"
# Get current blockchain height
get_current_height() {
local retry=0
while [[ $retry -lt $MAX_RETRIES ]]; do
response=$(curl -s -X POST $RPC_URL -d '{"jsonrpc":"2.0","id":"0","method":"get_block_count"}' -H 'Content-Type: application/json')
if [[ $? -eq 0 ]]; then
height=$(echo "$response" | jq -r '.result.count')
if [[ -n "$height" && "$height" != "null" ]]; then
echo $((height - 1)) # Return 0-based height
return 0
fi
fi
((retry++))
sleep $SLEEP_BETWEEN_REQUESTS
done
echo "Error: Failed to get blockchain height after $MAX_RETRIES attempts" >&2
exit 1
}
# Get block sizes for a range
get_block_sizes() {
local start=$1
local end=$2
local retry=0
while [[ $retry -lt $MAX_RETRIES ]]; do
response=$(curl -s -X POST $RPC_URL -d "{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_block_headers_range\",\"params\":{\"start_height\":$start,\"end_height\":$end}}" -H 'Content-Type: application/json')
if [[ $? -eq 0 ]]; then
sizes=$(echo "$response" | jq -r '.result.headers[].block_size')
if [[ -n "$sizes" ]]; then
echo "$sizes"
return 0
fi
fi
((retry++))
sleep $SLEEP_BETWEEN_REQUESTS
done
echo "Error: Failed to get blocks $start-$end after $MAX_RETRIES attempts" >&2
return 1
}
main() {
current_height=$(get_current_height)
echo "Current blockchain height: $current_height"
ranges=$((current_height / BLOCK_RANGE_SIZE))
echo "Processing $ranges ranges of $BLOCK_RANGE_SIZE blocks each..."
echo -n "[" > "$OUTPUT_FILE"
first_range=true
for ((i=0; i<=ranges; i++)); do
start=$((i * BLOCK_RANGE_SIZE))
end=$((start + BLOCK_RANGE_SIZE - 1))
# Cap the end at current height
if [[ $end -gt $current_height ]]; then
end=$current_height
fi
# Status update every 1000 blocks within the range
for ((j=start; j<=end; j+=1000)); do
checkpoint=$((j + 1000 - 1))
if [[ $checkpoint -gt $end ]]; then
checkpoint=$end
fi
echo "Processing blocks $j to $checkpoint ..."
done
sizes=$(get_block_sizes $start $end)
if [[ $? -ne 0 ]]; then
continue
fi
# Calculate average
count=0
sum=0
for size in $sizes; do
sum=$((sum + size))
((count++))
done
if [[ $count -gt 0 ]]; then
average=$((sum / count))
if [[ "$first_range" = false ]]; then
echo -n ", " >> "$OUTPUT_FILE"
fi
echo -n "$average" >> "$OUTPUT_FILE"
first_range=false
fi
sleep $SLEEP_BETWEEN_REQUESTS
done
echo "]" >> "$OUTPUT_FILE"
echo "Done! Averages saved to $OUTPUT_FILE"
}
main