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:
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'''
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:
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(' '):
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')
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 = {}
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
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'])))