From 6e1e3d4be3de755dbb409063ba7518d0af3dc801 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 7 Nov 2015 03:39:37 +0100 Subject: [PATCH] fix serialisation issue with address entry --- .../java/io/bitsquare/btc/AddressEntry.java | 26 ++++++++++++++++++- .../java/io/bitsquare/btc/WalletService.java | 5 ++++ .../java/io/bitsquare/app/BitsquareApp.java | 3 +++ .../io/bitsquare/app/BitsquareAppMain.java | 4 +-- .../io/bitsquare/gui/main/MainViewModel.java | 24 ----------------- gui/src/main/resources/logback.xml | 4 +-- .../main/java/io/bitsquare/p2p/P2PModule.java | 3 ++- .../io/bitsquare/p2p/network/NetworkNode.java | 2 +- .../bitsquare/p2p/network/TorNetworkNode.java | 21 ++++++++------- .../io/bitsquare/p2p/seed/SeedNodeMain.java | 4 +++ 10 files changed, 56 insertions(+), 40 deletions(-) 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); }