3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-01-31 07:12:17 +00:00

Invoke transaction confidence listeners when a new peer broadcasts the given transaction. Use EventListenerInvoker to run the listeners.

This commit is contained in:
Mike Hearn 2012-04-02 17:23:48 +02:00
parent 6368862ffe
commit dc42630526
2 changed files with 25 additions and 12 deletions

View File

@ -17,6 +17,7 @@
package com.google.bitcoin.core;
import com.google.bitcoin.store.BlockStoreException;
import com.google.bitcoin.utils.EventListenerInvoker;
import java.io.Serializable;
import java.math.BigInteger;
@ -212,14 +213,19 @@ 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#NOT_SEEN_IN_CHAIN}.
* If confidence is currently unknown, sets it to {@link ConfidenceType#NOT_SEEN_IN_CHAIN}. Listeners will be
* invoked in this case.
*
* @param address IP address of the peer, used as a proxy for identity.
*/
public synchronized void markBroadcastBy(PeerAddress address) {
broadcastBy.add(address);
if (getConfidenceType() == ConfidenceType.UNKNOWN)
if (getConfidenceType() == ConfidenceType.UNKNOWN) {
setConfidenceType(ConfidenceType.NOT_SEEN_IN_CHAIN);
// Listeners are already run by setConfidenceType.
} else {
runListeners();
}
}
/**
@ -356,16 +362,11 @@ public class TransactionConfidence implements Serializable {
}
private void runListeners() {
if (listeners == null) return;
for (int i = 0; i < listeners.size(); i++) {
Listener l = listeners.get(i);
synchronized (l) {
l.onConfidenceChanged(transaction);
EventListenerInvoker.invoke(listeners, new EventListenerInvoker<Listener>() {
@Override
public void invoke(Listener listener) {
listener.onConfidenceChanged(transaction);
}
if (listeners.get(i) != l) {
// Listener removed itself.
i--;
}
}
});
}
}

View File

@ -224,20 +224,32 @@ public class PeerGroupTest extends TestWithNetworkConnections {
InventoryMessage inv = new InventoryMessage(params);
inv.addTransaction(tx);
final Transaction[] event = new Transaction[1];
tx.getConfidence().addEventListener(new TransactionConfidence.Listener() {
public void onConfidenceChanged(Transaction tx) {
event[0] = tx;
}
});
// Peer 2 advertises the tx but does not download it.
assertNull(n2.exchange(inv));
assertEquals(0, tx.getConfidence().numBroadcastPeers());
assertEquals(null, event[0]);
// Peer 1 (the download peer) advertises the tx, we download it.
n1.exchange(inv); // returns getdata
n1.exchange(tx); // returns nothing after a queue drain.
// Two peers saw this tx hash.
assertEquals(2, tx.getConfidence().numBroadcastPeers());
assertEquals(tx, event[0]);
event[0] = null;
assertTrue(tx.getConfidence().getBroadcastBy().contains(n1.getPeerAddress()));
assertTrue(tx.getConfidence().getBroadcastBy().contains(n2.getPeerAddress()));
// A straggler reports in.
n3.exchange(inv);
assertEquals(3, tx.getConfidence().numBroadcastPeers());
assertTrue(tx.getConfidence().getBroadcastBy().contains(n3.getPeerAddress()));
assertEquals(tx, event[0]);
event[0] = null;
}
@Test