mirror of
https://github.com/bitcoinj/bitcoinj.git
synced 2025-02-22 22:25:41 +01:00
AddressV1Message, AddressV2Message: move parse()
to static constructor read()
This commit is contained in:
parent
a114c6ca0e
commit
a155caa076
6 changed files with 51 additions and 44 deletions
|
@ -16,12 +16,17 @@
|
|||
|
||||
package org.bitcoinj.core;
|
||||
|
||||
import org.bitcoinj.base.VarInt;
|
||||
import org.bitcoinj.net.discovery.PeerDiscovery;
|
||||
|
||||
import java.nio.BufferUnderflowException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.bitcoinj.base.internal.Preconditions.check;
|
||||
|
||||
/**
|
||||
* Abstract superclass for address messages on the P2P network, which contain network addresses of other peers. This is
|
||||
* one of the ways peers can find each other without using the {@link PeerDiscovery} mechanism.
|
||||
|
@ -31,8 +36,22 @@ public abstract class AddressMessage extends BaseMessage {
|
|||
protected static final long MAX_ADDRESSES = 1000;
|
||||
protected List<PeerAddress> addresses;
|
||||
|
||||
AddressMessage(ByteBuffer payload) throws ProtocolException {
|
||||
super(payload);
|
||||
protected static List<PeerAddress> readAddresses(ByteBuffer payload, int protocolVariant) throws BufferUnderflowException, ProtocolException {
|
||||
VarInt numAddressesVarInt = VarInt.read(payload);
|
||||
check(numAddressesVarInt.fitsInt(), BufferUnderflowException::new);
|
||||
int numAddresses = numAddressesVarInt.intValue();
|
||||
// Guard against ultra large messages that will crash us.
|
||||
if (numAddresses > MAX_ADDRESSES)
|
||||
throw new ProtocolException("Address message too large.");
|
||||
List<PeerAddress> addresses = new ArrayList<>(numAddresses);
|
||||
for (int i = 0; i < numAddresses; i++) {
|
||||
addresses.add(PeerAddress.read(payload, protocolVariant));
|
||||
}
|
||||
return addresses;
|
||||
}
|
||||
|
||||
protected AddressMessage(List<PeerAddress> addresses) {
|
||||
this.addresses = addresses;
|
||||
}
|
||||
|
||||
public abstract void addAddress(PeerAddress address);
|
||||
|
|
|
@ -25,11 +25,7 @@ import java.io.IOException;
|
|||
import java.io.OutputStream;
|
||||
import java.nio.BufferUnderflowException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.bitcoinj.base.internal.Preconditions.check;
|
||||
import static org.bitcoinj.base.internal.Preconditions.checkArgument;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents an "addr" message on the P2P network, which contains broadcast IP addresses of other peers. This is
|
||||
|
@ -38,27 +34,24 @@ import static org.bitcoinj.base.internal.Preconditions.checkArgument;
|
|||
* Instances of this class are not safe for use by multiple threads.
|
||||
*/
|
||||
public class AddressV1Message extends AddressMessage {
|
||||
|
||||
/**
|
||||
* Construct a new 'addr' message.
|
||||
* @throws ProtocolException
|
||||
* Deserialize this message from a given payload.
|
||||
*
|
||||
* @param payload payload to deserialize from
|
||||
* @return read message
|
||||
* @throws BufferUnderflowException if the read message extends beyond the remaining bytes of the payload
|
||||
*/
|
||||
AddressV1Message(ByteBuffer payload) throws ProtocolException {
|
||||
super(payload);
|
||||
public static AddressV1Message read(ByteBuffer payload) throws BufferUnderflowException, ProtocolException {
|
||||
return new AddressV1Message(readAddresses(payload, 1));
|
||||
}
|
||||
|
||||
private AddressV1Message(List<PeerAddress> addresses) {
|
||||
super(addresses);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException {
|
||||
VarInt numAddressesVarInt = VarInt.read(payload);
|
||||
check(numAddressesVarInt.fitsInt(), BufferUnderflowException::new);
|
||||
int numAddresses = numAddressesVarInt.intValue();
|
||||
// Guard against ultra large messages that will crash us.
|
||||
if (numAddresses > MAX_ADDRESSES)
|
||||
throw new ProtocolException("Address message too large.");
|
||||
addresses = new ArrayList<>(numAddresses);
|
||||
for (int i = 0; i < numAddresses; i++) {
|
||||
addresses.add(PeerAddress.read(payload, 1));
|
||||
}
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void addAddress(PeerAddress address) {
|
||||
|
|
|
@ -24,10 +24,7 @@ import java.io.IOException;
|
|||
import java.io.OutputStream;
|
||||
import java.nio.BufferUnderflowException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static org.bitcoinj.base.internal.Preconditions.check;
|
||||
import static org.bitcoinj.base.internal.Preconditions.checkArgument;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents an "addrv2" message on the P2P network, which contains broadcast addresses of other peers. This is
|
||||
|
@ -39,25 +36,23 @@ import static org.bitcoinj.base.internal.Preconditions.checkArgument;
|
|||
*/
|
||||
public class AddressV2Message extends AddressMessage {
|
||||
/**
|
||||
* Construct a new 'addrv2' message.
|
||||
* @throws ProtocolException
|
||||
* Deserialize this message from a given payload.
|
||||
*
|
||||
* @param payload payload to deserialize from
|
||||
* @return read message
|
||||
* @throws BufferUnderflowException if the read message extends beyond the remaining bytes of the payload
|
||||
*/
|
||||
AddressV2Message(ByteBuffer payload) throws ProtocolException {
|
||||
super(payload);
|
||||
public static AddressV2Message read(ByteBuffer payload) throws BufferUnderflowException, ProtocolException {
|
||||
return new AddressV2Message(readAddresses(payload, 2));
|
||||
}
|
||||
|
||||
private AddressV2Message(List<PeerAddress> addresses) {
|
||||
super(addresses);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException {
|
||||
VarInt numAddressesVarInt = VarInt.read(payload);
|
||||
check(numAddressesVarInt.fitsInt(), BufferUnderflowException::new);
|
||||
int numAddresses = numAddressesVarInt.intValue();
|
||||
// Guard against ultra large messages that will crash us.
|
||||
if (numAddresses > MAX_ADDRESSES)
|
||||
throw new ProtocolException("Address message too large.");
|
||||
addresses = new ArrayList<>(numAddresses);
|
||||
for (int i = 0; i < numAddresses; i++) {
|
||||
addresses.add(PeerAddress.read(payload, 2));
|
||||
}
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void addAddress(PeerAddress address) {
|
||||
|
|
|
@ -280,7 +280,7 @@ public class BitcoinSerializer extends MessageSerializer {
|
|||
*/
|
||||
@Override
|
||||
public AddressV1Message makeAddressV1Message(ByteBuffer payload) throws ProtocolException {
|
||||
return new AddressV1Message(payload);
|
||||
return AddressV1Message.read(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -289,7 +289,7 @@ public class BitcoinSerializer extends MessageSerializer {
|
|||
*/
|
||||
@Override
|
||||
public AddressV2Message makeAddressV2Message(ByteBuffer payload) throws ProtocolException {
|
||||
return new AddressV2Message(payload);
|
||||
return AddressV2Message.read(payload);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -60,7 +60,7 @@ public class AddressV1MessageTest {
|
|||
|
||||
@Test
|
||||
public void roundtrip() {
|
||||
AddressMessage message = new AddressV1Message(ByteBuffer.wrap(ByteUtils.parseHex(MESSAGE_HEX)));
|
||||
AddressMessage message = AddressV1Message.read(ByteBuffer.wrap(ByteUtils.parseHex(MESSAGE_HEX)));
|
||||
|
||||
List<PeerAddress> addresses = message.getAddresses();
|
||||
assertEquals(4, addresses.size());
|
||||
|
|
|
@ -75,7 +75,7 @@ public class AddressV2MessageTest {
|
|||
|
||||
@Test
|
||||
public void roundtrip() {
|
||||
AddressMessage message = new AddressV2Message(ByteBuffer.wrap(ByteUtils.parseHex(MESSAGE_HEX)));
|
||||
AddressMessage message = AddressV2Message.read(ByteBuffer.wrap(ByteUtils.parseHex(MESSAGE_HEX)));
|
||||
|
||||
List<PeerAddress> addresses = message.getAddresses();
|
||||
assertEquals(5, addresses.size());
|
||||
|
|
Loading…
Add table
Reference in a new issue