From e86a77c55781b5390851775943e0469b0c4eea6d Mon Sep 17 00:00:00 2001 From: Sean Gilligan Date: Fri, 25 Mar 2022 15:37:12 -0700 Subject: [PATCH] Peer: construct getdata a little bit more functionally and atomically in downloadDependencies() Build GetDataMessage in a private method. --- core/src/main/java/org/bitcoinj/core/Peer.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/Peer.java b/core/src/main/java/org/bitcoinj/core/Peer.java index b16fbbe76..49a7b695f 100644 --- a/core/src/main/java/org/bitcoinj/core/Peer.java +++ b/core/src/main/java/org/bitcoinj/core/Peer.java @@ -812,11 +812,10 @@ public class Peer extends PeerSocketHandler { try { // Build the request for the missing dependencies. List> futures = new ArrayList<>(); - GetDataMessage getdata = new GetDataMessage(params); + GetDataMessage getdata = buildMultiTransactionDataMessage(txIdsToRequest); if (txIdsToRequest.size() > 1) log.info("{}: Requesting {} transactions for depth {} dep resolution", getAddress(), txIdsToRequest.size(), depth + 1); for (Sha256Hash hash : txIdsToRequest) { - getdata.addTransaction(hash, vPeerVersionMessage.isWitnessSupported()); GetDataRequest req = new GetDataRequest(hash); futures.add(req.future); getDataFutures.add(req); @@ -870,6 +869,18 @@ public class Peer extends PeerSocketHandler { return resultFuture; } + /** + * Build a GetDataMessage to query multiple transactions by ID + * @param txIds A set of transaction IDs to query + * @return A GetDataMessage that will query those IDs + */ + private GetDataMessage buildMultiTransactionDataMessage(Set txIds) { + GetDataMessage getdata = new GetDataMessage(params); + txIds.forEach(txId -> + getdata.addTransaction(txId, vPeerVersionMessage.isWitnessSupported())); + return getdata; + } + /** * Combine the direct results and the child dependencies. Make sure to filter out nulls from * {@code Futures.successfulAsList}.