From 7efab37c6c46ef29fd6e8b474744e48c20313875 Mon Sep 17 00:00:00 2001 From: Sean Gilligan Date: Sat, 15 Jul 2023 10:21:31 -0700 Subject: [PATCH] DnsDiscovery, MultiplexingDiscovery: use Network in constructors --- .../java/org/bitcoinj/core/PeerGroup.java | 2 +- .../java/org/bitcoinj/kits/WalletAppKit.java | 2 +- .../bitcoinj/net/discovery/DnsDiscovery.java | 46 +++++++++++---- .../net/discovery/MultiplexingDiscovery.java | 56 ++++++++++++++----- .../net/discovery/DnsDiscoveryTest.java | 10 ++-- .../org/bitcoinj/examples/FetchBlock.java | 2 +- .../org/bitcoinj/examples/PeerMonitor.java | 3 +- .../org/bitcoinj/examples/PrintPeers.java | 2 +- .../bitcoinj/examples/RestoreFromSeed.java | 2 +- .../org/bitcoinj/tools/BuildCheckpoints.java | 2 +- .../java/org/bitcoinj/tools/WatchMempool.java | 3 +- 11 files changed, 92 insertions(+), 38 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/PeerGroup.java b/core/src/main/java/org/bitcoinj/core/PeerGroup.java index f288803be..9a3a434a9 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerGroup.java +++ b/core/src/main/java/org/bitcoinj/core/PeerGroup.java @@ -1033,7 +1033,7 @@ public class PeerGroup implements TransactionBroadcaster { try { this.requiredServices = requiredServices; peerDiscoverers.clear(); - addPeerDiscovery(MultiplexingDiscovery.forServices(params, requiredServices)); + addPeerDiscovery(MultiplexingDiscovery.forServices(params.network(), requiredServices)); } finally { lock.unlock(); } diff --git a/core/src/main/java/org/bitcoinj/kits/WalletAppKit.java b/core/src/main/java/org/bitcoinj/kits/WalletAppKit.java index 3e6c32e4d..d3a88ca47 100644 --- a/core/src/main/java/org/bitcoinj/kits/WalletAppKit.java +++ b/core/src/main/java/org/bitcoinj/kits/WalletAppKit.java @@ -445,7 +445,7 @@ public class WalletAppKit extends AbstractIdleService implements Closeable { vPeerGroup.setMaxConnections(peerAddresses.length); peerAddresses = null; } else if (params.network() != BitcoinNetwork.REGTEST) { - vPeerGroup.addPeerDiscovery(discovery != null ? discovery : new DnsDiscovery(params)); + vPeerGroup.addPeerDiscovery(discovery != null ? discovery : new DnsDiscovery(network)); } vChain.addWallet(vWallet); vPeerGroup.addWallet(vWallet); diff --git a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java index f8e3fbd49..642cf6aa3 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java @@ -17,6 +17,7 @@ package org.bitcoinj.net.discovery; +import org.bitcoinj.base.Network; import org.bitcoinj.base.internal.PlatformUtils; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Services; @@ -52,27 +53,44 @@ public class DnsDiscovery extends MultiplexingDiscovery { /** * Supports finding peers through DNS A records. Community run DNS entry points will be used. * - * @param netParams Network parameters to be used for port information. + * @param network Network to be used for port information. */ - public DnsDiscovery(NetworkParameters netParams) { - this(netParams.getDnsSeeds(), netParams); + public DnsDiscovery(Network network) { + this(NetworkParameters.of(network).getDnsSeeds(), network); } /** * Supports finding peers through DNS A records. * * @param dnsSeeds Host names to be examined for seed addresses. - * @param params Network parameters to be used for port information. + * @param network Network to be used for port information. */ - public DnsDiscovery(String[] dnsSeeds, NetworkParameters params) { - super(params, buildDiscoveries(params, dnsSeeds)); + public DnsDiscovery(String[] dnsSeeds, Network network) { + super(network, buildDiscoveries(network, dnsSeeds)); } - private static List buildDiscoveries(NetworkParameters params, String[] seeds) { + /** + * @deprecated Use {@link DnsDiscovery#DnsDiscovery(Network)} + */ + @Deprecated + public DnsDiscovery(NetworkParameters netParams) { + this(netParams.getDnsSeeds(), netParams.network()); + } + + /** + * @deprecated Use {@link DnsDiscovery#DnsDiscovery(String[], Network)} + */ + @Deprecated + public DnsDiscovery(String[] dnsSeeds, NetworkParameters params) { + this(dnsSeeds, params.network()); + } + + + private static List buildDiscoveries(Network network, String[] seeds) { List discoveries = new ArrayList<>(); if (seeds != null) for (String seed : seeds) - discoveries.add(new DnsSeedDiscovery(params, seed)); + discoveries.add(new DnsSeedDiscovery(network, seed)); return discoveries; } @@ -91,9 +109,17 @@ public class DnsDiscovery extends MultiplexingDiscovery { private final String hostname; private final NetworkParameters params; - public DnsSeedDiscovery(NetworkParameters params, String hostname) { + public DnsSeedDiscovery(Network network, String hostname) { this.hostname = hostname; - this.params = params; + this.params = NetworkParameters.of(network); + } + + /** + * @deprecated Use {@link DnsSeedDiscovery#DnsSeedDiscovery(Network, String)} + */ + @Deprecated + public DnsSeedDiscovery(NetworkParameters params, String hostname) { + this(params.network(), hostname); } @Override diff --git a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java index f268d3c26..185cb2264 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java @@ -17,6 +17,7 @@ package org.bitcoinj.net.discovery; +import org.bitcoinj.base.Network; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Services; import org.bitcoinj.core.VersionMessage; @@ -50,6 +51,7 @@ public class MultiplexingDiscovery implements PeerDiscovery { private static final Logger log = LoggerFactory.getLogger(MultiplexingDiscovery.class); protected final List seeds; + @Deprecated protected final NetworkParameters netParams; private volatile ExecutorService vThreadPool; private final boolean parallelQueries; @@ -57,41 +59,69 @@ public class MultiplexingDiscovery implements PeerDiscovery { /** * Builds a suitable set of peer discoveries. Will query them in parallel before producing a merged response. - * @param params Network to use. + * @param network Network to use. * @param services Required services as a bitmask, e.g. {@link Services#NODE_NETWORK}. */ - public static MultiplexingDiscovery forServices(NetworkParameters params, long services) { - return forServices(params, services, true, true); + public static MultiplexingDiscovery forServices(Network network, long services) { + return forServices(network, services, true, true); } /** * Builds a suitable set of peer discoveries. - * @param params Network to use. + * @param network Network to use. * @param services Required services as a bitmask, e.g. {@link Services#NODE_NETWORK}. * @param parallelQueries When true, seeds are queried in parallel * @param shufflePeers When true, queried peers are shuffled */ - public static MultiplexingDiscovery forServices(NetworkParameters params, long services, boolean parallelQueries, + public static MultiplexingDiscovery forServices(Network network, long services, boolean parallelQueries, boolean shufflePeers) { List discoveries = new ArrayList<>(); - String[] dnsSeeds = params.getDnsSeeds(); + String[] dnsSeeds = NetworkParameters.of(network).getDnsSeeds(); if (dnsSeeds != null) for (String dnsSeed : dnsSeeds) - discoveries.add(new DnsSeedDiscovery(params, dnsSeed)); - return new MultiplexingDiscovery(params, discoveries, parallelQueries, shufflePeers); + discoveries.add(new DnsSeedDiscovery(network, dnsSeed)); + return new MultiplexingDiscovery(network, discoveries, parallelQueries, shufflePeers); + } + + /** + * @deprecated Use {@link #forServices(Network, long)} + */ + @Deprecated + public static MultiplexingDiscovery forServices(NetworkParameters params, long services) { + return forServices(params.network(), services); + } + + /** + * @deprecated Use {@link #forServices(Network, long, boolean, boolean)} + */ + @Deprecated + public static MultiplexingDiscovery forServices(NetworkParameters params, long services, boolean parallelQueries, + boolean shufflePeers) { + return forServices(params.network(), services, parallelQueries, shufflePeers); } /** * Will query the given seeds in parallel before producing a merged response. + * @param network The network we are querying for + * @param seeds Sources to query in parallel */ - public MultiplexingDiscovery(NetworkParameters params, List seeds) { - this(params, seeds, true, true); + public MultiplexingDiscovery(Network network, List seeds) { + this(network, seeds, true, true); } - private MultiplexingDiscovery(NetworkParameters params, List seeds, boolean parallelQueries, + /** + * Will query the given seeds in parallel before producing a merged response. + * @deprecated Use {@link MultiplexingDiscovery#MultiplexingDiscovery(Network, List)} + */ + @Deprecated + public MultiplexingDiscovery(NetworkParameters params, List seeds) { + this(params.network(), seeds); + } + + private MultiplexingDiscovery(Network network, List seeds, boolean parallelQueries, boolean shufflePeers) { - checkArgument(!seeds.isEmpty() || params.network() == REGTEST); - this.netParams = params; + checkArgument(!seeds.isEmpty() || network == REGTEST); + this.netParams = NetworkParameters.of(network); this.seeds = seeds; this.parallelQueries = parallelQueries; this.shufflePeers = shufflePeers; diff --git a/core/src/test/java/org/bitcoinj/net/discovery/DnsDiscoveryTest.java b/core/src/test/java/org/bitcoinj/net/discovery/DnsDiscoveryTest.java index 2fa72ba0b..8fdd542b3 100644 --- a/core/src/test/java/org/bitcoinj/net/discovery/DnsDiscoveryTest.java +++ b/core/src/test/java/org/bitcoinj/net/discovery/DnsDiscoveryTest.java @@ -16,7 +16,7 @@ package org.bitcoinj.net.discovery; -import org.bitcoinj.params.MainNetParams; +import org.bitcoinj.base.BitcoinNetwork; import org.junit.Test; import java.net.InetSocketAddress; @@ -32,7 +32,7 @@ public class DnsDiscoveryTest { @Test public void testBuildDiscoveries() throws PeerDiscoveryException { String[] seeds = new String[] { "seed.bitcoin.sipa.be", "dnsseed.bluematt.me" }; - DnsDiscovery dnsDiscovery = new DnsDiscovery(seeds, MainNetParams.get()); + DnsDiscovery dnsDiscovery = new DnsDiscovery(seeds, BitcoinNetwork.MAINNET); assertTrue(dnsDiscovery.seeds.size() == 2); for (PeerDiscovery peerDiscovery : dnsDiscovery.seeds) { assertTrue(peerDiscovery.getPeers(0, Duration.ofMillis(100)).size() > 0); @@ -41,13 +41,13 @@ public class DnsDiscoveryTest { @Test(expected = PeerDiscoveryException.class) public void testGetPeersThrowsPeerDiscoveryExceptionWithServicesGreaterThanZero() throws PeerDiscoveryException { - DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), ""); + DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(BitcoinNetwork.MAINNET, ""); dnsSeedDiscovery.getPeers(1, Duration.ofMillis(100)); } @Test public void testGetPeersReturnsNotEmptyListOfSocketAddresses() throws PeerDiscoveryException { - DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), + DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(BitcoinNetwork.MAINNET, "localhost"); List inetSocketAddresses = dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100)); assertNotEquals(0, inetSocketAddresses.size()); @@ -55,7 +55,7 @@ public class DnsDiscoveryTest { @Test(expected = PeerDiscoveryException.class) public void testGetPeersThrowsPeerDiscoveryExceptionForUnknownHost() throws PeerDiscoveryException { - DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), + DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(BitcoinNetwork.MAINNET, "unknown host"); dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100)); } diff --git a/examples/src/main/java/org/bitcoinj/examples/FetchBlock.java b/examples/src/main/java/org/bitcoinj/examples/FetchBlock.java index 76c52b973..a0a7ae63e 100644 --- a/examples/src/main/java/org/bitcoinj/examples/FetchBlock.java +++ b/examples/src/main/java/org/bitcoinj/examples/FetchBlock.java @@ -62,7 +62,7 @@ public class FetchBlock implements Callable { BlockChain chain = new BlockChain(network, blockStore); PeerGroup peerGroup = new PeerGroup(network, chain); if (localhost) { - peerGroup.addPeerDiscovery(new DnsDiscovery(params)); + peerGroup.addPeerDiscovery(new DnsDiscovery(network)); } else { PeerAddress addr = PeerAddress.localhost(params); peerGroup.addAddress(addr); diff --git a/examples/src/main/java/org/bitcoinj/examples/PeerMonitor.java b/examples/src/main/java/org/bitcoinj/examples/PeerMonitor.java index 320b20db5..70c271071 100644 --- a/examples/src/main/java/org/bitcoinj/examples/PeerMonitor.java +++ b/examples/src/main/java/org/bitcoinj/examples/PeerMonitor.java @@ -21,7 +21,6 @@ import org.bitcoinj.base.BitcoinNetwork; import org.bitcoinj.base.Network; import org.bitcoinj.core.AddressMessage; import org.bitcoinj.base.Coin; -import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Peer; import org.bitcoinj.core.PeerAddress; import org.bitcoinj.core.PeerGroup; @@ -72,7 +71,7 @@ public class PeerMonitor { peerGroup = new PeerGroup(network, null /* no chain */); peerGroup.setUserAgent("PeerMonitor", "1.0"); peerGroup.setMaxConnections(4); - peerGroup.addPeerDiscovery(new DnsDiscovery(NetworkParameters.of(network))); + peerGroup.addPeerDiscovery(new DnsDiscovery(network)); peerGroup.addConnectedEventListener((peer, peerCount) -> { refreshUI(); lookupReverseDNS(peer); diff --git a/examples/src/main/java/org/bitcoinj/examples/PrintPeers.java b/examples/src/main/java/org/bitcoinj/examples/PrintPeers.java index 4101d27a6..fdbf13a04 100644 --- a/examples/src/main/java/org/bitcoinj/examples/PrintPeers.java +++ b/examples/src/main/java/org/bitcoinj/examples/PrintPeers.java @@ -57,7 +57,7 @@ public class PrintPeers { private static void printDNS(Network network) throws PeerDiscoveryException { long start = System.currentTimeMillis(); - DnsDiscovery dns = new DnsDiscovery(NetworkParameters.of(network)); + DnsDiscovery dns = new DnsDiscovery(network); dnsPeers = dns.getPeers(0, Duration.ofSeconds(10)); printPeers(dnsPeers); printElapsed(start); diff --git a/examples/src/main/java/org/bitcoinj/examples/RestoreFromSeed.java b/examples/src/main/java/org/bitcoinj/examples/RestoreFromSeed.java index 7b4a93493..23bdf0b53 100644 --- a/examples/src/main/java/org/bitcoinj/examples/RestoreFromSeed.java +++ b/examples/src/main/java/org/bitcoinj/examples/RestoreFromSeed.java @@ -67,7 +67,7 @@ public class RestoreFromSeed { SPVBlockStore chainStore = new SPVBlockStore(params, chainFile); BlockChain chain = new BlockChain(network, chainStore); PeerGroup peerGroup = new PeerGroup(network, chain); - peerGroup.addPeerDiscovery(new DnsDiscovery(params)); + peerGroup.addPeerDiscovery(new DnsDiscovery(network)); // Now we need to hook the wallet up to the blockchain and the peers. This registers event listeners that notify our wallet about new transactions. chain.addWallet(wallet); diff --git a/tools/src/main/java/org/bitcoinj/tools/BuildCheckpoints.java b/tools/src/main/java/org/bitcoinj/tools/BuildCheckpoints.java index 80d83c129..709308040 100644 --- a/tools/src/main/java/org/bitcoinj/tools/BuildCheckpoints.java +++ b/tools/src/main/java/org/bitcoinj/tools/BuildCheckpoints.java @@ -121,7 +121,7 @@ public class BuildCheckpoints implements Callable { // use a peer group discovered with dns peerGroup.setUserAgent("PeerMonitor", "1.0"); peerGroup.setMaxConnections(20); - peerGroup.addPeerDiscovery(new DnsDiscovery(params)); + peerGroup.addPeerDiscovery(new DnsDiscovery(net)); peerGroup.start(); // Connect to at least 4 peers because some may not support download diff --git a/tools/src/main/java/org/bitcoinj/tools/WatchMempool.java b/tools/src/main/java/org/bitcoinj/tools/WatchMempool.java index bb1c8b103..e0348dc43 100644 --- a/tools/src/main/java/org/bitcoinj/tools/WatchMempool.java +++ b/tools/src/main/java/org/bitcoinj/tools/WatchMempool.java @@ -28,7 +28,6 @@ import org.bitcoinj.base.BitcoinNetwork; import org.bitcoinj.base.Network; import org.bitcoinj.base.internal.TimeUtils; import org.bitcoinj.core.listeners.*; -import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Peer; import org.bitcoinj.core.PeerGroup; import org.bitcoinj.core.Transaction; @@ -52,7 +51,7 @@ public class WatchMempool { BriefLogFormatter.init(); PeerGroup peerGroup = new PeerGroup(NETWORK); peerGroup.setMaxConnections(32); - peerGroup.addPeerDiscovery(new DnsDiscovery(NetworkParameters.of(NETWORK))); + peerGroup.addPeerDiscovery(new DnsDiscovery(NETWORK)); peerGroup.addOnTransactionBroadcastListener((peer, tx) -> { Result result = DefaultRiskAnalysis.FACTORY.create(null, tx, NO_DEPS).analyze(); incrementCounter(TOTAL_KEY);