1 from twisted.internet import reactor, defer
2 from stratum import settings
5 from mining.interfaces import Interfaces
8 log = stratum.logger.get_logger('block_updater')
10 class BlockUpdater(object):
12 Polls upstream's getinfo() and detecting new block on the network.
13 This will call registry.update_block when new prevhash appear.
15 This is just failback alternative when something
16 with ./bitcoind -blocknotify will go wrong.
19 def __init__(self, registry, bitcoin_rpc):
20 self.bitcoin_rpc = bitcoin_rpc
21 self.registry = registry
26 when = self._get_next_time()
27 #log.debug("Next prevhash update in %.03f sec" % when)
28 #log.debug("Merkle update in next %.03f sec" % \
29 # ((self.registry.last_update + settings.MERKLE_REFRESH_INTERVAL)-Interfaces.timestamper.time()))
30 self.clock = reactor.callLater(when, self.run)
32 def _get_next_time(self):
33 when = settings.PREVHASH_REFRESH_INTERVAL - (Interfaces.timestamper.time() - self.registry.last_update) % \
34 settings.PREVHASH_REFRESH_INTERVAL
37 @defer.inlineCallbacks
42 if self.registry.last_block:
43 current_prevhash = "%064x" % self.registry.last_block.hashPrevBlock
45 current_prevhash = None
47 prevhash = util.reverse_hash((yield self.bitcoin_rpc.prevhash()))
48 if prevhash and prevhash != current_prevhash:
49 log.info("New block! Prevhash: %s" % prevhash)
52 elif Interfaces.timestamper.time() - self.registry.last_update >= settings.MERKLE_REFRESH_INTERVAL:
53 log.info("Merkle update! Prevhash: %s" % prevhash)
57 self.registry.update_block()
60 log.exception("UpdateWatchdog.run failed")