W3Schools



我看了完整的api方法列表 and did not seem to find one.

我想没有专门用于此目的的命令,那么这样做的一般方法是什么?

我会考虑检查最后生成的块的时间戳,但是getblock method is not really explained in much detail.

编辑:

有些人回答我应该将块数与在线区块链监视器之一进行比较。这不是一个真正的实际解决方案。比特币-Qt客户端有一种方法可以知道何时完成同步(V-sign与同步图标),为什么不进行bitcoind? 比特币-Qt如何获得这些信息?

荣一娱乐官网_荣一娱乐注册_荣一娱乐交易所
blockchainbitcoindjson-rpc
10个回答
12

没有办法检查同步是否完成,只是因为它没有已知.

客户端有点抽象,可能对你的情况没用总是 syncing: there is no real difference between "having all blocks" and "not having all blocks" - it always has all blocks that it knows about, and doesn't know whether there are blocks which it misses.

GUI向您显示的是猜测。它检查最后一个已知块的年龄,如果它是(IIRC)超过90分钟前,则假定它不同步。这通常是一个很好的指标,但它很少会偶尔随机失败。

核心代码具有另一种内置启发式,它使用其他节点报告的块高度(不以任何方式验证该信息,因此很容易被欺骗)。此信息用于确定是否应针对许多快速操作或可靠性优化高速缓存行为。它也没有直接暴露,但getwork()和getblocktemplate()RPC在这种模式下将失败。


16

我使用一个抓取的python脚本HTTP://block chain.info/请/get block count and compares it to the output of 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)

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;"

1

这里有一些简洁的解决方案,也许这只是过于简单,但是,如果你合法地追赶区块链而不是基本上在最后只有每10分钟一次获得新块,请查看你的cpu使用情况。

如果您使用的是Linux,请运行“top”。 bitcoind将通过区块链计算每个块的每个哈希值。一旦它赶上来,它基本上是空闲的。


8

Bitcoind不再支持RPC调用。尝试:

watch bitcoin-cli getblockchaininfo

当显示的块数等于显示的标题数时,您已同步!


0

这里没有看到任何微不足道的答案。这就是我做的。

使用API​​ CALL“getblockchaininfo” 如果同步,参数“verificationprogress”将为〜= 1.0。

警告:这似乎是基于时间,你的时钟需要有点准确。

我检查它是> = 0.999来确定我是否同步。


2

有点hacky,但调试日志显示你的“进展”,就bitcoind而言。

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%“完成”。


0

更简陋但有用的是知道钱包是否同步

通过使用命令:

  • “getinfo”(给出你当前的块高)
  • “getpeerinfo”(给出 使用每个连接的“startingheight”字段阻止高度。

然后,您可以轻松地比较值并找出下载区块链的百分比。