diff --git a/core/src/main/java/org/bitcoinj/core/TransactionConfidence.java b/core/src/main/java/org/bitcoinj/core/TransactionConfidence.java index 78978fa2..10461e09 100644 --- a/core/src/main/java/org/bitcoinj/core/TransactionConfidence.java +++ b/core/src/main/java/org/bitcoinj/core/TransactionConfidence.java @@ -270,9 +270,10 @@ public class TransactionConfidence implements Serializable { /** * Called by a {@link Peer} when a transaction is pending and announced by a peer. The more peers announce the * transaction, the more peers have validated it (assuming your internet connection is not being intercepted). - * If confidence is currently unknown, sets it to {@link ConfidenceType#PENDING}. + * If confidence is currently unknown, sets it to {@link ConfidenceType#PENDING}. Does not run listeners. * * @param address IP address of the peer, used as a proxy for identity. + * @return true if marked, false if this address was already seen (no-op) */ public synchronized boolean markBroadcastBy(PeerAddress address) { if (!broadcastBy.addIfAbsent(address)) diff --git a/core/src/main/java/org/bitcoinj/core/TxConfidenceTable.java b/core/src/main/java/org/bitcoinj/core/TxConfidenceTable.java index 328c5b35..8b49c41e 100644 --- a/core/src/main/java/org/bitcoinj/core/TxConfidenceTable.java +++ b/core/src/main/java/org/bitcoinj/core/TxConfidenceTable.java @@ -139,14 +139,16 @@ public class TxConfidenceTable { */ public TransactionConfidence seen(Sha256Hash hash, PeerAddress byPeer) { TransactionConfidence confidence; + boolean fresh = false; lock.lock(); { cleanTable(); confidence = getOrCreate(hash); - confidence.markBroadcastBy(byPeer); + fresh = confidence.markBroadcastBy(byPeer); } lock.unlock(); - confidence.queueListeners(TransactionConfidence.Listener.ChangeReason.SEEN_PEERS); + if (fresh) + confidence.queueListeners(TransactionConfidence.Listener.ChangeReason.SEEN_PEERS); return confidence; } diff --git a/core/src/test/java/org/bitcoinj/core/TxConfidenceTableTest.java b/core/src/test/java/org/bitcoinj/core/TxConfidenceTableTest.java index 0edce577..b8aab869 100644 --- a/core/src/test/java/org/bitcoinj/core/TxConfidenceTableTest.java +++ b/core/src/test/java/org/bitcoinj/core/TxConfidenceTableTest.java @@ -69,6 +69,22 @@ public class TxConfidenceTableTest { assertEquals(2, seen[0]); } + @Test + public void events() throws Exception { + final TransactionConfidence.Listener.ChangeReason[] run = new TransactionConfidence.Listener.ChangeReason[1]; + tx1.getConfidence().addEventListener(new TransactionConfidence.Listener() { + @Override + public void onConfidenceChanged(TransactionConfidence confidence, ChangeReason reason) { + run[0] = reason; + } + }, Threading.SAME_THREAD); + table.seen(tx1.getHash(), address1); + assertEquals(TransactionConfidence.Listener.ChangeReason.SEEN_PEERS, run[0]); + run[0] = null; + table.seen(tx1.getHash(), address1); + assertNull(run[0]); + } + @Test public void invAndDownload() throws Exception { // Base case: we see a transaction announced twice and then download it. The count is in the confidence object.