/
block_updater.py
executable file
·62 lines (50 loc) · 2.18 KB
/
block_updater.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from twisted.internet import reactor, defer
from poolsrv import config
import util
from poolsrv.posix_time import posix_time
import poolsrv.logger
log = poolsrv.logger.get_logger()
class BlockUpdater(object):
'''
Polls upstream's getinfo() and detecting new block on the network.
This will call registry.update_block when new prevhash appear.
This is just failback alternative when something
with ./bitcoind -blocknotify will go wrong.
'''
def __init__(self, registry, bitcoin_rpc):
self.bitcoin_rpc = bitcoin_rpc
self.registry = registry
self.clock = None
self.schedule()
def schedule(self):
when = self._get_next_time()
#log.debug("Next prevhash update in %.03f sec" % when)
#log.debug("Merkle update in next %.03f sec" % \
# ((self.registry.last_update + config.MERKLE_REFRESH_INTERVAL)-posix_time()))
self.clock = reactor.callLater(when, self.run) #@UndefinedVariable
def _get_next_time(self):
when = config.PREVHASH_REFRESH_INTERVAL - (posix_time() - self.registry.last_update) % config.PREVHASH_REFRESH_INTERVAL #@UndefinedVariable
return when
@defer.inlineCallbacks
def run(self):
try:
template = self.registry.get_last_template()
if template:
current_prevhash = "%064x" % template.hashPrevBlock
else:
current_prevhash = None
# Get prevhash
if config.BITCOIN_VERSION_0_9_PLUS:
prevhash = yield self.bitcoin_rpc.get_best_block_hash()
else:
prevhash = util.reverse_hash((yield self.bitcoin_rpc.prevhash()))
if prevhash and prevhash != current_prevhash:
log.info("New block! Prevhash: %s" % prevhash)
self.registry.update_blank_block(prevhash)
elif posix_time() - self.registry.last_update >= config.MERKLE_REFRESH_INTERVAL:
log.info("Merkle update! Prevhash: %s" % prevhash)
self.registry.update_block()
except Exception:
log.exception("UpdateWatchdog.run failed")
finally:
self.schedule()