From 1d2115fa5cfc9bcdd3b15f7981262e801034dee1 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Wed, 31 Oct 2012 01:34:50 -0400 Subject: [PATCH] added testcase for node+work that simulates mining 100 shares --- p2pool/bitcoin/networks.py | 2 +- p2pool/networks.py | 2 +- p2pool/node.py | 12 +++++-- p2pool/test/test_node.py | 80 ++++++++++++++++++++++++++++++++++++++++++++ p2pool/work.py | 2 +- 5 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 p2pool/test/test_node.py diff --git a/p2pool/bitcoin/networks.py b/p2pool/bitcoin/networks.py index 6e074f3..30666cd 100644 --- a/p2pool/bitcoin/networks.py +++ b/p2pool/bitcoin/networks.py @@ -115,7 +115,7 @@ nets = dict( CONF_FILE_FUNC=lambda: os.path.join(os.path.join(os.environ['APPDATA'], 'Litecoin') if platform.system() == 'Windows' else os.path.expanduser('~/Library/Application Support/Litecoin/') if platform.system() == 'Darwin' else os.path.expanduser('~/.litecoin'), 'litecoin.conf'), BLOCK_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/block/', ADDRESS_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/address/', - SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256//1000 - 1), + SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256 - 1), ), ) for net_name, net in nets.iteritems(): diff --git a/p2pool/networks.py b/p2pool/networks.py index 2513248..30d266d 100644 --- a/p2pool/networks.py +++ b/p2pool/networks.py @@ -70,7 +70,7 @@ nets = dict( IDENTIFIER='cca5e24ec6408b1e'.decode('hex'), PREFIX='ad9614f6466a39cf'.decode('hex'), P2P_PORT=19338, - MAX_TARGET=2**256//2000 - 1, + MAX_TARGET=2**256 - 1, PERSIST=False, WORKER_PORT=19327, BOOTSTRAP_ADDRS='72.14.191.28'.split(' '), diff --git a/p2pool/node.py b/p2pool/node.py index c0ff82c..4a90646 100644 --- a/p2pool/node.py +++ b/p2pool/node.py @@ -174,7 +174,7 @@ class Node(object): self.bitcoind_work = variable.Variable((yield helper.getwork(self.bitcoind))) @defer.inlineCallbacks def work_poller(): - while True: + while stop_signal.times == 0: flag = self.factory.new_block.get_deferred() try: self.bitcoind_work.set((yield helper.getwork(self.bitcoind, self.bitcoind_work.value['use_getblocktemplate']))) @@ -204,6 +204,8 @@ class Node(object): self.handle_header = handle_header @defer.inlineCallbacks def poll_header(): + if self.factory.conn.value is None: + return handle_header((yield self.factory.conn.value.get_block_header(self.bitcoind_work.value['previous_block']))) self.bitcoind_work.changed.watch(lambda _: poll_header()) yield deferral.retry('Error while requesting best block header:')(poll_header)() @@ -272,9 +274,13 @@ class Node(object): if tx_hash in self.known_txs_var.value: new_known_txs[tx_hash] = self.known_txs_var.value[tx_hash] self.known_txs_var.set(new_known_txs) - task.LoopingCall(forget_old_txs).start(10) + t = task.LoopingCall(forget_old_txs) + t.start(10) + stop_signal.watch(t.stop) - task.LoopingCall(self.clean_tracker).start(5) + t = task.LoopingCall(self.clean_tracker) + t.start(5) + stop_signal.watch(t.stop) def set_best_share(self): best, desired, decorated_heads = self.tracker.think(self.get_height_rel_highest, self.bitcoind_work.value['previous_block'], self.bitcoind_work.value['bits'], self.known_txs_var.value) diff --git a/p2pool/test/test_node.py b/p2pool/test/test_node.py new file mode 100644 index 0000000..d41c1b7 --- /dev/null +++ b/p2pool/test/test_node.py @@ -0,0 +1,80 @@ +from twisted.internet import defer +from twisted.trial import unittest + +from p2pool import networks, node, work +from p2pool.util import deferral, variable + +class factory(object): + new_headers = variable.Event() + new_block = variable.Event() + new_tx = variable.Event() + conn = variable.Variable(None) + @classmethod + def getProtocol(self): + return defer.Deferred() + +class bitcoind(object): + @classmethod + def rpc_help(self): + return '\ngetblock ' + + @classmethod + def rpc_getblock(self, block_hash_hex): + return dict(height=42) + + @classmethod + def rpc_getmemorypool(self): + return { + "version" : 2, + "previousblockhash" : "000000000000016c169477c25421250ec5d32cf9c6d38538b5de970a2355fd89", + "transactions" : [ + ], + "coinbaseaux" : { + "flags" : "062f503253482f" + }, + "coinbasevalue" : 5044450000, + "target" : "0000000000000513c50000000000000000000000000000000000000000000000", + "mintime" : 1351655621, + "mutable" : [ + "time", + "transactions", + "prevblock" + ], + "noncerange" : "00000000ffffffff", + "sigoplimit" : 20000, + "sizelimit" : 1000000, + "curtime" : 1351659940, + "bits" : "1a0513c5", + "height" : 205801 + } + +class FakeRequest(object): + def getUser(self): + return 'fakeuser' + def getClientIP(self): + return 'fakeclientip' + +class Test(unittest.TestCase): + @defer.inlineCallbacks + def test_node(self): + net = networks.nets['litecoin_testnet'] + n = node.Node(factory, bitcoind, [], [], net) + yield n.start() + + wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3) + + yield deferral.sleep(3) + + for i in xrange(100): + ba, got_resp = wb.get_work(pubkey_hash=4242, desired_share_target=2**256-1, desired_pseudoshare_target=2**256-1) + got_resp(dict(version=ba.version, previous_block=ba.previous_block, merkle_root=ba.merkle_root, timestamp=ba.timestamp, bits=ba.bits, nonce=42), FakeRequest()) + yield deferral.sleep(.01) + + yield deferral.sleep(3) + + assert len(n.tracker.items) == 100 + assert n.tracker.verified.get_height(n.best_share_var.value) == 100 + + n.stop() + + yield deferral.sleep(20) # waiting for work_poller to exit diff --git a/p2pool/work.py b/p2pool/work.py index 7c8d374..21b77ac 100644 --- a/p2pool/work.py +++ b/p2pool/work.py @@ -160,7 +160,7 @@ class WorkerBridge(worker_interface.WorkerBridge): return pubkey_hash, desired_share_target, desired_pseudoshare_target def get_work(self, pubkey_hash, desired_share_target, desired_pseudoshare_target): - if len(self.node.p2p_node.peers) == 0 and self.node.net.PERSIST: + if (self.node.p2p_node is None or len(self.node.p2p_node.peers) == 0) and self.node.net.PERSIST: raise jsonrpc.Error_for_code(-12345)(u'p2pool is not connected to any peers') if self.node.best_share_var.value is None and self.node.net.PERSIST: raise jsonrpc.Error_for_code(-12345)(u'p2pool is downloading shares') -- 1.7.1