Mysql share reporting fixed. Update config template.
[stratum-mining.git] / mining / interfaces.py
index 40f1d2f..5bbe68a 100644 (file)
@@ -2,51 +2,65 @@
    Default implementation do almost nothing, you probably want to override these classes
    and customize references to interface instances in your launcher.
    (see launcher_demo.tac for an example).
-'''
-
+''' 
+from stratum import settings
 import time
 from twisted.internet import reactor, defer
+from lib.util import b58encode
 
 import stratum.logger
 log = stratum.logger.get_logger('interfaces')
 
+import DBInterface
+dbi = DBInterface.DBInterface()
+dbi.init_main()
+
 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
+       # Important NOTE: This is called on EVERY submitted share. So you'll need caching!!!
+       return dbi.check_password(worker_name,worker_password)
+
 
 class ShareLimiterInterface(object):
     '''Implement difficulty adjustments here'''
-
-    def submit(self, connection_ref, current_difficulty, timestamp):
+    
+    def submit(self, connection_ref, job_id, current_difficulty, timestamp, worker_name):
         '''connection - weak reference to Protocol instance
            current_difficulty - difficulty of the connection
            timestamp - submission time of current share
-
+           
            - raise SubmitException for stop processing this request
            - call mining.set_difficulty on connection to adjust the difficulty'''
-        pass
-
+       return dbi.update_worker_diff(worker_name,settings.POOL_TARGET)
 class ShareManagerInterface(object):
     def __init__(self):
         # Fire deferred when manager is ready
         self.on_load = defer.Deferred()
         self.on_load.callback(True)
+       self.block_height = 0
+       self.prev_hash = 0
 
-    def on_network_block(self, prevhash):
+    def on_network_block(self, prevhash, block_height):
         '''Prints when there's new block coming from the network (possibly new round)'''
+        self.block_height = block_height
+       self.prev_hash = b58encode(int(prevhash,16))
         pass
-
-    def on_submit_share(self, worker_name, block_header, block_hash, shares, timestamp, is_valid):
-        log.info("%s %s %s" % (block_hash, 'valid' if is_valid else 'INVALID', worker_name))
-
-    def on_submit_block(self, is_accepted, worker_name, block_header, block_hash, timestamp):
+    
+    def on_submit_share(self, worker_name, block_header, block_hash, difficulty, timestamp, is_valid, ip, invalid_reason, share_diff ):
+        log.info("%s (%s) %s %s" % (block_hash, share_diff, 'valid' if is_valid else 'INVALID', worker_name))
+       dbi.queue_share([worker_name,block_header,block_hash,difficulty,timestamp,is_valid, ip, self.block_height, self.prev_hash, 
+               invalid_reason, share_diff ])
+    def on_submit_block(self, is_accepted, worker_name, block_header, block_hash, timestamp, ip, share_diff ):
         log.info("Block %s %s" % (block_hash, 'ACCEPTED' if is_accepted else 'REJECTED'))
-
+       dbi.found_block([worker_name,block_header,block_hash,-1,timestamp,is_accepted,ip,self.block_height, self.prev_hash, share_diff ])
+    
 class TimestamperInterface(object):
     '''This is the only source for current time in the application.
     Override this for generating unix timestamp in different way.'''
@@ -57,34 +71,35 @@ class PredictableTimestamperInterface(TimestamperInterface):
     '''Predictable timestamper may be useful for unit testing.'''
     start_time = 1345678900 # Some day in year 2012
     delta = 0
-
+    
     def time(self):
         self.delta += 1
         return self.start_time + self.delta
-
+        
 class Interfaces(object):
     worker_manager = None
     share_manager = None
     share_limiter = None
     timestamper = None
     template_registry = None
-
+    
     @classmethod
     def set_worker_manager(cls, manager):
-        cls.worker_manager = manager
-
-    @classmethod
+        cls.worker_manager = manager    
+    
+    @classmethod        
     def set_share_manager(cls, manager):
         cls.share_manager = manager
 
-    @classmethod
+    @classmethod        
     def set_share_limiter(cls, limiter):
         cls.share_limiter = limiter
-
+    
     @classmethod
     def set_timestamper(cls, manager):
         cls.timestamper = manager
-
+        
     @classmethod
     def set_template_registry(cls, registry):
+       dbi.set_bitcoinrpc(registry.bitcoin_rpc)
         cls.template_registry = registry