From 9f2e9de94f7c2a55f3c82c4d1ea359bdc5882ee1 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 07:49:08 +0100 Subject: [PATCH 01/24] Extract MessageModule.BOOTSTRAP_NODE_KEY constant --- src/main/java/io/bitsquare/msg/MessageModule.java | 4 +++- .../java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index d2f7976d11..bcd89ee2e6 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -34,6 +34,8 @@ public abstract class MessageModule extends BitsquareModule { public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; public static final String NETWORK_INTERFACE_KEY = "networkInterface"; + public static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; + protected MessageModule(Properties properties) { super(properties); } @@ -52,7 +54,7 @@ public abstract class MessageModule extends BitsquareModule { ); bind(Node.class) - .annotatedWith(Names.named("bootstrapNode")) + .annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)) .toInstance(bootstrapNode); bind(String.class) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index a13a12856e..6870021bb5 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -68,6 +68,8 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static io.bitsquare.msg.MessageModule.BOOTSTRAP_NODE_KEY; + /** * Creates a DHT peer and bootstrap to the network via a seed node */ @@ -91,7 +93,7 @@ class BootstrappedPeerFactory { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public BootstrappedPeerFactory(Persistence persistence, @Named("bootstrapNode") Node bootstrapNode, + public BootstrappedPeerFactory(Persistence persistence, @Named(BOOTSTRAP_NODE_KEY) Node bootstrapNode, @Named("networkInterface") String networkInterface) { this.persistence = persistence; this.bootstrapNode = bootstrapNode; From 426ee28b930de9570755980386256ecadb459994 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:08:10 +0100 Subject: [PATCH 02/24] Extract TomP2PNode#USE_DISK_STORAGE_KEY constant --- src/main/java/io/bitsquare/msg/MessageModule.java | 3 --- .../io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 5 +++++ src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java | 10 ++++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index bcd89ee2e6..c396954846 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -44,9 +44,6 @@ public abstract class MessageModule extends BitsquareModule { protected final void configure() { bind(MessageFacade.class).to(messageFacade()).asEagerSingleton(); - // we will probably later use disk storage instead of memory storage for TomP2P - bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(false); - Node bootstrapNode = Node.at( properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 3e31154074..bf414507fc 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -20,6 +20,8 @@ package io.bitsquare.msg.tomp2p; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageModule; +import com.google.inject.name.Names; + import java.util.Properties; public class TomP2PMessageModule extends MessageModule { @@ -30,6 +32,9 @@ public class TomP2PMessageModule extends MessageModule { @Override protected void doConfigure() { + // we will probably later use disk storage instead of memory storage for TomP2P + bind(Boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); + bind(TomP2PNode.class).asEagerSingleton(); bind(BootstrappedPeerFactory.class).asEagerSingleton(); } diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java index 5f3768ccef..93211fc09c 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java @@ -78,6 +78,8 @@ import static io.bitsquare.util.tomp2p.BaseFutureUtil.isSuccess; public class TomP2PNode { private static final Logger log = LoggerFactory.getLogger(TomP2PNode.class); + static final String USE_DISK_STORAGE_KEY = "useDiskStorage"; + private KeyPair keyPair; private String appName; private final Boolean useDiskStorage; @@ -96,7 +98,7 @@ public class TomP2PNode { @Inject public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory, @Named("appName") String appName, - @Named("useDiskStorage") Boolean useDiskStorage) { + @Named(USE_DISK_STORAGE_KEY) Boolean useDiskStorage) { this.bootstrappedPeerFactory = bootstrappedPeerFactory; this.appName = appName; this.useDiskStorage = useDiskStorage; @@ -127,7 +129,7 @@ public class TomP2PNode { } public void start(int port, BootstrapListener bootstrapListener) { - useDiscStorage(useDiskStorage); + useDiskStorage(useDiskStorage); bootstrappedPeerFactory.setStorage(storage); setupTimerForIPCheck(); @@ -392,8 +394,8 @@ public class TomP2PNode { return putDomainProtectedData(locationKey, data); } - private void useDiscStorage(boolean useDiscStorage) { - if (useDiscStorage) { + private void useDiskStorage(boolean useDiskStorage) { + if (useDiskStorage) { File path = new File(AppDirectory.dir(appName).toFile() + "/tomP2P"); if (!path.exists()) { boolean created = path.mkdir(); From 9bdb4b424988379adebb1808af4bd2cde1f8be5f Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:20:15 +0100 Subject: [PATCH 03/24] Move {MessageModule=>BootstrappedPeerFactory}#BOOTSTRAP_NODE_KEY --- src/main/java/io/bitsquare/msg/MessageModule.java | 15 --------------- .../msg/tomp2p/BootstrappedPeerFactory.java | 4 +++- .../bitsquare/msg/tomp2p/TomP2PMessageModule.java | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index c396954846..50761b82a5 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -18,15 +18,12 @@ package io.bitsquare.msg; import io.bitsquare.BitsquareModule; -import io.bitsquare.network.Node; import com.google.inject.Injector; import com.google.inject.name.Names; import java.util.Properties; -import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; - public abstract class MessageModule extends BitsquareModule { public static final String BOOTSTRAP_NODE_ID_KEY = "id"; @@ -34,8 +31,6 @@ public abstract class MessageModule extends BitsquareModule { public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; public static final String NETWORK_INTERFACE_KEY = "networkInterface"; - public static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; - protected MessageModule(Properties properties) { super(properties); } @@ -44,16 +39,6 @@ public abstract class MessageModule extends BitsquareModule { protected final void configure() { bind(MessageFacade.class).to(messageFacade()).asEagerSingleton(); - Node bootstrapNode = Node.at( - properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), - properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), - properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) - ); - - bind(Node.class) - .annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)) - .toInstance(bootstrapNode); - bind(String.class) .annotatedWith(Names.named("networkInterface")) .toInstance(properties.getProperty(NETWORK_INTERFACE_KEY, "")); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index 6870021bb5..e463c31fd9 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -68,7 +68,7 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static io.bitsquare.msg.MessageModule.BOOTSTRAP_NODE_KEY; + /** * Creates a DHT peer and bootstrap to the network via a seed node @@ -76,6 +76,8 @@ import static io.bitsquare.msg.MessageModule.BOOTSTRAP_NODE_KEY; class BootstrappedPeerFactory { private static final Logger log = LoggerFactory.getLogger(BootstrappedPeerFactory.class); + static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; + private KeyPair keyPair; private Storage storage; private final Node bootstrapNode; diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index bf414507fc..461841846e 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -19,11 +19,14 @@ package io.bitsquare.msg.tomp2p; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageModule; +import io.bitsquare.network.Node; import com.google.inject.name.Names; import java.util.Properties; +import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; + public class TomP2PMessageModule extends MessageModule { public TomP2PMessageModule(Properties properties) { @@ -36,6 +39,17 @@ public class TomP2PMessageModule extends MessageModule { bind(Boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); bind(TomP2PNode.class).asEagerSingleton(); + + Node bootstrapNode = Node.at( + properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), + properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), + properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) + ); + + bind(Node.class) + .annotatedWith(Names.named(BootstrappedPeerFactory.BOOTSTRAP_NODE_KEY)) + .toInstance(bootstrapNode); + bind(BootstrappedPeerFactory.class).asEagerSingleton(); } From 8723e9ef0de2ece7f5d23a04c0b0f24e77bce179 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:26:56 +0100 Subject: [PATCH 04/24] Move {MessageModule=>TomP2PMessageModule}#BOOTSTRAP_NODE_*_KEY --- src/main/java/io/bitsquare/app/ArgumentParser.java | 3 ++- src/main/java/io/bitsquare/app/cli/SeedNode.java | 2 +- src/main/java/io/bitsquare/app/gui/Main.java | 3 ++- src/main/java/io/bitsquare/msg/MessageModule.java | 3 --- .../java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 4 ++++ 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index a685c7ef72..a97127f056 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -22,7 +22,8 @@ import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; -import static io.bitsquare.msg.MessageModule.*; +import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; +import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; public class ArgumentParser { diff --git a/src/main/java/io/bitsquare/app/cli/SeedNode.java b/src/main/java/io/bitsquare/app/cli/SeedNode.java index 512fff52fb..de7772263a 100644 --- a/src/main/java/io/bitsquare/app/cli/SeedNode.java +++ b/src/main/java/io/bitsquare/app/cli/SeedNode.java @@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory; import net.sourceforge.argparse4j.inf.Namespace; -import static io.bitsquare.msg.MessageModule.*; +import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; public class SeedNode { private static final Logger log = LoggerFactory.getLogger(SeedNode.class); diff --git a/src/main/java/io/bitsquare/app/gui/Main.java b/src/main/java/io/bitsquare/app/gui/Main.java index 7d11f36d06..e5af8c5264 100644 --- a/src/main/java/io/bitsquare/app/gui/Main.java +++ b/src/main/java/io/bitsquare/app/gui/Main.java @@ -50,7 +50,8 @@ import lighthouse.files.AppDirectory; import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; -import static io.bitsquare.msg.MessageModule.*; +import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; +import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; public class Main extends Application { private static final Logger log = LoggerFactory.getLogger(Main.class); diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index 50761b82a5..f389605173 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -26,9 +26,6 @@ import java.util.Properties; public abstract class MessageModule extends BitsquareModule { - public static final String BOOTSTRAP_NODE_ID_KEY = "id"; - public static final String BOOTSTRAP_NODE_IP_KEY = "ip"; - public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; public static final String NETWORK_INTERFACE_KEY = "networkInterface"; protected MessageModule(Properties properties) { diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 461841846e..d11dcdd2de 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -29,6 +29,10 @@ import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { + public static final String BOOTSTRAP_NODE_ID_KEY = "id"; + public static final String BOOTSTRAP_NODE_IP_KEY = "ip"; + public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; + public TomP2PMessageModule(Properties properties) { super(properties); } From 7e3c53ac24584487c0d41a466383eea0c2ab7c8e Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:36:22 +0100 Subject: [PATCH 05/24] Polish TomP2PMessageModule#doConfigure --- .../msg/tomp2p/TomP2PMessageModule.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index d11dcdd2de..076353e46b 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -25,6 +25,7 @@ import com.google.inject.name.Names; import java.util.Properties; +import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.BOOTSTRAP_NODE_KEY; import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { @@ -39,21 +40,16 @@ public class TomP2PMessageModule extends MessageModule { @Override protected void doConfigure() { - // we will probably later use disk storage instead of memory storage for TomP2P - bind(Boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); - + bind(boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); bind(TomP2PNode.class).asEagerSingleton(); - Node bootstrapNode = Node.at( - properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), - properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), - properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) + bind(Node.class).annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)).toInstance( + Node.at( + properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), + properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), + properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) + ) ); - - bind(Node.class) - .annotatedWith(Names.named(BootstrappedPeerFactory.BOOTSTRAP_NODE_KEY)) - .toInstance(bootstrapNode); - bind(BootstrappedPeerFactory.class).asEagerSingleton(); } From 9e00c3d85e6a11a622f0239ec5a021cc92082f2a Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:43:31 +0100 Subject: [PATCH 06/24] Use extracted NETWORK_INTERFACE_KEY consistently --- src/main/java/io/bitsquare/msg/MessageModule.java | 2 +- .../io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index f389605173..35792d4f43 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -37,7 +37,7 @@ public abstract class MessageModule extends BitsquareModule { bind(MessageFacade.class).to(messageFacade()).asEagerSingleton(); bind(String.class) - .annotatedWith(Names.named("networkInterface")) + .annotatedWith(Names.named(NETWORK_INTERFACE_KEY)) .toInstance(properties.getProperty(NETWORK_INTERFACE_KEY, "")); doConfigure(); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index e463c31fd9..56495c7af6 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -17,6 +17,7 @@ package io.bitsquare.msg.tomp2p; +import io.bitsquare.msg.MessageModule; import io.bitsquare.network.BootstrapState; import io.bitsquare.network.Node; import io.bitsquare.persistence.Persistence; @@ -68,6 +69,7 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; /** @@ -95,8 +97,9 @@ class BootstrappedPeerFactory { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public BootstrappedPeerFactory(Persistence persistence, @Named(BOOTSTRAP_NODE_KEY) Node bootstrapNode, - @Named("networkInterface") String networkInterface) { + public BootstrappedPeerFactory(Persistence persistence, + @Named(BOOTSTRAP_NODE_KEY) Node bootstrapNode, + @Named(NETWORK_INTERFACE_KEY) String networkInterface) { this.persistence = persistence; this.bootstrapNode = bootstrapNode; this.networkInterface = networkInterface; From ed76f73897ab142fa6fa2b8806e5ac86d46879e5 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 08:47:15 +0100 Subject: [PATCH 07/24] Move {MessageModule=>TomP2PMessageModule}#NETWORK_INTERFACE_KEY This change moves the NETWORK_INTERFACE_KEY into BootstrappedPeerFactory, where it is actually used, but because BootstrappedPeerFactory is package-private and has no other reason to be public, NETWORK_INTERFACE_KEY is re-exposed publicly through TomP2PMessageModule, where it can be used by types in the io.bitsquare.app* packages. --- src/main/java/io/bitsquare/app/ArgumentParser.java | 1 - src/main/java/io/bitsquare/app/gui/Main.java | 1 - src/main/java/io/bitsquare/msg/MessageModule.java | 7 ------- .../io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java | 4 +--- .../java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 3 +++ 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index a97127f056..b8a472d184 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -22,7 +22,6 @@ import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; -import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; public class ArgumentParser { diff --git a/src/main/java/io/bitsquare/app/gui/Main.java b/src/main/java/io/bitsquare/app/gui/Main.java index e5af8c5264..55afe99cdd 100644 --- a/src/main/java/io/bitsquare/app/gui/Main.java +++ b/src/main/java/io/bitsquare/app/gui/Main.java @@ -50,7 +50,6 @@ import lighthouse.files.AppDirectory; import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; -import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; public class Main extends Application { diff --git a/src/main/java/io/bitsquare/msg/MessageModule.java b/src/main/java/io/bitsquare/msg/MessageModule.java index 35792d4f43..e7092fa4da 100644 --- a/src/main/java/io/bitsquare/msg/MessageModule.java +++ b/src/main/java/io/bitsquare/msg/MessageModule.java @@ -20,14 +20,11 @@ package io.bitsquare.msg; import io.bitsquare.BitsquareModule; import com.google.inject.Injector; -import com.google.inject.name.Names; import java.util.Properties; public abstract class MessageModule extends BitsquareModule { - public static final String NETWORK_INTERFACE_KEY = "networkInterface"; - protected MessageModule(Properties properties) { super(properties); } @@ -36,10 +33,6 @@ public abstract class MessageModule extends BitsquareModule { protected final void configure() { bind(MessageFacade.class).to(messageFacade()).asEagerSingleton(); - bind(String.class) - .annotatedWith(Names.named(NETWORK_INTERFACE_KEY)) - .toInstance(properties.getProperty(NETWORK_INTERFACE_KEY, "")); - doConfigure(); } diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index 56495c7af6..4f7502e937 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -17,7 +17,6 @@ package io.bitsquare.msg.tomp2p; -import io.bitsquare.msg.MessageModule; import io.bitsquare.network.BootstrapState; import io.bitsquare.network.Node; import io.bitsquare.persistence.Persistence; @@ -69,8 +68,6 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static io.bitsquare.msg.MessageModule.NETWORK_INTERFACE_KEY; - /** * Creates a DHT peer and bootstrap to the network via a seed node @@ -79,6 +76,7 @@ class BootstrappedPeerFactory { private static final Logger log = LoggerFactory.getLogger(BootstrappedPeerFactory.class); static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; + static final String NETWORK_INTERFACE_KEY = "networkInterface"; private KeyPair keyPair; private Storage storage; diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 076353e46b..9f70bb983c 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -33,6 +33,7 @@ public class TomP2PMessageModule extends MessageModule { public static final String BOOTSTRAP_NODE_ID_KEY = "id"; public static final String BOOTSTRAP_NODE_IP_KEY = "ip"; public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; + public static final String NETWORK_INTERFACE_KEY = BootstrappedPeerFactory.NETWORK_INTERFACE_KEY; public TomP2PMessageModule(Properties properties) { super(properties); @@ -50,6 +51,8 @@ public class TomP2PMessageModule extends MessageModule { properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) ) ); + bindConstant().annotatedWith(Names.named(NETWORK_INTERFACE_KEY)).to( + properties.getProperty(NETWORK_INTERFACE_KEY, "")); bind(BootstrappedPeerFactory.class).asEagerSingleton(); } From 85f5f02378b871c06d058dd039b6b290d4fa33ef Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 09:07:32 +0100 Subject: [PATCH 08/24] Introduce NETWORK_INTERFACE_UNSPECIFIED contstant Use an explicit value of "" vs. empty string ("") for clarity when the user has not specified a network interface to use. --- .../java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java | 3 ++- .../java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index 4f7502e937..e0c0d6622f 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -77,6 +77,7 @@ class BootstrappedPeerFactory { static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; static final String NETWORK_INTERFACE_KEY = "networkInterface"; + static final String NETWORK_INTERFACE_UNSPECIFIED = ""; private KeyPair keyPair; private Storage storage; @@ -132,7 +133,7 @@ class BootstrappedPeerFactory { cc.maxPermitsTCP(100); cc.maxPermitsUDP(100); Bindings bindings = new Bindings(); - if (!networkInterface.equals("")) + if (!NETWORK_INTERFACE_UNSPECIFIED.equals(networkInterface)) bindings.addInterface(networkInterface); peer = new PeerBuilder(keyPair).ports(port).peerMap(pm).bindings(bindings) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 9f70bb983c..dcdcb112bd 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -25,7 +25,7 @@ import com.google.inject.name.Names; import java.util.Properties; -import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.BOOTSTRAP_NODE_KEY; +import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.*; import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { @@ -52,7 +52,7 @@ public class TomP2PMessageModule extends MessageModule { ) ); bindConstant().annotatedWith(Names.named(NETWORK_INTERFACE_KEY)).to( - properties.getProperty(NETWORK_INTERFACE_KEY, "")); + properties.getProperty(NETWORK_INTERFACE_KEY, NETWORK_INTERFACE_UNSPECIFIED)); bind(BootstrappedPeerFactory.class).asEagerSingleton(); } From bad88f1612b02e3e5f2de15a96e86d8464b7be11 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 11:19:53 +0100 Subject: [PATCH 09/24] Extract clientPort constant --- src/main/java/io/bitsquare/app/AppModule.java | 5 ----- src/main/java/io/bitsquare/gui/main/MainModel.java | 9 ++------- src/main/java/io/bitsquare/msg/MessageFacade.java | 2 +- .../io/bitsquare/msg/tomp2p/TomP2PMessageFacade.java | 7 +++---- .../io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 4 ++++ src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java | 9 +++++++-- 6 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/bitsquare/app/AppModule.java b/src/main/java/io/bitsquare/app/AppModule.java index e7f34d289a..8b7a134a0e 100644 --- a/src/main/java/io/bitsquare/app/AppModule.java +++ b/src/main/java/io/bitsquare/app/AppModule.java @@ -36,8 +36,6 @@ import com.google.inject.name.Names; import java.util.Properties; -import net.tomp2p.connection.Ports; - /** * Configures all non-UI modules necessary to run a Bitsquare application. */ @@ -64,9 +62,6 @@ public class AppModule extends BitsquareModule { Preconditions.checkArgument(appName != null, "App name must be non-null"); bindConstant().annotatedWith(Names.named("appName")).to(appName); - - int randomPort = new Ports().tcpPort(); - bindConstant().annotatedWith(Names.named("clientPort")).to(randomPort); } protected MessageModule messageModule() { diff --git a/src/main/java/io/bitsquare/gui/main/MainModel.java b/src/main/java/io/bitsquare/gui/main/MainModel.java index 4e61501cd4..49963ec5ed 100644 --- a/src/main/java/io/bitsquare/gui/main/MainModel.java +++ b/src/main/java/io/bitsquare/gui/main/MainModel.java @@ -31,8 +31,6 @@ import io.bitsquare.user.User; import com.google.inject.Inject; -import javax.inject.Named; - import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; @@ -56,7 +54,6 @@ class MainModel extends UIModel { private final MessageFacade messageFacade; private final TradeManager tradeManager; private final Persistence persistence; - private final int clientPort; private boolean messageFacadeInited; private boolean walletFacadeInited; @@ -75,14 +72,12 @@ class MainModel extends UIModel { @Inject private MainModel(User user, WalletFacade walletFacade, MessageFacade messageFacade, - TradeManager tradeManager, Persistence persistence, - @Named("clientPort") int clientPort) { + TradeManager tradeManager, Persistence persistence) { this.user = user; this.walletFacade = walletFacade; this.messageFacade = messageFacade; this.tradeManager = tradeManager; this.persistence = persistence; - this.clientPort = clientPort; } @@ -112,7 +107,7 @@ class MainModel extends UIModel { // For testing with the serverside seednode we need the BootstrappedPeerFactory which gets started form // messageFacade.init - messageFacade.init(clientPort, new BootstrapListener() { + messageFacade.init(new BootstrapListener() { @Override public void onCompleted() { messageFacadeInited = true; diff --git a/src/main/java/io/bitsquare/msg/MessageFacade.java b/src/main/java/io/bitsquare/msg/MessageFacade.java index 1dd9f49868..f57f5d9e1a 100644 --- a/src/main/java/io/bitsquare/msg/MessageFacade.java +++ b/src/main/java/io/bitsquare/msg/MessageFacade.java @@ -45,7 +45,7 @@ public interface MessageFacade extends MessageBroker { void getArbitrators(Locale defaultLanguageLocale); - void init(int clientPort, BootstrapListener bootstrapListener); + void init(BootstrapListener bootstrapListener); void getPeerAddress(PublicKey messagePublicKey, GetPeerAddressListener getPeerAddressListener); } diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageFacade.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageFacade.java index 19255f105e..4be38ec5a4 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageFacade.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageFacade.java @@ -92,11 +92,10 @@ class TomP2PMessageFacade implements MessageFacade { // Public Methods /////////////////////////////////////////////////////////////////////////////////////////// - public void init(int port, BootstrapListener bootstrapListener) { + public void init(BootstrapListener bootstrapListener) { p2pNode.setMessageBroker(this); p2pNode.setKeyPair(user.getMessageKeyPair()); - - p2pNode.start(port, bootstrapListener); + p2pNode.start(bootstrapListener); } public void shutDown() { @@ -219,7 +218,7 @@ class TomP2PMessageFacade implements MessageFacade { } })); - // We don't test futureRemove.isSuccess() as this API does not fit well to that operation, + // We don't test futureRemove.isSuccess() as this API does not fit well to that operation, // it might change in future to something like foundAndRemoved and notFound // See discussion at: https://github.com/tomp2p/TomP2P/issues/57#issuecomment-62069840 diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index dcdcb112bd..272ed988f1 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -25,6 +25,8 @@ import com.google.inject.name.Names; import java.util.Properties; +import net.tomp2p.connection.Ports; + import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.*; import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; @@ -41,6 +43,8 @@ public class TomP2PMessageModule extends MessageModule { @Override protected void doConfigure() { + Integer randomPort = new Ports().tcpPort(); + bindConstant().annotatedWith(Names.named(TomP2PNode.CLIENT_PORT_KEY)).to(randomPort); bind(boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); bind(TomP2PNode.class).asEagerSingleton(); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java index 93211fc09c..f778202c9a 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java @@ -79,9 +79,11 @@ public class TomP2PNode { private static final Logger log = LoggerFactory.getLogger(TomP2PNode.class); static final String USE_DISK_STORAGE_KEY = "useDiskStorage"; + static final String CLIENT_PORT_KEY = "clientPort"; private KeyPair keyPair; private String appName; + private final int clientPort; private final Boolean useDiskStorage; private MessageBroker messageBroker; @@ -98,9 +100,11 @@ public class TomP2PNode { @Inject public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory, @Named("appName") String appName, + @Named(CLIENT_PORT_KEY) int clientPort, @Named(USE_DISK_STORAGE_KEY) Boolean useDiskStorage) { this.bootstrappedPeerFactory = bootstrappedPeerFactory; this.appName = appName; + this.clientPort = clientPort; this.useDiskStorage = useDiskStorage; } @@ -111,6 +115,7 @@ public class TomP2PNode { peerDHT.peerBean().keyPair(keyPair); messageBroker = (message, peerAddress) -> { }; + clientPort = -1; useDiskStorage = false; } @@ -128,13 +133,13 @@ public class TomP2PNode { bootstrappedPeerFactory.setKeyPair(keyPair); } - public void start(int port, BootstrapListener bootstrapListener) { + public void start(BootstrapListener bootstrapListener) { useDiskStorage(useDiskStorage); bootstrappedPeerFactory.setStorage(storage); setupTimerForIPCheck(); - ListenableFuture bootstrapComplete = bootstrap(port); + ListenableFuture bootstrapComplete = bootstrap(clientPort); Futures.addCallback(bootstrapComplete, new FutureCallback() { @Override public void onSuccess(@Nullable PeerDHT result) { From 9ddf075366338f25f6996a39425d332d64689ad4 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 11:27:50 +0100 Subject: [PATCH 10/24] Qualify id, ip and port options with 'bootstrap.node.*' This change clarifies the relationship between the Bitsquare node that is being run (the local node) and the Bitsquare node that the local node is being bootstrapped against (the bootstrap node). Prior to this change, customizing bootstrap node looked like this: java -jar bitsquare.jar --ip=203.0.113.3 Now it looks like this: java -jar bitsquare.jar --bootstrap.node.ip=203.0.113.3 This change also removes entirely the short option strings (-d, -s, -p, -i) for simplicity and clarity while these values are undergoing change. By qualifying bootstrap node options explicitly in this fashion, we make way for customizing the the same values against the local node. These changes will come with subsequent commits. --- src/main/java/io/bitsquare/app/ArgumentParser.java | 8 ++++---- .../java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index b8a472d184..749bc4b745 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -34,15 +34,15 @@ public class ArgumentParser { .description("Bitsquare - The decentralized bitcoin exchange"); // Args for seed node config - parser.addArgument("-d", "--" + BOOTSTRAP_NODE_ID_KEY) + parser.addArgument("--" + BOOTSTRAP_NODE_ID_KEY) .help("Seed node ID"); - parser.addArgument("-s", "--" + BOOTSTRAP_NODE_IP_KEY) + parser.addArgument("--" + BOOTSTRAP_NODE_IP_KEY) .help("Seed node IP"); - parser.addArgument("-p", "--" + BOOTSTRAP_NODE_PORT_KEY) + parser.addArgument("--" + BOOTSTRAP_NODE_PORT_KEY) .help("Seed node port"); // A custom network interface (needed at the moment for windows, but might be useful also later) - parser.addArgument("-i", "--" + NETWORK_INTERFACE_KEY) + parser.addArgument("--" + NETWORK_INTERFACE_KEY) .help("Network interface"); // Args for app config diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 272ed988f1..39d0c23b95 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -32,9 +32,9 @@ import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { - public static final String BOOTSTRAP_NODE_ID_KEY = "id"; - public static final String BOOTSTRAP_NODE_IP_KEY = "ip"; - public static final String BOOTSTRAP_NODE_PORT_KEY = "port"; + public static final String BOOTSTRAP_NODE_ID_KEY = "bootstrap.node.id"; + public static final String BOOTSTRAP_NODE_IP_KEY = "bootstrap.node.ip"; + public static final String BOOTSTRAP_NODE_PORT_KEY = "bootstrap.node.port"; public static final String NETWORK_INTERFACE_KEY = BootstrappedPeerFactory.NETWORK_INTERFACE_KEY; public TomP2PMessageModule(Properties properties) { From cb0e214a288050d68e4e7352dba128d75d948989 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 11:52:39 +0100 Subject: [PATCH 11/24] Polish whitespace --- src/test/java/io/bitsquare/msg/TomP2PTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index 97bf06484a..def7c4d792 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -237,7 +237,7 @@ public class TomP2PTests { futureRemove.awaitUninterruptibly(); futureRemove.awaitListenersUninterruptibly(); - // We don't test futureRemove.isSuccess() as this API does not fit well to that operation, + // We don't test futureRemove.isSuccess() as this API does not fit well to that operation, // it might change in future to something like foundAndRemoved and notFound // See discussion at: https://github.com/tomp2p/TomP2P/issues/57#issuecomment-62069840 From 2ae59494481b179a4c757cf91a9b31b293c8f555 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 12:21:43 +0100 Subject: [PATCH 12/24] Allow command-line configuration of local node id and port This change does away with the notion of "clientPort" and replaces it, simply, with "port". There are only two ports we care about in Bitsquare: 1. The port that the local node (i.e. a Bitsquare UI running on your laptop) listens on. This value is now specified with `--port` 2. The port of the bootstrap node that the local node will connect to on its first run. This value is specified with `--bootstrap.node.port` So, for example, the following is a valid commandline invocation: java -jar bitsquare.jar --port 1234 --bootstrap.node.port=9876 Both of these values default to Node.DEFAULT_PORT (currently 7366) This commit also introduces the --id flag for configuring the ID of the local node. --- .../java/io/bitsquare/app/ArgumentParser.java | 8 +++++ .../java/io/bitsquare/app/cli/SeedNode.java | 19 +++-------- .../msg/tomp2p/TomP2PMessageModule.java | 6 ++-- .../io/bitsquare/msg/tomp2p/TomP2PNode.java | 12 +++---- src/main/java/io/bitsquare/network/Node.java | 2 ++ .../java/io/bitsquare/msg/TomP2PTests.java | 34 ++++++++----------- 6 files changed, 38 insertions(+), 43 deletions(-) diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index 749bc4b745..0b42d1da86 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -17,6 +17,8 @@ package io.bitsquare.app; +import io.bitsquare.network.Node; + import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; @@ -33,6 +35,12 @@ public class ArgumentParser { .defaultHelp(true) .description("Bitsquare - The decentralized bitcoin exchange"); + // Args for local node config + parser.addArgument("--" + Node.ID_KEY) + .help("Local node ID"); + parser.addArgument("--" + Node.PORT_KEY) + .help("Local port to listen on"); + // Args for seed node config parser.addArgument("--" + BOOTSTRAP_NODE_ID_KEY) .help("Seed node ID"); diff --git a/src/main/java/io/bitsquare/app/cli/SeedNode.java b/src/main/java/io/bitsquare/app/cli/SeedNode.java index de7772263a..fbaad46a32 100644 --- a/src/main/java/io/bitsquare/app/cli/SeedNode.java +++ b/src/main/java/io/bitsquare/app/cli/SeedNode.java @@ -18,7 +18,6 @@ package io.bitsquare.app.cli; import io.bitsquare.app.ArgumentParser; -import io.bitsquare.network.BootstrapNodes; import io.bitsquare.network.Node; import net.tomp2p.dht.PeerBuilderDHT; @@ -36,8 +35,6 @@ import org.slf4j.LoggerFactory; import net.sourceforge.argparse4j.inf.Namespace; -import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; - public class SeedNode { private static final Logger log = LoggerFactory.getLogger(SeedNode.class); @@ -48,18 +45,12 @@ public class SeedNode { ArgumentParser parser = new ArgumentParser(); Namespace namespace = parser.parseArgs(args); - Node defaultNode = BootstrapNodes.DIGITAL_OCEAN_1; - String id = defaultNode.getId(); - int port = defaultNode.getPort(); + String id = namespace.getString(Node.ID_KEY); + if (id == null) + throw new IllegalArgumentException(String.format("--%s option is required", Node.ID_KEY)); - // Passed program args will override the properties of the default bootstrapNode - // So you can use the same id but different ports (e.g. running several nodes on one server with - // different ports) - if (namespace.getString(BOOTSTRAP_NODE_ID_KEY) != null) - id = namespace.getString(BOOTSTRAP_NODE_ID_KEY); - - if (namespace.getString(BOOTSTRAP_NODE_PORT_KEY) != null) - port = Integer.valueOf(namespace.getString(BOOTSTRAP_NODE_PORT_KEY)); + String portValue = namespace.getString(Node.PORT_KEY); + int port = portValue != null ? Integer.valueOf(portValue) : Node.DEFAULT_PORT; try { Number160 peerId = Number160.createHash(id); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 39d0c23b95..a16877e0c7 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -25,8 +25,6 @@ import com.google.inject.name.Names; import java.util.Properties; -import net.tomp2p.connection.Ports; - import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.*; import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; @@ -43,8 +41,8 @@ public class TomP2PMessageModule extends MessageModule { @Override protected void doConfigure() { - Integer randomPort = new Ports().tcpPort(); - bindConstant().annotatedWith(Names.named(TomP2PNode.CLIENT_PORT_KEY)).to(randomPort); + bind(int.class).annotatedWith(Names.named(Node.PORT_KEY)).toInstance( + Integer.valueOf(properties.getProperty(Node.PORT_KEY, String.valueOf(Node.DEFAULT_PORT)))); bind(boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); bind(TomP2PNode.class).asEagerSingleton(); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java index f778202c9a..b6b326f698 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java @@ -19,6 +19,7 @@ package io.bitsquare.msg.tomp2p; import io.bitsquare.msg.MessageBroker; import io.bitsquare.msg.listeners.BootstrapListener; +import io.bitsquare.network.Node; import io.bitsquare.network.tomp2p.TomP2PPeer; import com.google.common.util.concurrent.FutureCallback; @@ -79,11 +80,10 @@ public class TomP2PNode { private static final Logger log = LoggerFactory.getLogger(TomP2PNode.class); static final String USE_DISK_STORAGE_KEY = "useDiskStorage"; - static final String CLIENT_PORT_KEY = "clientPort"; private KeyPair keyPair; private String appName; - private final int clientPort; + private final int port; private final Boolean useDiskStorage; private MessageBroker messageBroker; @@ -100,11 +100,11 @@ public class TomP2PNode { @Inject public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory, @Named("appName") String appName, - @Named(CLIENT_PORT_KEY) int clientPort, + @Named(Node.PORT_KEY) int port, @Named(USE_DISK_STORAGE_KEY) Boolean useDiskStorage) { this.bootstrappedPeerFactory = bootstrappedPeerFactory; this.appName = appName; - this.clientPort = clientPort; + this.port = port; this.useDiskStorage = useDiskStorage; } @@ -115,7 +115,7 @@ public class TomP2PNode { peerDHT.peerBean().keyPair(keyPair); messageBroker = (message, peerAddress) -> { }; - clientPort = -1; + port = Node.DEFAULT_PORT; useDiskStorage = false; } @@ -139,7 +139,7 @@ public class TomP2PNode { bootstrappedPeerFactory.setStorage(storage); setupTimerForIPCheck(); - ListenableFuture bootstrapComplete = bootstrap(clientPort); + ListenableFuture bootstrapComplete = bootstrap(port); Futures.addCallback(bootstrapComplete, new FutureCallback() { @Override public void onSuccess(@Nullable PeerDHT result) { diff --git a/src/main/java/io/bitsquare/network/Node.java b/src/main/java/io/bitsquare/network/Node.java index 2410a234cb..ae59dfc851 100644 --- a/src/main/java/io/bitsquare/network/Node.java +++ b/src/main/java/io/bitsquare/network/Node.java @@ -20,6 +20,8 @@ package io.bitsquare.network; import com.google.common.base.Objects; public final class Node { + public static final String ID_KEY = "id"; + public static final String PORT_KEY = "port"; public static final int DEFAULT_PORT = 7366; private final String id; diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index def7c4d792..c5b37208f8 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -304,8 +304,7 @@ public class TomP2PTests { assertEquals("pong", futureDirect.object()); } - private Peer bootstrapDirectConnection(String clientId, int clientPort) { - final String id = clientId + clientPort; + private Peer bootstrapDirectConnection(String clientId, int port) { Peer peer = null; try { Number160 peerId = Number160.createHash(clientId); @@ -315,7 +314,7 @@ public class TomP2PTests { cc.maxPermitsTCP(100); cc.maxPermitsUDP(100); peer = new PeerBuilder(peerId).bindings(getBindings()).channelClientConfiguration(cc).peerMap(pm) - .ports(clientPort).start(); + .ports(port).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); futureDiscover.awaitUninterruptibly(); if (futureDiscover.isSuccess()) { @@ -347,12 +346,11 @@ public class TomP2PTests { } } - private Peer bootstrapWithPortForwarding(String clientId, int clientPort) { - final String id = clientId + clientPort; + private Peer bootstrapWithPortForwarding(String clientId, int port) { Peer peer = null; try { peer = new PeerBuilder(Number160.createHash(clientId)).bindings(getBindings()).behindFirewall() - .ports(clientPort).start(); + .ports(port).start(); PeerNAT peerNAT = new PeerBuilderNAT(peer).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); @@ -401,13 +399,11 @@ public class TomP2PTests { } } - private Peer bootstrapInRelayMode(String clientId, int clientPort) { - final String id = clientId + clientPort; - + private Peer bootstrapInRelayMode(String clientId, int port) { Peer peer = null; try { peer = new PeerBuilder(Number160.createHash(clientId)).bindings(getBindings()).behindFirewall() - .ports(clientPort).start(); + .ports(port).start(); PeerNAT peerNAT = new PeerBuilderNAT(peer).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); @@ -444,19 +440,19 @@ public class TomP2PTests { } } - private Peer bootstrapInUnknownMode(String clientId, int clientPort) { + private Peer bootstrapInUnknownMode(String clientId, int port) { resolvedConnectionType = ConnectionType.DIRECT; - Peer peer = bootstrapDirectConnection(clientId, clientPort); + Peer peer = bootstrapDirectConnection(clientId, port); if (peer != null) return peer; resolvedConnectionType = ConnectionType.NAT; - peer = bootstrapWithPortForwarding(clientId, clientPort); + peer = bootstrapWithPortForwarding(clientId, port); if (peer != null) return peer; resolvedConnectionType = ConnectionType.RELAY; - peer = bootstrapInRelayMode(clientId, clientPort); + peer = bootstrapInRelayMode(clientId, port); if (peer != null) return peer; else @@ -466,19 +462,19 @@ public class TomP2PTests { return peer; } - private PeerDHT getDHTPeer(String clientId, int clientPort) { + private PeerDHT getDHTPeer(String clientId, int port) { Peer peer; if (FORCED_CONNECTION_TYPE == ConnectionType.DIRECT) { - peer = bootstrapDirectConnection(clientId, clientPort); + peer = bootstrapDirectConnection(clientId, port); } else if (FORCED_CONNECTION_TYPE == ConnectionType.NAT) { - peer = bootstrapWithPortForwarding(clientId, clientPort); + peer = bootstrapWithPortForwarding(clientId, port); } else if (FORCED_CONNECTION_TYPE == ConnectionType.RELAY) { - peer = bootstrapInRelayMode(clientId, clientPort); + peer = bootstrapInRelayMode(clientId, port); } else { - peer = bootstrapInUnknownMode(clientId, clientPort); + peer = bootstrapInUnknownMode(clientId, port); } if (peer == null) From 3398a973117043dc26872ea3a55494289009067b Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 12:49:24 +0100 Subject: [PATCH 13/24] Rename Node#{id => name} Refer to the "name" of a node rather than its "id". This is reflected in the command line options as well. Instead of `--id`, now pass `--name`. Instead of `--bootstrap.node.id`, now pass `--bootstrap.node.id`. --- .../java/io/bitsquare/app/ArgumentParser.java | 4 +-- .../java/io/bitsquare/app/cli/SeedNode.java | 8 ++--- src/main/java/io/bitsquare/app/gui/Main.java | 8 +++-- .../msg/tomp2p/BootstrappedPeerFactory.java | 2 +- .../msg/tomp2p/TomP2PMessageModule.java | 4 +-- src/main/java/io/bitsquare/network/Node.java | 30 +++++++++---------- .../java/io/bitsquare/msg/TomP2PTests.java | 2 +- .../java/io/bitsquare/network/NodeTests.java | 6 ++-- 8 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index 0b42d1da86..ad1bf769f5 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -36,13 +36,13 @@ public class ArgumentParser { .description("Bitsquare - The decentralized bitcoin exchange"); // Args for local node config - parser.addArgument("--" + Node.ID_KEY) + parser.addArgument("--" + Node.NAME_KEY) .help("Local node ID"); parser.addArgument("--" + Node.PORT_KEY) .help("Local port to listen on"); // Args for seed node config - parser.addArgument("--" + BOOTSTRAP_NODE_ID_KEY) + parser.addArgument("--" + BOOTSTRAP_NODE_NAME_KEY) .help("Seed node ID"); parser.addArgument("--" + BOOTSTRAP_NODE_IP_KEY) .help("Seed node IP"); diff --git a/src/main/java/io/bitsquare/app/cli/SeedNode.java b/src/main/java/io/bitsquare/app/cli/SeedNode.java index fbaad46a32..f15df2953d 100644 --- a/src/main/java/io/bitsquare/app/cli/SeedNode.java +++ b/src/main/java/io/bitsquare/app/cli/SeedNode.java @@ -45,15 +45,15 @@ public class SeedNode { ArgumentParser parser = new ArgumentParser(); Namespace namespace = parser.parseArgs(args); - String id = namespace.getString(Node.ID_KEY); - if (id == null) - throw new IllegalArgumentException(String.format("--%s option is required", Node.ID_KEY)); + String name = namespace.getString(Node.NAME_KEY); + if (name == null) + throw new IllegalArgumentException(String.format("--%s option is required", Node.NAME_KEY)); String portValue = namespace.getString(Node.PORT_KEY); int port = portValue != null ? Integer.valueOf(portValue) : Node.DEFAULT_PORT; try { - Number160 peerId = Number160.createHash(id); + Number160 peerId = Number160.createHash(name); PeerMapConfiguration pmc = new PeerMapConfiguration(peerId).peerNoVerification(); PeerMap pm = new PeerMap(pmc); peer = new PeerBuilder(peerId).ports(port).peerMap(pm).start(); diff --git a/src/main/java/io/bitsquare/app/gui/Main.java b/src/main/java/io/bitsquare/app/gui/Main.java index 55afe99cdd..ce6d252af9 100644 --- a/src/main/java/io/bitsquare/app/gui/Main.java +++ b/src/main/java/io/bitsquare/app/gui/Main.java @@ -51,6 +51,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; +import static io.bitsquare.network.Node.*; public class Main extends Application { private static final Logger log = LoggerFactory.getLogger(Main.class); @@ -70,8 +71,11 @@ public class Main extends Application { properties.setProperty(APP_NAME_KEY, appName); - if (argumentsNamespace.getString(BOOTSTRAP_NODE_ID_KEY) != null) - properties.setProperty(BOOTSTRAP_NODE_ID_KEY, argumentsNamespace.getString(BOOTSTRAP_NODE_ID_KEY)); + if (argumentsNamespace.getString(NAME_KEY) != null) + properties.setProperty(NAME_KEY, argumentsNamespace.getString(NAME_KEY)); + + if (argumentsNamespace.getString(BOOTSTRAP_NODE_NAME_KEY) != null) + properties.setProperty(BOOTSTRAP_NODE_NAME_KEY, argumentsNamespace.getString(BOOTSTRAP_NODE_NAME_KEY)); if (argumentsNamespace.getString(BOOTSTRAP_NODE_IP_KEY) != null) properties.setProperty(BOOTSTRAP_NODE_IP_KEY, argumentsNamespace.getString(BOOTSTRAP_NODE_IP_KEY)); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index e0c0d6622f..116abb3c69 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -349,7 +349,7 @@ class BootstrappedPeerFactory { private PeerAddress getBootstrapAddress() { try { - return new PeerAddress(Number160.createHash(bootstrapNode.getId()), + return new PeerAddress(Number160.createHash(bootstrapNode.getName()), InetAddress.getByName(bootstrapNode.getIp()), bootstrapNode.getPort(), bootstrapNode.getPort()); diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index a16877e0c7..ba56742fb6 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -30,7 +30,7 @@ import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { - public static final String BOOTSTRAP_NODE_ID_KEY = "bootstrap.node.id"; + public static final String BOOTSTRAP_NODE_NAME_KEY = "bootstrap.node.name"; public static final String BOOTSTRAP_NODE_IP_KEY = "bootstrap.node.ip"; public static final String BOOTSTRAP_NODE_PORT_KEY = "bootstrap.node.port"; public static final String NETWORK_INTERFACE_KEY = BootstrappedPeerFactory.NETWORK_INTERFACE_KEY; @@ -48,7 +48,7 @@ public class TomP2PMessageModule extends MessageModule { bind(Node.class).annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)).toInstance( Node.at( - properties.getProperty(BOOTSTRAP_NODE_ID_KEY, DEFAULT_BOOTSTRAP_NODE.getId()), + properties.getProperty(BOOTSTRAP_NODE_NAME_KEY, DEFAULT_BOOTSTRAP_NODE.getName()), properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) ) diff --git a/src/main/java/io/bitsquare/network/Node.java b/src/main/java/io/bitsquare/network/Node.java index ae59dfc851..e03788e5be 100644 --- a/src/main/java/io/bitsquare/network/Node.java +++ b/src/main/java/io/bitsquare/network/Node.java @@ -20,34 +20,34 @@ package io.bitsquare.network; import com.google.common.base.Objects; public final class Node { - public static final String ID_KEY = "id"; + public static final String NAME_KEY = "name"; public static final String PORT_KEY = "port"; public static final int DEFAULT_PORT = 7366; - private final String id; + private final String name; private final String ip; private final int port; - private Node(String id, String ip, int port) { - this.id = id; + private Node(String name, String ip, int port) { + this.name = name; this.ip = ip; this.port = port; } - public static Node at(String id, String ip) { - return Node.at(id, ip, DEFAULT_PORT); + public static Node at(String name, String ip) { + return Node.at(name, ip, DEFAULT_PORT); } - public static Node at(String id, String ip, int port) { - return new Node(id, ip, port); + public static Node at(String name, String ip, int port) { + return new Node(name, ip, port); } - public static Node at(String id, String ip, String port) { - return new Node(id, ip, Integer.valueOf(port)); + public static Node at(String name, String ip, String port) { + return new Node(name, ip, Integer.valueOf(port)); } - public String getId() { - return id; + public String getName() { + return name; } public String getIp() { @@ -71,20 +71,20 @@ public final class Node { return false; Node that = (Node) object; - return Objects.equal(this.id, that.id) && + return Objects.equal(this.name, that.name) && Objects.equal(this.ip, that.ip) && Objects.equal(this.port, that.port); } @Override public int hashCode() { - return Objects.hashCode(id, ip, port); + return Objects.hashCode(name, ip, port); } @Override public String toString() { return Objects.toStringHelper(Node.class.getSimpleName()) - .add("id", id) + .add("name", name) .add("ip", ip) .add("port", port) .toString(); diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index c5b37208f8..35b2b65519 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -97,7 +97,7 @@ public class TomP2PTests { static { try { BOOTSTRAP_NODE_ADDRESS = new PeerAddress( - Number160.createHash(BOOTSTRAP_NODE.getId()), + Number160.createHash(BOOTSTRAP_NODE.getName()), BOOTSTRAP_NODE.getIp(), BOOTSTRAP_NODE.getPort(), BOOTSTRAP_NODE.getPort()); } catch (UnknownHostException ex) { throw new RuntimeException(BOOTSTRAP_NODE.toString(), ex); diff --git a/src/test/java/io/bitsquare/network/NodeTests.java b/src/test/java/io/bitsquare/network/NodeTests.java index cf8f66be48..ad2083d079 100644 --- a/src/test/java/io/bitsquare/network/NodeTests.java +++ b/src/test/java/io/bitsquare/network/NodeTests.java @@ -38,8 +38,8 @@ public class NodeTests { assertThat(node1a, not((Object) equalTo("not a node"))); assertThat(node1a, not(equalTo(Node.at("bitsquare2.example.com", node1a.getIp())))); - assertThat(node1a, not(equalTo(Node.at(node1a.getId(), "203.0.113.2")))); - assertThat(node1a, not(equalTo(Node.at(node1a.getId(), node1a.getIp(), Node.DEFAULT_PORT + 1)))); + assertThat(node1a, not(equalTo(Node.at(node1a.getName(), "203.0.113.2")))); + assertThat(node1a, not(equalTo(Node.at(node1a.getName(), node1a.getIp(), Node.DEFAULT_PORT + 1)))); Node node2 = Node.at("bitsquare2.example.com", "203.0.113.2"); assertThat(node1a.hashCode(), equalTo(node1b.hashCode())); @@ -57,6 +57,6 @@ public class NodeTests { @Test public void testToString() { Node node = Node.at("bitsquare1.example.com", "203.0.113.1", 5001); - assertThat(node.toString(), equalTo("Node{id=bitsquare1.example.com, ip=203.0.113.1, port=5001}")); + assertThat(node.toString(), equalTo("Node{name=bitsquare1.example.com, ip=203.0.113.1, port=5001}")); } } \ No newline at end of file From 737d1855d171a5ee949ef1e00424528b3b3dc2b3 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 14:36:28 +0100 Subject: [PATCH 14/24] Expose --port command-line option --- src/main/java/io/bitsquare/app/gui/Main.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/io/bitsquare/app/gui/Main.java b/src/main/java/io/bitsquare/app/gui/Main.java index ce6d252af9..fadb2288b8 100644 --- a/src/main/java/io/bitsquare/app/gui/Main.java +++ b/src/main/java/io/bitsquare/app/gui/Main.java @@ -74,6 +74,9 @@ public class Main extends Application { if (argumentsNamespace.getString(NAME_KEY) != null) properties.setProperty(NAME_KEY, argumentsNamespace.getString(NAME_KEY)); + if (argumentsNamespace.getString(PORT_KEY) != null) + properties.setProperty(PORT_KEY, argumentsNamespace.getString(PORT_KEY)); + if (argumentsNamespace.getString(BOOTSTRAP_NODE_NAME_KEY) != null) properties.setProperty(BOOTSTRAP_NODE_NAME_KEY, argumentsNamespace.getString(BOOTSTRAP_NODE_NAME_KEY)); From 396fd089ca18f0b73886989b344bce3bfe635053 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 12:53:13 +0100 Subject: [PATCH 15/24] Eliminate the option to use TomP2P disk storage (for now) In practice we always use TomP2P's in-memory storage. Eliminate the useDiskStorage option for now, in order to simplify the ongoing refactoring efforts. --- .../msg/tomp2p/TomP2PMessageModule.java | 1 - .../io/bitsquare/msg/tomp2p/TomP2PNode.java | 35 +------------------ 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index ba56742fb6..5f6197dd9b 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -43,7 +43,6 @@ public class TomP2PMessageModule extends MessageModule { protected void doConfigure() { bind(int.class).annotatedWith(Names.named(Node.PORT_KEY)).toInstance( Integer.valueOf(properties.getProperty(Node.PORT_KEY, String.valueOf(Node.DEFAULT_PORT)))); - bind(boolean.class).annotatedWith(Names.named(TomP2PNode.USE_DISK_STORAGE_KEY)).toInstance(false); bind(TomP2PNode.class).asEagerSingleton(); bind(Node.class).annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)).toInstance( diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java index b6b326f698..8df10e3ecf 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PNode.java @@ -28,7 +28,6 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.inject.name.Named; -import java.io.File; import java.io.IOException; import java.security.KeyPair; @@ -43,13 +42,11 @@ import javax.inject.Inject; import javafx.application.Platform; -import net.tomp2p.connection.DSASignatureFactory; import net.tomp2p.connection.PeerConnection; import net.tomp2p.dht.FutureGet; import net.tomp2p.dht.FuturePut; import net.tomp2p.dht.FutureRemove; import net.tomp2p.dht.PeerDHT; -import net.tomp2p.dht.StorageMemory; import net.tomp2p.futures.BaseFuture; import net.tomp2p.futures.BaseFutureListener; import net.tomp2p.futures.FutureDirect; @@ -58,7 +55,6 @@ import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.storage.Data; import net.tomp2p.storage.Storage; -import net.tomp2p.storage.StorageDisk; import net.tomp2p.utils.Utils; import org.jetbrains.annotations.NotNull; @@ -66,8 +62,6 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lighthouse.files.AppDirectory; - import static io.bitsquare.util.tomp2p.BaseFutureUtil.isSuccess; /** @@ -79,12 +73,8 @@ import static io.bitsquare.util.tomp2p.BaseFutureUtil.isSuccess; public class TomP2PNode { private static final Logger log = LoggerFactory.getLogger(TomP2PNode.class); - static final String USE_DISK_STORAGE_KEY = "useDiskStorage"; - private KeyPair keyPair; - private String appName; private final int port; - private final Boolean useDiskStorage; private MessageBroker messageBroker; private PeerAddress storedPeerAddress; @@ -98,14 +88,9 @@ public class TomP2PNode { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory, - @Named("appName") String appName, - @Named(Node.PORT_KEY) int port, - @Named(USE_DISK_STORAGE_KEY) Boolean useDiskStorage) { + public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory, @Named(Node.PORT_KEY) int port) { this.bootstrappedPeerFactory = bootstrappedPeerFactory; - this.appName = appName; this.port = port; - this.useDiskStorage = useDiskStorage; } // for unit testing @@ -116,7 +101,6 @@ public class TomP2PNode { messageBroker = (message, peerAddress) -> { }; port = Node.DEFAULT_PORT; - useDiskStorage = false; } @@ -134,8 +118,6 @@ public class TomP2PNode { } public void start(BootstrapListener bootstrapListener) { - useDiskStorage(useDiskStorage); - bootstrappedPeerFactory.setStorage(storage); setupTimerForIPCheck(); @@ -398,19 +380,4 @@ public class TomP2PNode { log.debug("storePeerAddress " + peerDHT.peerAddress().toString()); return putDomainProtectedData(locationKey, data); } - - private void useDiskStorage(boolean useDiskStorage) { - if (useDiskStorage) { - File path = new File(AppDirectory.dir(appName).toFile() + "/tomP2P"); - if (!path.exists()) { - boolean created = path.mkdir(); - if (!created) - throw new RuntimeException("Could not create the directory '" + path + "'"); - } - storage = new StorageDisk(Number160.ZERO, path, new DSASignatureFactory()); - } - else { - storage = new StorageMemory(); - } - } } From a56ac8e45411cc454e1e79e108369113bfa8696d Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:08:42 +0100 Subject: [PATCH 16/24] Rename networkInterface => interface i.e., pass `--interface` vs. `--networkInterface` at the command line. --- .../java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index 116abb3c69..d19294741d 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -76,7 +76,7 @@ class BootstrappedPeerFactory { private static final Logger log = LoggerFactory.getLogger(BootstrappedPeerFactory.class); static final String BOOTSTRAP_NODE_KEY = "bootstrapNode"; - static final String NETWORK_INTERFACE_KEY = "networkInterface"; + static final String NETWORK_INTERFACE_KEY = "interface"; static final String NETWORK_INTERFACE_UNSPECIFIED = ""; private KeyPair keyPair; From 879ff57789231d36a865b2716b96e8bafa13054d Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:12:45 +0100 Subject: [PATCH 17/24] Remove obsolete SeedNodeForTesting class --- .../io/bitsquare/msg/SeedNodeForTesting.java | 80 ------------------- .../java/io/bitsquare/msg/TomP2PTests.java | 2 +- 2 files changed, 1 insertion(+), 81 deletions(-) delete mode 100644 src/test/java/io/bitsquare/msg/SeedNodeForTesting.java diff --git a/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java b/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java deleted file mode 100644 index 4d39f76fb5..0000000000 --- a/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This file is part of Bitsquare. - * - * Bitsquare 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. - * - * Bitsquare 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 Bitsquare. If not, see . - */ - -package io.bitsquare.msg; - -import io.bitsquare.network.Node; - -import net.tomp2p.connection.Bindings; -import net.tomp2p.connection.ChannelServerConfiguration; -import net.tomp2p.connection.Ports; -import net.tomp2p.connection.StandardProtocolFamily; -import net.tomp2p.dht.PeerBuilderDHT; -import net.tomp2p.nat.PeerBuilderNAT; -import net.tomp2p.p2p.Peer; -import net.tomp2p.p2p.PeerBuilder; -import net.tomp2p.peers.Number160; -import net.tomp2p.peers.PeerAddress; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Used for testing with {@link TomP2PTests} - */ -public class SeedNodeForTesting { - private static final Logger log = LoggerFactory.getLogger(SeedNodeForTesting.class); - - public static void main(String[] args) throws Exception { - Peer peer = null; - try { - ChannelServerConfiguration csc = PeerBuilder.createDefaultChannelServerConfiguration(); - csc.ports(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); - csc.portsForwarding(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); - csc.connectionTimeoutTCPMillis(10 * 1000); - csc.idleTCPSeconds(10); - csc.idleUDPSeconds(10); - - Bindings bindings = new Bindings(); - bindings.addProtocol(StandardProtocolFamily.INET); - - peer = new PeerBuilder(Number160.createHash("localhost")).bindings(bindings) - .channelServerConfiguration(csc).ports(Node.DEFAULT_PORT).start(); - - peer.objectDataReply((sender, request) -> { - log.trace("received request: ", request.toString()); - return "pong"; - }); - - // Needed for DHT support - new PeerBuilderDHT(peer).start(); - // Needed for NAT support - new PeerBuilderNAT(peer).start(); - - log.debug("SeedNode started."); - for (; ; ) { - for (PeerAddress pa : peer.peerBean().peerMap().all()) { - log.debug("peer online:" + pa); - } - Thread.sleep(2000); - } - } catch (Exception e) { - if (peer != null) - peer.shutdown().awaitUninterruptibly(); - } - } -} diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index 35b2b65519..4814f9f98a 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -70,7 +70,7 @@ import static org.junit.Assert.*; * Test bootstrapping, DHT operations like put/get/add/remove and sendDirect in both LAN and WAN environment * Test scenarios in direct connection, auto port forwarding or relay mode. *

- * The start a seed node code use the {@link SeedNodeForTesting} class. + * To start a seed node code use the {@link io.bitsquare.app.cli.SeedNode} class. *

* To configure your test environment edit the static fields for id, IP and port. * In the configure method and the connectionType you can define your test scenario. From 519cfb8957826558bc562874d4eade0530a0e21b Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:15:01 +0100 Subject: [PATCH 18/24] Remove commented code from SeedNode --- .../java/io/bitsquare/app/cli/SeedNode.java | 59 ------------------- 1 file changed, 59 deletions(-) diff --git a/src/main/java/io/bitsquare/app/cli/SeedNode.java b/src/main/java/io/bitsquare/app/cli/SeedNode.java index f15df2953d..540dc798c0 100644 --- a/src/main/java/io/bitsquare/app/cli/SeedNode.java +++ b/src/main/java/io/bitsquare/app/cli/SeedNode.java @@ -98,63 +98,4 @@ public class SeedNode { } peer = null; } - - - /*public static void main(String[] args) throws Exception { - ArgumentParser parser = new ArgumentParser(); - Namespace namespace = parser.parseArgs(args); - - Node defaultNode = BootstrapNodes.DIGITAL_OCEAN_1; - String id = defaultNode.getId(); - int port = defaultNode.getPort(); - - // Passed program args will override the properties of the default bootstrapNode - // So you can use the same id but different ports (e.g. running several nodes on one server with - // different ports) - if (namespace.getString(ArgumentParser.SEED_ID_FLAG) != null) - id = namespace.getString(ArgumentParser.SEED_ID_FLAG); - - if (namespace.getString(ArgumentParser.SEED_PORT_FLAG) != null) - port = Integer.valueOf(namespace.getString(ArgumentParser.SEED_PORT_FLAG)); - - log.info("This node use ID: [" + id + "] and port: [" + port + "]"); - - Peer peer = null; - try { - // Lets test with different settings - ChannelServerConfiguration csc = PeerBuilder.createDefaultChannelServerConfiguration(); - csc.ports(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); - csc.portsForwarding(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); - csc.connectionTimeoutTCPMillis(10 * 1000); - csc.idleTCPSeconds(10); - csc.idleUDPSeconds(10); - - Bindings bindings = new Bindings(); - bindings.addProtocol(StandardProtocolFamily.INET); - - peer = new PeerBuilder(Number160.createHash(id)).bindings(bindings) - .channelServerConfiguration(csc).ports(port).start(); - - peer.objectDataReply((sender, request) -> { - log.trace("received request: ", request.toString()); - return "pong"; - }); - - // Needed for DHT support - new PeerBuilderDHT(peer).start(); - // Needed for NAT support - new PeerBuilderNAT(peer).start(); - - log.debug("SeedNode started."); - for (; ; ) { - for (PeerAddress pa : peer.peerBean().peerMap().all()) { - log.debug("peer online:" + pa); - } - Thread.sleep(2000); - } - } catch (Exception e) { - if (peer != null) - peer.shutdown().awaitUninterruptibly(); - } - }*/ } From 117b4ce5dc8dcde619c592ec0752695ad31c4ffd Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:31:12 +0100 Subject: [PATCH 19/24] Remove dead code from UtilsDHT2.java --- src/test/java/net/tomp2p/dht/UtilsDHT2.java | 232 -------------------- 1 file changed, 232 deletions(-) diff --git a/src/test/java/net/tomp2p/dht/UtilsDHT2.java b/src/test/java/net/tomp2p/dht/UtilsDHT2.java index a0f59da1d6..52f0a256ec 100644 --- a/src/test/java/net/tomp2p/dht/UtilsDHT2.java +++ b/src/test/java/net/tomp2p/dht/UtilsDHT2.java @@ -16,99 +16,20 @@ package net.tomp2p.dht; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.UnknownHostException; - -import java.util.ArrayList; -import java.util.List; -import java.util.NavigableSet; import java.util.Random; -import java.util.TreeSet; import net.tomp2p.connection.Bindings; -import net.tomp2p.futures.FutureBootstrap; -import net.tomp2p.futures.FutureDiscover; -import net.tomp2p.message.Message; -import net.tomp2p.message.Message.Type; import net.tomp2p.p2p.AutomaticFuture; import net.tomp2p.p2p.Peer; import net.tomp2p.p2p.PeerBuilder; import net.tomp2p.peers.Number160; -import net.tomp2p.peers.PeerAddress; import net.tomp2p.peers.PeerMap; import net.tomp2p.peers.PeerMapConfiguration; -import net.tomp2p.peers.PeerSocketAddress; public class UtilsDHT2 { - /** - * Used to make the testcases predictable. Used as an input for {@link Random}. - */ - public static final long THE_ANSWER = 42L; - - /** - * Having two peers in a network, the seed needs to be different, otherwise we create a peer with the same id twice. - */ - public static final long THE_ANSWER2 = 43L; - - public static Message createDummyMessage() throws UnknownHostException { - return createDummyMessage(false, false); - } - - public static Message createDummyMessage(boolean firewallUDP, boolean firewallTCP) - throws UnknownHostException { - return createDummyMessage(new Number160("0x4321"), "127.0.0.1", 8001, 8002, new Number160("0x1234"), - "127.0.0.1", 8003, 8004, (byte) 0, Type.REQUEST_1, firewallUDP, firewallTCP); - } - - public static PeerAddress createAddress(Number160 id) throws UnknownHostException { - return createAddress(id, "127.0.0.1", 8005, 8006, false, false); - } - - public static PeerAddress createAddress() throws UnknownHostException { - return createAddress(new Number160("0x5678"), "127.0.0.1", 8005, 8006, false, false); - } - - public static PeerAddress createAddress(int id) throws UnknownHostException { - return createAddress(new Number160(id), "127.0.0.1", 8005, 8006, false, false); - } - - public static PeerAddress createAddress(String id) throws UnknownHostException { - return createAddress(new Number160(id), "127.0.0.1", 8005, 8006, false, false); - } - - public static PeerAddress createAddress(Number160 idSender, String inetSender, int tcpPortSender, - int udpPortSender, boolean firewallUDP, - boolean firewallTCP) throws UnknownHostException { - InetAddress inetSend = InetAddress.getByName(inetSender); - PeerSocketAddress peerSocketAddress = new PeerSocketAddress(inetSend, tcpPortSender, udpPortSender); - PeerAddress n1 = new PeerAddress(idSender, peerSocketAddress, firewallTCP, firewallUDP, false, false, false, - PeerAddress.EMPTY_PEER_SOCKET_ADDRESSES); - return n1; - } - - public static Message createDummyMessage(Number160 idSender, String inetSender, int tcpPortSendor, - int udpPortSender, Number160 idRecipien, String inetRecipient, - int tcpPortRecipient, - int udpPortRecipient, byte command, Type type, boolean firewallUDP, - boolean firewallTCP) - throws UnknownHostException { - Message message = new Message(); - PeerAddress n1 = createAddress(idSender, inetSender, tcpPortSendor, udpPortSender, firewallUDP, - firewallTCP); - message.sender(n1); - // - PeerAddress n2 = createAddress(idRecipien, inetRecipient, tcpPortRecipient, udpPortRecipient, - firewallUDP, firewallTCP); - message.recipient(n2); - message.type(type); - message.command(command); - return message; - } public static PeerDHT[] createNodes(int nrOfPeers, Random rnd, int port) throws Exception { return createNodes(nrOfPeers, rnd, port, null); @@ -177,34 +98,6 @@ public class UtilsDHT2 { return peers; } - public static Peer[] createRealNodes(int nrOfPeers, Random rnd, int startPort, - AutomaticFuture automaticFuture) throws Exception { - if (nrOfPeers < 1) { - throw new IllegalArgumentException("Cannot create less than 1 peer"); - } - Peer[] peers = new Peer[nrOfPeers]; - for (int i = 0; i < nrOfPeers; i++) { - peers[i] = new PeerBuilder(new Number160(rnd)) - .ports(startPort + i).start().addAutomaticFuture(automaticFuture); - } - System.err.println("real peers created."); - return peers; - } - - public static Peer[] createNonMaintenanceNodes(int nrOfPeers, Random rnd, int port) throws IOException { - if (nrOfPeers < 1) { - throw new IllegalArgumentException("Cannot create less than 1 peer"); - } - Peer[] peers = new Peer[nrOfPeers]; - peers[0] = new PeerBuilder(new Number160(rnd)).enableMaintenance(false).ports(port).start(); - for (int i = 1; i < nrOfPeers; i++) { - peers[i] = new PeerBuilder(new Number160(rnd)).enableMaintenance(false).masterPeer(peers[0]) - .start(); - } - System.err.println("non-maintenance peers created."); - return peers; - } - /** * Perfect routing, where each neighbor has contacted each other. This means that for small number of peers, every * peer knows every other peer. @@ -219,14 +112,6 @@ public class UtilsDHT2 { System.err.println("perfect routing done."); } - public static void perfectRoutingIndirect(PeerDHT... peers) { - for (int i = 0; i < peers.length; i++) { - for (int j = 0; j < peers.length; j++) - peers[i].peerBean().peerMap().peerFound(peers[j].peerAddress(), peers[j].peerAddress(), null); - } - System.err.println("perfect routing done."); - } - public static void main(String[] args) throws IOException { createTempDirectory(); } @@ -246,121 +131,4 @@ public class UtilsDHT2 { throw new IllegalStateException("Failed to create directory within " + TEMP_DIR_ATTEMPTS + " attempts (tried " + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')'); } - - public static Peer[] createAndAttachNodes(int nr, int port, Random rnd) throws Exception { - Peer[] peers = new Peer[nr]; - for (int i = 0; i < nr; i++) { - if (i == 0) { - peers[0] = new PeerBuilder(new Number160(rnd)).ports(port).start(); - } - else { - peers[i] = new PeerBuilder(new Number160(rnd)).masterPeer(peers[0]).start(); - } - } - return peers; - } - - public static void bootstrap(Peer[] peers) { - List futures1 = new ArrayList(); - List futures2 = new ArrayList(); - for (int i = 1; i < peers.length; i++) { - FutureDiscover tmp = peers[i].discover().peerAddress(peers[0].peerAddress()).start(); - futures2.add(tmp); - } - for (FutureDiscover future : futures2) { - future.awaitUninterruptibly(); - } - for (int i = 1; i < peers.length; i++) { - FutureBootstrap tmp = peers[i].bootstrap().peerAddress(peers[0].peerAddress()).start(); - futures1.add(tmp); - } - for (int i = 1; i < peers.length; i++) { - FutureBootstrap tmp = peers[0].bootstrap().peerAddress(peers[i].peerAddress()).start(); - futures1.add(tmp); - } - for (FutureBootstrap future : futures1) - future.awaitUninterruptibly(); - } - - public static void routing(Number160 key, Peer[] peers, int start) { - System.out.println("routing: searching for key " + key); - NavigableSet pa1 = new TreeSet(PeerMap.createComparator(key)); - NavigableSet queried = new TreeSet(PeerMap.createComparator(key)); - Number160 result = Number160.ZERO; - Number160 resultPeer = new Number160("0xd75d1a3d57841fbc9e2a3d175d6a35dc2e15b9f"); - int round = 0; - while (!resultPeer.equals(result)) { - System.out.println("round " + round); - round++; - pa1.addAll(peers[start].peerBean().peerMap().all()); - queried.add(peers[start].peerAddress()); - System.out.println("closest so far: " + queried.first()); - PeerAddress next = pa1.pollFirst(); - while (queried.contains(next)) { - next = pa1.pollFirst(); - } - result = next.peerId(); - start = findNr(next.peerId().toString(), peers); - } - } - - public static void findInMap(PeerAddress key, Peer[] peers) { - for (int i = 0; i < peers.length; i++) { - if (peers[i].peerBean().peerMap().contains(key)) { - System.out.println("Peer " + i + " with the id " + peers[i].peerID() + " knows the peer " - + key); - } - } - } - - public static int findNr(String string, Peer[] peers) { - for (int i = 0; i < peers.length; i++) { - if (peers[i].peerID().equals(new Number160(string))) { - System.out.println("we found the number " + i + " for peer with id " + string); - return i; - } - } - return -1; - } - - public static Peer find(String string, Peer[] peers) { - for (int i = 0; i < peers.length; i++) { - if (peers[i].peerID().equals(new Number160(string))) { - System.out.println("!!we found the number " + i + " for peer with id " + string); - return peers[i]; - } - } - return null; - } - - public static void exec(String cmd) throws Exception { - Process p = Runtime.getRuntime().exec(cmd); - p.waitFor(); - - BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); - String line = null; - while ((line = br.readLine()) != null) { - System.out.println(line); - } - br.close(); - } - - public static PeerAddress createAddressIP(String inet) throws UnknownHostException { - return createAddress(Number160.createHash(inet), inet, 8005, 8006, false, false); - } - - public static PeerAddress[] createDummyAddress(int size, int portTCP, int portUDP) throws UnknownHostException { - PeerAddress[] pa = new PeerAddress[size]; - for (int i = 0; i < size; i++) { - pa[i] = createAddress(i + 1, portTCP, portUDP); - } - return pa; - } - - public static PeerAddress createAddress(int iid, int portTCP, int portUDP) throws UnknownHostException { - Number160 id = new Number160(iid); - InetAddress address = InetAddress.getByName("127.0.0.1"); - return new PeerAddress(id, address, portTCP, portUDP); - } - } From 56409c0177fb843831a5bacace21876e27ca7024 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:34:22 +0100 Subject: [PATCH 20/24] Rename app.cli.{SeedNode => BootstrapNode} With this commit we're now using the naming "bootstrap node" everywhere as opposed to the more fuzzy notion of "seed node" (which was originally borrowed from Bitcoin Core, but doesn't really describe what we're up to very well. As it turns out, Kademlia also uses the terminology "bootstrap node" [1], so we're in good company with this change. [1]: https://en.wikipedia.org/wiki/Kademlia#Joining_the_network --- doc/bitsquare.conf | 7 ++----- .../java/io/bitsquare/app/ArgumentParser.java | 12 ++++++------ .../app/cli/{SeedNode.java => BootstrapNode.java} | 6 +++--- .../java/io/bitsquare/gui/main/MainModel.java | 2 +- .../msg/tomp2p/BootstrappedPeerFactory.java | 4 ++-- src/main/resources/bitsquare.properties | 12 +----------- src/test/java/io/bitsquare/msg/TomP2PTests.java | 15 +++++++-------- 7 files changed, 22 insertions(+), 36 deletions(-) rename src/main/java/io/bitsquare/app/cli/{SeedNode.java => BootstrapNode.java} (95%) diff --git a/doc/bitsquare.conf b/doc/bitsquare.conf index 0f15d3e90e..76dd87bf9c 100644 --- a/doc/bitsquare.conf +++ b/doc/bitsquare.conf @@ -13,13 +13,10 @@ # Mac OSX: # $HOME/Library/Application Support/Bitcoin/ -# /Users/username/Library/Application Support/Bitcoin/bitcoin.conf +# /Users/username/Library/Application Support/Bitcoin/bitcoin.conf # Supported properties: -# networkType=regtest | testnet | mainnet - -# defaultSeedNode=localhost | server +# networkType=regtest | testnet | mainnet networkType=regtest -defaultSeedNode=localhost \ No newline at end of file diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index ad1bf769f5..0b5ca26f0d 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -37,17 +37,17 @@ public class ArgumentParser { // Args for local node config parser.addArgument("--" + Node.NAME_KEY) - .help("Local node ID"); + .help("Local node name"); parser.addArgument("--" + Node.PORT_KEY) - .help("Local port to listen on"); + .help("Local node port"); - // Args for seed node config + // Args for bootstrap node config parser.addArgument("--" + BOOTSTRAP_NODE_NAME_KEY) - .help("Seed node ID"); + .help("Bootstrap node name"); parser.addArgument("--" + BOOTSTRAP_NODE_IP_KEY) - .help("Seed node IP"); + .help("Bootstrap node IP address"); parser.addArgument("--" + BOOTSTRAP_NODE_PORT_KEY) - .help("Seed node port"); + .help("Bootstrap node port"); // A custom network interface (needed at the moment for windows, but might be useful also later) parser.addArgument("--" + NETWORK_INTERFACE_KEY) diff --git a/src/main/java/io/bitsquare/app/cli/SeedNode.java b/src/main/java/io/bitsquare/app/cli/BootstrapNode.java similarity index 95% rename from src/main/java/io/bitsquare/app/cli/SeedNode.java rename to src/main/java/io/bitsquare/app/cli/BootstrapNode.java index 540dc798c0..b5d076a4a6 100644 --- a/src/main/java/io/bitsquare/app/cli/SeedNode.java +++ b/src/main/java/io/bitsquare/app/cli/BootstrapNode.java @@ -35,8 +35,8 @@ import org.slf4j.LoggerFactory; import net.sourceforge.argparse4j.inf.Namespace; -public class SeedNode { - private static final Logger log = LoggerFactory.getLogger(SeedNode.class); +public class BootstrapNode { + private static final Logger log = LoggerFactory.getLogger(BootstrapNode.class); private static Peer peer = null; private static boolean running = true; @@ -68,7 +68,7 @@ public class SeedNode { new PeerBuilderDHT(peer).start(); new PeerBuilderNAT(peer).start(); - log.debug("SeedNode started."); + log.debug("started"); new Thread(new Runnable() { @Override public void run() { diff --git a/src/main/java/io/bitsquare/gui/main/MainModel.java b/src/main/java/io/bitsquare/gui/main/MainModel.java index 49963ec5ed..6124599c29 100644 --- a/src/main/java/io/bitsquare/gui/main/MainModel.java +++ b/src/main/java/io/bitsquare/gui/main/MainModel.java @@ -104,7 +104,7 @@ class MainModel extends UIModel { void initBackend() { - // For testing with the serverside seednode we need the BootstrappedPeerFactory which gets started form + // For testing with the bootstrap node we need the BootstrappedPeerFactory which gets started from // messageFacade.init messageFacade.init(new BootstrapListener() { diff --git a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java index d19294741d..9c76a2ff31 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/BootstrappedPeerFactory.java @@ -70,7 +70,7 @@ import org.slf4j.LoggerFactory; /** - * Creates a DHT peer and bootstrap to the network via a seed node + * Creates a DHT peer and bootstraps to the network via a bootstrap node */ class BootstrappedPeerFactory { private static final Logger log = LoggerFactory.getLogger(BootstrappedPeerFactory.class); @@ -201,7 +201,7 @@ class BootstrappedPeerFactory { // 1. Attempt: Try to discover our outside visible address private void discover() { - setState(BootstrapState.DIRECT_INIT, "We are starting to bootstrap to a seed node."); + setState(BootstrapState.DIRECT_INIT, "We are starting discovery against a bootstrap node."); FutureDiscover futureDiscover = peer.discover().peerAddress(getBootstrapAddress()).start(); futureDiscover.addListener(new BaseFutureListener() { @Override diff --git a/src/main/resources/bitsquare.properties b/src/main/resources/bitsquare.properties index 416874c054..93b4dec9d3 100644 --- a/src/main/resources/bitsquare.properties +++ b/src/main/resources/bitsquare.properties @@ -1,11 +1 @@ -seed.0.id=digitalocean1.bitsquare.io -seed.0.address=188.226.179.109 -seed.0.port=5000 - -seed.1.id=digitalocean2.bitsquare.io -seed.1.address=128.199.251.106 -seed.1.port=5000 - -seed.2.id=localhost -seed.2.address=127.0.0.1 -seed.2.port=5001 +# Empty for now; see ConfigLoader \ No newline at end of file diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index 4814f9f98a..848f4d4bb1 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -70,7 +70,7 @@ import static org.junit.Assert.*; * Test bootstrapping, DHT operations like put/get/add/remove and sendDirect in both LAN and WAN environment * Test scenarios in direct connection, auto port forwarding or relay mode. *

- * To start a seed node code use the {@link io.bitsquare.app.cli.SeedNode} class. + * To start a bootstrap node code use the {@link io.bitsquare.app.cli.BootstrapNode} class. *

* To configure your test environment edit the static fields for id, IP and port. * In the configure method and the connectionType you can define your test scenario. @@ -86,11 +86,10 @@ public class TomP2PTests { // If you want to test in one specific connection mode define it directly, otherwise use UNKNOWN private static final ConnectionType FORCED_CONNECTION_TYPE = ConnectionType.NAT; - // Typically you run the seed node in localhost to test direct connection. - // If you have a setup where you are not behind a router you can also use a WAN side seed node. - private static final Node BOOTSTRAP_NODE = - (FORCED_CONNECTION_TYPE == ConnectionType.DIRECT) ? BootstrapNodes.LOCALHOST : BootstrapNodes - .DIGITAL_OCEAN_1_DEV; + // Typically you run the bootstrap node on localhost to test direct connection. + // If you have a setup where you are not behind a router you can also use a WAN bootstrap node. + private static final Node BOOTSTRAP_NODE = (FORCED_CONNECTION_TYPE == ConnectionType.DIRECT) ? + BootstrapNodes.LOCALHOST : BootstrapNodes.DIGITAL_OCEAN_1_DEV; private static final PeerAddress BOOTSTRAP_NODE_ADDRESS; @@ -290,11 +289,11 @@ public class TomP2PTests { } } - // That test should always succeed as we use the server seed node as receiver. + // This test should always succeed as we use the bootstrap node as receiver. // A node can send a message to another peer which is not in the same LAN. @Test @Repeat(STRESS_TEST_COUNT) - public void testSendDirectToSeedNode() throws Exception { + public void testSendDirectToBootstrapNode() throws Exception { peer1DHT = getDHTPeer("node_1", client1Port); FuturePeerConnection futurePeerConnection = peer1DHT.peer().createPeerConnection(BOOTSTRAP_NODE_ADDRESS, 500); From 50e27014fbd56949d64d75fcb2ffa827bfba124e Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:43:57 +0100 Subject: [PATCH 21/24] Rename BootstrapNodes#{DEFAULT_BOOTSTRAP_NODE=>DEFAULT} Also, reorganize and comment other Node fields exposed by BootstrapNodes. --- .../msg/tomp2p/TomP2PMessageModule.java | 8 ++++---- .../io/bitsquare/network/BootstrapNodes.java | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java index 5f6197dd9b..d1c1e7ca45 100644 --- a/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java +++ b/src/main/java/io/bitsquare/msg/tomp2p/TomP2PMessageModule.java @@ -19,6 +19,7 @@ package io.bitsquare.msg.tomp2p; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.MessageModule; +import io.bitsquare.network.BootstrapNodes; import io.bitsquare.network.Node; import com.google.inject.name.Names; @@ -26,7 +27,6 @@ import com.google.inject.name.Names; import java.util.Properties; import static io.bitsquare.msg.tomp2p.BootstrappedPeerFactory.*; -import static io.bitsquare.network.BootstrapNodes.DEFAULT_BOOTSTRAP_NODE; public class TomP2PMessageModule extends MessageModule { @@ -47,9 +47,9 @@ public class TomP2PMessageModule extends MessageModule { bind(Node.class).annotatedWith(Names.named(BOOTSTRAP_NODE_KEY)).toInstance( Node.at( - properties.getProperty(BOOTSTRAP_NODE_NAME_KEY, DEFAULT_BOOTSTRAP_NODE.getName()), - properties.getProperty(BOOTSTRAP_NODE_IP_KEY, DEFAULT_BOOTSTRAP_NODE.getIp()), - properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, DEFAULT_BOOTSTRAP_NODE.getPortAsString()) + properties.getProperty(BOOTSTRAP_NODE_NAME_KEY, BootstrapNodes.DEFAULT.getName()), + properties.getProperty(BOOTSTRAP_NODE_IP_KEY, BootstrapNodes.DEFAULT.getIp()), + properties.getProperty(BOOTSTRAP_NODE_PORT_KEY, BootstrapNodes.DEFAULT.getPortAsString()) ) ); bindConstant().annotatedWith(Names.named(NETWORK_INTERFACE_KEY)).to( diff --git a/src/main/java/io/bitsquare/network/BootstrapNodes.java b/src/main/java/io/bitsquare/network/BootstrapNodes.java index cc12bf90d9..b15684c270 100644 --- a/src/main/java/io/bitsquare/network/BootstrapNodes.java +++ b/src/main/java/io/bitsquare/network/BootstrapNodes.java @@ -25,15 +25,27 @@ import java.util.List; // Lets use ports in that range 7366-7390 // 7366 will be used as default port public interface BootstrapNodes { - Node LOCALHOST = Node.at("localhost", "127.0.0.1"); + Node DIGITAL_OCEAN_1 = Node.at("digitalocean1.bitsquare.io", "188.226.179.109"); Node DIGITAL_OCEAN_1_DEV = Node.at("digitalocean1.bitsquare.io", "188.226.179.109", 7367); - Node DEFAULT_BOOTSTRAP_NODE = DIGITAL_OCEAN_1; + /** + * Alias to the default bootstrap node. + */ + Node DEFAULT = DIGITAL_OCEAN_1; + /** + * A locally-running {@link io.bitsquare.app.cli.BootstrapNode} instance. + * Typically used only for testing. Not included in results from {@link #all()}. + */ + Node LOCALHOST = Node.at("localhost", "127.0.0.1"); + + /** + * All known public bootstrap nodes. + */ static List all() { return Arrays.asList( - LOCALHOST, DIGITAL_OCEAN_1 + DIGITAL_OCEAN_1 ); } } From 5ab837658ba80b5d7c71e8941dbb66a32471e9d6 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:47:45 +0100 Subject: [PATCH 22/24] Move comments regarding default ports to Node#DEFAULT_PORT --- src/main/java/io/bitsquare/network/BootstrapNodes.java | 4 ---- src/main/java/io/bitsquare/network/Node.java | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/bitsquare/network/BootstrapNodes.java b/src/main/java/io/bitsquare/network/BootstrapNodes.java index b15684c270..c542be8d01 100644 --- a/src/main/java/io/bitsquare/network/BootstrapNodes.java +++ b/src/main/java/io/bitsquare/network/BootstrapNodes.java @@ -20,10 +20,6 @@ package io.bitsquare.network; import java.util.Arrays; import java.util.List; -// Ports 7366-7390 are not registered @see -// + * currently unassigned by IANA (7366-7390). + */ public static final int DEFAULT_PORT = 7366; private final String name; From adfd8b2ac4f8fd0cac4e7dbf38f28af1af15ca45 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 13:52:12 +0100 Subject: [PATCH 23/24] Eliminate BootstrapNodes#DIGITAL_OCEAN_1_DEV Instead of including testing-related bootstrap nodes in the BootstrapNodes class, this change introduces a Node#withPort method that allows for obtaining a copy of an existing bootstrap node (e.g. DIGITAL_OCEAN_1) with a modified port value. This approach to `with*` methods allows for convenient customization of value types without sacrificing immutability. See [1] for details. [1]: http://blog.joda.org/2014/03/valjos-value-java-objects.html --- src/main/java/io/bitsquare/network/BootstrapNodes.java | 1 - src/main/java/io/bitsquare/network/Node.java | 7 +++++++ src/test/java/io/bitsquare/msg/TomP2PTests.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/bitsquare/network/BootstrapNodes.java b/src/main/java/io/bitsquare/network/BootstrapNodes.java index c542be8d01..bb2713a175 100644 --- a/src/main/java/io/bitsquare/network/BootstrapNodes.java +++ b/src/main/java/io/bitsquare/network/BootstrapNodes.java @@ -23,7 +23,6 @@ import java.util.List; public interface BootstrapNodes { Node DIGITAL_OCEAN_1 = Node.at("digitalocean1.bitsquare.io", "188.226.179.109"); - Node DIGITAL_OCEAN_1_DEV = Node.at("digitalocean1.bitsquare.io", "188.226.179.109", 7367); /** * Alias to the default bootstrap node. diff --git a/src/main/java/io/bitsquare/network/Node.java b/src/main/java/io/bitsquare/network/Node.java index 9a83378170..349f9dcfce 100644 --- a/src/main/java/io/bitsquare/network/Node.java +++ b/src/main/java/io/bitsquare/network/Node.java @@ -68,6 +68,13 @@ public final class Node { return String.valueOf(port); } + /** + * Return a copy of this node with the port updated to the given value. + */ + public Node withPort(int newPort) { + return Node.at(this.name, this.ip, newPort); + } + @Override public boolean equals(Object object) { if (this == object) diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index 848f4d4bb1..5e76f51654 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -89,7 +89,7 @@ public class TomP2PTests { // Typically you run the bootstrap node on localhost to test direct connection. // If you have a setup where you are not behind a router you can also use a WAN bootstrap node. private static final Node BOOTSTRAP_NODE = (FORCED_CONNECTION_TYPE == ConnectionType.DIRECT) ? - BootstrapNodes.LOCALHOST : BootstrapNodes.DIGITAL_OCEAN_1_DEV; + BootstrapNodes.LOCALHOST : BootstrapNodes.DIGITAL_OCEAN_1.withPort(7367); private static final PeerAddress BOOTSTRAP_NODE_ADDRESS; From 8c9557c8910255ccf809cb2fe5aeec9cb9031a6e Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 10 Nov 2014 14:19:06 +0100 Subject: [PATCH 24/24] Allow configurability of bitcoin network with --bitcoin.network This commit changes the previous option value of 'networkType' to 'bitcoin.network' and exposes it through the ArgumentParser. --- doc/bitsquare.conf | 4 ++-- .../java/io/bitsquare/app/ArgumentParser.java | 5 +++++ src/main/java/io/bitsquare/app/gui/Main.java | 4 ++++ .../java/io/bitsquare/btc/BitcoinModule.java | 17 ++++++----------- .../java/io/bitsquare/btc/BitcoinNetwork.java | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/doc/bitsquare.conf b/doc/bitsquare.conf index 76dd87bf9c..2a4da4ad8d 100644 --- a/doc/bitsquare.conf +++ b/doc/bitsquare.conf @@ -17,6 +17,6 @@ # Supported properties: -# networkType=regtest | testnet | mainnet +# bitcoin.network=regtest | testnet | mainnet -networkType=regtest +bitcoin.network=regtest diff --git a/src/main/java/io/bitsquare/app/ArgumentParser.java b/src/main/java/io/bitsquare/app/ArgumentParser.java index 0b5ca26f0d..e3a847d77e 100644 --- a/src/main/java/io/bitsquare/app/ArgumentParser.java +++ b/src/main/java/io/bitsquare/app/ArgumentParser.java @@ -17,6 +17,7 @@ package io.bitsquare.app; +import io.bitsquare.btc.BitcoinModule; import io.bitsquare.network.Node; import net.sourceforge.argparse4j.ArgumentParsers; @@ -53,6 +54,10 @@ public class ArgumentParser { parser.addArgument("--" + NETWORK_INTERFACE_KEY) .help("Network interface"); + parser.addArgument("--" + BitcoinModule.BITCOIN_NETWORK_KEY) + .setDefault(BitcoinModule.DEFAULT_BITCOIN_NETWORK.toString()) + .help("Bitcoin network to use"); + // Args for app config parser.addArgument("-n", "--" + APP_NAME_KEY) .help("Name to append to default application name"); diff --git a/src/main/java/io/bitsquare/app/gui/Main.java b/src/main/java/io/bitsquare/app/gui/Main.java index fadb2288b8..ded08d0aa6 100644 --- a/src/main/java/io/bitsquare/app/gui/Main.java +++ b/src/main/java/io/bitsquare/app/gui/Main.java @@ -50,6 +50,7 @@ import lighthouse.files.AppDirectory; import net.sourceforge.argparse4j.inf.Namespace; import static io.bitsquare.app.AppModule.APP_NAME_KEY; +import static io.bitsquare.btc.BitcoinModule.BITCOIN_NETWORK_KEY; import static io.bitsquare.msg.tomp2p.TomP2PMessageModule.*; import static io.bitsquare.network.Node.*; @@ -89,6 +90,9 @@ public class Main extends Application { if (argumentsNamespace.getString(NETWORK_INTERFACE_KEY) != null) properties.setProperty(NETWORK_INTERFACE_KEY, argumentsNamespace.getString(NETWORK_INTERFACE_KEY)); + if (argumentsNamespace.getString(BITCOIN_NETWORK_KEY) != null) + properties.setProperty(BITCOIN_NETWORK_KEY, argumentsNamespace.getString(BITCOIN_NETWORK_KEY)); + Application.launch(Main.class, args); } diff --git a/src/main/java/io/bitsquare/btc/BitcoinModule.java b/src/main/java/io/bitsquare/btc/BitcoinModule.java index 15794095bb..c43edba080 100644 --- a/src/main/java/io/bitsquare/btc/BitcoinModule.java +++ b/src/main/java/io/bitsquare/btc/BitcoinModule.java @@ -30,17 +30,11 @@ import java.util.Properties; public class BitcoinModule extends BitsquareModule { - private static final BitcoinNetwork DEFAULT_NETWORK = BitcoinNetwork.TESTNET; - - private final BitcoinNetwork network; + public static final String BITCOIN_NETWORK_KEY = "bitcoin.network"; + public static final String DEFAULT_BITCOIN_NETWORK = BitcoinNetwork.TESTNET.toString(); public BitcoinModule(Properties properties) { - this(properties, DEFAULT_NETWORK); - } - - public BitcoinModule(Properties properties, BitcoinNetwork network) { super(properties); - this.network = network; } @Override @@ -57,9 +51,10 @@ public class BitcoinModule extends BitsquareModule { } private NetworkParameters network() { - String networkName = properties.getProperty("networkType", network.name()); + BitcoinNetwork network = BitcoinNetwork.valueOf( + properties.getProperty(BITCOIN_NETWORK_KEY, DEFAULT_BITCOIN_NETWORK).toUpperCase()); - switch (BitcoinNetwork.valueOf(networkName.toUpperCase())) { + switch (network) { case MAINNET: return MainNetParams.get(); case TESTNET: @@ -67,7 +62,7 @@ public class BitcoinModule extends BitsquareModule { case REGTEST: return RegTestParams.get(); default: - throw new IllegalArgumentException("Unknown bitcoin network name: " + networkName); + throw new IllegalArgumentException("Unknown bitcoin network: " + network); } } } diff --git a/src/main/java/io/bitsquare/btc/BitcoinNetwork.java b/src/main/java/io/bitsquare/btc/BitcoinNetwork.java index 444b2a7bea..d0a1fa2007 100644 --- a/src/main/java/io/bitsquare/btc/BitcoinNetwork.java +++ b/src/main/java/io/bitsquare/btc/BitcoinNetwork.java @@ -18,5 +18,5 @@ package io.bitsquare.btc; public enum BitcoinNetwork { - MAINNET, TESTNET, REGTEST + MAINNET, TESTNET, REGTEST; }