#!/bin/bash source $AK_LIBDIR/_ak_log source $AK_LIBDIR/_ak_script source $AK_LIBDIR/_ak_gpg _ak_zblock_show(){ # _ak_zblock_show # ak-zblock [IPFS CID] # # Returns a JSON array representing the chain retrieved. # Logs messages to $LOGSFILE. verify=1 if [ ! -z "$1" ] && [ "$1" == "-h" ] || [ "$1" == "--help" ] then usage exit elif [ ! -z "$1" ] then echo $1 | grep -e 'Qm.\{44\}' >/dev/null if [ $? -ne 0 ] then logit "ERROR" "Argument provided ($1) was not an IPFS CIDv0 string" exit 1 fi entrance="$1" else entrance="$(cat $AK_ZLATEST)" fi ak-enter -l 1 "$entrance" > "$AK_CACHEDIR/fzblocks/$entrance" } # _ak_zblock_manipulator(){ # #!/bin/bash # # This file describe the structure of the ArchingKaos messages in their basis. # # # # As previously thought, we exchange one IPFS hash through whatever means we can. # # # # GPG is mentioned as a signing algorithm for encryption, decryption and signing. # # Let's say we have a file named as `example` # # # # We can extend this with calling the encoder and further send the transaction # # # # #FINGERPRINT="CHANGE THIS TO YOUR DEFAULT FINGERPRINT" # # We acquire the GPG fingerprint by email address # # The following example finds kaos@kaos.kaos' GPG fingerprint like this # # FINGERPRINT="$(gpg2 --homedir $AK_GPGHOME --list-keys | grep kaos@kaos.kaos -1 | head -n1 | awk '{print $1}')" # # # Below, the usage information # PROGRAM="$(basename $0)" # source $AK_LIBDIR/_ak_log # source $AK_LIBDIR/_ak_ipfs # source $AK_LIBDIR/_ak_gpg # # usage(){ # echo "Usage:" # echo "$PROGRAM -b block_file | -h block_hash | dunno" # echo "Creates and publishes a ZBLOCK based on a block and a previous" # echo "zblock." # echo "" # echo "Either -b or -h is needed. If both, -h is used." # echo "" # echo "-b block_file Points to a block file that we want to fix." # echo "-h block_hash If we don't have the block as a file, we can" # echo " use it's hash to retrieve it and edit it." # echo "-p previous_hash We refering to a previous hash for a ZBLOCK." # echo "" # echo "#TODO:" # echo "-t timestamp Unix UTC timestamp in seconds." # echo "-a \"module/action\" Change the action tag. Format: object/verb." # echo " In sense, \"Add news -> news/add\"." # echo "-d data In case you want to change the data, you 'll" # echo " be changing potentially the key of the block" # echo " and the data signature, otherwise your block" # echo " will be unverified." # echo "" # } # # main(){ # # logit "INFO" "We are doing" $BLOCK_TO_ADD "with content" $PREVIOUS # # We add it to IPFS # MESSAGE_HASH=$(_ak_ipfs_add $MESSAGE) # # # We create a detached and armor signature of it # MESSAGE_SIGN_FILE=$MESSAGE".asc" # _ak_gpg_sign_detached $MESSAGE_SIGN_FILE $MESSAGE # # # We add the signature to IPFS # MESSAGE_SIGNATURE=$(_ak_ipfs_add $MESSAGE_SIGN_FILE) # # # We will be using our public key also to put it in the block later # KEY="gpg.pub" # _ak_gpg_key_self_export $KEY # GPG_PUB_KEY=$(_ak_ipfs_add $KEY) # # # Acquire last block of information, to chain this one with previous posted # PREVIOUS=$(_ak_ipfs_files_stat /zlatest | head -n 1) # # # We create a block of json like this: # cat > block < zblock << EOF # { # "block":"$BLOCK", # "block_signature":"$BLOCK_SIGNATURE" # } # EOF # ZBL="zblock" # # and we add it on IPFS # ZBLOCK=$(_ak_ipfs_add $ZBL) # echo $ZBLOCK # } # # if [ ! -z $2 ]; # then # PWD="$(pwd)" # # # We ask which BLOCK is goind to be edited # BLOCK_TO_ADD="$1" # # We ask for a ZBLOCK or GENESIS to put in the BLOCK # PREVIOUS="$2" # # _ak_ipfs_cat "$BLOCK_TO_ADD" # if [ $? == 0 ]; # then # echo "Nice! We found the block" # _ak_ipfs_get "$BLOCK_TO_ADD" # # sed -i.bak -e 's/^.*previous.*$/\"previous\":\"'$PREVIOUS'\"/' $BLOCK_TO_ADD # cat $BLOCK_TO_ADD | jq -M # # exit 2 # else # echo "Too bad, it seems the block is not there" # exit 1 # fi # # # cat $PWD/zblock | jq -M # # Optional or extending with # # python send_as_ak_tx $ZBLOCK # # or for "offline" use # echo $ZBLOCK > $ZLATEST # _ak_ipfs_name_publish --key=zchain $ZBLOCK > /dev/null 2>&1 # _ak_ipfs_files_mkdir /zarchive > /dev/null 2>&1 # _ak_ipfs_files_cp /zlatest /zarchive/$(date -u +%s)-$(_ak_ipfs_files_stat /zlatest | head -n 1) > /dev/null 2>&1 # _ak_ipfs_files_rm /zlatest > /dev/null 2>&1 # _ak_ipfs_files_cp /ipfs/$ZBLOCK /zlatest > /dev/null 2>&1 # else # usage # exit 0 # fi # # } _ak_zblock_gen_html(){ time_started=$(date -u +%s.%N) ss=$(echo $time_started | cut -d '.' -f 1) nss=$(echo $time_started | cut -d '.' -f 2) # Check if there are enough arguments if [ $# -lt 1 ] then logit "ERROR" "Not enough arguments provided" _ak_help exit 1 fi if [ -n "$1" ] then TEST="$(echo -n "$1" | grep -v '^Qm[A-Za-z0-9]\{44\}$')" if [ -n "$TEST" ] then echo not ok exit 1 fi fi arg="$(mktemp)" ak-enter -l 1 "$1" | jq '.[]' > $arg ( \ # Create HTML document echo "" echo "" echo "" echo " Arching Kaos Chain Data" echo ' ' echo ' ' echo ' ' echo "" echo "" # Iterate through each argument and parse data if [ -f "$arg" ] then # Extract data from argument zblock=$(cat $arg | jq -r '.zblock') block=$(cat $arg | jq -r '.block') timestamp=$(cat $arg | jq -r '.timestamp') block_signature=$(cat $arg | jq -r '.block_signature') detach=$(cat $arg | jq -r '.detach') data=$(cat $arg | jq -r '.data') module=$(cat $arg | jq -r '.module') action=$(cat $arg | jq -r '.action') gpg=$(cat $arg | jq -r '.gpg') previous=$(cat $arg | jq -r '.previous') datablock=$(cat $arg | jq -r ".$data") # Output data in HTML format echo "

