diff --git a/core/src/main/java/org/bitcoinj/core/AddressV1Message.java b/core/src/main/java/org/bitcoinj/core/AddressV1Message.java index 77bec9f9e..1fb508f90 100644 --- a/core/src/main/java/org/bitcoinj/core/AddressV1Message.java +++ b/core/src/main/java/org/bitcoinj/core/AddressV1Message.java @@ -48,7 +48,7 @@ public class AddressV1Message extends AddressMessage { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { final VarInt numAddressesVarInt = VarInt.read(payload); int numAddresses = numAddressesVarInt.intValue(); // Guard against ultra large messages that will crash us. diff --git a/core/src/main/java/org/bitcoinj/core/AddressV2Message.java b/core/src/main/java/org/bitcoinj/core/AddressV2Message.java index 8bdbb119e..bd7cbc5ba 100644 --- a/core/src/main/java/org/bitcoinj/core/AddressV2Message.java +++ b/core/src/main/java/org/bitcoinj/core/AddressV2Message.java @@ -48,7 +48,7 @@ public class AddressV2Message extends AddressMessage { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { final VarInt numAddressesVarInt = VarInt.read(payload); int numAddresses = numAddressesVarInt.intValue(); // Guard against ultra large messages that will crash us. diff --git a/core/src/main/java/org/bitcoinj/core/Block.java b/core/src/main/java/org/bitcoinj/core/Block.java index fe9bc8877..88818a235 100644 --- a/core/src/main/java/org/bitcoinj/core/Block.java +++ b/core/src/main/java/org/bitcoinj/core/Block.java @@ -221,7 +221,7 @@ public class Block extends Message { /** * Parse transactions from the block. */ - protected void parseTransactions() throws ProtocolException { + protected void parseTransactions(ByteBuffer payload) throws ProtocolException { VarInt numTransactionsVarInt = VarInt.read(payload); int numTransactions = numTransactionsVarInt.intValue(); transactions = new ArrayList<>(Math.min(numTransactions, Utils.MAX_INITIAL_ARRAY_LENGTH)); @@ -234,7 +234,7 @@ public class Block extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { // header payload.mark(); version = ByteUtils.readUint32(payload); @@ -248,7 +248,7 @@ public class Block extends Message { // transactions if (payload.hasRemaining()) // otherwise this message is just a header - parseTransactions(); + parseTransactions(payload); } public static Block createGenesis(NetworkParameters n) { diff --git a/core/src/main/java/org/bitcoinj/core/BloomFilter.java b/core/src/main/java/org/bitcoinj/core/BloomFilter.java index 82dcc6751..3dd439536 100644 --- a/core/src/main/java/org/bitcoinj/core/BloomFilter.java +++ b/core/src/main/java/org/bitcoinj/core/BloomFilter.java @@ -149,7 +149,7 @@ public class BloomFilter extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { data = Buffers.readLengthPrefixedBytes(payload); if (data.length > MAX_FILTER_SIZE) throw new ProtocolException ("Bloom filter out of size range."); diff --git a/core/src/main/java/org/bitcoinj/core/EmptyMessage.java b/core/src/main/java/org/bitcoinj/core/EmptyMessage.java index 0063a9cff..e5e2fe896 100644 --- a/core/src/main/java/org/bitcoinj/core/EmptyMessage.java +++ b/core/src/main/java/org/bitcoinj/core/EmptyMessage.java @@ -20,6 +20,7 @@ package org.bitcoinj.core; import java.io.IOException; import java.io.OutputStream; import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; /** *

Parent class for header only messages that don't have a payload. @@ -43,6 +44,6 @@ public abstract class EmptyMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { } } diff --git a/core/src/main/java/org/bitcoinj/core/FeeFilterMessage.java b/core/src/main/java/org/bitcoinj/core/FeeFilterMessage.java index 940fbf0e0..a6c5874d5 100644 --- a/core/src/main/java/org/bitcoinj/core/FeeFilterMessage.java +++ b/core/src/main/java/org/bitcoinj/core/FeeFilterMessage.java @@ -48,7 +48,7 @@ public class FeeFilterMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { feeRate = Coin.ofSat(ByteUtils.readInt64(payload)); check(feeRate.signum() >= 0, () -> new ProtocolException("fee rate out of range: " + feeRate)); } diff --git a/core/src/main/java/org/bitcoinj/core/FilteredBlock.java b/core/src/main/java/org/bitcoinj/core/FilteredBlock.java index 59c455a96..a0b5a3c66 100644 --- a/core/src/main/java/org/bitcoinj/core/FilteredBlock.java +++ b/core/src/main/java/org/bitcoinj/core/FilteredBlock.java @@ -67,7 +67,7 @@ public class FilteredBlock extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { byte[] headerBytes = Buffers.readBytes(payload, Block.HEADER_SIZE); header = new Block(params, ByteBuffer.wrap(headerBytes)); merkleTree = new PartialMerkleTree(params, payload); diff --git a/core/src/main/java/org/bitcoinj/core/GetBlocksMessage.java b/core/src/main/java/org/bitcoinj/core/GetBlocksMessage.java index 1b51e8736..23fe5bb5a 100644 --- a/core/src/main/java/org/bitcoinj/core/GetBlocksMessage.java +++ b/core/src/main/java/org/bitcoinj/core/GetBlocksMessage.java @@ -49,7 +49,7 @@ public class GetBlocksMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { version = ByteUtils.readUint32(payload); int startCount = VarInt.read(payload).intValue(); if (startCount > 500) diff --git a/core/src/main/java/org/bitcoinj/core/HeadersMessage.java b/core/src/main/java/org/bitcoinj/core/HeadersMessage.java index 6133c57cd..c574f4f6b 100644 --- a/core/src/main/java/org/bitcoinj/core/HeadersMessage.java +++ b/core/src/main/java/org/bitcoinj/core/HeadersMessage.java @@ -68,7 +68,7 @@ public class HeadersMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { int numHeaders = VarInt.read(payload).intValue(); if (numHeaders > MAX_HEADERS) throw new ProtocolException("Too many headers: got " + numHeaders + " which is larger than " + diff --git a/core/src/main/java/org/bitcoinj/core/ListMessage.java b/core/src/main/java/org/bitcoinj/core/ListMessage.java index 567312e0e..69547cc21 100644 --- a/core/src/main/java/org/bitcoinj/core/ListMessage.java +++ b/core/src/main/java/org/bitcoinj/core/ListMessage.java @@ -66,7 +66,7 @@ public abstract class ListMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { long arrayLen = VarInt.read(payload).longValue(); if (arrayLen > MAX_INVENTORY_ITEMS) throw new ProtocolException("Too many items in INV message: " + arrayLen); diff --git a/core/src/main/java/org/bitcoinj/core/Message.java b/core/src/main/java/org/bitcoinj/core/Message.java index bd6d2fe5a..ea43e3b18 100644 --- a/core/src/main/java/org/bitcoinj/core/Message.java +++ b/core/src/main/java/org/bitcoinj/core/Message.java @@ -41,9 +41,6 @@ public abstract class Message { public static final int MAX_SIZE = 0x02000000; // 32MB - // The raw message payload bytes themselves. - protected ByteBuffer payload; - protected final MessageSerializer serializer; @Nullable @@ -74,15 +71,12 @@ public abstract class Message { protected Message(NetworkParameters params, ByteBuffer payload, MessageSerializer serializer) throws ProtocolException { this.serializer = serializer; this.params = params; - this.payload = payload; try { - parse(); + parse(payload); } catch(BufferUnderflowException e) { throw new ProtocolException(e); } - - this.payload = null; } protected Message(ByteBuffer payload) throws ProtocolException { @@ -95,7 +89,7 @@ public abstract class Message { // These methods handle the serialization/deserialization using the custom Bitcoin protocol. - protected abstract void parse() throws BufferUnderflowException, ProtocolException; + protected abstract void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException; /** *

To be called before any change of internal values including any setters. This ensures any cached byte array is diff --git a/core/src/main/java/org/bitcoinj/core/PartialMerkleTree.java b/core/src/main/java/org/bitcoinj/core/PartialMerkleTree.java index cd9d69ca5..da9dc3da3 100644 --- a/core/src/main/java/org/bitcoinj/core/PartialMerkleTree.java +++ b/core/src/main/java/org/bitcoinj/core/PartialMerkleTree.java @@ -123,7 +123,7 @@ public class PartialMerkleTree extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { transactionCount = (int) ByteUtils.readUint32(payload); int nHashes = VarInt.read(payload).intValue(); diff --git a/core/src/main/java/org/bitcoinj/core/PeerAddress.java b/core/src/main/java/org/bitcoinj/core/PeerAddress.java index aa7b6aafd..8bf6c911c 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerAddress.java +++ b/core/src/main/java/org/bitcoinj/core/PeerAddress.java @@ -229,7 +229,7 @@ public class PeerAddress extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { int protocolVersion = serializer.getProtocolVersion(); if (protocolVersion < 0 || protocolVersion > 2) throw new IllegalStateException("invalid protocolVersion: " + protocolVersion); diff --git a/core/src/main/java/org/bitcoinj/core/Ping.java b/core/src/main/java/org/bitcoinj/core/Ping.java index 32594a5e7..df4e4d335 100644 --- a/core/src/main/java/org/bitcoinj/core/Ping.java +++ b/core/src/main/java/org/bitcoinj/core/Ping.java @@ -57,7 +57,7 @@ public class Ping extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { nonce = ByteUtils.readInt64(payload); } diff --git a/core/src/main/java/org/bitcoinj/core/Pong.java b/core/src/main/java/org/bitcoinj/core/Pong.java index 6b0f36ad6..a89057966 100644 --- a/core/src/main/java/org/bitcoinj/core/Pong.java +++ b/core/src/main/java/org/bitcoinj/core/Pong.java @@ -45,7 +45,7 @@ public class Pong extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { nonce = ByteUtils.readInt64(payload); } diff --git a/core/src/main/java/org/bitcoinj/core/RejectMessage.java b/core/src/main/java/org/bitcoinj/core/RejectMessage.java index d871b495f..b7bad15de 100644 --- a/core/src/main/java/org/bitcoinj/core/RejectMessage.java +++ b/core/src/main/java/org/bitcoinj/core/RejectMessage.java @@ -95,7 +95,7 @@ public class RejectMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { message = Buffers.readLengthPrefixedString(payload); code = RejectCode.fromCode(payload.get()); reason = Buffers.readLengthPrefixedString(payload); diff --git a/core/src/main/java/org/bitcoinj/core/Transaction.java b/core/src/main/java/org/bitcoinj/core/Transaction.java index 732cb7662..8fcf1f4f1 100644 --- a/core/src/main/java/org/bitcoinj/core/Transaction.java +++ b/core/src/main/java/org/bitcoinj/core/Transaction.java @@ -647,7 +647,7 @@ public class Transaction extends Message { * transaction is segwit or not. */ @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { boolean allowWitness = allowWitness(); @@ -655,27 +655,27 @@ public class Transaction extends Message { version = ByteUtils.readUint32(payload); byte flags = 0; // Try to parse the inputs. In case the dummy is there, this will be read as an empty array list. - parseInputs(); + parseInputs(payload); if (inputs.size() == 0 && allowWitness) { // We read a dummy or an empty input flags = payload.get(); if (flags != 0) { - parseInputs(); - parseOutputs(); + parseInputs(payload); + parseOutputs(payload); } else { outputs = new ArrayList<>(0); } } else { // We read non-empty inputs. Assume normal outputs follows. - parseOutputs(); + parseOutputs(payload); } if (((flags & 1) != 0) && allowWitness) { // The witness flag is present, and we support witnesses. flags ^= 1; // script_witnesses - parseWitnesses(); + parseWitnesses(payload); if (!hasWitnesses()) { // It's illegal to encode witnesses when all witness stacks are empty. throw new ProtocolException("Superfluous witness record"); @@ -689,7 +689,7 @@ public class Transaction extends Message { vLockTime = LockTime.of(ByteUtils.readUint32(payload)); } - private void parseInputs() { + private void parseInputs(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { VarInt numInputsVarInt = VarInt.read(payload); int numInputs = numInputsVarInt.intValue(); inputs = new ArrayList<>(Math.min((int) numInputs, Utils.MAX_INITIAL_ARRAY_LENGTH)); @@ -704,7 +704,7 @@ public class Transaction extends Message { } } - private void parseOutputs() { + private void parseOutputs(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { VarInt numOutputsVarInt = VarInt.read(payload); int numOutputs = numOutputsVarInt.intValue(); outputs = new ArrayList<>(Math.min((int) numOutputs, Utils.MAX_INITIAL_ARRAY_LENGTH)); @@ -719,7 +719,7 @@ public class Transaction extends Message { } } - private void parseWitnesses() { + private void parseWitnesses(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { int numWitnesses = inputs.size(); for (int i = 0; i < numWitnesses; i++) { VarInt pushCountVarInt = VarInt.read(payload); diff --git a/core/src/main/java/org/bitcoinj/core/TransactionInput.java b/core/src/main/java/org/bitcoinj/core/TransactionInput.java index bad84aeaf..b1d6dc1d0 100644 --- a/core/src/main/java/org/bitcoinj/core/TransactionInput.java +++ b/core/src/main/java/org/bitcoinj/core/TransactionInput.java @@ -153,7 +153,7 @@ public class TransactionInput extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { outpoint = new TransactionOutPoint(payload); int scriptLen = VarInt.read(payload).intValue(); scriptBytes = Buffers.readBytes(payload, scriptLen); diff --git a/core/src/main/java/org/bitcoinj/core/TransactionOutPoint.java b/core/src/main/java/org/bitcoinj/core/TransactionOutPoint.java index fb7957b66..3e92d16f9 100644 --- a/core/src/main/java/org/bitcoinj/core/TransactionOutPoint.java +++ b/core/src/main/java/org/bitcoinj/core/TransactionOutPoint.java @@ -94,7 +94,7 @@ public class TransactionOutPoint extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { hash = Sha256Hash.read(payload); index = ByteUtils.readUint32(payload); } diff --git a/core/src/main/java/org/bitcoinj/core/TransactionOutput.java b/core/src/main/java/org/bitcoinj/core/TransactionOutput.java index 576983938..1bc18d195 100644 --- a/core/src/main/java/org/bitcoinj/core/TransactionOutput.java +++ b/core/src/main/java/org/bitcoinj/core/TransactionOutput.java @@ -127,7 +127,7 @@ public class TransactionOutput extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { value = ByteUtils.readInt64(payload); // Negative values obviously make no sense, except for -1 which is used as a sentinel value when calculating // SIGHASH_SINGLE signatures, so unfortunately we have to allow that here. diff --git a/core/src/main/java/org/bitcoinj/core/VersionMessage.java b/core/src/main/java/org/bitcoinj/core/VersionMessage.java index c9d2413ae..7b4d36924 100644 --- a/core/src/main/java/org/bitcoinj/core/VersionMessage.java +++ b/core/src/main/java/org/bitcoinj/core/VersionMessage.java @@ -112,7 +112,7 @@ public class VersionMessage extends Message { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { clientVersion = (int) ByteUtils.readUint32(payload); localServices = Services.read(payload); time = Instant.ofEpochSecond(ByteUtils.readInt64(payload)); diff --git a/core/src/test/java/org/bitcoinj/core/BitcoinSerializerTest.java b/core/src/test/java/org/bitcoinj/core/BitcoinSerializerTest.java index 72d0bd2f8..3f44a17ec 100644 --- a/core/src/test/java/org/bitcoinj/core/BitcoinSerializerTest.java +++ b/core/src/test/java/org/bitcoinj/core/BitcoinSerializerTest.java @@ -233,7 +233,7 @@ public class BitcoinSerializerTest { Message unknownMessage = new Message() { @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { } }; ByteArrayOutputStream bos = new ByteArrayOutputStream(ADDRESS_MESSAGE_BYTES.length); diff --git a/core/src/test/java/org/bitcoinj/core/MessageTest.java b/core/src/test/java/org/bitcoinj/core/MessageTest.java index 6fc5c5aee..759ee9819 100644 --- a/core/src/test/java/org/bitcoinj/core/MessageTest.java +++ b/core/src/test/java/org/bitcoinj/core/MessageTest.java @@ -42,7 +42,7 @@ public class MessageTest { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { Buffers.readLengthPrefixedString(payload); } } @@ -61,7 +61,7 @@ public class MessageTest { } @Override - protected void parse() throws BufferUnderflowException, ProtocolException { + protected void parse(ByteBuffer payload) throws BufferUnderflowException, ProtocolException { Buffers.readLengthPrefixedBytes(payload); } } diff --git a/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java b/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java index 1fab679b6..6264a07bf 100644 --- a/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java +++ b/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java @@ -45,7 +45,7 @@ public class PeerAddressTest { public void equalsContract() { EqualsVerifier.forClass(PeerAddress.class) .suppress(Warning.NONFINAL_FIELDS) - .withIgnoredFields("time", "params", "payload", "serializer") + .withIgnoredFields("time", "params", "serializer") .usingGetClass() .verify(); }