PeerGroup, FilterMerger: deprecate setting false-positive rate

In the bitcoinj code itself, the false-positive rate is never changed
after constructing a `PeerGroup` or a `FilterMerger`.

* Deprecate methods for setting Bloom Filter FP rate in both methods
* Add constructor params to `PeerGroup` so they can be set at construction
  time, if non-default values are needed
This commit is contained in:
Sean Gilligan 2023-08-12 19:48:41 -07:00 committed by Andreas Schildbach
parent 5955eee4c8
commit 81b78292e2
3 changed files with 20 additions and 4 deletions

View file

@ -417,7 +417,19 @@ public class PeerGroup implements TransactionBroadcaster {
* @param connectionManager used to create new connections and keep track of existing ones.
*/
protected PeerGroup(Network network, @Nullable AbstractBlockChain chain, ClientConnectionManager connectionManager) {
this(NetworkParameters.of(Objects.requireNonNull(network)), chain, connectionManager);
this(NetworkParameters.of(Objects.requireNonNull(network)), chain, connectionManager, DEFAULT_BLOOM_FILTER_FP_RATE);
}
/**
* Create a PeerGroup for the given network, chain and connection manager.
* @param network the P2P network to connect to
* @param chain used to process blocks
* @param connectionManager used to create new connections and keep track of existing ones.
* @param bloomFilterFpRate false positive rate for bloom filters
*/
protected PeerGroup(Network network, @Nullable AbstractBlockChain chain, ClientConnectionManager connectionManager, double bloomFilterFpRate) {
this(NetworkParameters.of(Objects.requireNonNull(network)), chain, connectionManager, bloomFilterFpRate);
}
/**
@ -425,9 +437,10 @@ public class PeerGroup implements TransactionBroadcaster {
* @param params the P2P network to connect to
* @param chain used to process blocks
* @param connectionManager used to create new connections and keep track of existing ones.
* @param bloomFilterFpRate false positive rate for bloom filters
*/
// For testing only
protected PeerGroup(NetworkParameters params, @Nullable AbstractBlockChain chain, ClientConnectionManager connectionManager) {
protected PeerGroup(NetworkParameters params, @Nullable AbstractBlockChain chain, ClientConnectionManager connectionManager, double bloomFilterFpRate) {
Objects.requireNonNull(params);
Context.getOrCreate(); // create a context for convenience
this.params = params;
@ -473,7 +486,7 @@ public class PeerGroup implements TransactionBroadcaster {
channels = connectionManager;
peerDiscoverers = new CopyOnWriteArraySet<>();
runningBroadcasts = Collections.synchronizedSet(new HashSet<TransactionBroadcast>());
bloomFilterMerger = new FilterMerger(DEFAULT_BLOOM_FILTER_FP_RATE);
bloomFilterMerger = new FilterMerger(bloomFilterFpRate);
vMinRequiredProtocolVersion = ProtocolVersion.BLOOM_FILTER.intValue();
}
@ -1430,6 +1443,7 @@ public class PeerGroup implements TransactionBroadcaster {
* <p>See the docs for {@link BloomFilter#BloomFilter(int, double, int, BloomFilter.BloomUpdate)} for a brief
* explanation of anonymity when using bloom filters.</p>
*/
@Deprecated
public void setBloomFilterFalsePositiveRate(double bloomFilterFPRate) {
lock.lock();
try {

View file

@ -46,6 +46,7 @@ public class FilterMerger {
// We use a constant tweak to avoid giving up privacy when we regenerate our filter with new keys
private final int bloomFilterTweak = new Random().nextInt();
// TODO: Make final after deprecated setBloomFilterFPRate() method is removed
private volatile double vBloomFilterFPRate;
private int lastBloomFilterElementCount;
private BloomFilter lastFilter;
@ -108,6 +109,7 @@ public class FilterMerger {
}
}
@Deprecated
public void setBloomFilterFPRate(double bloomFilterFPRate) {
this.vBloomFilterFPRate = bloomFilterFPRate;
}

View file

@ -113,7 +113,7 @@ public class TestWithPeerGroup extends TestWithNetworkConnections {
protected final Semaphore jobBlocks = new Semaphore(0);
private PeerGroup createPeerGroup(final ClientConnectionManager manager) {
return new PeerGroup(UNITTEST, blockChain, manager) {
return new PeerGroup(UNITTEST, blockChain, manager, PeerGroup.DEFAULT_BLOOM_FILTER_FP_RATE) {
@Override
protected ListeningScheduledExecutorService createPrivateExecutor() {
return MoreExecutors.listeningDecorator(new ScheduledThreadPoolExecutor(1, new ContextPropagatingThreadFactory("PeerGroup test thread")) {