From ca2e77d2d90638705eaa1e7e1db61fe05669c6d4 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Mon, 31 Dec 2012 16:54:37 -0500 Subject: [PATCH] cache work by rolling coinbase --- p2pool/bitcoin/worker_interface.py | 34 ++++++++++++++++++++++++++++++++++ p2pool/main.py | 5 +++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/p2pool/bitcoin/worker_interface.py b/p2pool/bitcoin/worker_interface.py index 98daf21..0e6d9b9 100644 --- a/p2pool/bitcoin/worker_interface.py +++ b/p2pool/bitcoin/worker_interface.py @@ -98,3 +98,37 @@ class WorkerInterface(object): print 'POLL %i END identifier=%i' % (id, self.worker_bridge.new_work_event.times) defer.returnValue(res.getwork(identifier=str(self.worker_bridge.new_work_event.times), submitold=True)) + +class CachingWorkerBridge(object): + def __init__(self, inner): + self._inner = inner + + self.COINBASE_NONCE_LENGTH = (inner.COINBASE_NONCE_LENGTH+1)//2 + self.new_work_event = inner.new_work_event + self.preprocess_request = inner.preprocess_request + + self._my_bits = (self._inner.COINBASE_NONCE_LENGTH - self.COINBASE_NONCE_LENGTH)*8 + + self._cache = {} + self._times = None + + def get_work(self, *args): + if self._times != self.new_work_event.times: + self._cache = {} + self._times = self.new_work_event.times + + if args not in self._cache: + x, handler = self._inner.get_work(*args) + self._cache[args] = x, handler, 0 + + x, handler, nonce = self._cache.pop(args) + + res = ( + dict(x, coinb1=x['coinb1'] + pack.IntType(self._my_bits).pack(nonce)), + lambda header, user, coinbase_nonce: handler(header, user, pack.IntType(self._my_bits).pack(nonce) + coinbase_nonce), + ) + + if nonce + 1 != 2**self._my_bits: + self._cache[args] = x, handler, nonce + 1 + + return res diff --git a/p2pool/main.py b/p2pool/main.py index ee94079..a0e5ff3 100644 --- a/p2pool/main.py +++ b/p2pool/main.py @@ -213,11 +213,12 @@ def main(args, net, datadir_path, merged_urls, worker_endpoint): wb = work.WorkerBridge(node, my_pubkey_hash, args.donation_percentage, merged_urls, args.worker_fee) web_root = web.get_web_root(wb, datadir_path, bitcoind_warning_var) - worker_interface.WorkerInterface(wb).attach_to(web_root, get_handler=lambda request: request.redirect('/static/')) + caching_wb = worker_interface.CachingWorkerBridge(wb) + worker_interface.WorkerInterface(caching_wb).attach_to(web_root, get_handler=lambda request: request.redirect('/static/')) web_serverfactory = server.Site(web_root) - serverfactory = switchprotocol.FirstByteSwitchFactory({'{': stratum.StratumServerFactory(wb)}, web_serverfactory) + serverfactory = switchprotocol.FirstByteSwitchFactory({'{': stratum.StratumServerFactory(caching_wb)}, web_serverfactory) deferral.retry('Error binding to worker port:', traceback=False)(reactor.listenTCP)(worker_endpoint[1], serverfactory, interface=worker_endpoint[0]) with open(os.path.join(os.path.join(datadir_path, 'ready_flag')), 'wb') as f: -- 1.7.1