3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-15 11:45:51 +00:00

Connect bitcoinj to hidden services

This commit adds a few small modifications to PeerAddress to make it easier for
bitcoinj to connect to Tor hidden services when using the Orchid TorClient.
This commit is contained in:
Chris 2015-07-24 11:34:51 -04:00 committed by Andreas Schildbach
parent d0416b7f0f
commit 8a2e742598
2 changed files with 29 additions and 3 deletions

View File

@ -439,7 +439,7 @@ public class Peer extends PeerSocketHandler {
PeerAddress peerAddress = getAddress(); PeerAddress peerAddress = getAddress();
long peerTime = vPeerVersionMessage.time * 1000; long peerTime = vPeerVersionMessage.time * 1000;
log.info("Connected to {}: version={}, subVer='{}', services=0x{}, time={}, blocks={}", log.info("Connected to {}: version={}, subVer='{}', services=0x{}, time={}, blocks={}",
peerAddress == null ? "Peer" : peerAddress.getAddr().getHostAddress(), peerAddress == null ? "Peer" : (peerAddress.getAddr() == null ? peerAddress.getHostname() : peerAddress.getAddr().getHostAddress()),
peerVersion, peerVersion,
vPeerVersionMessage.subVer, vPeerVersionMessage.subVer,
vPeerVersionMessage.localServices, vPeerVersionMessage.localServices,

View File

@ -40,6 +40,7 @@ public class PeerAddress extends ChildMessage {
static final int MESSAGE_SIZE = 30; static final int MESSAGE_SIZE = 30;
private InetAddress addr; private InetAddress addr;
private String hostname; // Used for .onion addresses
private int port; private int port;
private BigInteger services; private BigInteger services;
private long time; private long time;
@ -97,8 +98,20 @@ public class PeerAddress extends ChildMessage {
this(addr, MainNetParams.get().getPort()); this(addr, MainNetParams.get().getPort());
} }
/**
* Constructs a peer address from an {@link InetSocketAddress}. An InetSocketAddress can take in as parameters an
* InetAddress or a String hostname. If you want to connect to a .onion, set the hostname to the .onion address.
*/
public PeerAddress(InetSocketAddress addr) { public PeerAddress(InetSocketAddress addr) {
this(addr.getAddress(), addr.getPort()); if (addr.getHostName() == null || !addr.getHostName().toLowerCase().endsWith(".onion")) {
this.addr = checkNotNull(addr.getAddress());
} else {
this.hostname = addr.getHostName();
}
this.port = addr.getPort();
this.protocolVersion = NetworkParameters.PROTOCOL_VERSION;
this.services = BigInteger.ZERO;
length = protocolVersion > 31402 ? MESSAGE_SIZE : MESSAGE_SIZE - 4;
} }
public static PeerAddress localhost(NetworkParameters params) { public static PeerAddress localhost(NetworkParameters params) {
@ -163,6 +176,11 @@ public class PeerAddress extends ChildMessage {
return length; return length;
} }
public String getHostname() {
maybeParse();
return hostname;
}
public InetAddress getAddr() { public InetAddress getAddr() {
maybeParse(); maybeParse();
return addr; return addr;
@ -216,6 +234,9 @@ public class PeerAddress extends ChildMessage {
@Override @Override
public String toString() { public String toString() {
if (hostname != null) {
return "[" + hostname + "]:" + port;
}
return "[" + addr.getHostAddress() + "]:" + port; return "[" + addr.getHostAddress() + "]:" + port;
} }
@ -234,6 +255,11 @@ public class PeerAddress extends ChildMessage {
} }
public InetSocketAddress toSocketAddress() { public InetSocketAddress toSocketAddress() {
return new InetSocketAddress(addr, port); // Reconstruct the InetSocketAddress properly
if (hostname != null) {
return InetSocketAddress.createUnresolved(hostname, port);
} else {
return new InetSocketAddress(addr, port);
}
} }
} }