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:
parent
6368862ffe
commit
dc42630526
@ -17,6 +17,7 @@
|
|||||||
package com.google.bitcoin.core;
|
package com.google.bitcoin.core;
|
||||||
|
|
||||||
import com.google.bitcoin.store.BlockStoreException;
|
import com.google.bitcoin.store.BlockStoreException;
|
||||||
|
import com.google.bitcoin.utils.EventListenerInvoker;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigInteger;
|
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
|
* 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).
|
* 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.
|
* @param address IP address of the peer, used as a proxy for identity.
|
||||||
*/
|
*/
|
||||||
public synchronized void markBroadcastBy(PeerAddress address) {
|
public synchronized void markBroadcastBy(PeerAddress address) {
|
||||||
broadcastBy.add(address);
|
broadcastBy.add(address);
|
||||||
if (getConfidenceType() == ConfidenceType.UNKNOWN)
|
if (getConfidenceType() == ConfidenceType.UNKNOWN) {
|
||||||
setConfidenceType(ConfidenceType.NOT_SEEN_IN_CHAIN);
|
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() {
|
private void runListeners() {
|
||||||
if (listeners == null) return;
|
EventListenerInvoker.invoke(listeners, new EventListenerInvoker<Listener>() {
|
||||||
for (int i = 0; i < listeners.size(); i++) {
|
@Override
|
||||||
Listener l = listeners.get(i);
|
public void invoke(Listener listener) {
|
||||||
synchronized (l) {
|
listener.onConfidenceChanged(transaction);
|
||||||
l.onConfidenceChanged(transaction);
|
|
||||||
}
|
}
|
||||||
if (listeners.get(i) != l) {
|
});
|
||||||
// Listener removed itself.
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,20 +224,32 @@ public class PeerGroupTest extends TestWithNetworkConnections {
|
|||||||
InventoryMessage inv = new InventoryMessage(params);
|
InventoryMessage inv = new InventoryMessage(params);
|
||||||
inv.addTransaction(tx);
|
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.
|
// Peer 2 advertises the tx but does not download it.
|
||||||
assertNull(n2.exchange(inv));
|
assertNull(n2.exchange(inv));
|
||||||
assertEquals(0, tx.getConfidence().numBroadcastPeers());
|
assertEquals(0, tx.getConfidence().numBroadcastPeers());
|
||||||
|
assertEquals(null, event[0]);
|
||||||
// Peer 1 (the download peer) advertises the tx, we download it.
|
// Peer 1 (the download peer) advertises the tx, we download it.
|
||||||
n1.exchange(inv); // returns getdata
|
n1.exchange(inv); // returns getdata
|
||||||
n1.exchange(tx); // returns nothing after a queue drain.
|
n1.exchange(tx); // returns nothing after a queue drain.
|
||||||
// Two peers saw this tx hash.
|
// Two peers saw this tx hash.
|
||||||
assertEquals(2, tx.getConfidence().numBroadcastPeers());
|
assertEquals(2, tx.getConfidence().numBroadcastPeers());
|
||||||
|
assertEquals(tx, event[0]);
|
||||||
|
event[0] = null;
|
||||||
assertTrue(tx.getConfidence().getBroadcastBy().contains(n1.getPeerAddress()));
|
assertTrue(tx.getConfidence().getBroadcastBy().contains(n1.getPeerAddress()));
|
||||||
assertTrue(tx.getConfidence().getBroadcastBy().contains(n2.getPeerAddress()));
|
assertTrue(tx.getConfidence().getBroadcastBy().contains(n2.getPeerAddress()));
|
||||||
// A straggler reports in.
|
// A straggler reports in.
|
||||||
n3.exchange(inv);
|
n3.exchange(inv);
|
||||||
assertEquals(3, tx.getConfidence().numBroadcastPeers());
|
assertEquals(3, tx.getConfidence().numBroadcastPeers());
|
||||||
assertTrue(tx.getConfidence().getBroadcastBy().contains(n3.getPeerAddress()));
|
assertTrue(tx.getConfidence().getBroadcastBy().contains(n3.getPeerAddress()));
|
||||||
|
assertEquals(tx, event[0]);
|
||||||
|
event[0] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
Reference in New Issue
Block a user