fix serialisation issue with address entry

This commit is contained in:
Manfred Karrer 2015-11-07 03:39:37 +01:00
parent bce5460aa4
commit 6e1e3d4be3
10 changed files with 56 additions and 40 deletions

View File

@ -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;

View File

@ -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()) {

View File

@ -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 {

View File

@ -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))

View File

@ -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

View File

@ -31,10 +31,10 @@
<logger name="org.bitcoinj.core.BitcoinSerializer" level="WARN"/>
<logger name="org.bitcoinj.core.Peer" level="WARN"/>
<logger name="org.bitcoinj.core.HeadersMessage" level="WARN"/>
<logger name="org.bitcoinj.core.AbstractBlockChain" level="WARN"/>
<!--
<logger name="com.vinumeris.updatefx" level="OFF"/>
<logger name="io.netty" level="OFF"/>
<logger name="org.bitcoinj.core.BitcoinSerializer" level="ERROR"/>
<logger name="org.bitcoinj.core.Peer" level="ERROR"/>-->

View File

@ -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);
}
}

View File

@ -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");

View File

@ -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<HiddenServiceDescriptor> resultHandler) {
private void createHiddenService(TorNode torNode, int localPort, int servicePort,
Consumer<HiddenServiceDescriptor> resultHandler) {
ListenableFuture<HiddenServiceDescriptor> 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() +

View File

@ -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);
}