Skip to content

Instantly share code, notes, and snippets.

@jprupp
Last active June 11, 2020 10:24
Show Gist options
  • Save jprupp/dda42d824d846fda349b9ca564e9b3a1 to your computer and use it in GitHub Desktop.
Save jprupp/dda42d824d846fda349b9ca564e9b3a1 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
NET='bch'
if [[ -n $1 ]]
then
NET="$1"
fi
COUNT=1
if [[ $2 -gt 0 ]]
then
COUNT=$2
fi
OFFSET=0
if [[ $3 -gt 0 ]]
then
OFFSET=$3
fi
DEPTH=20
if [[ $4 -gt 0 ]]
then
DEPTH=$4
fi
case "$NET" in
'btc' | 'bch' | 'btctest' | 'bchtest')
BASE="https://api.haskoin.com/$NET"
;;
'bchreg' | 'btcreg')
BASE='http://localhost:3000'
;;
*)
echo "Could not find network: $NET" >&2
exit 1
;;
esac
CURLOPTS="-sf"
best()
{
curl $CURLOPTS "$BASE/block/best" | jq -r .hash
}
block-at-height()
{
local HEIGHT="$1"
curl $CURLOPTS "$BASE/block/height/$HEIGHT" | jq -r '.[0].hash'
}
height()
{
local HASH="$1"
curl $CURLOPTS "$BASE/block/$HASH" | jq -r .height
}
prev()
{
local HASH="$1"
curl $CURLOPTS "$BASE/block/$HASH" | jq -r .previous
}
txs()
{
local HASH="$1"
curl $CURLOPTS "$BASE/transactions/block/$HASH"
}
ins()
{
jq -r '.[] | .inputs[]'
}
outs()
{
jq -r '.[] | .outputs[]'
}
addrs()
{
jq -r 'select(.address != null) | .address'
}
mempool()
{
curl $CURLOPTS "$BASE/mempool?limit=0" |
jq -r '.[]' |
while read TXHASH
do
curl $CURLOPTS "$BASE/transaction/$TXHASH"
done |
jq -s
}
tx()
{
local TX="$1"
curl $CURLOPTS "$BASE/transaction/$TX"
}
block-addrs()
{
{
local HASH="$1"
local TXS="$(txs "$HASH")"
echo "$TXS" | ins | addrs
echo "$TXS" | outs | addrs
} | sort | uniq
}
mem-addrs()
{
{
local TXS="$(mempool)"
echo "$TXS" | ins | addrs
echo "$TXS" | outs | addrs
} | sort | uniq
}
addr-balance()
{
local ADDR="$1"
curl $CURLOPTS "$BASE/address/$ADDR/balance?pretty=false"
}
addr-txs()
{
local ADDR="$1"
curl $CURLOPTS "$BASE/address/$ADDR/transactions?limit=10000"
}
addr-compare()
{
local ADDR="$1"
local HEIGHT=$2
local TXC=$(addr-balance "$ADDR" | jq -r .txs)
if [[ $TXC -le 10000 ]]
then
local TXS="$(addr-txs "$ADDR")"
local EARLIEST=$(jq '.[-1].block.height' <<< $TXS)
if [[ $EARLIEST != null && $HEIGHT -le $(( EARLIEST + DEPTH )) ]]
then
TXN=$(addr-txs "$ADDR" | jq length)
if [[ $TXC -ne $TXN ]]
then
echo "FAIL: $ADDR"
fi
fi
fi
}
print-progress()
{
local ADDR_COUNT=$1
local ADDR_INDEX=$2
local PERCENT=$(( (100 * ADDR_INDEX) / ADDR_COUNT ))
echo -n "[$PERCENT%]" >&2
echo -ne '\r'
}
addr-test()
{
local HEIGHT=$1
shift
local ADDRS=("$@")
for ADDR in "${ADDRS[@]}"
do
print-progress ${#ADDRS[@]} $(( ++N ))
addr-compare "$ADDR" $HEIGHT
done
}
BEST="$(best)"
HEIGHT=$(( $(height "$BEST") - OFFSET ))
BLOCK="$(block-at-height $HEIGHT)"
if [[ $OFFSET -eq 0 ]]
then
ADDRS=($(mem-addrs))
echo "MEMPOOL"
addr-test $HEIGHT "${ADDRS[@]}"
fi
for (( i = 1; i <= COUNT; i++ ))
do
HEIGHT=$(height "$BLOCK")
echo "BLOCK: $BLOCK ($HEIGHT)"
ADDRS=($(block-addrs "$BLOCK"))
N=0
addr-test $HEIGHT "${ADDRS[@]}"
BLOCK="$(prev "$BLOCK")"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment