Как проверить, является ли цепочка блоков актуальной, используя биткойн или json-rpc?

Я прочитал полный список методов api и, похоже, не нашел его.

Я полагаю, что для этой цели нет команды, так какой же общий способ сделать это?

Я бы рассмотрел возможность проверки метки времени последнего сгенерированного блока, но метод getblock на самом деле не объясняется подробно.

EDIT:

Некоторые люди отвечают, что я должен сравнить количество блоков с одним из онлайн-мониторов цепочки блоков. Это не практическое решение. Клиент Bitcoin-Qt имеет способ узнать, когда выполняется синхронизация (знак V и значок синхронизации), так почему же биткойн? Как Bitcoin-Qt получает это информация?

32 голоса | спросил Steven Roose 3 PMpWed, 03 Apr 2013 22:45:11 +040045Wednesday 2013, 22:45:11

10 ответов


16

Я использую скрипт python, который захватывает http://blockchain.info/q/getblockcount и сравнивает его с выходом bitcoind getblockcount.

Как уже говорили другие, нет абсолютного способа сказать, обновляется ли ваша блок-цепочка.

В любом случае, вот мой скрипт:

    import httplib2
    from bitcoinrpc.authproxy import AuthServiceProxy
    access = AuthServiceProxy('#########')
    try:
            blockCount = access.getblockcount()
    except Exception as e:
            print "Problems connecting to bitcoin wallet:"
    else:
            try:
                    response, trueBlockCount = httplib2.Http().request("http://blockexplorer.com/q/getblockcount/")
            except Exception as e:
                    print "Unable to get true blockcount from blockexplorer:"+str(e)
            else:
                    if (int(trueBlockCount) - 5) > blockCount :
                            print "blockchain not up to date: true block count is: "+str(trueBlockCount)+", while bitcoind is at: "+str(blockCount)
ответил Konstantin Schubert 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 17 Sep 2013 05:22:05 +0400 2013, 05:22:05
12

Невозможно проверить, выполняется ли синхронизация, просто потому, что она не известна .

Немного абстрактно и, вероятно, не полезно в вашем случае, клиенту является always синхронизация: нет никакой реальной разницы между «наличием всех блоков» и «не имеющим всех блоков» - у него всегда есть все блоки, о которых он знает, и не знает, есть ли блоки, которые он пропускает.

Что показывает вам GUI - это предположение. Он проверяет возраст последнего известного блока, и если он (IIRC) более 90 минут назад, он предполагает, что он не синхронизирован. Это, как правило, хороший показатель, но он редко будет, конечно, случайным образом терпеть неудачу время от времени.

В базовом коде имеется еще один эвристический встроенный модуль, который использует высоты блоков, сообщаемые другими узлами (без какой-либо проверки этой информации, поэтому ее легко обмануть). Эта информация используется для определения того, следует ли оптимизировать поведение кэша для многих быстрых операций или надежности. Он также не отображается напрямую, но в этом режиме сбои RPCs getwork () и getblocktemplate () будут неработоспособны.

ответил Pieter Wuille 1 Mayam13 2013, 04:58:39
9

Учитывая, что вы всегда несколько не синхронизированы, вот как вы можете получить, как долго в секундах, а затем вы можете разделить на 60 или 3600, чтобы получить его в течение нескольких минут или часов.

Если вы хотите сделать это вручную:

# bitcoin-cli getblockcount
2345
# bitcoin-cli getblockhash 2345
000000007024f233aa44bc7784a78926fb1c325f9985c936ae57b94530505062
# bitcoin-cli getblock 000000007024f233aa44bc7784a78926fb1c325f9985c936ae57b94530505062 | grep "time"
    "time" : 1233313208,
# echo $((`date +%s`-1233313208))
<number of seconds>

Или то же самое в два этапа

bitcoin-cli getblock `bitcoin-cli getblockhash \`bitcoin-cli getblockcount\`` | grep time
    "time" : 1233313208,
echo $((`date +%s`-1233313208))
<number of seconds>

Я не нашел способ сделать это за один вызов, так что вот сценарий, который делает все это, без проверки ошибок, как вы можете видеть:

