From ef86e467e4a82ec51d4e51230fa505eb9ca53d8e Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Fri, 2 Nov 2012 15:36:39 -0400 Subject: [PATCH] include merged mining work in simulated mining --- p2pool/test/test_node.py | 28 ++++++++++++++++++++++++---- p2pool/work.py | 6 +++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/p2pool/test/test_node.py b/p2pool/test/test_node.py index 515f54a..756ff51 100644 --- a/p2pool/test/test_node.py +++ b/p2pool/test/test_node.py @@ -98,6 +98,20 @@ class bitcoind(object): "height" : 205801 } +@apply +class mm_provider(object): + def __getattr__(self, name): + print '>>>>>>>', name + def rpc_getauxblock(self, request, result1=None, result2=None): + if result1 is not None: + print result1, result2 + return True + return { + "target" : "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", # 2**256*2/3 + "hash" : "2756ea0315d46dc3d8d974f34380873fc88863845ac01a658ef11bc3b368af52", + "chainid" : 1 + } + mynet = math.Object( PARENT=networks.nets['litecoin_testnet'], SHARE_PERIOD=3, # seconds @@ -120,7 +134,7 @@ mynet = math.Object( class MiniNode(object): @classmethod @defer.inlineCallbacks - def start(cls, net, factory, bitcoind, peer_ports): + def start(cls, net, factory, bitcoind, peer_ports, merged_urls): self = cls() self.n = node.Node(factory, bitcoind, [], [], net) @@ -129,7 +143,7 @@ class MiniNode(object): self.n.p2p_node = node.P2PNode(self.n, 0, 1000000, {}, [('127.0.0.1', peer_port) for peer_port in peer_ports]) self.n.p2p_node.start() - wb = work.WorkerBridge(node=self.n, my_pubkey_hash=random.randrange(2**160), donation_percentage=random.uniform(0, 10), merged_urls=[], worker_fee=3) + wb = work.WorkerBridge(node=self.n, my_pubkey_hash=random.randrange(2**160), donation_percentage=random.uniform(0, 10), merged_urls=merged_urls, worker_fee=3) web_root = resource.Resource() worker_interface.WorkerInterface(wb).attach_to(web_root) self.web_port = reactor.listenTCP(0, server.Site(web_root)) @@ -146,10 +160,14 @@ class MiniNode(object): class Test(unittest.TestCase): @defer.inlineCallbacks def test_node(self): + mm_root = resource.Resource() + mm_root.putChild('', jsonrpc.Server(mm_provider)) + mm_port = reactor.listenTCP(0, server.Site(mm_root)) + n = node.Node(factory, bitcoind, [], [], mynet) yield n.start() - wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3) + wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[('http://127.0.0.1:%i' % (mm_port.getHost().port,), '')], worker_fee=3) web_root = resource.Resource() worker_interface.WorkerInterface(wb).attach_to(web_root) port = reactor.listenTCP(0, server.Site(web_root)) @@ -167,6 +185,7 @@ class Test(unittest.TestCase): assert len(n.tracker.items) == 100 assert n.tracker.verified.get_height(n.best_share_var.value) == 100 + wb.stop() n.stop() yield port.stopListening() @@ -177,6 +196,7 @@ class Test(unittest.TestCase): gc.collect() yield deferral.sleep(20) # waiting for work_poller to exit + yield mm_port.stopListening() #test_node.timeout = 15 @defer.inlineCallbacks @@ -190,7 +210,7 @@ class Test(unittest.TestCase): nodes = [] for i in xrange(N): - nodes.append((yield MiniNode.start(mynet, factory, bitcoind, [mn.n.p2p_node.serverfactory.listen_port.getHost().port for mn in nodes]))) + nodes.append((yield MiniNode.start(mynet, factory, bitcoind, [mn.n.p2p_node.serverfactory.listen_port.getHost().port for mn in nodes], []))) yield deferral.sleep(3) diff --git a/p2pool/work.py b/p2pool/work.py index 5a53f51..a28e7af 100644 --- a/p2pool/work.py +++ b/p2pool/work.py @@ -23,6 +23,7 @@ class WorkerBridge(worker_interface.WorkerBridge): self.donation_percentage = donation_percentage self.worker_fee = worker_fee + self.running = True self.pseudoshare_received = variable.Event() self.share_received = variable.Event() self.local_rate_monitor = math.RateMonitor(10*60) @@ -60,7 +61,7 @@ class WorkerBridge(worker_interface.WorkerBridge): @defer.inlineCallbacks def set_merged_work(merged_url, merged_userpass): merged_proxy = jsonrpc.Proxy(merged_url, dict(Authorization='Basic ' + base64.b64encode(merged_userpass))) - while True: + while self.running: auxblock = yield deferral.retry('Error while calling merged getauxblock:', 30)(merged_proxy.rpc_getauxblock)() self.merged_work.set(dict(self.merged_work.value, **{auxblock['chainid']: dict( hash=int(auxblock['hash'], 16), @@ -111,6 +112,9 @@ class WorkerBridge(worker_interface.WorkerBridge): self.merged_work.changed.watch(lambda _: self.new_work_event.happened()) self.node.best_share_var.changed.watch(lambda _: self.new_work_event.happened()) + def stop(self): + self.running = False + def get_stale_counts(self): '''Returns (orphans, doas), total, (orphans_recorded_in_chain, doas_recorded_in_chain)''' my_shares = len(self.my_share_hashes) -- 1.7.1