Change Transaction.countUnconfirmedByCreator() to disregard CHAT transactions.

This is because CHAT transactions have intrinsic anti-spam/DoS prevention
by requiring proof of work.
This commit is contained in:
catbref 2020-05-04 09:29:07 +01:00
parent e2916b130b
commit e9f29767c8
2 changed files with 10 additions and 9 deletions

View File

@ -67,7 +67,7 @@ public class Settings {
// Specific to this node // Specific to this node
private boolean wipeUnconfirmedOnStart = false; private boolean wipeUnconfirmedOnStart = false;
/** Maximum number of unconfirmed transactions allowed per account */ /** Maximum number of unconfirmed transactions allowed per account */
private int maxUnconfirmedPerAccount = 100; private int maxUnconfirmedPerAccount = 25;
/** Max milliseconds into future for accepting new, unconfirmed transactions */ /** Max milliseconds into future for accepting new, unconfirmed transactions */
private int maxTransactionTimestampFuture = 24 * 60 * 60 * 1000; // milliseconds private int maxTransactionTimestampFuture = 24 * 60 * 60 * 1000; // milliseconds
/** Whether we check, fetch and install auto-updates */ /** Whether we check, fetch and install auto-updates */

View File

@ -8,6 +8,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Predicate;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -578,16 +579,16 @@ public abstract class Transaction {
private int countUnconfirmedByCreator(PublicKeyAccount creator) throws DataException { private int countUnconfirmedByCreator(PublicKeyAccount creator) throws DataException {
List<TransactionData> unconfirmedTransactions = repository.getTransactionRepository().getUnconfirmedTransactions(); List<TransactionData> unconfirmedTransactions = repository.getTransactionRepository().getUnconfirmedTransactions();
int count = 0; // We exclude CHAT transactions as they never get included into blocks and
for (TransactionData unconfirmedTransactionData : unconfirmedTransactions) { // have spam/DoS prevention by requiring proof of work
Transaction transaction = Transaction.fromData(repository, unconfirmedTransactionData); Predicate<TransactionData> hasSameCreatorButNotChat = transactionData -> {
PublicKeyAccount otherCreator = transaction.getCreator(); if (transactionData.getType() == TransactionType.CHAT)
return false;
if (Arrays.equals(creator.getPublicKey(), otherCreator.getPublicKey())) return Arrays.equals(creator.getPublicKey(), transactionData.getCreatorPublicKey());
++count; };
}
return count; return (int) unconfirmedTransactions.stream().filter(hasSameCreatorButNotChat).count();
} }
/** /**