Биткойн: ошибка синтаксического анализа json в bashscript для отправки BTC с помощью команды sendmany

Я моделирую сеть биткойнов на своей машине, для которой я написал сценарий bash для имитации транзакций между узлами. Когда я использую sendmanyопцию bitcoin-cliдля отправки транзакций, я получаю сообщение об ошибке синтаксического анализа json, о котором сообщает bitcoin-cli.

Код:

#!/bin/bash
MAX_NODES=2
MY_PATH=/home/ubuntu/test
CLIENT=/usr/local/bin/bitcoin-cli

declare -a addr

function fcomp() {
        /usr/bin/awk -v n1=$1 -v n2=$2 'BEGIN{ if (n1>n2) exit 0; exit 1}'
}

json="'{"

#get addresses to send
for ((i = 1; i <= MAX_NODES; i++));
do
    addr[$i-1]="$($CLIENT -regtest -rpcport=$((16500 + $i)) -datadir=$MY_PATH/$i/ getnewaddress myaccount)"
    if [ "$i" -lt "$MAX_NODES" ]
    then
        json="$json\"${addr[$i-1]}\":0.00001, "
    else
        json="$json\"${addr[$i-1]}\":0.00001"
    fi
done

json="$json}'"
echo $json

#loop to send money to other nodes
for ((i = 1; i <= MAX_NODES; i++));
do
        balance=`$CLIENT -regtest -rpcport=$((16500 + $i)) -datadir=$MY_PATH/$i/ getbalance`
        if fcomp $balance 0.002; then
                $CLIENT -regtest -rpcport=$((16500 + $i)) -datadir=$MY_PATH/$i sendmany myaccount $json
    fi
done

вывод json-эха:

'{"mj2FrDhEomSzyQtRoGY78oVRPcQs5L5o95":0.00001, "mkxnkT3kx9dsFS8V3qYydpL1o5F5MfwCvM":0.00001}'

Это дает мне ошибку как:

error: Error parsing JSON:'{"mj2FrDhEomSzyQtRoGY78oVRPcQs5L5o95":0.00001,

Я пробовал все возможные комбинации кавычек, двойных кавычек и escape-последовательностей, но потерпел неудачу. Если я копирую и вставляю вывод echo $jsonв ручную bitcoin-cli sendmanyкоманду, все работает отлично.

1) Используете ли вы ту же оболочку для запуска при копировании/вставке, что и при использовании скрипта? 2) Попробуйте убрать пробел после запятой в строке json="$json\"${addr[$i-1]}\":0.00001, "Это мне помогло.

Ответы (1)

Если это ваш эхо-выход:

'{"mj2FrDhEomSzyQtRoGY78oVRPcQs5L5o95":0.00001, "mkxnkT3kx9dsFS8V3qYydpL1o5F5MfwCvM":0.00001}'

Тогда у вас слишком много цитат. Когда вы запустите эхо, вы должны увидеть:

{"mj2FrDhEomSzyQtRoGY78oVRPcQs5L5o95":0.00001, "mkxnkT3kx9dsFS8V3qYydpL1o5F5MfwCvM":0.00001}

Это потому, что оболочка удаляет внешний набор кавычек; это происходит и при отправке JSON в bitcoin-cli. Поскольку у вас есть кавычки в эхо-выходе, это означает, что они есть в команде bitcoin-cli, поэтому то, что вы отправляете Bitcoin Core, выглядит как строка JSON, а не как объект JSON.


Это не задается в вашем вопросе, но вы также можете изучить пакеты и команды Debian/Ubuntu с именами jshonи jq. Это поможет вам обрабатывать JSON в сценариях оболочки. Поскольку они понимают JSON, они, как правило, намного надежнее, sedчем awk. Однако я не знаю, нужны ли они вам для этого скрипта.