DnsDiscovery, MultiplexingDiscovery: use Network in constructors

This commit is contained in:
Sean Gilligan 2023-07-15 10:21:31 -07:00 committed by Andreas Schildbach
parent 27cb2fc3cc
commit 7efab37c6c
11 changed files with 92 additions and 38 deletions

View file

@ -1033,7 +1033,7 @@ public class PeerGroup implements TransactionBroadcaster {
try { try {
this.requiredServices = requiredServices; this.requiredServices = requiredServices;
peerDiscoverers.clear(); peerDiscoverers.clear();
addPeerDiscovery(MultiplexingDiscovery.forServices(params, requiredServices)); addPeerDiscovery(MultiplexingDiscovery.forServices(params.network(), requiredServices));
} finally { } finally {
lock.unlock(); lock.unlock();
} }

View file

@ -445,7 +445,7 @@ public class WalletAppKit extends AbstractIdleService implements Closeable {
vPeerGroup.setMaxConnections(peerAddresses.length); vPeerGroup.setMaxConnections(peerAddresses.length);
peerAddresses = null; peerAddresses = null;
} else if (params.network() != BitcoinNetwork.REGTEST) { } 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); vChain.addWallet(vWallet);
vPeerGroup.addWallet(vWallet); vPeerGroup.addWallet(vWallet);

View file

