diff --git a/core/src/main/java/bisq/core/CoreModule.java b/core/src/main/java/bisq/core/CoreModule.java index 65e88eb18dd..e22d44406ab 100644 --- a/core/src/main/java/bisq/core/CoreModule.java +++ b/core/src/main/java/bisq/core/CoreModule.java @@ -30,7 +30,6 @@ import bisq.core.dao.DaoModule; import bisq.core.filter.FilterModule; import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; -import bisq.core.network.p2p.seed.SeedNodeAddressLookup; import bisq.core.notifications.MobileMessageEncryption; import bisq.core.notifications.MobileModel; import bisq.core.notifications.MobileNotificationService; @@ -99,7 +98,6 @@ protected void configure() { bind(CorruptedDatabaseFilesHandler.class).in(Singleton.class); bind(AvoidStandbyModeService.class).in(Singleton.class); - bind(SeedNodeAddressLookup.class).in(Singleton.class); bind(SeedNodeRepository.class).to(DefaultSeedNodeRepository.class).in(Singleton.class); File storageDir = new File(environment.getRequiredProperty(Storage.STORAGE_DIR)); diff --git a/core/src/main/java/bisq/core/app/BisqEnvironment.java b/core/src/main/java/bisq/core/app/BisqEnvironment.java index 9a3ca198c4f..6f9b1a5f871 100644 --- a/core/src/main/java/bisq/core/app/BisqEnvironment.java +++ b/core/src/main/java/bisq/core/app/BisqEnvironment.java @@ -57,6 +57,7 @@ import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; @@ -345,7 +346,7 @@ public BisqEnvironment(PropertySource commandLineProperties) { bannedPriceRelayNodes = !bannedPriceRelayNodesAsString.isEmpty() ? Arrays.asList(StringUtils.deleteWhitespace(bannedPriceRelayNodesAsString).split(",")) : null; final String bannedSeedNodesAsString = getProperty(FilterManager.BANNED_SEED_NODES, ""); - bannedSeedNodes = !bannedSeedNodesAsString.isEmpty() ? Arrays.asList(StringUtils.deleteWhitespace(bannedSeedNodesAsString).split(",")) : null; + bannedSeedNodes = !bannedSeedNodesAsString.isEmpty() ? Arrays.asList(StringUtils.deleteWhitespace(bannedSeedNodesAsString).split(",")) : new ArrayList<>(); final String bannedBtcNodesAsString = getProperty(FilterManager.BANNED_BTC_NODES, ""); bannedBtcNodes = !bannedBtcNodesAsString.isEmpty() ? Arrays.asList(StringUtils.deleteWhitespace(bannedBtcNodesAsString).split(",")) : null; diff --git a/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java b/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java index 16d1c87ea70..35413918c2d 100644 --- a/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java +++ b/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java @@ -26,7 +26,6 @@ import bisq.core.dao.DaoModule; import bisq.core.filter.FilterModule; import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; -import bisq.core.network.p2p.seed.SeedNodeAddressLookup; import bisq.core.offer.OfferModule; import bisq.core.proto.network.CoreNetworkProtoResolver; import bisq.core.proto.persistable.CorePersistenceProtoResolver; @@ -77,7 +76,6 @@ protected void configure() { bind(BridgeAddressProvider.class).to(Preferences.class).in(Singleton.class); bind(TorSetup.class).in(Singleton.class); - bind(SeedNodeAddressLookup.class).in(Singleton.class); bind(SeedNodeRepository.class).to(DefaultSeedNodeRepository.class).in(Singleton.class); File storageDir = new File(environment.getRequiredProperty(Storage.STORAGE_DIR)); diff --git a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeAddresses.java b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeAddresses.java deleted file mode 100644 index d6ef2f5b5d7..00000000000 --- a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeAddresses.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import bisq.network.p2p.NodeAddress; - -import com.google.common.collect.ImmutableSet; - -import java.util.Set; - -class DefaultSeedNodeAddresses { - // Addresses are used if the last digit of their port match the network id: - // - mainnet use port ends in 0 - // - testnet use port ends in 1 - // - regtest use port ends in 2 - public static final Set DEFAULT_LOCALHOST_SEED_NODE_ADDRESSES = ImmutableSet.of( - // BTC - // mainnet - new NodeAddress("localhost:2000"), - new NodeAddress("localhost:3000"), - new NodeAddress("localhost:4000"), - - // testnet - new NodeAddress("localhost:2001"), - new NodeAddress("localhost:3001"), - new NodeAddress("localhost:4001"), - - // regtest - new NodeAddress("localhost:2002"), - new NodeAddress("localhost:3002") - /* new NodeAddress("localhost:4002"),*/ - ); - - // Addresses are used if their port match the network id: - // - mainnet uses port 8000 - // - testnet uses port 8001 - // - regtest uses port 8002 - public static final Set DEFAULT_TOR_SEED_NODE_ADDRESSES = ImmutableSet.of( - // BTC mainnet - new NodeAddress("5quyxpxheyvzmb2d.onion:8000"), // @miker - new NodeAddress("s67qglwhkgkyvr74.onion:8000"), // @emzy - new NodeAddress("ef5qnzx6znifo3df.onion:8000"), // @manfredkarrer - new NodeAddress("jhgcy2won7xnslrb.onion:8000"), // @manfredkarrer - new NodeAddress("3f3cu2yw7u457ztq.onion:8000"), // @manfredkarrer - new NodeAddress("723ljisnynbtdohi.onion:8000"), // @manfredkarrer - new NodeAddress("rm7b56wbrcczpjvl.onion:8000"), // @manfredkarrer - new NodeAddress("fl3mmribyxgrv63c.onion:8000"), // @manfredkarrer - - // local dev - // new NodeAddress("joehwtpe7ijnz4df.onion:8000"), - // new NodeAddress("uqxi3zrpobhtoes6.onion:8000"), - - // BTC testnet - // new NodeAddress("vjkh4ykq7x5skdlt.onion:8001"), // local dev test - //new NodeAddress("fjr5w4eckjghqtnu.onion:8001"), // testnet seed 1 - /* new NodeAddress("74w2sttlo4qk6go3.onion:8001"), // testnet seed 2 - new NodeAddress("jmc5ajqvtnzqaggm.onion:8001"), // testnet seed 3 - new NodeAddress("3d56s6acbi3vk52v.onion:8001"), // testnet seed 4*/ - - // BTC regtest - // For development you need to change that to your local onion addresses - // 1. Run a seed node with prog args: --bitcoinNetwork=regtest --nodePort=8002 --myAddress=rxdkppp3vicnbgqt:8002 --appName=bisq_seed_node_rxdkppp3vicnbgqt.onion_8002 - // 2. Find your local onion address in bisq_seed_node_rxdkppp3vicnbgqt.onion_8002/regtest/tor/hiddenservice/hostname - // 3. Shut down the seed node - // 4. Rename the directory with your local onion address - // 5. Edit here your found onion address (new NodeAddress("YOUR_ONION.onion:8002") - new NodeAddress("rxdkppp3vicnbgqt.onion:8002"), - new NodeAddress("4ie52dse64kaarxw.onion:8002"), - - // DAO TESTNET (server side regtest dedicated for DAO testing) - new NodeAddress("fjr5w4eckjghqtnu.onion:8003"), // testnet seed 1 - new NodeAddress("74w2sttlo4qk6go3.onion:8003"), // testnet seed 2 - new NodeAddress("jmc5ajqvtnzqaggm.onion:8003"), // testnet seed 3 - new NodeAddress("3d56s6acbi3vk52v.onion:8003") // testnet seed 4 - - // explorer - // new NodeAddress("gtif46mfxirv533z.onion:8003") - ); - - private DefaultSeedNodeAddresses() { - } -} diff --git a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java index 6c9e160bebf..ad24cb7e30c 100644 --- a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java +++ b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java @@ -17,59 +17,87 @@ package bisq.core.network.p2p.seed; +import bisq.core.app.BisqEnvironment; + +import bisq.network.NetworkOptionKeys; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.seed.SeedNodeRepository; import javax.inject.Inject; +import javax.inject.Named; -import java.util.Set; -import java.util.stream.Stream; +import java.net.URL; -public class DefaultSeedNodeRepository implements SeedNodeRepository { +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; - private final Set seedNodeAddresses; - private final Set torSeedNodeAddresses; - private final Set localhostSeedNodeAddresses; +public class DefaultSeedNodeRepository implements SeedNodeRepository { + private static final Pattern pattern = Pattern.compile("^([a-z0-9]+\\.onion:\\d+)"); + private static final String ENDING = ".seednodes"; + private static final Collection cache = new HashSet<>(); + private final BisqEnvironment bisqEnvironment; + private final String seedNodes; @Inject - public DefaultSeedNodeRepository(SeedNodeAddressLookup lookup) { - this.seedNodeAddresses = lookup.resolveNodeAddresses(); - this.torSeedNodeAddresses = DefaultSeedNodeAddresses.DEFAULT_TOR_SEED_NODE_ADDRESSES; - this.localhostSeedNodeAddresses = DefaultSeedNodeAddresses.DEFAULT_LOCALHOST_SEED_NODE_ADDRESSES; + public DefaultSeedNodeRepository(BisqEnvironment environment, + @Nullable @Named(NetworkOptionKeys.SEED_NODES_KEY) String seedNodes) { + bisqEnvironment = environment; + this.seedNodes = seedNodes; } - @Override - public Set getSeedNodeAddresses() { - return seedNodeAddresses; - } + private void reload() { - @Override - public String getOperator(NodeAddress nodeAddress) { - switch (nodeAddress.getFullAddress()) { - case "5quyxpxheyvzmb2d.onion:8000": - return "@miker"; - case "ef5qnzx6znifo3df.onion:8000": - return "@manfredkarrer"; - case "s67qglwhkgkyvr74.onion:8000": - return "@emzy"; - case "jhgcy2won7xnslrb.onion:8000": - return "@manfredkarrer"; - case "3f3cu2yw7u457ztq.onion:8000": - return "@manfredkarrer"; - case "723ljisnynbtdohi.onion:8000": - return "@manfredkarrer"; - case "rm7b56wbrcczpjvl.onion:8000": - return "@manfredkarrer"; - case "fl3mmribyxgrv63c.onion:8000": - return "@manfredkarrer"; - default: - return "Undefined"; + // see if there are any seed nodes configured manually + if(seedNodes != null && !seedNodes.isEmpty()) { + cache.clear(); + Arrays.stream(seedNodes.split(",")).forEach(s -> cache.add(new NodeAddress(s))); + + return; } + + // else, we fetch the seed nodes from our resources + try { + // read appropriate file + final URL file = DefaultSeedNodeRepository.class.getClassLoader().getResource(BisqEnvironment.getBaseCurrencyNetwork().name().toLowerCase() + ENDING); + final BufferedReader seedNodeFile = new BufferedReader(new FileReader(file.getFile())); + + // only clear if we have a fresh data source (otherwise, an exception would prevent us from getting here) + cache.clear(); + + // refill the cache + seedNodeFile.lines().forEach(s -> { + final Matcher matcher = pattern.matcher(s); + if(matcher.find()) + cache.add(new NodeAddress(matcher.group(1))); + }); + + // filter + cache.removeAll(bisqEnvironment.getBannedSeedNodes().stream().map(s -> new NodeAddress(s)).collect(Collectors.toSet())); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public Collection getSeedNodeAddresses() { + if(cache.isEmpty()) + reload(); + + return cache; } - @Override public boolean isSeedNode(NodeAddress nodeAddress) { - return Stream.concat(localhostSeedNodeAddresses.stream(), torSeedNodeAddresses.stream()) - .anyMatch(e -> e.equals(nodeAddress)); + if(cache.isEmpty()) + reload(); + return cache.contains(nodeAddress); } } diff --git a/core/src/main/java/bisq/core/network/p2p/seed/ImmutableSetDecorator.java b/core/src/main/java/bisq/core/network/p2p/seed/ImmutableSetDecorator.java deleted file mode 100644 index 31fbb644b5f..00000000000 --- a/core/src/main/java/bisq/core/network/p2p/seed/ImmutableSetDecorator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import com.google.common.collect.ImmutableSet; - -import java.util.AbstractSet; -import java.util.Iterator; -import java.util.Set; - -import org.jetbrains.annotations.NotNull; - -class ImmutableSetDecorator extends AbstractSet { - private final Set delegate; - - public ImmutableSetDecorator(Set delegate) { - this.delegate = ImmutableSet.copyOf(delegate); - } - - @NotNull - @Override - public Iterator iterator() { - return delegate.iterator(); - } - - @Override - public int size() { - return delegate.size(); - } -} diff --git a/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddressLookup.java b/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddressLookup.java deleted file mode 100644 index dc28119d615..00000000000 --- a/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddressLookup.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import bisq.core.app.BisqEnvironment; - -import bisq.network.NetworkOptionKeys; -import bisq.network.p2p.NodeAddress; - -import com.google.inject.name.Named; - -import javax.inject.Inject; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nullable; - -public class SeedNodeAddressLookup { - private static final Logger log = LoggerFactory.getLogger(SeedNodeAddressLookup.class); - - private final BisqEnvironment environment; - private final boolean isLocalHostUsed; - private final int networkId; - @Nullable - private final String myAddress; - @Nullable - private final String seedNodes; - - @Inject - public SeedNodeAddressLookup(BisqEnvironment environment, - @Named(NetworkOptionKeys.USE_LOCALHOST_FOR_P2P) boolean useLocalhostForP2P, - @Named(NetworkOptionKeys.NETWORK_ID) int networkId, - @Nullable @Named(NetworkOptionKeys.MY_ADDRESS) String myAddress, - @Nullable @Named(NetworkOptionKeys.SEED_NODES_KEY) String seedNodes) { - this.environment = environment; - this.isLocalHostUsed = useLocalhostForP2P; - this.networkId = networkId; - this.myAddress = myAddress; - this.seedNodes = seedNodes; - } - - public Set resolveNodeAddresses() { - SeedNodeAddresses allSeedNodeAddresses = getAllAddresses(); - - Set bannedHosts = getBannedHosts(); - allSeedNodeAddresses = allSeedNodeAddresses.excludeByHost(bannedHosts); - - if (myAddress != null) { - allSeedNodeAddresses = allSeedNodeAddresses.excludeByFullAddress(myAddress); - } - - log.debug("We received banned seed nodes={}, seedNodeAddresses={}", bannedHosts, allSeedNodeAddresses); - return allSeedNodeAddresses; - } - - private Set getBannedHosts() { - return Optional.ofNullable(environment.getBannedSeedNodes()) - .map(HashSet::new) - .map(hosts -> (Set) hosts) - .orElse(Collections.emptySet()); - } - - private SeedNodeAddresses getAllAddresses() { - SeedNodeAddresses seedNodeAddresses = Optional.ofNullable(seedNodes) - .map(nodes -> SeedNodeAddresses.fromString(seedNodes)) - .orElse(new SeedNodeAddresses(Collections.emptySet())); - - if (seedNodeAddresses.isEmpty()) { - Set delegate = isLocalHostUsed - ? DefaultSeedNodeAddresses.DEFAULT_LOCALHOST_SEED_NODE_ADDRESSES - : DefaultSeedNodeAddresses.DEFAULT_TOR_SEED_NODE_ADDRESSES; - seedNodeAddresses = delegate.stream() - .filter(address -> isAddressFromNetwork(address, networkId)) - .collect(SeedNodeAddresses.collector()); - } - return seedNodeAddresses; - } - - private static boolean isAddressFromNetwork(NodeAddress address, int networkId) { - String suffix = "0" + networkId; - int port = address.getPort(); - String portAsString = String.valueOf(port); - return portAsString.endsWith(suffix); - } -} diff --git a/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddresses.java b/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddresses.java deleted file mode 100644 index ad451e21722..00000000000 --- a/core/src/main/java/bisq/core/network/p2p/seed/SeedNodeAddresses.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import bisq.network.p2p.NodeAddress; - -import org.apache.commons.lang3.StringUtils; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collector; -import java.util.stream.Collectors; - -class SeedNodeAddresses extends ImmutableSetDecorator { - - public SeedNodeAddresses(Set delegate) { - super(delegate); - } - - public SeedNodeAddresses excludeByHost(Set hosts) { - Set copy = new HashSet<>(this); - copy.removeIf(address -> { - String hostName = address.getHostName(); - return hosts.contains(hostName); - }); - return new SeedNodeAddresses(copy); - } - - public SeedNodeAddresses excludeByFullAddress(String fullAddress) { - Set copy = new HashSet<>(this); - copy.removeIf(address -> fullAddress.equals(address.getFullAddress())); - return new SeedNodeAddresses(copy); - } - - public static Collector collector() { - return Collectors.collectingAndThen(Collectors.toSet(), SeedNodeAddresses::new); - } - - public static SeedNodeAddresses fromString(String seedNodes) { - if (seedNodes.isEmpty()) { - return new SeedNodeAddresses(Collections.emptySet()); - } - - String trimmed = StringUtils.deleteWhitespace(seedNodes); - String[] nodes = trimmed.split(","); - return Arrays.stream(nodes) - .map(NodeAddress::new) - .collect(collector()); - } -} diff --git a/core/src/main/resources/btc_dao_testnet.seednodes b/core/src/main/resources/btc_dao_testnet.seednodes new file mode 100644 index 00000000000..fa63d9f5aed --- /dev/null +++ b/core/src/main/resources/btc_dao_testnet.seednodes @@ -0,0 +1,5 @@ +# nodeaddress.onion:port [(@owner)] +fjr5w4eckjghqtnu.onion:8003 +3d56s6acbi3vk52v.onion:8003 +74w2sttlo4qk6go3.onion:8003 +jmc5ajqvtnzqaggm.onion:8003 diff --git a/core/src/main/resources/btc_mainnet.seednodes b/core/src/main/resources/btc_mainnet.seednodes new file mode 100644 index 00000000000..fede53e55e5 --- /dev/null +++ b/core/src/main/resources/btc_mainnet.seednodes @@ -0,0 +1,9 @@ +# nodeaddress.onion:port [(@owner)] +5quyxpxheyvzmb2d.onion:8000 (@miker) +s67qglwhkgkyvr74.onion:8000 (@emzy) +ef5qnzx6znifo3df.onion:8000 (@manfredkarrer) +jhgcy2won7xnslrb.onion:8000 (@manfredkarrer) +3f3cu2yw7u457ztq.onion:8000 (@manfredkarrer) +723ljisnynbtdohi.onion:8000 (@manfredkarrer) +rm7b56wbrcczpjvl.onion:8000 (@manfredkarrer) +fl3mmribyxgrv63c.onion:8000 (@manfredkarrer) diff --git a/core/src/main/resources/btc_regtest.seednodes b/core/src/main/resources/btc_regtest.seednodes new file mode 100644 index 00000000000..fb71abcae3e --- /dev/null +++ b/core/src/main/resources/btc_regtest.seednodes @@ -0,0 +1,10 @@ +# For development you need to change that to your local onion addresses +# 1. Run a seed node with prog args: --bitcoinNetwork=regtest --nodePort=8002 --myAddress=rxdkppp3vicnbgqt:8002 --appName=bisq_seed_node_rxdkppp3vicnbgqt.onion_8002 +# 2. Find your local onion address in bisq_seed_node_rxdkppp3vicnbgqt.onion_8002/regtest/tor/hiddenservice/hostname +# 3. Shut down the seed node +# 4. Rename the directory with your local onion address +# 5. Edit here your found onion address (new NodeAddress("YOUR_ONION.onion:8002") + +# nodeaddress.onion:port [(@owner)] +rxdkppp3vicnbgqt.onion:8002 +4ie52dse64kaarxw.onion:8002 diff --git a/core/src/main/resources/btc_testnet.seednodes b/core/src/main/resources/btc_testnet.seednodes new file mode 100644 index 00000000000..afc7c92300a --- /dev/null +++ b/core/src/main/resources/btc_testnet.seednodes @@ -0,0 +1,2 @@ +# nodeaddress.onion:port [(@owner)] +# Bisq on BTC TESTNET has been discontinued diff --git a/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java b/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java new file mode 100644 index 00000000000..85b00a44fc6 --- /dev/null +++ b/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java @@ -0,0 +1,48 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.network.p2p.seed; + +import bisq.core.app.BisqEnvironment; + +import bisq.network.p2p.NodeAddress; + +import org.springframework.core.env.PropertySource; + +import org.junit.Assert; +import org.junit.Test; + +public class DefaultSeedNodeRepositoryTest { + + @Test + public void getSeedNodes() { + DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new BisqEnvironment(new PropertySource.StubPropertySource("name")), null); + Assert.assertFalse(DUT.getSeedNodeAddresses().isEmpty()); + } + + @Test + public void manualSeedNodes() { + String seed1 = "asdf:8001"; + String seed2 = "fdsa:6001"; + String seedNodes = seed1 + "," + seed2; + DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new BisqEnvironment(new PropertySource.StubPropertySource("name")), seedNodes); + Assert.assertFalse(DUT.getSeedNodeAddresses().isEmpty()); + Assert.assertEquals(2, DUT.getSeedNodeAddresses().size()); + Assert.assertTrue(DUT.getSeedNodeAddresses().contains(new NodeAddress(seed1))); + Assert.assertTrue(DUT.getSeedNodeAddresses().contains(new NodeAddress(seed2))); + } +} diff --git a/core/src/test/java/bisq/core/network/p2p/seed/ImmutableSetDecoratorTest.java b/core/src/test/java/bisq/core/network/p2p/seed/ImmutableSetDecoratorTest.java deleted file mode 100644 index b1cab1649d6..00000000000 --- a/core/src/test/java/bisq/core/network/p2p/seed/ImmutableSetDecoratorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import com.google.common.collect.Sets; - -import java.util.Set; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class ImmutableSetDecoratorTest { - @Test(expected = UnsupportedOperationException.class) - public void testAdd() { - Set original = Sets.newHashSet(1, 2, 3); - Set decorator = new ImmutableSetDecorator<>(original); - decorator.add(4); - } - - @Test(expected = UnsupportedOperationException.class) - public void testRemove() { - Set original = Sets.newHashSet(1, 2, 3); - Set decorator = new ImmutableSetDecorator<>(original); - decorator.remove(3); - } - - @Test(expected = UnsupportedOperationException.class) - public void testClear() { - Set original = Sets.newHashSet(1, 2, 3); - Set decorator = new ImmutableSetDecorator<>(original); - decorator.clear(); - } - - @Test(expected = UnsupportedOperationException.class) - public void testRemoveWithIterator() { - Set original = Sets.newHashSet(1, 2, 3); - Set decorator = new ImmutableSetDecorator<>(original); - decorator.iterator().remove(); - } - - @Test - public void testBackingCollection() { - Set original = Sets.newHashSet(1, 2, 3); - Set decorator = new ImmutableSetDecorator<>(original); - - original.remove(2); - assertTrue(decorator.contains(2)); - } -} diff --git a/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressLookupTest.java b/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressLookupTest.java deleted file mode 100644 index 0ee76ef9686..00000000000 --- a/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressLookupTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import bisq.core.app.BisqEnvironment; - -import bisq.network.p2p.NodeAddress; - -import java.util.Collections; -import java.util.Set; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.mockito.Mockito.mock; - -public class SeedNodeAddressLookupTest { - - - @Test - public void testResolveNodeAddressesWhenLocalAddressSpecified() { - SeedNodeAddressLookup lookup = new SeedNodeAddressLookup( - mock(BisqEnvironment.class), false, 0, "192.168.0.1:1234", - "192.168.0.1:1234, 192.168.0.2:9897"); - - Set actual = lookup.resolveNodeAddresses(); - Set expected = Collections.singleton(new NodeAddress("192.168.0.2:9897")); - assertEquals(expected, actual); - } - - @Test - public void testResolveNodeAddressesWhenSeedNodesAreNull() { - SeedNodeAddressLookup lookup = new SeedNodeAddressLookup( - mock(BisqEnvironment.class), false, 0, "192.168.0.1:1234", null); - - Set actual = lookup.resolveNodeAddresses(); - assertFalse(actual.isEmpty()); - } -} diff --git a/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressesTest.java b/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressesTest.java deleted file mode 100644 index b036f98faff..00000000000 --- a/core/src/test/java/bisq/core/network/p2p/seed/SeedNodeAddressesTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.network.p2p.seed; - -import bisq.network.p2p.NodeAddress; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -import org.bouncycastle.jce.provider.BouncyCastleProvider; - -import java.security.Security; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class SeedNodeAddressesTest { - - - @Test - public void testCollector() { - List addresses = Lists.newArrayList( - new NodeAddress("192.168.0.1:1111"), - new NodeAddress("192.168.0.1:1111"), - new NodeAddress("192.168.0.2:2222")); - Set expected = new HashSet<>(addresses); - - SeedNodeAddresses actual = addresses.stream() - .collect(SeedNodeAddresses.collector()); - - assertEquals(expected, actual); - } - - @Test - public void testExcludeByFullAddress() { - Set delegate = Sets.newHashSet( - new NodeAddress("192.168.0.1:1111"), - new NodeAddress("192.168.0.2:2222")); - SeedNodeAddresses addresses = new SeedNodeAddresses(delegate); - SeedNodeAddresses actual = addresses.excludeByFullAddress("192.168.0.1:1111"); - - assertEquals(1, actual.size()); - } - - @Test - public void testExcludeByHost() { - Set delegate = Sets.newHashSet( - new NodeAddress("aaa:1111"), - new NodeAddress("aaa:2222"), - new NodeAddress("bbb:1111"), - new NodeAddress("bbb:2222"), - new NodeAddress("ccc:1111"), - new NodeAddress("ccc:2222")); - SeedNodeAddresses addresses = new SeedNodeAddresses(delegate); - - Set hosts = Sets.newHashSet("aaa", "bbb"); - SeedNodeAddresses actual = addresses.excludeByHost(hosts); - - Set expected = Sets.newHashSet( - new NodeAddress("ccc:1111"), - new NodeAddress("ccc:2222")); - - assertEquals(expected, actual); - } - - @Test - public void testFromString() { - Set expected = Sets.newHashSet( - new NodeAddress("192.168.0.1:1111"), - new NodeAddress("192.168.0.2:2222")); - SeedNodeAddresses actual = SeedNodeAddresses.fromString("192.168.0.1:1111, 192.168.0.2:2222"); - assertEquals(expected, actual); - } - - @Test - public void testFromEmptyString() { - SeedNodeAddresses nodeAddresses = SeedNodeAddresses.fromString(""); - assertTrue(nodeAddresses.isEmpty()); - } -} diff --git a/core/src/test/resources/mainnet.seednodes b/core/src/test/resources/mainnet.seednodes new file mode 100644 index 00000000000..fede53e55e5 --- /dev/null +++ b/core/src/test/resources/mainnet.seednodes @@ -0,0 +1,9 @@ +# nodeaddress.onion:port [(@owner)] +5quyxpxheyvzmb2d.onion:8000 (@miker) +s67qglwhkgkyvr74.onion:8000 (@emzy) +ef5qnzx6znifo3df.onion:8000 (@manfredkarrer) +jhgcy2won7xnslrb.onion:8000 (@manfredkarrer) +3f3cu2yw7u457ztq.onion:8000 (@manfredkarrer) +723ljisnynbtdohi.onion:8000 (@manfredkarrer) +rm7b56wbrcczpjvl.onion:8000 (@manfredkarrer) +fl3mmribyxgrv63c.onion:8000 (@manfredkarrer) diff --git a/core/src/test/resources/regtest.seednodes b/core/src/test/resources/regtest.seednodes new file mode 100644 index 00000000000..fb71abcae3e --- /dev/null +++ b/core/src/test/resources/regtest.seednodes @@ -0,0 +1,10 @@ +# For development you need to change that to your local onion addresses +# 1. Run a seed node with prog args: --bitcoinNetwork=regtest --nodePort=8002 --myAddress=rxdkppp3vicnbgqt:8002 --appName=bisq_seed_node_rxdkppp3vicnbgqt.onion_8002 +# 2. Find your local onion address in bisq_seed_node_rxdkppp3vicnbgqt.onion_8002/regtest/tor/hiddenservice/hostname +# 3. Shut down the seed node +# 4. Rename the directory with your local onion address +# 5. Edit here your found onion address (new NodeAddress("YOUR_ONION.onion:8002") + +# nodeaddress.onion:port [(@owner)] +rxdkppp3vicnbgqt.onion:8002 +4ie52dse64kaarxw.onion:8002 diff --git a/core/src/test/resources/testnet.seednodes b/core/src/test/resources/testnet.seednodes new file mode 100644 index 00000000000..77b6af07e63 --- /dev/null +++ b/core/src/test/resources/testnet.seednodes @@ -0,0 +1,7 @@ +# nodeaddress.onion:port [(@owner)] +snenz4mea65wigen.onion:8001 +fjr5w4eckjghqtnu.onion:8001 +3d56s6acbi3vk52v.onion:8001 +74w2sttlo4qk6go3.onion:8001 +gtif46mfxirv533z.onion:8001 +jmc5ajqvtnzqaggm.onion:8001 diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java index 1a5d0ea3078..dcc03f1128a 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java @@ -32,14 +32,12 @@ import bisq.common.Clock; import bisq.common.app.Capabilities; -import bisq.common.app.Version; import bisq.common.proto.network.NetworkEnvelope; import bisq.common.proto.network.NetworkProtoResolver; import bisq.core.app.BisqEnvironment; import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.btc.BtcOptionKeys; import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; -import bisq.core.network.p2p.seed.SeedNodeAddressLookup; import bisq.core.proto.network.CoreNetworkProtoResolver; import bisq.core.proto.persistable.CorePersistenceProtoResolver; import bisq.monitor.AvailableTor; @@ -162,7 +160,6 @@ protected void execute() { // boot up P2P node File storageDir = torHiddenServiceDir; - String seedNodes = ""; try { BisqEnvironment environment = new BisqEnvironment(new PropertySource("name") { @@ -177,8 +174,7 @@ public String getProperty(String name) { NetworkProtoResolver networkProtoResolver = new CoreNetworkProtoResolver(); CorePersistenceProtoResolver persistenceProtoResolver = new CorePersistenceProtoResolver(null, networkProtoResolver, storageDir); - DefaultSeedNodeRepository seedNodeRepository = new DefaultSeedNodeRepository( - new SeedNodeAddressLookup(environment, false, Version.getBaseCurrencyNetwork(), null, seedNodes)); + DefaultSeedNodeRepository seedNodeRepository = new DefaultSeedNodeRepository(environment, null); PeerManager peerManager = new PeerManager(networkNode, seedNodeRepository, new Clock(), persistenceProtoResolver, maxConnections, storageDir); diff --git a/p2p/src/main/java/bisq/network/p2p/seed/SeedNodeRepository.java b/p2p/src/main/java/bisq/network/p2p/seed/SeedNodeRepository.java index c5805af277d..a59807ddb04 100644 --- a/p2p/src/main/java/bisq/network/p2p/seed/SeedNodeRepository.java +++ b/p2p/src/main/java/bisq/network/p2p/seed/SeedNodeRepository.java @@ -19,13 +19,11 @@ import bisq.network.p2p.NodeAddress; -import java.util.Set; +import java.util.Collection; public interface SeedNodeRepository { boolean isSeedNode(NodeAddress nodeAddress); - Set getSeedNodeAddresses(); - - String getOperator(NodeAddress nodeAddress); + Collection getSeedNodeAddresses(); }