From 52f76d96602bc5770f43b1ae1defc3149302ae4e Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 9 Sep 2012 22:49:49 +0000 Subject: [PATCH] Added on_load hooks to important objects. Report all rejected shares to ShareManager --- lib/block_updater.py | 6 +++--- lib/coinbaser.py | 9 ++++++++- mining/__init__.py | 19 ++++++++++++++++--- mining/interfaces.py | 13 ++++++++++++- mining/service.py | 11 ++++------- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/block_updater.py b/lib/block_updater.py index 3ed44b8..b80a024 100644 --- a/lib/block_updater.py +++ b/lib/block_updater.py @@ -24,9 +24,9 @@ class BlockUpdater(object): 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 + settings.MERKLE_REFRESH_INTERVAL)-Interfaces.timestamper.time())) + #log.debug("Next prevhash update in %.03f sec" % when) + #log.debug("Merkle update in next %.03f sec" % \ + # ((self.registry.last_update + settings.MERKLE_REFRESH_INTERVAL)-Interfaces.timestamper.time())) self.clock = reactor.callLater(when, self.run) def _get_next_time(self): diff --git a/lib/coinbaser.py b/lib/coinbaser.py index 04b7d80..f3fd14b 100644 --- a/lib/coinbaser.py +++ b/lib/coinbaser.py @@ -1,4 +1,5 @@ import util +from twisted.internet import defer import stratum.logger log = stratum.logger.get_logger('coinbaser') @@ -10,11 +11,13 @@ class SimpleCoinbaser(object): for all generated blocks.''' def __init__(self, bitcoin_rpc, address): + # Fire callback when coinbaser is ready + self.on_load = defer.Deferred() + self.address = address self.is_valid = False # We need to check if pool can use this address self.bitcoin_rpc = bitcoin_rpc - self._validate() def _validate(self): @@ -26,6 +29,10 @@ class SimpleCoinbaser(object): if result['isvalid'] and result['ismine']: self.is_valid = True log.info("Coinbase address '%s' is valid" % self.address) + + if not self.on_load.called: + self.on_load.callback(True) + else: self.is_valid = False log.error("Coinbase address '%s' is NOT valid!" % self.address) diff --git a/mining/__init__.py b/mining/__init__.py index 4709e14..03366d3 100644 --- a/mining/__init__.py +++ b/mining/__init__.py @@ -1,16 +1,22 @@ from service import MiningService from subscription import MiningSubscription +from twisted.internet import defer +@defer.inlineCallbacks def setup(): '''Setup mining service internal environment. You should not need to change this. If you want to use another Worker manager or Share manager, you should set proper reference to Interfaces class *before* you call setup() in the launcher script.''' - + from stratum import settings from interfaces import Interfaces + # Let's wait until share manager and worker manager boot up + (yield Interfaces.share_manager.on_load) + (yield Interfaces.worker_manager.on_load) + from lib.block_updater import BlockUpdater from lib.template_registry import TemplateRegistry from lib.bitcoin_rpc import BitcoinRPC @@ -22,8 +28,11 @@ def setup(): settings.BITCOIN_TRUSTED_USER, settings.BITCOIN_TRUSTED_PASSWORD) + coinbaser = SimpleCoinbaser(bitcoin_rpc, settings.CENTRAL_WALLET) + (yield coinbaser.on_load) + registry = TemplateRegistry(BlockTemplate, - SimpleCoinbaser(bitcoin_rpc, settings.CENTRAL_WALLET), + coinbaser, bitcoin_rpc, settings.INSTANCE_ID, MiningSubscription.on_block) @@ -35,4 +44,8 @@ def setup(): # Set up polling mechanism for detecting new block on the network # This is just failsafe solution when -blocknotify # mechanism is not working properly - BlockUpdater(registry, bitcoin_rpc) \ No newline at end of file + BlockUpdater(registry, bitcoin_rpc) + + import stratum.logger + log = stratum.logger.get_logger('mining') + log.info("MINING SERVICE IS READY") diff --git a/mining/interfaces.py b/mining/interfaces.py index 812f0d0..88f5417 100644 --- a/mining/interfaces.py +++ b/mining/interfaces.py @@ -5,17 +5,28 @@ ''' import time +from twisted.internet import reactor, defer import stratum.logger log = stratum.logger.get_logger('interfaces') class WorkerManagerInterface(object): + def __init__(self): + # Fire deferred when manager is ready + self.on_load = defer.Deferred() + self.on_load.callback(True) + def authorize(self, worker_name, worker_password): return True class ShareManagerInterface(object): + def __init__(self): + # Fire deferred when manager is ready + self.on_load = defer.Deferred() + self.on_load.callback(True) + def on_submit_share(self, worker_name, block_header, block_hash, shares, timestamp, is_valid): - log.info("%s %s %s" % ('Valid' if is_valid else 'INVALID', worker_name, block_hash)) + log.info("%s %s %s" % (block_hash, 'valid' if is_valid else 'INVALID', worker_name)) def on_submit_block(self, worker_name, block_header, block_hash, timestamp, is_accepted): log.info("Block %s %s" % (block_hash, 'ACCEPTED' if is_accepted else 'REJECTED')) diff --git a/mining/service.py b/mining/service.py index f3a6861..8bdccd2 100644 --- a/mining/service.py +++ b/mining/service.py @@ -83,13 +83,10 @@ class MiningService(GenericService): (is_valid, reason, block_header, block_hash) = Interfaces.template_registry.submit_share(job_id, worker_name, extranonce1_bin, extranonce2, ntime, nonce, difficulty, Interfaces.share_manager.on_submit_block) - - if block_header != None: - # block header is missing when template registry was unable to build it - # from given parameters. Client side is probably broken, storing such - # submit don't have any sense. - Interfaces.share_manager.on_submit_share(worker_name, block_header, block_hash, difficulty, - Interfaces.timestamper.time(), is_valid) + + # block_header and block_hash may be None when submitted data are corrupted + Interfaces.share_manager.on_submit_share(worker_name, block_header, block_hash, difficulty, + Interfaces.timestamper.time(), is_valid) if not is_valid: raise SubmitException(reason) -- 1.7.1