diff options
Diffstat (limited to 'bin/ak-get-balances')
-rwxr-xr-x | bin/ak-get-balances | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/bin/ak-get-balances b/bin/ak-get-balances new file mode 100755 index 0000000..f02ed54 --- /dev/null +++ b/bin/ak-get-balances @@ -0,0 +1,270 @@ +#!/bin/bash +## +## Calculates the balances of the sblocks found from a chain +## Saves stuff too for later reference +## +## The program is not accepting sblocks that hold invalid zchains +## The zchains are the ones that can be crawled back from a zblock that is found +## in the sblock. +## +fullprogrampath="$(realpath $0)" +PROGRAM="$(basename $0)" +descriptionString="Export balances from schain and zchains" +source $AK_LIBDIR/_ak_log +source $AK_LIBDIR/_ak_script +source $AK_LIBDIR/_ak_ipfs +source $AK_LIBDIR/_ak_gpg +source $AK_LIBDIR/_ak_zchain +source $AK_LIBDIR/_ak_schain +source $AK_LIBDIR/_ak_sblock +#set -xe +AK_DB="$AK_WORKDIR/db" + +# coin max is 10,000.0000000 +# but we count in integer to avoid floating point arithmetic :P +# +# Note that this is subject to change when implemented in C +# +COINBASE=100000000000 + +GENESIS="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + +AK_BALANCESDIR="$AK_WORKDIR/balances" +if [ ! -d $AK_BALANCESDIR ] +then + mkdir $AK_BALANCESDIR + if [ $? -ne 0 ] + then + _ak_log_error "Could not create $AK_BALANCESDIR" + exit 1 + fi +fi + +AK_INVALIDATED_SBLOCKS="$AK_WORKDIR/invalid_sblocks" +if [ ! -d $AK_INVALIDATED_SBLOCKS ] +then + mkdir -p $AK_INVALIDATED_SBLOCKS + if [ $? -ne 0 ] + then + _ak_log_error "Could not create $AK_INVALIDATED_SBLOCKS" + exit 1 + fi +fi + +if [ ! -f $AK_WORKDIR/schain.latest ] +then + _ak_schain_latest_cached + LATEST="$(cat $AK_WORKDIR/schain.latest | jq -r '.latest_block')" + #echo -n $LATEST > $AK_WORKDIR/schain.latest +else + LATEST="$(cat $AK_WORKDIR/schain.latest | jq -r '.latest_block')" +fi + +TEMP="$(_ak_make_temp_directory)" +cd $TEMP + +_ak_get_zblocks_from_sblock(){ + if [ "$(_ak_sblock_show $1 | jq 'has("zblocks")')" == "true" ] + then + mkdir $1 && cd $1 + _ak_sblock_show $1 | jq -r '.zblocks[]' | while read zblock + do + touch $zblock.untested + done + cd .. + fi +} + +_ak_verify_zblocks_found(){ + if [ -d $1 ] + then + cd $1 + find . -type f | while read found_filename + do + filename="$(basename $found_filename)" + zblock="$(echo -n $filename | cut -d '.' -f 1)" + zblock_status="$(echo -n $filename | cut -d '.' -f 2)" + if [ "$zblock_status" == "untested" ] && [ ! -f $AK_DB/zblocks-tested/$zblock.success ] && [ ! -f $AK_DB/zblocks-tested/$zblock.failed ] + then + _ak_zchain_crawl $zblock > /dev/null 2>&1 + if [ $? -ne 0 ] + then + cp $filename $AK_DB/zblocks-tested/$zblock.failed + mv $filename $zblock.failed + else + cp $filename $AK_DB/zblocks-tested/$zblock.success + mv $filename $zblock.success + fi + elif [ -f $AK_DB/zblocks-tested/$zblock.success ] + then + mv $filename $zblock.success + elif [ -f $AK_DB/zblocks-tested/$zblock.failed ] + then + mv $filename $zblock.failed + fi + done + cd .. + fi +} + +_ak_balances_from_sblock(){ + if [ -z $1 ] || [ ! -n "$1" ] + then + _ak_log_error "No sblock provided $1" + exit 1 + fi + CUR_TARGET="$1" + _ak_log_info "Extracting balances from sblock provided $CUR_TARGET" + if [ ! -f $AK_MINEDBLOCKSDIR/$CUR_TARGET ] + then + _ak_log_error "Sblock not found $CUR_TARGET" + fi + _ak_log_info "Checking zblocks in sblock $CUR_TARGET" + _ak_get_zblocks_from_sblock $CUR_TARGET + _ak_log_info "Verifying zblocks in sblock $CUR_TARGET" + _ak_verify_zblocks_found $CUR_TARGET + _ak_log_debug "Looking for failed ones" + if [ -d $CUR_TARGET ] + then + find $CUR_TARGET -type f | grep failed + if [ $? -ne 0 ] + then + _ak_rewards_from_sblock $CUR_TARGET + else + _ak_log_warning "$CUR_TARGET is invalid" + fi + fi + #sleep 3 + _ak_sblock_show $CUR_TARGET | jq +} + +_ak_rewards_from_sblock(){ + CUR_TARGET="$1" + GPG="$(_ak_sblock_show $CUR_TARGET | jq -r '.output')" + if [ "$GPG" == "null" ] + then + GPG="$(_ak_sblock_show $CUR_TARGET | jq -r '.miner')" + fi + AMOUNT="$(_ak_sblock_show $CUR_TARGET | jq -r '.amount')" + if [ "$AMOUNT" == "null" ] + then + AMOUNT="$(_ak_sblock_show $CUR_TARGET | jq -r '.reward')" + fi + TIMESTAMP="$(_ak_sblock_show $CUR_TARGET | jq -r '.timestamp')" + _ak_log_info "Found [$CUR_TARGET]($TIMESTAMP) $AMOUNT to $GPG" + if [ -f "$AK_BALANCESDIR/$(_ak_gpg_key_get_fingerprint_from_ipfs $GPG)" ] + then + grep "$TIMESTAMP:$CUR_TARGET:$AMOUNT" $AK_BALANCESDIR/$(_ak_gpg_key_get_fingerprint_from_ipfs $GPG) > /dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "$TIMESTAMP:$CUR_TARGET:$AMOUNT" >> $AK_BALANCESDIR/$(_ak_gpg_key_get_fingerprint_from_ipfs $GPG) + _ak_log_info "Added [$CUR_TARGET]($TIMESTAMP) $AMOUNT to $GPG" + fi + else + echo "$TIMESTAMP:$CUR_TARGET:$AMOUNT" >> $AK_BALANCESDIR/$(_ak_gpg_key_get_fingerprint_from_ipfs $GPG) + _ak_log_info "Added [$CUR_TARGET]($TIMESTAMP) $AMOUNT to $GPG" + fi +} + +_ak_sblock_get_previous(){ + if [ -z $1 ] || [ ! -n "$1" ] + then + _ak_log_error "No sblock provided !!" + exit 1 + fi + CUR_TARGET="$1" + if [ ! -f $AK_MINEDBLOCKSDIR/$CUR_TARGET ] + then + _ak_log_error "Sblock not found" + exit 1 + fi + PREVIOUS="$(_ak_sblock_show $CUR_TARGET | jq -r '.previous')" + echo -n $PREVIOUS +} + +_ak_balances_calculate(){ + if [ ! -z $1 ] && [ -n "$1" ] + then + _ak_log_info "Calculating balance for $1" + CUR_TARGET="$1" + if [ ! -f $AK_BALANCESDIR/$CUR_TARGET ] + then + _ak_log_warning "Address not found" + echo -n '0' > $AK_BALANCESDIR/$CUR_TARGET.total + else + total=0 + # Zero cause we are now starting counting from the begging + echo -n '0' > $AK_BALANCESDIR/$CUR_TARGET.total + cat $AK_BALANCESDIR/$CUR_TARGET | cut -d ':' -f 3 | while read value + do + _ak_log_info "Found value $value for $CUR_TARGET" + total=$(($total + $value)) + _ak_log_info "New total $total for $CUR_TARGET" + echo -n $total > $AK_BALANCESDIR/$CUR_TARGET.total + done + fi + else + _ak_log_info "Calculating balances" + find $AK_BALANCESDIR -type f | grep -v 'total' | while read account + do + _ak_balances_calculate "$(basename $account)" + done + fi +} + +_ak_balances_print(){ + if [ ! -z $1 ] && [ -n "$1" ] + then + CUR_TARGET="$1" + if [ ! -f $AK_BALANCESDIR/$CUR_TARGET.total ] + then + _ak_log_error "Account not found" + exit 1 + fi + printf '%s:%s\n' "$CUR_TARGET" "$(cat $AK_BALANCESDIR/$CUR_TARGET.total)" + else + find $AK_BALANCESDIR -type f | grep total | while read CUR_TARGET + do + printf '%s:%s\n' "$(basename $CUR_TARGET | cut -d'.' -f1)" "$(cat $CUR_TARGET)" + done + fi +} + +_ak_schain_counting_balances(){ + if [ ! -z $1 ] && [ -n "$1" ] + then + CUR_TARGET="$1" + else + _ak_log_error "No next target found. So long for $1" + exit 1 + fi + _ak_log_info "Looking at $CUR_TARGET" + counter=$(($counter + 1)) + if [ "$1" == "$GENESIS" ] + then + _ak_balances_calculate + _ak_balances_print + _ak_log_warning "Looks like genesis. Exiting with 0" + exit 0 + fi + if [ ! -f $AK_MINEDBLOCKSDIR/$CUR_TARGET ] + then + _ak_log_error "Could not find $CUR_TARGET" + exit 1 + else + _ak_balances_from_sblock $CUR_TARGET + NEXT_TARGET="$(_ak_sblock_get_previous $CUR_TARGET)" + # mv $AK_MINEDBLOCKSDIR/$CUR_TARGET $AK_INVALIDATED_SBLOCKS/$CUR_TARGET + _ak_log_info "Found previous: $NEXT_TARGET" + _ak_schain_counting_balances "$NEXT_TARGET" + fi +} + +if [ ! -z $1 ] && [ -n "$1" ] +then + _ak_usage +else + CUR_TARGET="$LATEST" + _ak_log_info "$CUR_TARGET $LATEST" + _ak_schain_counting_balances $CUR_TARGET +fi |