From: Forrest Voight Date: Mon, 27 Jan 2014 13:55:29 +0000 (-0500) Subject: Merge branch 'chk-genesis' of https://github.com/iongchun/p2pool into HEAD X-Git-Url: https://git.novaco.in/?p=p2pool.git;a=commitdiff_plain;h=d43be753b133c401cbc5a933229a42d2f1d76e54;hp=ee5819f595c7fd367f6aa7984ffabdfc5bb60f16 Merge branch 'chk-genesis' of https://github.com/iongchun/p2pool into HEAD --- diff --git a/p2pool/data.py b/p2pool/data.py index 3ebc1f7..e8fe347 100644 --- a/p2pool/data.py +++ b/p2pool/data.py @@ -430,7 +430,7 @@ class OkayTracker(forest.Tracker): try: share.check(self) except: - log.err(None, 'Share check failed:') + log.err(None, 'Share check failed: %064x -> %064x' % (share.hash, share.previous_hash if share.previous_hash is not None else 0)) return False else: self.verified.add(share) @@ -438,21 +438,21 @@ class OkayTracker(forest.Tracker): def think(self, block_rel_height_func, previous_block, bits, known_txs): desired = set() + bad_peer_addresses = set() # O(len(self.heads)) # make 'unverified heads' set? # for each overall head, attempt verification # if it fails, attempt on parent, and repeat # if no successful verification because of lack of parents, request parent - bads = set() + bads = [] for head in set(self.heads) - set(self.verified.heads): head_height, last = self.get_height_and_last(head) for share in self.get_chain(head, head_height if last is None else min(5, max(0, head_height - self.net.CHAIN_LENGTH))): if self.attempt_verify(share): break - if share.hash in self.heads: - bads.add(share.hash) + bads.append(share.hash) else: if last is not None: desired.add(( @@ -463,10 +463,16 @@ class OkayTracker(forest.Tracker): )) for bad in bads: assert bad not in self.verified.items - assert bad in self.heads + #assert bad in self.heads + bad_share = self.items[bad] + if bad_share.peer_addr is not None: + bad_peer_addresses.add(bad_share.peer_addr) if p2pool.DEBUG: print "BAD", bad - self.remove(bad) + try: + self.remove(bad) + except NotImplementedError: + pass # try to get at least CHAIN_LENGTH height for each verified head, requesting parents if needed for head in list(self.verified.heads): @@ -527,7 +533,7 @@ class OkayTracker(forest.Tracker): for peer_addr, hash, ts, targ in desired: print ' ', None if peer_addr is None else '%s:%i' % peer_addr, format_hash(hash), math.format_dt(time.time() - ts), bitcoin_data.target_to_difficulty(targ), ts >= timestamp_cutoff, targ <= target_cutoff - return best, [(peer_addr, hash) for peer_addr, hash, ts, targ in desired if ts >= timestamp_cutoff], decorated_heads + return best, [(peer_addr, hash) for peer_addr, hash, ts, targ in desired if ts >= timestamp_cutoff], decorated_heads, bad_peer_addresses def score(self, share_hash, block_rel_height_func): # returns approximate lower bound on chain's hashrate in the last self.net.CHAIN_LENGTH*15//16*self.net.SHARE_PERIOD time diff --git a/p2pool/node.py b/p2pool/node.py index 2b25fbe..4a91620 100644 --- a/p2pool/node.py +++ b/p2pool/node.py @@ -292,16 +292,23 @@ class Node(object): 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) + best, desired, decorated_heads, bad_peer_addresses = self.tracker.think(self.get_height_rel_highest, self.bitcoind_work.value['previous_block'], self.bitcoind_work.value['bits'], self.known_txs_var.value) self.best_share_var.set(best) self.desired_var.set(desired) + if self.p2p_node is not None: + for bad_peer_address in bad_peer_addresses: + # XXX O(n) + for peer in self.p2p_node.peers.itervalues(): + if peer.addr == bad_peer_address: + peer.badPeerHappened() + break def get_current_txouts(self): return p2pool_data.get_expected_payouts(self.tracker, self.best_share_var.value, self.bitcoind_work.value['bits'].target, self.bitcoind_work.value['subsidy'], self.net) def clean_tracker(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) + best, desired, decorated_heads, bad_peer_addresses = self.tracker.think(self.get_height_rel_highest, self.bitcoind_work.value['previous_block'], self.bitcoind_work.value['bits'], self.known_txs_var.value) # eat away at heads if decorated_heads: diff --git a/p2pool/p2p.py b/p2pool/p2p.py index 707d346..94db442 100644 --- a/p2pool/p2p.py +++ b/p2pool/p2p.py @@ -94,8 +94,7 @@ class Protocol(p2protocol.Protocol): self.badPeerHappened() def badPeerHappened(self): - if p2pool.DEBUG: - print "Bad peer banned:", self.addr + print "Bad peer banned:", self.addr self.disconnect() if self.transport.getPeer().host != '127.0.0.1': # never ban localhost self.node.bans[self.transport.getPeer().host] = time.time() + 60*60 diff --git a/p2pool/web.py b/p2pool/web.py index 4400e7d..034baa5 100644 --- a/p2pool/web.py +++ b/p2pool/web.py @@ -443,6 +443,6 @@ def get_web_root(wb, datadir_path, bitcoind_getinfo_var, stop_event=variable.Eve hd.datastreams['getwork_latency'].add_datum(time.time(), new_work['latency']) new_root.putChild('graph_data', WebInterface(lambda source, view: hd.datastreams[source].dataviews[view].get_data(time.time()))) - web_root.putChild('static', static.File(os.path.join(os.path.dirname(sys.argv[0]), 'web-static'))) + web_root.putChild('static', static.File(os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), 'web-static'))) return web_root