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):
import util
+from twisted.internet import defer
import stratum.logger
log = stratum.logger.get_logger('coinbaser')
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):
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)
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
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)
# 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")
'''
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'))
(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)