From fff5af29ff8666e939e72ed68ce7b23afca2c22f Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Thu, 30 Jan 2014 17:43:33 +0100 Subject: [PATCH] Recalculate but don't rebroadcast bloom filters when a p2pubkey output is received. Resolves issue 513. --- .../com/google/bitcoin/core/PeerGroup.java | 79 +++++++++++++------ .../bitcoin/core/InboundMessageQueuer.java | 11 ++- .../google/bitcoin/core/PeerGroupTest.java | 33 ++++++++ .../bitcoin/core/TestWithPeerGroup.java | 5 +- 4 files changed, 99 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/google/bitcoin/core/PeerGroup.java b/core/src/main/java/com/google/bitcoin/core/PeerGroup.java index 79c45c37..209a137c 100644 --- a/core/src/main/java/com/google/bitcoin/core/PeerGroup.java +++ b/core/src/main/java/com/google/bitcoin/core/PeerGroup.java @@ -127,28 +127,39 @@ public class PeerGroup extends AbstractExecutionThreadService implements Transac double rate = checkNotNull(chain).getFalsePositiveRate(); if (rate > bloomFilterFPRate * MAX_FP_RATE_INCREASE) { log.info("Force update Bloom filter due to high false positive rate"); - recalculateFastCatchupAndFilter(true); + recalculateFastCatchupAndFilter(FilterRecalculateMode.FORCE_SEND); } } }; private int minBroadcastConnections = 0; - private Runnable recalculateRunnable = new Runnable() { + private Runnable bloomSendIfChanged = new Runnable() { @Override public void run() { - recalculateFastCatchupAndFilter(false); + recalculateFastCatchupAndFilter(FilterRecalculateMode.SEND_IF_CHANGED); + } + }; + private Runnable bloomDontSend = new Runnable() { + @Override public void run() { + recalculateFastCatchupAndFilter(FilterRecalculateMode.DONT_SEND); } }; private AbstractWalletEventListener walletEventListener = new AbstractWalletEventListener() { - private void queueRecalc() { - Uninterruptibles.putUninterruptibly(jobQueue, recalculateRunnable); + private void queueRecalc(boolean andTransmit) { + if (andTransmit) { + log.info("Queuing recalc of the Bloom filter due to new keys or scripts becoming available"); + Uninterruptibles.putUninterruptibly(jobQueue, bloomSendIfChanged); + } else { + log.info("Queuing recalc of the Bloom filter due to observing a pay to pubkey output on a relevant tx"); + Uninterruptibles.putUninterruptibly(jobQueue, bloomDontSend); + } } @Override public void onScriptsAdded(Wallet wallet, List