diff --git a/core/src/main/java/io/bitsquare/btc/AddressEntry.java b/core/src/main/java/io/bitsquare/btc/AddressEntry.java
index 89debef3f3..613860fd01 100644
--- a/core/src/main/java/io/bitsquare/btc/AddressEntry.java
+++ b/core/src/main/java/io/bitsquare/btc/AddressEntry.java
@@ -21,10 +21,15 @@ import io.bitsquare.app.Version;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.crypto.DeterministicKey;
+import org.bitcoinj.params.MainNetParams;
+import org.bitcoinj.params.RegTestParams;
+import org.bitcoinj.params.TestNet3Params;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.Serializable;
/**
@@ -56,7 +61,8 @@ public class AddressEntry implements Serializable {
private final Context context;
private final byte[] pubKey;
private final byte[] pubKeyHash;
- private final NetworkParameters params;
+ private final String paramId;
+ transient private NetworkParameters params;
///////////////////////////////////////////////////////////////////////////////////////////
@@ -75,10 +81,28 @@ public class AddressEntry implements Serializable {
this.context = context;
this.offerId = offerId;
+ paramId = params.getId();
+
pubKey = keyPair.getPubKey();
pubKeyHash = keyPair.getPubKeyHash();
}
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ try {
+ in.defaultReadObject();
+
+ if (MainNetParams.ID_MAINNET.equals(paramId))
+ params = MainNetParams.get();
+ else if (MainNetParams.ID_TESTNET.equals(paramId))
+ params = TestNet3Params.get();
+ else if (MainNetParams.ID_REGTEST.equals(paramId))
+ params = RegTestParams.get();
+
+ } catch (Throwable t) {
+ log.trace("Cannot be deserialized." + t.getMessage());
+ }
+ }
+
// Set after wallet is ready
public void setDeterministicKey(DeterministicKey deterministicKey) {
this.keyPair = deterministicKey;
diff --git a/core/src/main/java/io/bitsquare/btc/WalletService.java b/core/src/main/java/io/bitsquare/btc/WalletService.java
index 3a4bc00ee3..fb6e4971a8 100644
--- a/core/src/main/java/io/bitsquare/btc/WalletService.java
+++ b/core/src/main/java/io/bitsquare/btc/WalletService.java
@@ -188,6 +188,11 @@ public class WalletService {
UserThread.execute(resultHandler::handleResult);
}
};
+
+ // TODO try to get bitcoinj running over our tor proxy
+ /* if (!params.getId().equals(NetworkParameters.ID_REGTEST))
+ walletAppKit.useTor();*/
+
// Now configure and start the appkit. This will take a second or two - we could show a temporary splash screen
// or progress widget to keep the user engaged whilst we initialise, but we don't.
if (params == RegTestParams.get()) {
diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java
index 0731cbd828..6f4e4125fe 100644
--- a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java
+++ b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java
@@ -53,6 +53,7 @@ import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
+import org.bitcoinj.crypto.DRMWorkaround;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.controlsfx.dialog.Dialogs;
import org.reactfx.EventStreams;
@@ -114,6 +115,8 @@ public class BitsquareApp extends Application {
Thread.setDefaultUncaughtExceptionHandler(handler);
Thread.currentThread().setUncaughtExceptionHandler(handler);
+ DRMWorkaround.maybeDisableExportControls();
+
Security.addProvider(new BouncyCastleProvider());
try {
diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java b/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java
index f70dd0eeec..31eb2e19bb 100644
--- a/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java
+++ b/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java
@@ -20,7 +20,6 @@ package io.bitsquare.app;
import io.bitsquare.BitsquareException;
import io.bitsquare.btc.BitcoinNetwork;
import io.bitsquare.btc.RegTestHost;
-import io.bitsquare.p2p.Utils;
import io.bitsquare.util.joptsimple.EnumValueConverter;
import joptsimple.OptionException;
import joptsimple.OptionParser;
@@ -101,7 +100,8 @@ public class BitsquareAppMain extends BitsquareExecutable {
.ofType(boolean.class);
parser.accepts(ProgramArguments.NAME_KEY, description("Name of this node", null))
.withRequiredArg();
- parser.accepts(ProgramArguments.PORT_KEY, description("Port to listen on", Utils.findFreeSystemPort()))
+ // use a fixed port as arbitrator use that for his ID
+ parser.accepts(ProgramArguments.PORT_KEY, description("Port to listen on", 9999))
.withRequiredArg()
.ofType(int.class);
parser.accepts(ProgramArguments.USE_LOCALHOST, description("Use localhost network for development", false))
diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java
index 77a89af8ca..8064b97be7 100644
--- a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java
+++ b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java
@@ -206,30 +206,6 @@ class MainViewModel implements ViewModel {
///////////////////////////////////////////////////////////////////////////////////////////
private BooleanProperty initP2PNetwork() {
- /* if (networkService.getNetworkInfo() instanceof TomP2PNetworkInfo) {
- TomP2PNetworkInfo networkInfo = (TomP2PNetworkInfo) networkService.getNetworkInfo();
- networkInfo.numPeersProperty().addListener((observable, oldValue, newValue) -> {
- numDHTPeers.set(String.valueOf(newValue) + " peers");
- if ((int) newValue == 0) {
- if (lostP2PConnectionTimeoutTimer != null)
- lostP2PConnectionTimeoutTimer.stop();
- lostP2PConnectionTimeoutTimer = FxTimer.runLater(Duration.ofMillis(LOST_P2P_CONNECTION_TIMEOUT), () -> {
- log.trace("Connection lost timeout reached");
- bootstrapErrorMsg.set("We lost connection to the last peer.");
- });
- } else if ((int) oldValue == 0 && (int) newValue > 0) {
- if (lostP2PConnectionTimeoutTimer != null) {
- lostP2PConnectionTimeoutTimer.stop();
- lostP2PConnectionTimeoutTimer = null;
- }
- bootstrapErrorMsg.set(null);
- }
- });
-
- networkInfo.stateProperty().addListener((ov, oldValue, newValue) -> {
- setBootstrapState(newValue);
- });
- }*/
final BooleanProperty p2pNetworkReady = new SimpleBooleanProperty();
p2PService.start(new P2PServiceListener() {
@Override
diff --git a/gui/src/main/resources/logback.xml b/gui/src/main/resources/logback.xml
index f876642588..22f6f08efe 100644
--- a/gui/src/main/resources/logback.xml
+++ b/gui/src/main/resources/logback.xml
@@ -31,10 +31,10 @@
-
+
+
diff --git a/network/src/main/java/io/bitsquare/p2p/P2PModule.java b/network/src/main/java/io/bitsquare/p2p/P2PModule.java
index bd8f9285a2..1bf53fdc08 100644
--- a/network/src/main/java/io/bitsquare/p2p/P2PModule.java
+++ b/network/src/main/java/io/bitsquare/p2p/P2PModule.java
@@ -49,7 +49,8 @@ public class P2PModule extends AppModule {
File torDir = new File(env.getRequiredProperty(ProgramArguments.TOR_DIR));
bind(File.class).annotatedWith(named(ProgramArguments.TOR_DIR)).toInstance(torDir);
- Integer port = env.getProperty(ProgramArguments.PORT_KEY, int.class, Utils.findFreeSystemPort());
+ // use a fixed port as arbitrator use that for his ID
+ Integer port = env.getProperty(ProgramArguments.PORT_KEY, int.class, 9999);
bind(int.class).annotatedWith(Names.named(ProgramArguments.PORT_KEY)).toInstance(port);
}
}
\ No newline at end of file
diff --git a/network/src/main/java/io/bitsquare/p2p/network/NetworkNode.java b/network/src/main/java/io/bitsquare/p2p/network/NetworkNode.java
index 45d4420cd9..f96c7b1436 100644
--- a/network/src/main/java/io/bitsquare/p2p/network/NetworkNode.java
+++ b/network/src/main/java/io/bitsquare/p2p/network/NetworkNode.java
@@ -92,7 +92,7 @@ public abstract class NetworkNode implements MessageListener, ConnectionListener
log.info("\n\n############################################################\n" +
"NetworkNode created new outbound connection:"
- + "\npeerAddress=" + peerAddress.port
+ + "\npeerAddress=" + peerAddress.getFullAddress()
+ "\nconnection.uid=" + newConnection.getUid()
+ "\nmessage=" + message
+ "\n############################################################\n");
diff --git a/network/src/main/java/io/bitsquare/p2p/network/TorNetworkNode.java b/network/src/main/java/io/bitsquare/p2p/network/TorNetworkNode.java
index ab24a1a81d..e2b626f64b 100644
--- a/network/src/main/java/io/bitsquare/p2p/network/TorNetworkNode.java
+++ b/network/src/main/java/io/bitsquare/p2p/network/TorNetworkNode.java
@@ -8,6 +8,7 @@ import com.msopentech.thali.java.toronionproxy.JavaOnionProxyContext;
import com.msopentech.thali.java.toronionproxy.JavaOnionProxyManager;
import io.bitsquare.common.UserThread;
import io.bitsquare.p2p.Address;
+import io.bitsquare.p2p.Utils;
import io.nucleo.net.HiddenServiceDescriptor;
import io.nucleo.net.TorNode;
import org.jetbrains.annotations.NotNull;
@@ -50,8 +51,8 @@ public class TorNetworkNode extends NetworkNode {
// Constructor
// /////////////////////////////////////////////////////////////////////////////////////////
- public TorNetworkNode(int port, File torDir) {
- super(port);
+ public TorNetworkNode(int servicePort, File torDir) {
+ super(servicePort);
this.torDir = torDir;
}
@@ -75,7 +76,7 @@ public class TorNetworkNode extends NetworkNode {
setupListeners.stream().forEach(e -> UserThread.execute(() -> e.onTorNodeReady()));
// Create Hidden Service (takes about 40 sec.)
- createHiddenService(torNode, port, hiddenServiceDescriptor -> {
+ createHiddenService(torNode, Utils.findFreeSystemPort(), port, hiddenServiceDescriptor -> {
TorNetworkNode.this.hiddenServiceDescriptor = hiddenServiceDescriptor;
startServer(hiddenServiceDescriptor.getServerSocket());
@@ -113,7 +114,6 @@ public class TorNetworkNode extends NetworkNode {
} else {
log.error("executorService must not be null at shutDown");
}
-
ListenableFuture> future2 = executorService.submit(() -> {
try {
long ts = System.currentTimeMillis();
@@ -176,8 +176,11 @@ public class TorNetworkNode extends NetworkNode {
start(null);
}, WAIT_BEFORE_RESTART, TimeUnit.MILLISECONDS));
} else {
- log.error("We tried to restart tor " + restartCounter
- + " times, but we failed to get tor running. We give up now.");
+ String msg = "We tried to restart tor " + restartCounter
+ + " times, but we failed to get tor running. We give up now.";
+ log.error(msg);
+ // TODO display better error msg
+ throw new RuntimeException(msg);
}
}
@@ -219,14 +222,14 @@ public class TorNetworkNode extends NetworkNode {
});
}
- private void createHiddenService(final TorNode torNode, final int port,
- final Consumer resultHandler) {
+ private void createHiddenService(TorNode torNode, int localPort, int servicePort,
+ Consumer resultHandler) {
ListenableFuture future = executorService.submit(() -> {
Thread.currentThread().setName("NetworkNode:CreateHiddenService-" + new Random().nextInt(1000));
try {
long ts = System.currentTimeMillis();
log.debug("Create hidden service");
- HiddenServiceDescriptor hiddenServiceDescriptor = torNode.createHiddenService(port);
+ HiddenServiceDescriptor hiddenServiceDescriptor = torNode.createHiddenService(localPort, servicePort);
log.info("\n\n############################################################\n" +
"Hidden service created:" +
"\nAddress=" + hiddenServiceDescriptor.getFullAddress() +
diff --git a/seednode/src/main/java/io/bitsquare/p2p/seed/SeedNodeMain.java b/seednode/src/main/java/io/bitsquare/p2p/seed/SeedNodeMain.java
index 4d891f3a93..6a77678617 100644
--- a/seednode/src/main/java/io/bitsquare/p2p/seed/SeedNodeMain.java
+++ b/seednode/src/main/java/io/bitsquare/p2p/seed/SeedNodeMain.java
@@ -3,6 +3,7 @@ package io.bitsquare.p2p.seed;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.bitsquare.app.Logging;
import io.bitsquare.common.UserThread;
+import org.bitcoinj.crypto.DRMWorkaround;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,6 +30,9 @@ public class SeedNodeMain {
Path path = Paths.get("seed_node_log");
Logging.setup(path.toString());
log.info("Log files under: " + path.toAbsolutePath().toString());
+
+ DRMWorkaround.maybeDisableExportControls();
+
new SeedNodeMain(args);
}