Refactor SeedNodeRepo stuff

This commit is contained in:
Florian Reimair 2019-02-19 15:36:38 +01:00
parent fb5c9834e0
commit 282b0f2ef2
No known key found for this signature in database
GPG Key ID: 7EA8CA324B6E5633
17 changed files with 113 additions and 558 deletions

View File

@ -30,7 +30,6 @@ import bisq.core.btc.BitcoinModule;
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 @@ public class CoreModule extends AppModule {
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));

View File

@ -26,7 +26,6 @@ import bisq.core.btc.BitcoinModule;
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 @@ public class ModuleForAppWithP2p extends AppModule {
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));

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<NodeAddress> 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<NodeAddress> 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() {
}
}

View File

@ -17,59 +17,71 @@
package bisq.core.network.p2p.seed;
import bisq.core.app.BisqEnvironment;
import bisq.network.p2p.NodeAddress;
import bisq.network.p2p.seed.SeedNodeRepository;
import javax.inject.Inject;
import java.util.Set;
import java.util.stream.Stream;
import java.net.URL;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Collection;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class DefaultSeedNodeRepository implements SeedNodeRepository {
private final Set<NodeAddress> seedNodeAddresses;
private final Set<NodeAddress> torSeedNodeAddresses;
private final Set<NodeAddress> localhostSeedNodeAddresses;
private static final Pattern pattern = Pattern.compile("^([a-z0-9]+\\.onion:\\d+)");
private static final String ENDING = ".seednodes";
private static final Collection<NodeAddress> cache = new HashSet<>();
private static Collection<NodeAddress> excludes = new HashSet<>();
private final BisqEnvironment bisqEnvironment;
@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) {
bisqEnvironment = environment;
}
@Override
public Set<NodeAddress> getSeedNodeAddresses() {
return seedNodeAddresses;
}
private void reload() {
try {
// read appropriate file
final URL file = DefaultSeedNodeRepository.class.getClassLoader().getResource(BisqEnvironment.getBaseCurrencyNetwork().getNetwork().toLowerCase() + ENDING);
final BufferedReader seedNodeFile = new BufferedReader(new FileReader(file.getFile()));
@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";
// 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
if(bisqEnvironment.getBannedSeedNodes() != null)
cache.removeAll(bisqEnvironment.getBannedSeedNodes().stream().map(s -> new NodeAddress(s)).collect(Collectors.toSet()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public Collection<NodeAddress> getSeedNodeAddresses() {
if(cache.isEmpty())
reload();
return cache;
}
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);
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<NodeAddress> resolveNodeAddresses() {
SeedNodeAddresses allSeedNodeAddresses = getAllAddresses();
Set<String> 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<String> getBannedHosts() {
return Optional.ofNullable(environment.getBannedSeedNodes())
.map(HashSet::new)
.map(hosts -> (Set<String>) 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<NodeAddress> 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);
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<NodeAddress> {
public SeedNodeAddresses(Set<NodeAddress> delegate) {
super(delegate);
}
public SeedNodeAddresses excludeByHost(Set<String> hosts) {
Set<NodeAddress> 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<NodeAddress> copy = new HashSet<>(this);
copy.removeIf(address -> fullAddress.equals(address.getFullAddress()));
return new SeedNodeAddresses(copy);
}
public static Collector<NodeAddress, ?, SeedNodeAddresses> 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());
}
}

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -17,29 +17,18 @@
package bisq.core.network.p2p.seed;
import com.google.common.collect.ImmutableSet;
import bisq.core.app.BisqEnvironment;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
import org.springframework.core.env.PropertySource;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Test;
class ImmutableSetDecorator<T> extends AbstractSet<T> {
private final Set<T> delegate;
public class DefaultSeedNodeRepositoryTest {
public ImmutableSetDecorator(Set<T> delegate) {
this.delegate = ImmutableSet.copyOf(delegate);
}
@NotNull
@Override
public Iterator<T> iterator() {
return delegate.iterator();
}
@Override
public int size() {
return delegate.size();
@Test
public void getSeedNodes() {
DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new BisqEnvironment(new PropertySource.StubPropertySource("name")));
Assert.assertFalse(DUT.getSeedNodeAddresses().isEmpty());
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer> original = Sets.newHashSet(1, 2, 3);
Set<Integer> decorator = new ImmutableSetDecorator<>(original);
decorator.add(4);
}
@Test(expected = UnsupportedOperationException.class)
public void testRemove() {
Set<Integer> original = Sets.newHashSet(1, 2, 3);
Set<Integer> decorator = new ImmutableSetDecorator<>(original);
decorator.remove(3);
}
@Test(expected = UnsupportedOperationException.class)
public void testClear() {
Set<Integer> original = Sets.newHashSet(1, 2, 3);
Set<Integer> decorator = new ImmutableSetDecorator<>(original);
decorator.clear();
}
@Test(expected = UnsupportedOperationException.class)
public void testRemoveWithIterator() {
Set<Integer> original = Sets.newHashSet(1, 2, 3);
Set<Integer> decorator = new ImmutableSetDecorator<>(original);
decorator.iterator().remove();
}
@Test
public void testBackingCollection() {
Set<Integer> original = Sets.newHashSet(1, 2, 3);
Set<Integer> decorator = new ImmutableSetDecorator<>(original);
original.remove(2);
assertTrue(decorator.contains(2));
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<NodeAddress> actual = lookup.resolveNodeAddresses();
Set<NodeAddress> 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<NodeAddress> actual = lookup.resolveNodeAddresses();
assertFalse(actual.isEmpty());
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<NodeAddress> 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<NodeAddress> expected = new HashSet<>(addresses);
SeedNodeAddresses actual = addresses.stream()
.collect(SeedNodeAddresses.collector());
assertEquals(expected, actual);
}
@Test
public void testExcludeByFullAddress() {
Set<NodeAddress> 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<NodeAddress> 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<String> hosts = Sets.newHashSet("aaa", "bbb");
SeedNodeAddresses actual = addresses.excludeByHost(hosts);
Set<NodeAddress> expected = Sets.newHashSet(
new NodeAddress("ccc:1111"),
new NodeAddress("ccc:2222"));
assertEquals(expected, actual);
}
@Test
public void testFromString() {
Set<NodeAddress> 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());
}
}

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -19,13 +19,11 @@ package bisq.network.p2p.seed;
import bisq.network.p2p.NodeAddress;
import java.util.Set;
import java.util.Collection;
public interface SeedNodeRepository {
boolean isSeedNode(NodeAddress nodeAddress);
Set<NodeAddress> getSeedNodeAddresses();
String getOperator(NodeAddress nodeAddress);
Collection<NodeAddress> getSeedNodeAddresses();
}