@ -17,6 +17,7 @@
package org.bitcoinj.net.discovery; package org.bitcoinj.net.discovery;
import org.bitcoinj.base.Network;
import org.bitcoinj.base.internal.PlatformUtils; import org.bitcoinj.base.internal.PlatformUtils;
import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Services; 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. * 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) { public DnsDiscovery(Network network) {
this(netParams.getDnsSeeds(), netParams); this(NetworkParameters.of(network).getDnsSeeds(), network);
} }
/** /**
* Supports finding peers through DNS A records. * Supports finding peers through DNS A records.
* *
* @param dnsSeeds Host names to be examined for seed addresses. * @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) { public DnsDiscovery(String[] dnsSeeds, Network network) {
super(params, buildDiscoveries(params, dnsSeeds)); super(network, buildDiscoveries(network, dnsSeeds));
} }
private static List<PeerDiscovery> 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<PeerDiscovery> buildDiscoveries(Network network, String[] seeds) {
List<PeerDiscovery> discoveries = new ArrayList<>(); List<PeerDiscovery> discoveries = new ArrayList<>();
if (seeds != null) if (seeds != null)
for (String seed : seeds) for (String seed : seeds)
discoveries.add(new DnsSeedDiscovery(params, seed)); discoveries.add(new DnsSeedDiscovery(network, seed));
return discoveries; return discoveries;
} }
@ -91,9 +109,17 @@ public class DnsDiscovery extends MultiplexingDiscovery {
private final String hostname; private final String hostname;
private final NetworkParameters params; private final NetworkParameters params;
public DnsSeedDiscovery(NetworkParameters params, String hostname) { public DnsSeedDiscovery(Network network, String hostname) {
this.hostname = 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 @Override

View file

@ -17,6 +17,7 @@
package org.bitcoinj.net.discovery; package org.bitcoinj.net.discovery;
import org.bitcoinj.base.Network;
import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Services; import org.bitcoinj.core.Services;
import org.bitcoinj.core.VersionMessage; import org.bitcoinj.core.VersionMessage;
@ -50,6 +51,7 @@ public class MultiplexingDiscovery implements PeerDiscovery {
private static final Logger log = LoggerFactory.getLogger(MultiplexingDiscovery.class); private static final Logger log = LoggerFactory.getLogger(MultiplexingDiscovery.class);
protected final List<PeerDiscovery> seeds; protected final List<PeerDiscovery> seeds;
@Deprecated
protected final NetworkParameters netParams; protected final NetworkParameters netParams;
private volatile ExecutorService vThreadPool; private volatile ExecutorService vThreadPool;
private final boolean parallelQueries; 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. * 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}. * @param services Required services as a bitmask, e.g. {@link Services#NODE_NETWORK}.
*/ */
public static MultiplexingDiscovery forServices(NetworkParameters params, long services) { public static MultiplexingDiscovery forServices(Network network, long services) {
return forServices(params, services, true, true); return forServices(network, services, true, true);
} }
/** /**
* Builds a suitable set of peer discoveries. * 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 services Required services as a bitmask, e.g. {@link Services#NODE_NETWORK}.
* @param parallelQueries When true, seeds are queried in parallel * @param parallelQueries When true, seeds are queried in parallel
* @param shufflePeers When true, queried peers are shuffled * @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) { boolean shufflePeers) {
List<PeerDiscovery> discoveries = new ArrayList<>(); List<PeerDiscovery> discoveries = new ArrayList<>();
String[] dnsSeeds = params.getDnsSeeds(); String[] dnsSeeds = NetworkParameters.of(network).getDnsSeeds();
if (dnsSeeds != null) if (dnsSeeds != null)
for (String dnsSeed : dnsSeeds) for (String dnsSeed : dnsSeeds)
discoveries.add(new DnsSeedDiscovery(params, dnsSeed)); discoveries.add(new DnsSeedDiscovery(network, dnsSeed));
return new MultiplexingDiscovery(params, discoveries, parallelQueries, shufflePeers); 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. * 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<PeerDiscovery> seeds) { public MultiplexingDiscovery(Network network, List<PeerDiscovery> seeds) {
this(params, seeds, true, true); this(network, seeds, true, true);
} }
private MultiplexingDiscovery(NetworkParameters params, List<PeerDiscovery> 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<PeerDiscovery> seeds) {
this(params.network(), seeds);
}
private MultiplexingDiscovery(Network network, List<PeerDiscovery> seeds, boolean parallelQueries,
boolean shufflePeers) { boolean shufflePeers) {
checkArgument(!seeds.isEmpty() || params.network() == REGTEST); checkArgument(!seeds.isEmpty() || network == REGTEST);
this.netParams = params; this.netParams = NetworkParameters.of(network);
this.seeds = seeds; this.seeds = seeds;
this.parallelQueries = parallelQueries; this.parallelQueries = parallelQueries;
this.shufflePeers = shufflePeers; this.shufflePeers = shufflePeers;

View file

@ -16,7 +16,7 @@
package org.bitcoinj.net.discovery; package org.bitcoinj.net.discovery;
import org.bitcoinj.params.MainNetParams; import org.bitcoinj.base.BitcoinNetwork;
import org.junit.Test; import org.junit.Test;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -32,7 +32,7 @@ public class DnsDiscoveryTest {
@Test @Test
public void testBuildDiscoveries() throws PeerDiscoveryException { public void testBuildDiscoveries() throws PeerDiscoveryException {
String[] seeds = new String[] { "seed.bitcoin.sipa.be", "dnsseed.bluematt.me" }; 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); assertTrue(dnsDiscovery.seeds.size() == 2);
for (PeerDiscovery peerDiscovery : dnsDiscovery.seeds) { for (PeerDiscovery peerDiscovery : dnsDiscovery.seeds) {
assertTrue(peerDiscovery.getPeers(0, Duration.ofMillis(100)).size() > 0); assertTrue(peerDiscovery.getPeers(0, Duration.ofMillis(100)).size() > 0);
@ -41,13 +41,13 @@ public class DnsDiscoveryTest {
@Test(expected = PeerDiscoveryException.class) @Test(expected = PeerDiscoveryException.class)
public void testGetPeersThrowsPeerDiscoveryExceptionWithServicesGreaterThanZero() throws PeerDiscoveryException { 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)); dnsSeedDiscovery.getPeers(1, Duration.ofMillis(100));
} }
@Test @Test
public void testGetPeersReturnsNotEmptyListOfSocketAddresses() throws PeerDiscoveryException { public void testGetPeersReturnsNotEmptyListOfSocketAddresses() throws PeerDiscoveryException {
DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(BitcoinNetwork.MAINNET,
"localhost"); "localhost");
List<InetSocketAddress> inetSocketAddresses = dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100)); List<InetSocketAddress> inetSocketAddresses = dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100));
assertNotEquals(0, inetSocketAddresses.size()); assertNotEquals(0, inetSocketAddresses.size());
@ -55,7 +55,7 @@ public class DnsDiscoveryTest {
@Test(expected = PeerDiscoveryException.class) @Test(expected = PeerDiscoveryException.class)
public void testGetPeersThrowsPeerDiscoveryExceptionForUnknownHost() throws PeerDiscoveryException { public void testGetPeersThrowsPeerDiscoveryExceptionForUnknownHost() throws PeerDiscoveryException {
DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(BitcoinNetwork.MAINNET,
"unknown host"); "unknown host");
dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100)); dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100));
} }

View file

@ -62,7 +62,7 @@ public class FetchBlock implements Callable<Integer> {
BlockChain chain = new BlockChain(network, blockStore); BlockChain chain = new BlockChain(network, blockStore);
PeerGroup peerGroup = new PeerGroup(network, chain); PeerGroup peerGroup = new PeerGroup(network, chain);
if (localhost) { if (localhost) {
peerGroup.addPeerDiscovery(new DnsDiscovery(params)); peerGroup.addPeerDiscovery(new DnsDiscovery(network));
} else { } else {
PeerAddress addr = PeerAddress.localhost(params); PeerAddress addr = PeerAddress.localhost(params);
peerGroup.addAddress(addr); peerGroup.addAddress(addr);

View file

@ -21,7 +21,6 @@ import org.bitcoinj.base.BitcoinNetwork;
import org.bitcoinj.base.Network; import org.bitcoinj.base.Network;
import org.bitcoinj.core.AddressMessage; import org.bitcoinj.core.AddressMessage;
import org.bitcoinj.base.Coin; import org.bitcoinj.base.Coin;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Peer; import org.bitcoinj.core.Peer;
import org.bitcoinj.core.PeerAddress; import org.bitcoinj.core.PeerAddress;
import org.bitcoinj.core.PeerGroup; import org.bitcoinj.core.PeerGroup;
@ -72,7 +71,7 @@ public class PeerMonitor {
peerGroup = new PeerGroup(network, null /* no chain */); peerGroup = new PeerGroup(network, null /* no chain */);
peerGroup.setUserAgent("PeerMonitor", "1.0"); peerGroup.setUserAgent("PeerMonitor", "1.0");
peerGroup.setMaxConnections(4); peerGroup.setMaxConnections(4);
peerGroup.addPeerDiscovery(new DnsDiscovery(NetworkParameters.of(network))); peerGroup.addPeerDiscovery(new DnsDiscovery(network));
peerGroup.addConnectedEventListener((peer, peerCount) -> { peerGroup.addConnectedEventListener((peer, peerCount) -> {
refreshUI(); refreshUI();
lookupReverseDNS(peer); lookupReverseDNS(peer);

View file

@ -57,7 +57,7 @@ public class PrintPeers {
private static void printDNS(Network network) throws PeerDiscoveryException { private static void printDNS(Network network) throws PeerDiscoveryException {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
DnsDiscovery dns = new DnsDiscovery(NetworkParameters.of(network)); DnsDiscovery dns = new DnsDiscovery(network);
dnsPeers = dns.getPeers(0, Duration.ofSeconds(10)); dnsPeers = dns.getPeers(0, Duration.ofSeconds(10));
printPeers(dnsPeers); printPeers(dnsPeers);
printElapsed(start); printElapsed(start);

View file

@ -67,7 +67,7 @@ public class RestoreFromSeed {
SPVBlockStore chainStore = new SPVBlockStore(params, chainFile); SPVBlockStore chainStore = new SPVBlockStore(params, chainFile);
BlockChain chain = new BlockChain(network, chainStore); BlockChain chain = new BlockChain(network, chainStore);
PeerGroup peerGroup = new PeerGroup(network, chain); 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. // 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); chain.addWallet(wallet);

View file

@ -121,7 +121,7 @@ public class BuildCheckpoints implements Callable<Integer> {
// use a peer group discovered with dns // use a peer group discovered with dns
peerGroup.setUserAgent("PeerMonitor", "1.0"); peerGroup.setUserAgent("PeerMonitor", "1.0");
peerGroup.setMaxConnections(20); peerGroup.setMaxConnections(20);
peerGroup.addPeerDiscovery(new DnsDiscovery(params)); peerGroup.addPeerDiscovery(new DnsDiscovery(net));
peerGroup.start(); peerGroup.start();
// Connect to at least 4 peers because some may not support download // Connect to at least 4 peers because some may not support download

View file

@ -28,7 +28,6 @@ import org.bitcoinj.base.BitcoinNetwork;
import org.bitcoinj.base.Network; import org.bitcoinj.base.Network;
import org.bitcoinj.base.internal.TimeUtils; import org.bitcoinj.base.internal.TimeUtils;
import org.bitcoinj.core.listeners.*; import org.bitcoinj.core.listeners.*;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Peer; import org.bitcoinj.core.Peer;
import org.bitcoinj.core.PeerGroup; import org.bitcoinj.core.PeerGroup;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
@ -52,7 +51,7 @@ public class WatchMempool {
BriefLogFormatter.init(); BriefLogFormatter.init();
PeerGroup peerGroup = new PeerGroup(NETWORK); PeerGroup peerGroup = new PeerGroup(NETWORK);
peerGroup.setMaxConnections(32); peerGroup.setMaxConnections(32);
peerGroup.addPeerDiscovery(new DnsDiscovery(NetworkParameters.of(NETWORK))); peerGroup.addPeerDiscovery(new DnsDiscovery(NETWORK));
peerGroup.addOnTransactionBroadcastListener((peer, tx) -> { peerGroup.addOnTransactionBroadcastListener((peer, tx) -> {
Result result = DefaultRiskAnalysis.FACTORY.create(null, tx, NO_DEPS).analyze(); Result result = DefaultRiskAnalysis.FACTORY.create(null, tx, NO_DEPS).analyze();
incrementCounter(TOTAL_KEY); incrementCounter(TOTAL_KEY);