diff --git a/domain/miningmanager/mempool/error.go b/domain/miningmanager/mempool/error.go index d698217d7..827fa9014 100644 --- a/domain/miningmanager/mempool/error.go +++ b/domain/miningmanager/mempool/error.go @@ -51,6 +51,7 @@ const ( RejectDifficulty RejectCode = 0x44 RejectImmatureSpend RejectCode = 0x45 RejectBadOrphan RejectCode = 0x64 + RejectSpamTx RejectCode = 0x65 ) // Map of reject codes back strings for pretty printing. diff --git a/domain/miningmanager/mempool/validate_and_insert_transaction.go b/domain/miningmanager/mempool/validate_and_insert_transaction.go index d06a19cea..831557e13 100644 --- a/domain/miningmanager/mempool/validate_and_insert_transaction.go +++ b/domain/miningmanager/mempool/validate_and_insert_transaction.go @@ -2,6 +2,7 @@ package mempool import ( "fmt" + "github.com/kaspanet/kaspad/domain/consensus/utils/constants" "github.com/kaspanet/kaspad/infrastructure/logger" @@ -29,6 +30,12 @@ func (mp *mempool) validateAndInsertTransaction(transaction *externalapi.DomainT return nil, err } + numExtraOuts := len(transaction.Outputs) - len(transaction.Inputs) + if numExtraOuts > 2 && transaction.Fee < uint64(numExtraOuts)*constants.SompiPerKaspa { + log.Warnf("Rejected spam tx %s from mempool", consensushashing.TransactionID(transaction)) + return nil, transactionRuleError(RejectSpamTx, fmt.Sprintf("Rejected spam tx %s from mempool", consensushashing.TransactionID(transaction))) + } + if len(missingOutpoints) > 0 { if !allowOrphan { str := fmt.Sprintf("Transaction %s is an orphan, where allowOrphan = false",