#!/bin/bash
cnt=`bitcoin-cli getblockcount`
hash=`bitcoin-cli getblockhash ${cnt}`
timeline=`bitcoin-cli getblock $hash | grep '"time"'`
ltrimtime=${timeline#*time\" : }
newest=${ltrimtime%%,*}
echo $((`date +%s`-$newest))

Затем вы можете заменить

echo $((`date +%s`-$newest))

Чтобы получить количество минут, например:

echo $(((`date +%s`-$newest)/60))

Или количество таких часов:

echo $(((`date +%s`-$newest)/3600))

Или, если у вас есть perl (который у вас есть) и что вы предпочитаете иметь дату последнего блока:

perl -le "print scalar localtime $newest;"
ответил user13239 8 FebruaryEurope/MoscowbSat, 08 Feb 2014 02:32:34 +0400000000amSat, 08 Feb 2014 02:32:34 +040014 2014, 02:32:34
8

Bitcoind больше не поддерживает вызовы RPC. Попробуйте:

watch bitcoin-cli getblockchaininfo

Когда отображаемое количество блоков равно отображаемому количеству заголовков, вы синхронизированы!

ответил Chris 22 72015vEurope/Moscow11bEurope/MoscowSun, 22 Nov 2015 14:37:28 +0300 2015, 14:37:28
2

Немного взломанный, но журнал отладки показывает ваш «прогресс» в отношении биткойна.

tail -n 1 ~/.bitcoin/debug.log

Дает вам что-то вроде

2016-04-26 19:02:21 UpdateTip: new best=000000000000000002a9b8f81c231c99b86f79fae383fb1fc046974f7fdcf118  height=405098  log2_work=84.399379  tx=119389857  date=2016-03-31 10:06:53 
progress=0.982752  cache=0.5MiB(0tx)

В этом случае я на 98% «сделан».

ответил Thax 26 PMpTue, 26 Apr 2016 22:03:53 +030003Tuesday 2016, 22:03:53
1

Здесь есть несколько опрятных решений, и, может быть, это просто слишком просто, но если вы законно догоняете блок-цепочку и не в основном в конце, чтобы получить только этот новый блок каждые 10 минут, посмотрите на свой cpu.

Если вы используете linux, запустите «top». биткойн будет работать со своим отступом, вычисляя каждый хэш каждого блока через блок-цепочку. Как только он догнал, он в основном простаивает.

ответил seijirou 15 Jam1000000amThu, 15 Jan 2015 05:42:06 +030015 2015, 05:42:06
1

Обновление 7 августа 2015 ~ начало

Итак, после того, как IP или два запрещены из-за проверки на часто ... поэтому, я предоставлю некоторые варианты того, как избежать запрета. Во-первых, не используйте сценарий под этим обновлением; переменная расширения Bash преформ вызывает несколько вызовов https://blockchain.info за короткий промежуток времени. Вы можете попробовать добавить sleep 120 между назначением и вызовами, но это будет очень медленно. Во-вторых, ключевые вещи; Проверка локального подсчета $(bitcoin-cli getblockcount) и проверка известного узла $(wget -q -O - http://blockchain.info/q/getblockcount) и проверка локального состояния синхронизации $(bitcoin-cli getblocktemplate)

Чтобы объединить Blockchain с вашего узла на другой в одной строке

$($(wget -q -O - http://blockchain.info/q/getblockcount)-$(bitcoin-cli getblockcount))
# To print this with echo and date stamp
echo "    $(date) : $($(wget -q -O - http://blockchain.info/q/getblockcount)-$(bitcoin-cli getblockcount))"
# To redirect and exit with 0 : ie place in crontab
echo "$($(wget -q -O - http://blockchain.info/q/getblockcount)-$(bitcoin-cli getblockcount))" > /var/log/btc_blocks_left_to_sync.log 2>&1

Последний выше, вероятно, лучший для сценариев, поскольку файл, который он сохраняет, может быть прочитан только для номера внутри или в последний раз, когда он был изменен.

Обновление 7 августа 2015 ~ end

Действительно, там отображается правильный вызов функции, @BinaryMage, спасибо.

  

Возможный дубликат. Когда вы загружаете блок-цепочку в первый раз, как узнать, когда это будет сделано? - BinaryMage 4 апр '13 в 0:50

Лицом, показывающим правильную функцию, был @LoHoris, однако обновления для программного обеспечения узла биткойнов теперь используют bitcoin-cli getblocktemplate, а не bitcoind для этих поисков.

Благодаря обоим из них вы можете предложить вам все комбинации обоих ответов, завернутые в скрипт checker; готовый к вашей настройке и обновленный на 2015 год


    #!/bin/bash
    timed_wait=600
    vars_to_load(){
        ## Set vars to function such that they are set upon every call
        localCheck=$(bitcoin-cli getblockcount)
        crossCheck=$(wget -q -O - http://blockchain.info/q/getblockcount)
        diffBlocks=$(($crossCheck-$localCheck))
        localSize=$(ls -hal ~/.bitcoin/blocks | awk '/total/{print $2}')
    }
    check_sync(){
        while true
        do
            current_time=$(date)
            echo $current_time
            bitcoin-cli getblocktemplate
            if [ $? = 0 ]
            then
                echo "All synced up"
            else
                echo "Uh oh, running available checks"
                ## call function that runs it all on a timer
                networked_sync
                echo "Node has $localCheck of $crossCheck blocks available."
                echo "Size of local blockchain is $localSize"
            fi
            echo "Sleeping for $timed_wait seconds or $(($timed_wait/60)) minuets."
            sleep $timed_wait
        done
    }
    networked_sync(){
        vars_to_load
        ## Function to print difference in node sync
        if [ $diffBlocks -eq 0 ]
        then
            echo "Sync is good with $diffBlocks blocks off"
        else
            echo "Sync has $diffBlocks blocks left to download"
        fi
    }
    check_sync

Этот скрипт сначала проверяет статус выхода bitcoin-cli getblocktemplate, потому что ничего, кроме 0, обычно является ошибкой, он будет запускать другие части, только если bitcoin-cli getblocktemplate показывает ошибку. Конечно, вместо этого можно проверить конкретные коды ошибок и сделать что-то для определенных кодов ошибок ... но это отлично работает как шаблон для меня при настройке узлов BTC в безголовой среде. Затем другие проверки сравнивают стили с номерами блоков https://blockchain.info и выписывают, сколько блоков блокируется вашей системой. Они выполняются только тогда, когда локальная проверка ошибки состояния синхронизации, таким образом, если вы находитесь на более медленном уровне, например, @Steven Roose, то этот сценарий идеален.

По умолчанию время ожидания между проверками составляет 600 seconds (10 минут), чтобы свести к минимуму сетевые проверки и локальные проверки, однако для ведения журнала и улучшения управления ресурсами достаточно просто прокомментировать while, do и done и sleep $timed_wait). И добавьте одну линию в crontab для выполнения работы по расписанию. Последнее изменение самого конца скрипта для записи вывода в файл.


Измененная функция:

    check_sync(){
    #   while true
    #   do
            current_time=$(date)
            echo $current_time
            bitcoin-cli getblocktemplate
            if [ $? = 0 ]
            then
                echo "All synced up"
            else
                echo "Uh oh, running available checks"
                ## call function that runs it all on a timer
                networked_sync
                echo "Node has $localCheck of $crossCheck blocks available."
                echo "Size of local blockchain is $localSize"
            fi
            echo "Sleeping for $timed_wait seconds or $(($timed_wait/60)) minuets."
    #       sleep $timed_wait
    #   done
    }

И для запуска каждые 10 минут

    sudo nano /etc/crontab
        */10 *  * * *   root    /pathTo/script.sh 2>&1

Затем, чтобы включить ведение журнала, измените вызов, который запускает каждую вещь в скрипте;

    check_sync | tee -a /tmp/BTCsync_log.txt

Надеюсь, это достаточно приемлемый ответ, чтобы отметить этот вопрос как [разрешенный], чтобы будущие поисковики могли иметь более легкое время.

ответил S0AndS0 1 J000000Wednesday15 2015, 12:03:08
1

Не вижу никаких тривиальных ответов здесь. Вот что я сделал.

Использовать API CALL "getblockchaininfo" Параметр «verifyprogress» будет ~ = 1.0, если вы синхронизированы.

Предупреждение: это, по-видимому, основано на времени, ваши часы должны быть несколько точными.

Я проверяю, что это & ​​gt; = 0.999, чтобы определить, синхронизирован ли я.

ответил Damin 13 MaramSun, 13 Mar 2016 01:47:21 +03002016-03-13T01:47:21+03:0001 2016, 01:47:21
0

Бросьте сценарий ниже в свой /home/$USER/.bashrc файл и перезапустите свою оболочку.

alias bitcoindSynced='

bitcoindSynced() {
blockCount=`bitcoind getblockcount`
blockChain=`wget -O - http://blockchain.info/q/getblockcount`
blockDiff=`expr $blockChain - $blockCount`

if [ $blockDiff = 0 ]
then
    echo "up to date"
else
    echo "$blockDiff blocks behind"
fi
}

bitcoindSynced 2>/dev/null'

Затем, когда вы запустите команду

bitcoindSynced

вам будет предоставлено количество блоков, оставшихся до синхронизации,
или если ваш клиент обновлен, он вам сообщит.


Кроме того, если вы не хотите перезапускать свою оболочку, вы можете просто запустить команду

source /home/$USER/.bashrc

, и он сделает то же самое.

ответил derrend 1 Mayam13 2013, 03:49:33
0

Более рудиментарно, но полезно знать, синхронизирован ли кошелек или нет

Используя команды:

  • "getinfo" (укажите текущую высоту блока)
  • "getpeerinfo" (дайте высота блока с полем «startheight» для каждого соединения).

Затем вы можете легко сравнить значения и узнать, сколько процентов вы хотите загрузить блок-цепочку.

ответил Anemol 14 MarpmTue, 14 Mar 2017 15:45:30 +03002017-03-14T15:45:30+03:0003 2017, 15:45:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132