Removed worker_interface's dependency on bitcoin_data and net
authorForrest Voight <forrest@forre.st>
Fri, 2 Dec 2011 00:44:12 +0000 (19:44 -0500)
committerForrest Voight <forrest@forre.st>
Fri, 2 Dec 2011 03:31:38 +0000 (22:31 -0500)
p2pool/bitcoin/data.py
p2pool/main.py
p2pool/worker_interface.py

index 59981e7..6b81aac 100644 (file)
@@ -352,7 +352,7 @@ class FloatingInteger(object):
         elif isinstance(other, (int, long)):
             return cmp(self._value, other)
         else:
-            raise NotImplementedError()
+            raise NotImplementedError(other)
     
     def __int__(self):
         return self._value
index 4030d1c..d577c70 100644 (file)
@@ -398,8 +398,19 @@ def main(args):
         def _(share):
             if share.hash in my_shares and tracker.is_child_of(share.hash, current_work.value['best_share_hash']):
                 removed_unstales.add(share.hash)
-
-        def compute(state, payout_script):
+        
+        
+        def get_payout_script_from_username(request):
+            user = worker_interface.get_username(request)
+            if user is None:
+                return None
+            try:
+                return bitcoin_data.pubkey_hash_to_script2(bitcoin_data.address_to_pubkey_hash(user, args.net))
+            except: # XXX blah
+                return None
+        
+        def compute(state, request):
+            payout_script = get_payout_script_from_username(request)
             if payout_script is None or random.uniform(0, 100) < args.worker_fee:
                 payout_script = my_script
             if state['best_share_hash'] is None and args.net.PERSIST:
@@ -479,10 +490,10 @@ def main(args):
         doa_shares = set()
         times = {}
         
-        def got_response(data, user):
+        def got_response(header, request):
             try:
+                user = worker_interface.get_username(request)
                 # match up with transactions
-                header = bitcoin.getwork.decode_data(data)
                 xxx = merkle_root_to_transactions.get(header['merkle_root'], None)
                 if xxx is None:
                     print '''Couldn't link returned work's merkle root with its transactions - should only happen if you recently restarted p2pool'''
@@ -548,7 +559,7 @@ def main(args):
                 log.err(None, 'Error processing data received from worker:')
                 return False
         
-        web_root = worker_interface.WorkerInterface(current_work, compute, got_response, args.net)
+        web_root = worker_interface.WorkerInterface(current_work, compute, got_response)
         
         def get_rate():
             if current_work.value['best_share_hash'] is not None:
index c87db86..da791b5 100644 (file)
@@ -10,22 +10,7 @@ from twisted.python import log
 import p2pool
 from p2pool import data as p2pool_data
 from p2pool.util import jsonrpc, deferred_resource, variable
-from p2pool.bitcoin import data as bitcoin_data
-
-def get_username(request):
-    try:
-        return base64.b64decode(request.getHeader('Authorization').split(' ', 1)[1]).split(':')[0]
-    except: # XXX
-        return None
-
-def get_payout_script(request, net):
-    user = get_username(request)
-    if user is None:
-        return None
-    try:
-        return bitcoin_data.pubkey_hash_to_script2(bitcoin_data.address_to_pubkey_hash(user, net))
-    except: # XXX blah
-        return None
+from p2pool.bitcoin import getwork
 
 def get_memory(request):
     if request.getHeader('X-Miner-Extensions') is not None and 'workidentifier' in request.getHeader('X-Miner-Extensions').split(' '):
@@ -44,6 +29,26 @@ def get_memory(request):
     print 'Unknown miner User-Agent:', repr(user_agent)
     return 0
 
+def get_max_target(request): # inclusive
+    if request.getHeader('X-All-Targets') is not None or (request.getHeader('X-Miner-Extensions') is not None and 'alltargets' in request.getHeader('X-Miner-Extensions')):
+        return 2**256-1
+    user_agent = request.getHeader('User-Agent')
+    user_agent2 = '' if user_agent is None else user_agent.lower()
+    if 'java' in user_agent2 or 'diablominer' in user_agent2: return 2**256//2**32-1 # hopefully diablominer...
+    if 'cpuminer' in user_agent2: return 2**256//2**32-1
+    if 'tenebrix miner' in user_agent2: return 2**256-1
+    if 'cgminer' in user_agent2: return 2**256//2**32-1
+    if 'poclbm' in user_agent2: return 2**256//2**32-1
+    if 'phoenix' in user_agent2: return 2**256//2**32-1
+    print 'Unknown miner User-Agent:', repr(user_agent)
+    return 2**256//2**32-1
+
+def get_username(request):
+    try:
+        return base64.b64decode(request.getHeader('Authorization').split(' ', 1)[1]).split(':')[0]
+    except: # XXX
+        return None
+
 def get_id(request):
     return request.getClientIP(), request.getHeader('Authorization')
 
@@ -100,13 +105,12 @@ class LongPollingWorkerInterface(deferred_resource.DeferredResource):
     render_POST = render_GET
 
 class WorkerInterface(jsonrpc.Server):
-    def __init__(self, work, compute, response_callback, net):
+    def __init__(self, work, compute, response_callback):
         jsonrpc.Server.__init__(self)
         
         self.work = work
         self.compute = compute
         self.response_callback = response_callback
-        self.net = net
         self.holds = Holds()
         self.last_cache_invalidation = {}
         
@@ -119,7 +123,7 @@ class WorkerInterface(jsonrpc.Server):
         request.setHeader('X-Roll-NTime', 'expire=60')
         
         if data is not None:
-            defer.returnValue(self.response_callback(data, get_username(request)))
+            defer.returnValue(self.response_callback(getwork.decode_data(data), request))
         
         defer.returnValue((yield self.getwork(request)))
     rpc_getwork.takes_request = True
@@ -153,13 +157,12 @@ class WorkerInterface(jsonrpc.Server):
             if p2pool.DEBUG:
                 print 'POLL %i FAKED user=%r' % (id, get_username(request))
             self.holds.set_hold(request_id, .01)
-        res = self.compute(work, get_payout_script(request, self.net))
+        res = self.compute(work, request)
         
         self.last_cache_invalidation[request_id].set((thought_work[-1], work))
         if p2pool.DEBUG:
             print 'POLL %i END %s user=%r' % (id, p2pool_data.format_hash(work['best_share_hash']), get_username(request))
         
-        if request.getHeader('X-All-Targets') is None and res.share_target > self.net.MAX_TARGET:
-            res = res.update(share_target=self.net.MAX_TARGET)
-
+        res = res.update(share_target=min(res.share_target, get_max_target(request)))
+        
         defer.returnValue(res.getwork(identifier=str(work['best_share_hash'])))