include merged mining work in simulated mining
authorForrest Voight <forrest@forre.st>
Fri, 2 Nov 2012 19:36:39 +0000 (15:36 -0400)
committerForrest Voight <forrest@forre.st>
Fri, 2 Nov 2012 20:44:41 +0000 (16:44 -0400)
p2pool/test/test_node.py
p2pool/work.py

index 515f54a..756ff51 100644 (file)
@@ -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)
         
index 5a53f51..a28e7af 100644 (file)
@@ -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)