$PROGRAM

" echo "

🔎 $zblock

" if [ "$module" == "news" ] && [ "$action" == "add" ] then ak-news -x $zblock fi echo "

ℹī¸ $zblock

" echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo "
" echo "
đŸ“Ļ ZBLOCK
" echo "
" echo "
" echo " $zblock" echo "
$(_ak_ipfs_cat $zblock | jq)
" echo "
" echo "
" echo "
đŸ“Ļ BLOCK
" echo "
" echo "
" echo " $block" echo "
$(_ak_ipfs_cat $block | jq)
" echo "
" echo "
" echo "
🔏 BLOCK SIGNATURE
" echo "
" echo "
" echo " $block_signature" echo "
$(_ak_ipfs_cat $block_signature)
" echo "
" echo "
" echo "
⌚ TIMESTAMP
" echo "
" echo "

$timestamp

" echo "
" echo "
🔌 MODULE
" echo "
" echo "

$module

" echo "
" echo "
đŸĒ§ ACTION
" echo "
" echo "

$action

" echo "
" echo "
🔑 GPG
" echo "
" echo "
" echo " $gpg" echo "
$(_ak_ipfs_cat $gpg)
" echo "
" echo "
" echo "
đŸ“Ļ PREVIOUS
" echo "
" echo ' 🔗 '$previous'' echo "
" echo "
đŸ“Ļ DATA
" echo "
" echo "
" echo " $data" echo "
$datablock
" echo "
" echo "
" echo "
🔏 DATA_SIGNATURE
" echo "
" echo "
" echo " $detach" echo "
$(_ak_ipfs_cat $detach)
" echo "
" echo "
" echo "
📄 ipfs
" echo "
" echo ' '🔗 $(echo $datablock | jq -r '.ipfs')'' echo "
" echo "
🔏 detach
" echo "
" echo "
" echo " $(echo $datablock | jq -r '.detach')" echo "
$(_ak_ipfs_cat $(echo $datablock | jq -r '.detach'))
" echo "
" echo "
" echo " " echo " " echo " " echo " " echo " " echo " " echo " " echo "
" echo "
📃 Rendered ZBLOCK
" echo "
" echo "
$(cat $arg | jq)
" echo "
" fi time_ended=$(date -u +%s.%N) se=$(echo $time_ended | cut -d '.' -f 1) nse=$(echo $time_ended | cut -d '.' -f 2) echo "
" echo -n " " else echo "$(( $nse - $(echo -n $nss|sed 's/^0*//') )) seconds" fi echo "" echo "" ) > zblock-$1.html rm $arg } _ak_zblock_cache(){ if [ ! -d "$AK_CACHEDIR/fzblocks" ] then mkdir $AK_CACHEDIR/fzblocks fi if [ ! -z "$1" ] && [ -n "$1" ] then if [ -f "$AK_ZBLOCKDIR/$1" ] && [ "$(du -b $AK_ZBLOCKDIR/$1 | awk '{ print $1 }')" != "0" ] then if [ "$(sha512sum $AK_ZBLOCKDIR/$1 | awk '{ print $1 }')" == "$(_ak_zblock_show $1 | sha512sum | awk '{ print $1 }')" ] then logit "INFO" "Cache already there and updated" else logit "INFO" "Updating cache" _ak_zblock_show "$1" > $AK_CACHEDIR/fzblocks/$1 fi logit "INFO" "No cache found. Caching..." _ak_zblock_show "$1" if [ $? -ne "0" ] then logit "ERROR" "_ak_zblock_show failed..." exit 2 fi _ak_zblock_show "$1" > $AK_CACHEDIR/fzblocks/$1 else _ak_zblock_show "$1" > $AK_CACHEDIR/fzblocks/$1 if [ $? -ne "0" ] then logit "ERROR" "_ak_zblock_show failed..." exit 2 fi logit "ERROR" "Could not find zblock $1..." exit 1 fi exit 0 else logit "ERROR" "No arguments..." exit 1 fi } _ak_zblock_pack(){ if [ ! -z $2 ]; then MESSAGE="$2" ACTION="$1" if [ -f "$MESSAGE" ]; then # We check firstly if the encapsulated value of the "ipfs" key has already # appeared in the zchain. TO_CHECK="$(cat $MESSAGE | jq | grep ipfs | awk '{print $2}' | sed -e 's/"//g;s/,//g')" ak-enter | jq | grep ipfs | awk '{print $2}' | sed -e 's/"//g;s/,//g' | sort | uniq > tempisalreadythere while IFS="" read -r p || [ -n "$p" ] do if [ "$p" == "$TO_CHECK" ] then logit "ERROR" "Value $TO_CHECK already mentioned on the zchain" exit 1 fi done < tempisalreadythere rm tempisalreadythere logit "INFO" "We are doing $ACTION with content $MESSAGE" # We add it to IPFS MESSAGE_HASH=$(_ak_ipfs_add $MESSAGE) # We create a detached and armor signature of it MESSAGE_SIGN_FILE=$MESSAGE".asc" _ak_gpg_sign_detached $MESSAGE_SIGN_FILE $MESSAGE # We add the signature to IPFS MESSAGE_SIGNATURE=$(_ak_ipfs_add $MESSAGE_SIGN_FILE) # We will be using our public key also to put it in the block later KEY="gpg.pub" _ak_gpg_key_self_export $KEY GPG_PUB_KEY=$(_ak_ipfs_add $KEY) # Acquire last block of information, to chain this one with previous posted PREVIOUS=$(_ak_ipfs_files_stat /zlatest | head -n 1) # We create a block of json like this: printf '{"timestamp":"%s","action":"%s","data":"%s","detach":"%s","gpg":"%s","previous":"%s"}' $(date -u +%s) $ACTION $MESSAGE_HASH $MESSAGE_SIGNATURE $GPG_PUB_KEY $PREVIOUS > block BLOCK="block" BLOCK_SIG=$BLOCK".asc" # We have a block now, so we sign it _ak_gpg_sign_detached $BLOCK_SIG $BLOCK # We now add the signature to IPFS BLOCK_SIGNATURE=$(_ak_ipfs_add $BLOCK_SIG) # We also add the block! BLOCK=$(_ak_ipfs_add $BLOCK) # So we now do the think almost again printf '{"block":"%s","block_signature":"%s"}' $BLOCK $BLOCK_SIGNATURE > zblock ZBL="zblock" # and we add it on IPFS ZBLOCK=$(_ak_ipfs_add $ZBL) echo $ZBLOCK else logit "ERROR" "File does not exist. Aborting..." exit 1 fi # cat $PWD/zblock | jq -M # Optional or extending with # python send_as_ak_tx $ZBLOCK # or for "offline" use echo $ZBLOCK > $AK_ZLATEST _ak_ipfs_name_publish --key=zchain $ZBLOCK > /dev/null 2>&1 if [ $? -ne 0 ] then logit "ERROR" "Failed publishing ZBLOCK: $ZBLOCK" exit 1 fi _ak_ipfs_files_ls /zarchive > /dev/null 2>&1 if [ $? -ne 0 ] then logit "WARNING" "/zarchive does not exist" _ak_ipfs_files_mkdir /zarchive > /dev/null 2>&1 if [ $? -ne 0 ] then logit "ERROR" "Could not create /zarchive directory. Aborting." exit 1 fi fi _ak_ipfs_files_cp /zlatest /zarchive/$(date -u +%s)-$(_ak_ipfs_files_stat /zlatest | head -n 1) > /dev/null 2>&1 if [ $? -ne 0 ] then logit "ERROR" "Could not back up previous /zlatest" exit 1 fi _ak_ipfs_files_rm /zlatest > /dev/null 2>&1 if [ $? -ne 0 ] then logit "ERROR" "Could not remove previous /zlatest" exit 1 fi _ak_ipfs_files_cp /ipfs/$ZBLOCK /zlatest > /dev/null 2>&1 if [ $? -ne 0 ] then logit "ERROR" "Could not copy $ZBLOCK to /zlatest" exit 1 fi ak-config --publish if [ $? -ne 0 ] then logit "ERROR" "Could not publish new configuration" exit 1 fi else logit "ERROR" "Not enough arguments" exit 1 fi } _ak_zblock_announce(){ if [ ! -z "$1" ] && [ -n "$1" ] then curl \ --connect-timeout 3 \ --header 'Content-Type: application/json' \ --data-raw '{"zblock":"'$1'"}' \ "http://127.0.0.1:8610/v0/announce/zblock" \ 2>/dev/null | jq -M -c > /dev/null if [ $? -ne 0 ] then logit "ERROR" "zblock $zblock announcement failed" else logit "INFO" "zblock $zblock announced" fi else curl \ --connect-timeout 3 \ --header 'Content-Type: application/json' \ --data-raw '{"zblock":"'$(ak-get-zlatest)'"}' \ "http://127.0.0.1:8610/v0/announce/zblock" \ 2>/dev/null | jq -M -c > /dev/null if [ $? -ne 0 ] then logit "ERROR" "zblock $zblock announcement failed" else logit "INFO" "zblock $zblock announced" fi fi }