@Override protected void parse() throws ProtocolException { long numAddresses = readVarInt(); // Guard against ultra large messages that will crash us. if (numAddresses > MAX_ADDRESSES) throw new ProtocolException("Address message too large."); addresses = new ArrayList<PeerAddress>((int) numAddresses); for (int i = 0; i < numAddresses; i++) { PeerAddress addr = new PeerAddress(params, payload, cursor, protocolVersion, this, serializer); addresses.add(addr); cursor += addr.getMessageSize(); } length = new VarInt(addresses.size()).getSizeInBytes(); // The 4 byte difference is the uint32 timestamp that was introduced in version 31402 length += addresses.size() * (protocolVersion > 31402 ? PeerAddress.MESSAGE_SIZE : PeerAddress.MESSAGE_SIZE - 4); }
@Override protected void bitcoinSerializeToStream(OutputStream stream) throws IOException { if (addresses == null) return; stream.write(new VarInt(addresses.size()).encode()); for (PeerAddress addr : addresses) { addr.bitcoinSerialize(stream); } }
public void addAddress(PeerAddress address) { unCache(); address.setParent(this); addresses.add(address); if (length == UNKNOWN_LENGTH) getMessageSize(); else length += address.getMessageSize(); }
PeerAddress address = it.next(); Protos.PeerAddress proto = Protos.PeerAddress.newBuilder() .setIpAddress(ByteString.copyFrom(address.getAddr().getAddress())) .setPort(address.getPort()) .setServices(address.getServices().longValue()) .build(); confidenceBuilder.addBroadcastBy(proto);
public PeerSocketHandler(NetworkParameters params, InetSocketAddress remoteIp) { checkNotNull(params); serializer = params.getDefaultSerializer(); this.peerAddress = new PeerAddress(params, remoteIp); }
@Test public void testAddr() throws Exception { final NetworkParameters params = MainNetParams.get(); MessageSerializer serializer = params.getDefaultSerializer(); // the actual data from https://en.bitcoin.it/wiki/Protocol_specification#addr AddressMessage addressMessage = (AddressMessage) serializer.deserialize(ByteBuffer.wrap(ADDRESS_MESSAGE_BYTES)); assertEquals(1, addressMessage.getAddresses().size()); PeerAddress peerAddress = addressMessage.getAddresses().get(0); assertEquals(8333, peerAddress.getPort()); assertEquals("10.0.0.1", peerAddress.getAddr().getHostAddress()); ByteArrayOutputStream bos = new ByteArrayOutputStream(ADDRESS_MESSAGE_BYTES.length); serializer.serialize(addressMessage, bos); assertEquals(31, addressMessage.getMessageSize()); addressMessage.addAddress(new PeerAddress(params, InetAddress.getLocalHost())); assertEquals(61, addressMessage.getMessageSize()); addressMessage.removeAddress(0); assertEquals(31, addressMessage.getMessageSize()); //this wont be true due to dynamic timestamps. //assertTrue(LazyParseByteCacheTest.arrayContains(bos.toByteArray(), addrMessage)); }
@Override public void run() { // This can take a looooong time. String reverseDns = peer.getAddress().getAddr().getCanonicalHostName(); synchronized (reverseDnsLookups) { reverseDnsLookups.put(peer, reverseDns); } refreshUI(); } }.start();
@Test public void testBitcoinSerialize() throws Exception { PeerAddress pa = new PeerAddress(MainNetParams.get(), InetAddress.getByName(null), 8333, 0, BigInteger.ZERO); assertEquals("000000000000000000000000000000000000ffff7f000001208d", Utils.HEX.encode(pa.bitcoinSerialize())); } }
@Override public String toString() { PeerAddress addr = getAddress(); // if null, it's a user-provided NetworkConnection object return addr == null ? "Peer()" : addr.toString(); }
void dsegUpdate(Peer pnode) { lock.lock(); try { if (params.getId().equals(NetworkParameters.ID_MAINNET)) { if (!(pnode.getAddress().getAddr().isAnyLocalAddress() || pnode.getAddress().getAddr().isLoopbackAddress())) { //std::map < CNetAddr, int64_t >::iterator it = mWeAskedForMasternodeList.find(pnode -> addr); Iterator<Map.Entry<NetAddress, Long>> it = mWeAskedForMasternodeList.entrySet().iterator(); if (it.hasNext()) { if (Utils.currentTimeSeconds() < it.next().getValue()){ log.info("dseg - we already asked {} for the list; skipping...", pnode.getAddress().toString()); return; } } } } pnode.sendMessage(new DarkSendEntryGetMessage(new TransactionInput(params,null, new byte[0]))); //pnode -> PushMessage("dseg", CTxIn()); long askAgain = Utils.currentTimeSeconds() + MasternodeManager.MASTERNODES_DSEG_SECONDS; mWeAskedForMasternodeList.put(new NetAddress(pnode.getAddress().getAddr()),askAgain); } finally { lock.unlock(); } }
@Override public void connectionOpened() { // Announce ourselves. This has to come first to connect to clients beyond v0.3.20.2 which wait to hear // from us until they send their version message back. PeerAddress address = getAddress(); log.info("Announcing to {} as: {}", address == null ? "Peer" : address.toSocketAddress(), versionMessage.subVer); sendMessage(versionMessage); connectionOpenFuture.set(this); // When connecting, the remote peer sends us a version message with various bits of // useful data in it. We need to know the peer protocol version before we can talk to it. }
@SuppressWarnings("FieldAccessNotGuarded") // only called when inactives is accessed, and lock is held then. @Override public int compare(PeerAddress a, PeerAddress b) { checkState(lock.isHeldByCurrentThread()); int result = backoffMap.get(a).compareTo(backoffMap.get(b)); // Sort by port if otherwise equals - for testing if (result == 0) result = Ints.compare(a.getPort(), b.getPort()); return result; } });
/** * Helper for forcing a connection to localhost. Useful when using regtest mode. Returns the peer object. */ @Nullable public Peer connectToLocalHost() { lock.lock(); try { final PeerAddress localhost = PeerAddress.localhost(params); backoffMap.put(localhost, new ExponentialBackoff(peerBackoffParams)); return connectTo(localhost, true, vConnectTimeoutMillis); } finally { lock.unlock(); } }
@Test public void testPeerAddressRoundtrip() throws Exception { // copied verbatim from https://en.bitcoin.it/wiki/Protocol_specification#Network_address String fromSpec = "010000000000000000000000000000000000ffff0a000001208d"; PeerAddress pa = new PeerAddress(MainNetParams.get(), HEX.decode(fromSpec), 0, 0); String reserialized = Utils.HEX.encode(pa.unsafeBitcoinSerialize()); assertEquals(reserialized,fromSpec ); }
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; VersionMessage other = (VersionMessage) o; return other.bestHeight == bestHeight && other.clientVersion == clientVersion && other.localServices == localServices && other.time == time && other.subVer.equals(subVer) && other.myAddr.equals(myAddr) && other.theirAddr.equals(theirAddr) && other.relayTxesBeforeFilter == relayTxesBeforeFilter; }
PeerAddress address = it.next(); Protos.PeerAddress proto = Protos.PeerAddress.newBuilder() .setIpAddress(ByteString.copyFrom(address.getAddr().getAddress())) .setPort(address.getPort()) .setServices(address.getServices().longValue()) .build(); confidenceBuilder.addBroadcastBy(proto);
public PeerSocketHandler(NetworkParameters params, InetSocketAddress remoteIp) { checkNotNull(params); serializer = params.getDefaultSerializer(); this.peerAddress = new PeerAddress(params, remoteIp); }
public void addAddress(PeerAddress address) { unCache(); address.setParent(this); addresses.add(address); if (length == UNKNOWN_LENGTH) getMessageSize(); else length += address.getMessageSize(); }
private Object getAddressForPeer(Peer peer) { String s; synchronized (reverseDnsLookups) { s = reverseDnsLookups.get(peer); } if (s != null) return s; else return peer.getAddress().getAddr().getHostAddress(); } }