#!/usr/bin/env bash ### ### arching-kaos-tools ### Tools to interact and build an Arching Kaos Infochain ### Copyright (C) 2021 - 2025 kaotisk ### ### This program is free software: you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation, either version 3 of the License, or ### (at your option) any later version. ### ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with this program. If not, see . ### source $AK_LIBDIR/_ak_sblock AK_SCHAINSDIR=$AK_WORKDIR/schains GENESIS="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" _ak_schain_latest_cached(){ if [ ! -f $AK_WORKDIR/schain.latest ] then _ak_schain_get_latest > $AK_WORKDIR/schain.latest fi cat $AK_WORKDIR/schain.latest } _ak_schain_tidy(){ SLATEST=$(_ak_schain_get_latest | jq -r '.latest_block') if [ ! -d $AK_SCHAINSDIR ] then mkdir $AK_SCHAINSDIR fi } _ak_schain_block_latest_block_hash(){ _ak_schain_get_latest | jq -r '.latest_block' } _ak_schain_crawl(){ if [ ! -z $1 ] && [ -n "$1" ] then CUR_TARGET="$1" else _ak_log_warning "No next target found. So long for $1" exit 1 fi if [ $counter -eq 0 ] then echo '[' counter=$(($counter + 1)) else _ak_log_info "Counter: $counter, LIMIT_ENABLED: $LIMIT_ENABLED, LIMIT: $LIMIT" if [ "$LIMIT_ENABLED" == "yes" ] then if [ $counter -eq $LIMIT ] then echo ']' exit 0 fi fi echo ',' counter=$(($counter + 1)) fi if [ "$1" == "$GENESIS" ] then echo '{"genesis":"genesis"}' | jq echo ']' _ak_log_warning "Looks like genesis. Exiting with 0" exit 0 fi if [ ! -f "$AK_MINEDBLOCKSDIR/$CUR_TARGET" ] then _ak_log_warning "Could not find $CUR_TARGET" else ( echo -n '{"sblock":"'$1'",' && _ak_sblock_show $CUR_TARGET | sed -e 's/^{//g') | jq NEXT_TARGET="$(_ak_sblock_show $CUR_TARGET | jq -r '.previous')" _ak_log_info "Found previous: $NEXT_TARGET" _ak_schain_crawl "$NEXT_TARGET" fi } _ak_schain_crawl_interface(){ LIMIT_ENABLED="no" LIMIT=0 counter=0 if [ -z $1 ] || [ ! -n "$1" ] then _ak_schain_crawl `_ak_schain_block_latest_block_hash` else while [ "$#" ]; do case "$1" in -l) LIMIT_ENABLED="yes" LIMIT=$2 shift 2 ;; *) _ak_schain_crawl "$1" ;; esac done fi } _ak_schain_count_schain(){ echo -n $1 | grep -e '[0-9a-f]\{128\}' > /dev/null if [ $? -ne 0 ] then _ak_log_error "Not a SHA512 hash" exit 1 fi echo -n $1 | grep -e '0\{128\}' > /dev/null if [ $? -ne 0 ] then _ak_log_info "Genesis block found!" fi if [ ! -z $2 ] && [ -n "$2" ] then printf '%s' "$(echo $(( $(cat $tempcounters/$2) + 1 )))" > $tempcounters/$2 fi _ak_log_info "Accessing file: $1" NEXT_TARGET="$(cat "$AK_MINEDBLOCKSDIR/$1" | jq -r '.previous')" if [ -n "$NEXT_TARGET" ] then _ak_log_info "Found previous: $NEXT_TARGET" if [ ! -f "$AK_MINEDBLOCKSDIR/$NEXT_TARGET" ] then _ak_log_warning "Could not find $NEXT_TARGET" else _ak_schain_count_schain "$NEXT_TARGET" "$2" fi else _ak_log_warning "No next target found. So long for $1" fi } _ak_sblock_get_latest_from_haystack_of_sblocks(){ templistblock="$(_ak_make_temp_file)" tempcounters="$(_ak_make_temp_directory)" max="$(_ak_make_temp_file)" max_holder="$(_ak_make_temp_file)" echo -n 0 > $max echo -n "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" > $max_holder find $AK_MINEDBLOCKSDIR -maxdepth 1 -type f | while read line do basename "${line}" >> $templistblock done if [ "$(cat $templistblock | wc -l)" -eq 0 ] then _ak_log_error "No sblocks found" max_holder="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" printf '{"latest_block":"%s"}' "$max_holder" | tee $AK_WORKDIR/schain.latest exit fi cat $templistblock | while read line do if [ "$(echo $line | tr -d '\n' | wc -c)" -eq 128 ] then filename="$(basename $line)" _ak_log_info "Investigating $filename..." printf '1' > $tempcounters/$filename _ak_schain_count_schain "$filename" "$filename" else _ak_log_warning "Nothing to do with $filename" fi done rm $templistblock find $tempcounters -type f | while read line do _ak_log_debug "Current MAX $(cat $max) on $(cat $max_holder)" _ak_log_debug "Current $(cat $line) blocks on $(basename $line)" linesum="$(cat $line)" if [ $linesum -gt $(cat $max) ] then cat $line > $max basename $line > $max_holder _ak_log_info "New MAX $(cat $max) on $(cat $max_holder)" fi done printf '{"latest_block":"%s"}' "$(cat $max_holder)" | tee $AK_WORKDIR/schain.latest } _ak_schain_get_latest(){ _ak_sblock_get_latest_from_haystack_of_sblocks }