Shell Script para Tempo para o Próximo Ajuste de Dificuldade de Bitcoin

Recentemente, precisei de uma maneira rápida de ver quando o próximo ajuste de dificuldade de bitcoin ocorreria. Surpreendentemente, não há nenhum recurso online (funcionando) para ver isso. Eu escrevi este script rápido para pegar os dados brutos relevantes de blockchain.info e analisá-los para me mostrar uma saída rápida de quando isso acontecerá.

Lembre-se de que esta é apenas uma estimativa e muda com o tempo / velocidade de hash da rede. Se você não sabe disso, este script provavelmente não é útil para você. Isso é específico do ZSH, pois usa o módulo zsh mathfun.

#!/bin/zsh
zmodload zsh
/mathfunc
echo
"Loading data from blockchain.info ..."
NEXT_RETARGET
=$(curl -s http://blockchain.info/q/nextretarget)
CURRENT_BLOCK
=$(curl -s http://blockchain.info/q/getblockcount)
AVG_BLOCK_TIME
=$(curl -s http://blockchain.info/q/interval)
(( AVG_BLOCK_TIME=int(floor($AVG_BLOCK_TIME)) )) # Convert AVG time to int
(( BLOCKS_LEFT=$NEXT_RETARGET - $CURRENT_BLOCK ))
(( TOTAL_SECS_LEFT=$AVG_BLOCK_TIME * $BLOCKS_LEFT ))

##########################
# Calculate Seconds Left
##########################
TIME_LEFT
=""
DAYS_LEFT
=0
HOURS_LEFT
=0
MINS_LEFT
=0
(( SECS_LEFT=int(rint($TOTAL_SECS_LEFT)) ))

# Days
if [ $SECS_LEFT -ge 86400 ]; then
(( DAYS_LEFT=int(floor($SECS_LEFT / 86400)) ))
(( SECS_LEFT=$SECS_LEFT-$DAYS_LEFT * 86400 ))
fi
# Hours
if [ $SECS_LEFT -ge 3600 ]; then
(( HOURS_LEFT=int(floor($SECS_LEFT / 3600)) ))
(( SECS_LEFT=$SECS_LEFT-$HOURS_LEFT * 3600 ))
fi
# Mins
if [ $SECS_LEFT -ge 60 ]; then
(( MINS_LEFT=int(floor($SECS_LEFT / 60)) ))
(( SECS_LEFT=$SECS_LEFT-$MINS_LEFT * 60 ))
fi

if [ $DAYS_LEFT -gt 0 ]; then TIME_LEFT="${TIME_LEFT}${DAYS_LEFT}d "; fi
if [ $HOURS_LEFT -gt 0 ]; then TIME_LEFT="${TIME_LEFT}${HOURS_LEFT}h "; fi
if [ $MINS_LEFT -gt 0 ]; then TIME_LEFT="${TIME_LEFT}${MINS_LEFT}m "; fi
if [ $SECS_LEFT -gt 0 ]; then TIME_LEFT="${TIME_LEFT}${SECS_LEFT}s"; fi

cat
<<EOF
Current Block Height: $CURRENT_BLOCK
Next Retarget: $NEXT_RETARGET
Blocks Left: $BLOCKS_LEFT
Avg Time Solve: $AVG_BLOCK_TIME

Total Secs Left: $TOTAL_SECS_LEFT
Est. Left: $TIME_LEFT
EOF

A saída é semelhante a esta:

Loading data from blockchain.info ...
Current Block Height: 261304
Next Retarget: 262079
Blocks Left: 775
Avg Time Solve: 496

Total Secs Left: 384400
Est. Left: 4d 10h 46m 40s