diff --git a/core/src/main/java/bisq/core/app/BisqEnvironment.java b/core/src/main/java/bisq/core/app/BisqEnvironment.java index 439a5beace5..7406840ea99 100644 --- a/core/src/main/java/bisq/core/app/BisqEnvironment.java +++ b/core/src/main/java/bisq/core/app/BisqEnvironment.java @@ -193,7 +193,7 @@ public static boolean isDaoActivated(Environment environment) { protected final String btcNodes, seedNodes, ignoreDevMsg, useDevPrivilegeKeys, useDevMode, useTorForBtc, rpcUser, rpcPassword, rpcPort, rpcBlockNotificationPort, dumpBlockchainData, fullDaoNode, - myAddress, banList, dumpStatistics, maxMemory, socks5ProxyBtcAddress, + banList, dumpStatistics, maxMemory, socks5ProxyBtcAddress, torRcFile, torRcOptions, externalTorControlPort, externalTorPassword, externalTorCookieFile, socks5ProxyHttpAddress, useAllProvidedNodes, numConnectionForBtc, genesisTxId, genesisBlockHeight, referralId, daoActivated, msgThrottlePerSec, msgThrottlePer10Sec, sendMsgThrottleTrigger, sendMsgThrottleSleep; @@ -259,9 +259,6 @@ public BisqEnvironment(PropertySource commandLineProperties) { (String) commandLineProperties.getProperty(NetworkOptionKeys.SEED_NODES_KEY) : ""; - myAddress = commandLineProperties.containsProperty(NetworkOptionKeys.MY_ADDRESS) ? - (String) commandLineProperties.getProperty(NetworkOptionKeys.MY_ADDRESS) : - ""; banList = commandLineProperties.containsProperty(NetworkOptionKeys.BAN_LIST) ? (String) commandLineProperties.getProperty(NetworkOptionKeys.BAN_LIST) : ""; @@ -462,7 +459,6 @@ private PropertySource defaultProperties() { setProperty(CommonOptionKeys.USE_DEV_MODE, useDevMode); setProperty(NetworkOptionKeys.SEED_NODES_KEY, seedNodes); - setProperty(NetworkOptionKeys.MY_ADDRESS, myAddress); setProperty(NetworkOptionKeys.BAN_LIST, banList); setProperty(NetworkOptionKeys.TOR_DIR, Paths.get(btcNetworkDir, "tor").toString()); setProperty(NetworkOptionKeys.NETWORK_ID, String.valueOf(baseCurrencyNetwork.ordinal())); diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 2cc321c0dad..b82c123aa76 100644 --- a/core/src/main/java/bisq/core/app/BisqExecutable.java +++ b/core/src/main/java/bisq/core/app/BisqExecutable.java @@ -341,11 +341,6 @@ protected void customizeOptionParsing(OptionParser parser) { .withRequiredArg() .describedAs("host:port[,...]"); - parser.accepts(NetworkOptionKeys.MY_ADDRESS, - "My own onion address (used for bootstrap nodes to exclude itself)") - .withRequiredArg() - .describedAs("host:port"); - parser.accepts(NetworkOptionKeys.BAN_LIST, "Nodes to exclude from network connections.") .withRequiredArg() diff --git a/p2p/src/main/java/bisq/network/NetworkOptionKeys.java b/p2p/src/main/java/bisq/network/NetworkOptionKeys.java index 765a5c6b8a0..0cca23093ac 100644 --- a/p2p/src/main/java/bisq/network/NetworkOptionKeys.java +++ b/p2p/src/main/java/bisq/network/NetworkOptionKeys.java @@ -24,7 +24,6 @@ public class NetworkOptionKeys { public static final String PORT_KEY = "nodePort"; public static final String NETWORK_ID = "networkId"; public static final String SEED_NODES_KEY = "seedNodes"; - public static final String MY_ADDRESS = "myAddress"; public static final String BAN_LIST = "banList"; //SOCKS_5_PROXY_BTC_ADDRESS used in network module so dont move it to BtcOptionKeys public static final String SOCKS_5_PROXY_BTC_ADDRESS = "socks5ProxyBtcAddress"; diff --git a/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java b/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java index 6a5b7c78893..04349561be1 100644 --- a/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java +++ b/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java @@ -42,7 +42,6 @@ public class NetworkNodeProvider implements Provider { public NetworkNodeProvider(NetworkProtoResolver networkProtoResolver, BridgeAddressProvider bridgeAddressProvider, @Named(NetworkOptionKeys.USE_LOCALHOST_FOR_P2P) boolean useLocalhostForP2P, - @Named(NetworkOptionKeys.MY_ADDRESS) String address, @Named(NetworkOptionKeys.PORT_KEY) int port, @Named(NetworkOptionKeys.TOR_DIR) File torDir, @Named(NetworkOptionKeys.TORRC_FILE) String torrcFile, @@ -53,7 +52,7 @@ public NetworkNodeProvider(NetworkProtoResolver networkProtoResolver, @Named(NetworkOptionKeys.TOR_STREAM_ISOLATION) boolean streamIsolation, @Named(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE) boolean useSafeCookieAuthentication ) { networkNode = useLocalhostForP2P ? - new LocalhostNetworkNode(address, port, networkProtoResolver) : + new LocalhostNetworkNode(port, networkProtoResolver) : new TorNetworkNode(port, networkProtoResolver, streamIsolation, !controlPort.isEmpty() ? new RunningTor(torDir, Integer.parseInt(controlPort), password, cookieFile, useSafeCookieAuthentication) : diff --git a/p2p/src/main/java/bisq/network/p2p/P2PModule.java b/p2p/src/main/java/bisq/network/p2p/P2PModule.java index e94260d9b82..3618873a4ce 100644 --- a/p2p/src/main/java/bisq/network/p2p/P2PModule.java +++ b/p2p/src/main/java/bisq/network/p2p/P2PModule.java @@ -88,7 +88,6 @@ protected void configure() { Integer networkId = environment.getProperty(NetworkOptionKeys.NETWORK_ID, int.class, 1); bind(int.class).annotatedWith(Names.named(NetworkOptionKeys.NETWORK_ID)).toInstance(networkId); bindConstant().annotatedWith(named(NetworkOptionKeys.SEED_NODES_KEY)).to(environment.getRequiredProperty(NetworkOptionKeys.SEED_NODES_KEY)); - bindConstant().annotatedWith(named(NetworkOptionKeys.MY_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.MY_ADDRESS)); bindConstant().annotatedWith(named(NetworkOptionKeys.BAN_LIST)).to(environment.getRequiredProperty(NetworkOptionKeys.BAN_LIST)); bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS)); bindConstant().annotatedWith(named(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS)).to(environment.getRequiredProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS)); diff --git a/p2p/src/main/java/bisq/network/p2p/network/LocalhostNetworkNode.java b/p2p/src/main/java/bisq/network/p2p/network/LocalhostNetworkNode.java index ca0326419da..b49bff1e737 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/LocalhostNetworkNode.java +++ b/p2p/src/main/java/bisq/network/p2p/network/LocalhostNetworkNode.java @@ -41,8 +41,6 @@ public class LocalhostNetworkNode extends NetworkNode { private static int simulateTorDelayTorNode = 500; private static int simulateTorDelayHiddenService = 500; - private String address; - public static void setSimulateTorDelayTorNode(int simulateTorDelayTorNode) { LocalhostNetworkNode.simulateTorDelayTorNode = simulateTorDelayTorNode; } @@ -56,15 +54,8 @@ public static void setSimulateTorDelayHiddenService(int simulateTorDelayHiddenSe // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public LocalhostNetworkNode(String address, int port, NetworkProtoResolver networkProtoResolver) { - super(port, networkProtoResolver); - if (null != address && !address.trim().isEmpty()) { - this.address = address; - } - } - public LocalhostNetworkNode(int port, NetworkProtoResolver networkProtoResolver) { - this(null, port, networkProtoResolver); + super(port, networkProtoResolver); } @Override @@ -76,6 +67,8 @@ public void start(@Nullable SetupListener setupListener) { // simulate tor connection delay UserThread.runAfter(() -> { + nodeAddressProperty.set(new NodeAddress("localhost", servicePort)); + setupListeners.stream().forEach(SetupListener::onTorNodeReady); // simulate tor HS publishing delay @@ -86,10 +79,6 @@ public void start(@Nullable SetupListener setupListener) { e.printStackTrace(); log.error("Exception at startServer: " + e.getMessage()); } - final NodeAddress nodeAddress = address == null ? - new NodeAddress("localhost", servicePort) : - new NodeAddress(address); - nodeAddressProperty.set(nodeAddress); setupListeners.stream().forEach(SetupListener::onHiddenServicePublished); }, simulateTorDelayTorNode, TimeUnit.MILLISECONDS); }, simulateTorDelayHiddenService, TimeUnit.MILLISECONDS); diff --git a/p2p/src/main/java/bisq/network/p2p/network/NetworkNode.java b/p2p/src/main/java/bisq/network/p2p/network/NetworkNode.java index 75b4947daad..8ff8e04334d 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/NetworkNode.java +++ b/p2p/src/main/java/bisq/network/p2p/network/NetworkNode.java @@ -113,6 +113,11 @@ public SettableFuture sendMessage(@NotNull NodeAddress peersNodeAddr final SettableFuture resultFuture = SettableFuture.create(); ListenableFuture future = executorService.submit(() -> { Thread.currentThread().setName("NetworkNode:SendMessage-to-" + peersNodeAddress); + + if(peersNodeAddress.equals(getNodeAddress())){ + throw new ConnectException("We do not send a message to ourselves"); + } + OutboundConnection outboundConnection = null; try { // can take a while when using tor @@ -450,4 +455,9 @@ private void printInboundConnections() { public NodeAddress getNodeAddress() { return nodeAddressProperty.get(); } + + @Nullable + public ObjectProperty getNodeAddressProperty() { + return nodeAddressProperty; + } } diff --git a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java index c79b81c7477..ff94924b348 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java +++ b/p2p/src/main/java/bisq/network/p2p/network/TorNetworkNode.java @@ -250,11 +250,12 @@ private void createTorAndHiddenService(int localPort, int servicePort) { try { // get tor Tor.setDefault(torMode.getTor()); - UserThread.execute(() -> setupListeners.forEach(SetupListener::onTorNodeReady)); // start hidden service long ts2 = new Date().getTime(); hiddenServiceSocket = new HiddenServiceSocket(localPort, torMode.getHiddenServiceDirectory(), servicePort); + nodeAddressProperty.set(new NodeAddress(hiddenServiceSocket.getServiceName() + ":" + hiddenServiceSocket.getHiddenServicePort())); + UserThread.execute(() -> setupListeners.forEach(SetupListener::onTorNodeReady)); hiddenServiceSocket.addReadyListener(socket -> { try { log.info("\n################################################################\n" + diff --git a/p2p/src/main/java/bisq/network/p2p/peers/getdata/RequestDataManager.java b/p2p/src/main/java/bisq/network/p2p/peers/getdata/RequestDataManager.java index ffdee6072df..644f65ca9a3 100644 --- a/p2p/src/main/java/bisq/network/p2p/peers/getdata/RequestDataManager.java +++ b/p2p/src/main/java/bisq/network/p2p/peers/getdata/RequestDataManager.java @@ -38,6 +38,8 @@ import javax.inject.Inject; +import javafx.beans.property.SimpleObjectProperty; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -109,8 +111,7 @@ public interface Listener { public RequestDataManager(NetworkNode networkNode, SeedNodeRepository seedNodeRepository, P2PDataStorage dataStorage, - PeerManager peerManager, - @javax.annotation.Nullable @Named(NetworkOptionKeys.MY_ADDRESS) String myAddress) { + PeerManager peerManager) { this.networkNode = networkNode; this.dataStorage = dataStorage; this.peerManager = peerManager; @@ -121,14 +122,21 @@ public RequestDataManager(NetworkNode networkNode, this.seedNodeAddresses = new HashSet<>(seedNodeRepository.getSeedNodeAddresses()); - // If we are a seed node we use more redundancy at startup to be sure we get all data. - // We cannot use networkNode.getNodeAddress() as nodeAddress as that is null at this point, so we use - // new NodeAddress(myAddress) for checking if we are a seed node. - // seedNodeAddresses do not contain my own address as that gets filtered out - if (myAddress != null && !myAddress.isEmpty() && seedNodeRepository.isSeedNode(new NodeAddress(myAddress))) { - NUM_SEEDS_FOR_PRELIMINARY_REQUEST = 3; - NUM_ADDITIONAL_SEEDS_FOR_UPDATE_REQUEST = 2; - } + this.networkNode.getNodeAddressProperty().addListener(observable -> { + + NodeAddress myAddress = (NodeAddress) ((SimpleObjectProperty) observable).get(); + + seedNodeAddresses.remove(myAddress); + + // If we are a seed node we use more redundancy at startup to be sure we get all data. + // We cannot use networkNode.getNodeAddress() as nodeAddress as that is null at this point, so we use + // new NodeAddress(myAddress) for checking if we are a seed node. + // seedNodeAddresses do not contain my own address as that gets filtered out + if (myAddress != null && seedNodeRepository.isSeedNode(myAddress)) { + NUM_SEEDS_FOR_PRELIMINARY_REQUEST = 3; + NUM_ADDITIONAL_SEEDS_FOR_UPDATE_REQUEST = 2; + } + }); } public void shutDown() { diff --git a/p2p/src/test/java/bisq/network/p2p/DummySeedNode.java b/p2p/src/test/java/bisq/network/p2p/DummySeedNode.java index 0b9f6bc3578..ab9e6740f95 100644 --- a/p2p/src/test/java/bisq/network/p2p/DummySeedNode.java +++ b/p2p/src/test/java/bisq/network/p2p/DummySeedNode.java @@ -84,7 +84,6 @@ public DummySeedNode(String defaultUserDataDir) { // Example usage: -myAddress=lmvdenjkyvx2ovga.onion:8001 -networkId=0 -maxConnections=20 -useLocalhostForP2P=false -seedNodes=si3uu56adkyqkldl.onion:8002|eo5ay2lyzrfvx2nr.onion:8002 -ignore=4543y2lyzrfvx2nr.onion:8002|876572lyzrfvx2nr.onion:8002 public static final String USAGE = "Usage:\n" + - "--myAddress=\n" + "--networkId=[0|1|2] (Mainnet = 0, TestNet = 1, Regtest = 2)\n" + "--maxConnections=\n" + "--useLocalhostForP2P=[true|false]\n" + @@ -100,12 +99,7 @@ public void processArgs(String[] args) { String arg = arg1; if (arg.startsWith("--")) arg = arg.substring(2); - if (arg.startsWith(NetworkOptionKeys.MY_ADDRESS)) { - arg = arg.substring(NetworkOptionKeys.MY_ADDRESS.length() + 1); - checkArgument(arg.contains(":") && arg.split(":").length == 2 && arg.split(":")[1].length() > 3, "Wrong program argument: " + arg); - mySeedNodeAddress = new NodeAddress(arg); - log.debug("From processArgs: mySeedNodeAddress=" + mySeedNodeAddress); - } else if (arg.startsWith(NetworkOptionKeys.NETWORK_ID)) { + if (arg.startsWith(NetworkOptionKeys.NETWORK_ID)) { arg = arg.substring(NetworkOptionKeys.NETWORK_ID.length() + 1); networkId = Integer.parseInt(arg); log.debug("From processArgs: networkId=" + networkId);