diff --git a/core/src/main/java/org/bitcoinj/core/Peer.java b/core/src/main/java/org/bitcoinj/core/Peer.java index 683b1c8f3..ec53f90c2 100644 --- a/core/src/main/java/org/bitcoinj/core/Peer.java +++ b/core/src/main/java/org/bitcoinj/core/Peer.java @@ -1073,6 +1073,9 @@ public class Peer extends PeerSocketHandler { if (conf.numBroadcastPeers() > 1) { // Some other peer already announced this so don't download. it.remove(); + } else if (conf.getSource().equals(TransactionConfidence.Source.SELF)) { + // We created this transaction ourselves, so don't download. + it.remove(); } else { log.debug("{}: getdata on tx {}", getAddress(), item.hash); getdata.addItem(item); diff --git a/core/src/main/java/org/bitcoinj/core/PeerGroup.java b/core/src/main/java/org/bitcoinj/core/PeerGroup.java index 2ea0cce5c..e63f08b91 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerGroup.java +++ b/core/src/main/java/org/bitcoinj/core/PeerGroup.java @@ -1795,7 +1795,11 @@ public class PeerGroup implements TransactionBroadcaster { * which is calculated by watching the transaction propagate across the network and be announced by peers.

*/ public TransactionBroadcast broadcastTransaction(final Transaction tx, final int minConnections) { - // TODO: Context being owned by BlockChain isn't right w.r.t future intentions so it shouldn't really be optional here. + // If we don't have a record of where this tx came from already, set it to be ourselves so Peer doesn't end up + // redownloading it from the network redundantly. + if (tx.getConfidence().getSource().equals(TransactionConfidence.Source.UNKNOWN)) { + tx.getConfidence().setSource(TransactionConfidence.Source.SELF); + } final TransactionBroadcast broadcast = new TransactionBroadcast(this, tx); broadcast.setMinConnections(minConnections); // Send the TX to the wallet once we have a successful broadcast. diff --git a/core/src/test/java/org/bitcoinj/core/TransactionBroadcastTest.java b/core/src/test/java/org/bitcoinj/core/TransactionBroadcastTest.java index 027813e6a..81e0547e8 100644 --- a/core/src/test/java/org/bitcoinj/core/TransactionBroadcastTest.java +++ b/core/src/test/java/org/bitcoinj/core/TransactionBroadcastTest.java @@ -64,6 +64,7 @@ public class TransactionBroadcastTest extends TestWithPeerGroup { public void fourPeers() throws Exception { InboundMessageQueuer[] channels = { connectPeer(1), connectPeer(2), connectPeer(3), connectPeer(4) }; Transaction tx = new Transaction(params); + tx.getConfidence().setSource(TransactionConfidence.Source.SELF); TransactionBroadcast broadcast = new TransactionBroadcast(peerGroup, tx); final AtomicDouble lastProgress = new AtomicDouble(); broadcast.setProgressCallback(new TransactionBroadcast.ProgressCallback() { @@ -92,10 +93,11 @@ public class TransactionBroadcastTest extends TestWithPeerGroup { assertFalse(future.isDone()); assertEquals(0.0, lastProgress.get(), 0.0); inbound(channels[1], InventoryMessage.with(tx)); - pingAndWait(channels[1]); future.get(); Threading.waitForUserCode(); assertEquals(1.0, lastProgress.get(), 0.0); + // There is no response from the Peer as it has nothing to do. + assertNull(outbound(channels[1])); } @Test