From 012a8830c61226f48d979db9800edf1862d83df4 Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Sun, 19 Jan 2014 17:05:35 -0500 Subject: [PATCH] ban peers that send shares that fail to validate --- p2pool/data.py | 6 +++++- p2pool/node.py | 11 +++++++++-- p2pool/p2p.py | 3 +-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/p2pool/data.py b/p2pool/data.py index 3ebc1f7..0ce4f7a 100644 --- a/p2pool/data.py +++ b/p2pool/data.py @@ -438,6 +438,7 @@ 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? @@ -464,6 +465,9 @@ class OkayTracker(forest.Tracker): for bad in bads: assert bad not in self.verified.items 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) @@ -527,7 +531,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 -- 1.7.1