Add filterProvidedBtcNodes and filterProvidedSeedNodes fields to Config.

Signed-off-by: HenrikJannsen <boilingfrog@gmx.com>
This commit is contained in:
HenrikJannsen 2024-06-07 18:14:51 +07:00
parent 01355fdc54
commit ddf073a6ff
No known key found for this signature in database
GPG key ID: 02AA2BAE387C8307
4 changed files with 84 additions and 20 deletions

View file

@ -66,8 +66,10 @@ public class Config {
public static final String MAX_MEMORY = "maxMemory";
public static final String LOG_LEVEL = "logLevel";
public static final String BANNED_BTC_NODES = "bannedBtcNodes";
private static final String FILTER_PROVIDED_BTC_NODES = "filterProvidedBtcNodes";
public static final String BANNED_PRICE_RELAY_NODES = "bannedPriceRelayNodes";
public static final String BANNED_SEED_NODES = "bannedSeedNodes";
private static final String FILTER_PROVIDED_SEED_NODES = "filterProvidedSeedNodes";
public static final String BASE_CURRENCY_NETWORK = "baseCurrencyNetwork";
public static final String REFERRAL_ID = "referralId";
public static final String USE_DEV_MODE = "useDevMode";
@ -170,8 +172,10 @@ public class Config {
public final int maxMemory;
public final String logLevel;
public final List<String> bannedBtcNodes;
public final List<String> filterProvidedBtcNodes;
public final List<String> bannedPriceRelayNodes;
public final List<String> bannedSeedNodes;
public final List<String> filterProvidedSeedNodes;
public final BaseCurrencyNetwork baseCurrencyNetwork;
public final NetworkParameters networkParameters;
public final boolean ignoreLocalBtcNode;
@ -336,6 +340,12 @@ public class Config {
.ofType(String.class)
.withValuesSeparatedBy(',')
.describedAs("host:port[,...]");
ArgumentAcceptingOptionSpec<String> filterProvidedBtcNodesOpt =
parser.accepts(FILTER_PROVIDED_BTC_NODES, "List of filter provided Bitcoin nodes")
.withRequiredArg()
.ofType(String.class)
.withValuesSeparatedBy(',')
.describedAs("host:port[,...]");
ArgumentAcceptingOptionSpec<String> bannedPriceRelayNodesOpt =
parser.accepts(BANNED_PRICE_RELAY_NODES, "List Bisq price nodes to ban")
@ -350,6 +360,12 @@ public class Config {
.ofType(String.class)
.withValuesSeparatedBy(',')
.describedAs("host:port[,...]");
ArgumentAcceptingOptionSpec<String> filterProvidedSeedNodesOpt =
parser.accepts(FILTER_PROVIDED_SEED_NODES, "List of filer provided seed nodes")
.withRequiredArg()
.ofType(String.class)
.withValuesSeparatedBy(',')
.describedAs("host:port[,...]");
//noinspection rawtypes
ArgumentAcceptingOptionSpec<Enum> baseCurrencyNetworkOpt =
@ -539,9 +555,11 @@ public class Config {
.defaultsTo(50); // Pause in ms to sleep if we get too many messages to send
ArgumentAcceptingOptionSpec<String> btcNodesOpt =
parser.accepts(BTC_NODES, "Custom nodes used for BitcoinJ as comma separated IP addresses.")
parser.accepts(BTC_NODES, "Override provided Bitcoin nodes as comma separated list e.g. " +
"'rxdkppp3vicnbgqt.onion:8002,mfla72c4igh5ta2t.onion:8002'")
.withRequiredArg()
.describedAs("ip[,...]")
.withValuesSeparatedBy(',')
.describedAs("host:port[,...]")
.defaultsTo("");
ArgumentAcceptingOptionSpec<Boolean> useTorForBtcOpt =
@ -780,8 +798,10 @@ public class Config {
this.maxMemory = options.valueOf(maxMemoryOpt);
this.logLevel = options.valueOf(logLevelOpt);
this.bannedBtcNodes = options.valuesOf(bannedBtcNodesOpt);
this.filterProvidedBtcNodes = options.valuesOf(filterProvidedBtcNodesOpt);
this.bannedPriceRelayNodes = options.valuesOf(bannedPriceRelayNodesOpt);
this.bannedSeedNodes = options.valuesOf(bannedSeedNodesOpt);
this.filterProvidedSeedNodes = options.valuesOf(filterProvidedSeedNodesOpt);
this.baseCurrencyNetwork = (BaseCurrencyNetwork) options.valueOf(baseCurrencyNetworkOpt);
this.networkParameters = baseCurrencyNetwork.getParameters();
this.ignoreLocalBtcNode = options.valueOf(ignoreLocalBtcNodeOpt);

View file

@ -17,32 +17,44 @@
package bisq.core.btc.nodes;
import bisq.core.btc.nodes.BtcNodes.BtcNode;
import bisq.core.user.Preferences;
import bisq.network.p2p.NodeAddress;
import bisq.common.config.Config;
import bisq.common.util.Utilities;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.jetbrains.annotations.Nullable;
public class BtcNodesSetupPreferences {
private static final Logger log = LoggerFactory.getLogger(BtcNodesSetupPreferences.class);
private final Preferences preferences;
private final int numConnectionsForBtc;
private final Config config;
public BtcNodesSetupPreferences(Preferences preferences,
int numConnectionsForBtc) {
int numConnectionsForBtc,
Config config) {
this.preferences = preferences;
this.numConnectionsForBtc = numConnectionsForBtc;
this.config = config;
}
public List<BtcNodes.BtcNode> selectPreferredNodes(BtcNodes nodes) {
List<BtcNodes.BtcNode> result;
public List<BtcNode> selectPreferredNodes(BtcNodes btcNodes) {
List<BtcNode> result;
BtcNodes.BitcoinNodesOption nodesOption = BtcNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()];
switch (nodesOption) {
@ -51,10 +63,10 @@ public class BtcNodesSetupPreferences {
Set<String> distinctNodes = Utilities.commaSeparatedListToSet(bitcoinNodes, false);
result = BtcNodes.toBtcNodesList(distinctNodes);
if (result.isEmpty()) {
log.warn("Custom nodes is set but no valid nodes are provided. " +
"We fall back to provided nodes option.");
log.warn("Custom btcNodes is set but no valid btcNodes are provided. " +
"We fall back to provided btcNodes option.");
preferences.setBitcoinNodesOptionOrdinal(BtcNodes.BitcoinNodesOption.PROVIDED.ordinal());
result = nodes.getProvidedBtcNodes();
result = btcNodes.getProvidedBtcNodes();
}
break;
case PUBLIC:
@ -62,7 +74,24 @@ public class BtcNodesSetupPreferences {
break;
case PROVIDED:
default:
result = nodes.getProvidedBtcNodes();
Set<BtcNode> providedBtcNodes = new HashSet<>(btcNodes.getProvidedBtcNodes());
Set<BtcNode> filterProvidedBtcNodes = config.filterProvidedBtcNodes.stream()
.filter(n -> !n.isEmpty())
.map(this::getNodeAddress)
.filter(Objects::nonNull)
.map(nodeAddress -> new BtcNode(null, nodeAddress.getHostName(), null, nodeAddress.getPort(), "Provided by filter"))
.collect(Collectors.toSet());
providedBtcNodes.addAll(filterProvidedBtcNodes);
Set<String> bannedBtcNodeHostNames = config.bannedBtcNodes.stream()
.filter(n -> !n.isEmpty())
.map(this::getNodeAddress)
.filter(Objects::nonNull)
.map(NodeAddress::getHostName)
.collect(Collectors.toSet());
result = providedBtcNodes.stream()
.filter(e -> !bannedBtcNodeHostNames.contains(e.getHostName()))
.collect(Collectors.toList());
break;
}
@ -73,7 +102,7 @@ public class BtcNodesSetupPreferences {
return BtcNodes.BitcoinNodesOption.CUSTOM.ordinal() == preferences.getBitcoinNodesOptionOrdinal();
}
public int calculateMinBroadcastConnections(List<BtcNodes.BtcNode> nodes) {
public int calculateMinBroadcastConnections(List<BtcNode> nodes) {
BtcNodes.BitcoinNodesOption nodesOption = BtcNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()];
int result;
switch (nodesOption) {
@ -97,4 +126,13 @@ public class BtcNodesSetupPreferences {
return result;
}
@Nullable
private NodeAddress getNodeAddress(String address) {
try {
return new NodeAddress(address);
} catch (Throwable t) {
log.error("exception when filtering banned seednodes", t);
}
return null;
}
}

View file

@ -396,8 +396,7 @@ public class WalletsSetup {
}
private void configPeerNodes(@Nullable Socks5Proxy proxy) {
BtcNodesSetupPreferences btcNodesSetupPreferences = new BtcNodesSetupPreferences(preferences,
numConnectionsForBtc);
BtcNodesSetupPreferences btcNodesSetupPreferences = new BtcNodesSetupPreferences(preferences, numConnectionsForBtc, config);
List<BtcNode> nodes = btcNodesSetupPreferences.selectPreferredNodes(btcNodes);
int minBroadcastConnections = btcNodesSetupPreferences.calculateMinBroadcastConnections(nodes);

View file

@ -36,6 +36,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@ -51,7 +52,7 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository {
//TODO add support for localhost addresses
private static final Pattern pattern = Pattern.compile("^([a-z0-9]+\\.onion:\\d+)");
private static final String ENDING = ".seednodes";
private final Collection<NodeAddress> cache = new HashSet<>();
private final Set<NodeAddress> cache = new HashSet<>();
private final Config config;
@Inject
@ -73,13 +74,19 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository {
List<NodeAddress> result = getSeedNodeAddressesFromPropertyFile(config.baseCurrencyNetwork.name().toLowerCase(Locale.ENGLISH));
cache.addAll(result);
// let values configured by filter fail more gracefully
cache.removeAll(
config.bannedSeedNodes.stream()
.filter(n -> !n.isEmpty())
.map(this::getNodeAddress)
.filter(Objects::nonNull)
.collect(Collectors.toSet()));
Set<NodeAddress> filterProvidedSeedNodes = config.filterProvidedSeedNodes.stream()
.filter(n -> !n.isEmpty())
.map(this::getNodeAddress)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
cache.addAll(filterProvidedSeedNodes);
Set<NodeAddress> bannedSeedNodes = config.bannedSeedNodes.stream()
.filter(n -> !n.isEmpty())
.map(this::getNodeAddress)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
cache.removeAll(bannedSeedNodes);
log.info("Seed nodes: {}", cache);
} catch (Throwable t) {