| 1 | #!/bin/bash |
| 2 | |
| 3 | # Date: 2020-03-08T03:48Z; baltakatei> |
| 4 | |
| 5 | # Description: Log bitcoin block stats to file every minute for one |
| 6 | # hour. Also adds stats to PRNG. |
| 7 | |
| 8 | # Usage: bkbtclog [path] |
| 9 | |
| 10 | # [path]: Path to write log file. |
| 11 | |
| 12 | # Dependencies: jq |
| 13 | |
| 14 | # Modify PATH to include some non-standard executable directories. |
| 15 | PATH="/usr/local/bin/:$PATH" # for bitcoind and bitcoin-cli |
| 16 | PATH="/usr/bin/:$PATH" # for jq |
| 17 | |
| 18 | # Exit if jq is unavailable or bitcoin-cli getblockcount not available. |
| 19 | if ! ( ( command -v jq 1>/dev/null 2>&1 ) && ( bitcoin-cli getblockcount 1>/dev/null 2>&1 ) ) ; then echo "ERROR:Commands jq or bitcoin-cli not available." 1>&2; exit 1; fi |
| 20 | |
| 21 | # Set script time-to-live to 1 hour in seconds. See https://stackoverflow.com/a/11198713 . |
| 22 | SCRIPT_TTL=3600 |
| 23 | SECONDS_END=$(( SECONDS + SCRIPT_TTL )) |
| 24 | |
| 25 | # Set output log file path |
| 26 | LOG_PATH="$1" |
| 27 | LOG_DIR=$(dirname "$LOG_PATH" ) |
| 28 | |
| 29 | # Exit if LOG_DIR doesn't exist. |
| 30 | if [ ! -d "$LOG_DIR" ]; then echo "ERROR:Specified log directory doesn't exist." 1>&2; |
| 31 | echo "LOG_DIR is:""$LOG_DIR" 1>&2; exit 1; fi |
| 32 | |
| 33 | # Loop until script age exceeds SCRIPT_END. |
| 34 | while [ $SECONDS -lt $SECONDS_END ]; do |
| 35 | # Create log file and first line header if file at LOG_PATH doesn't exist. |
| 36 | if [ ! -f "$LOG_PATH" ]; then |
| 37 | echo "TIME","BTC_BESTBLOCKCOUNT","BTC_BESTBLOCKTIME","BTC_BESTBLOCKHASH","BTC_MEDIANFEE","BTC_TOTALOUTPUT","BTC_TXTOTALSIZE","BTC_TXCOUNT","BTC_TXIN","BTC_TXOUT","BTC_MAXTXFEERATE","BTC_MINTXFEERATE","BITCOINCORE_VERSION" >> "$LOG_PATH"; |
| 38 | fi |
| 39 | TIME="$(date +%Y%m%dT%H%M%S%z)" |
| 40 | BITCOINCORE_VERSION="$(bitcoin-cli -version)" |
| 41 | BTC_BESTBLOCKSTATS_JSON="$(bitcoin-cli getblockstats "$(bitcoin-cli getblockcount)" '["height","time","blockhash","medianfee","total_out","total_size","txs","ins","outs","maxfeerate","minfeerate"]')" |
| 42 | BTC_BESTBLOCKCOUNT=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .height' ) |
| 43 | BTC_BESTBLOCKTIME_UNIX=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .time' ) |
| 44 | BTC_BESTBLOCKTIME=$(date --date=@"$BTC_BESTBLOCKTIME_UNIX" +%Y%m%dT%H%M%S%z ) |
| 45 | BTC_BESTBLOCKHASH=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .blockhash' | tr -dc "[:xdigit:]" ) |
| 46 | BTC_MEDIANFEE=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .medianfee' ) |
| 47 | BTC_TOTALOUTPUT=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .total_out' ) |
| 48 | BTC_TXTOTALSIZE=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .total_size' ) |
| 49 | BTC_TXCOUNT=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .txs' ) |
| 50 | BTC_TXIN=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .ins' ) |
| 51 | BTC_TXOUT=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .outs' ) |
| 52 | BTC_MAXTXFEERATE=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .maxfeerate' ) |
| 53 | BTC_MINTXFEERATE=$(echo "$BTC_BESTBLOCKSTATS_JSON" | jq '. | .minfeerate' ) |
| 54 | OUTPUT=$(echo "$TIME","$BTC_BESTBLOCKCOUNT","$BTC_BESTBLOCKTIME","$BTC_BESTBLOCKHASH","$BTC_MEDIANFEE","$BTC_TOTALOUTPUT","$BTC_TXTOTALSIZE","$BTC_TXCOUNT","$BTC_TXIN","$BTC_TXOUT","$BTC_MAXTXFEERATE","$BTC_MINTXFEERATE","$BITCOINCORE_VERSION") |
| 55 | echo "$OUTPUT" >> "$LOG_PATH"; |
| 56 | echo "$OUTPUT" >> /dev/random; |
| 57 | sleep 60 |
| 58 | done |
| 59 | exit 0 |