Initial commit
[stratum-mining.git] / lib / coinbaser.py
diff --git a/lib/coinbaser.py b/lib/coinbaser.py
new file mode 100644 (file)
index 0000000..04b7d80
--- /dev/null
@@ -0,0 +1,51 @@
+import util
+
+import stratum.logger
+log = stratum.logger.get_logger('coinbaser')
+
+# TODO: Add on_* hooks in the app
+    
+class SimpleCoinbaser(object):
+    '''This very simple coinbaser uses constant bitcoin address
+    for all generated blocks.'''
+    
+    def __init__(self, bitcoin_rpc, address):
+        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):
+        d = self.bitcoin_rpc.validateaddress(self.address)
+        d.addCallback(self._address_check)
+        d.addErrback(self._failure)
+        
+    def _address_check(self, result):
+        if result['isvalid'] and result['ismine']:
+            self.is_valid = True
+            log.info("Coinbase address '%s' is valid" % self.address)
+        else:
+            self.is_valid = False
+            log.error("Coinbase address '%s' is NOT valid!" % self.address)
+        
+    def _failure(self, failure):
+        log.error("Cannot validate Bitcoin address '%s'" % self.address)
+        raise
+    
+    #def on_new_block(self):
+    #    pass
+    
+    #def on_new_template(self):
+    #    pass
+    
+    def get_script_pubkey(self):
+        if not self.is_valid:
+            # Try again, maybe bitcoind was down?
+            self._validate()
+            raise Exception("Coinbase address is not validated!")
+        return util.script_to_address(self.address)    
+                   
+    def get_coinbase_data(self):
+        return ''
\ No newline at end of file