diff --git a/domain/miningmanager/mempool/mempool_utxo_set.go b/domain/miningmanager/mempool/mempool_utxo_set.go index c2b6669b0..79d793a9a 100644 --- a/domain/miningmanager/mempool/mempool_utxo_set.go +++ b/domain/miningmanager/mempool/mempool_utxo_set.go @@ -3,6 +3,8 @@ package mempool import ( "fmt" + "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" + "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/utils/utxo" "github.com/kaspanet/kaspad/domain/miningmanager/mempool/model" @@ -22,13 +24,13 @@ func newMempoolUTXOSet(mp *mempool) *mempoolUTXOSet { } } -func (mpus *mempoolUTXOSet) getParentsInPool(transaction *model.MempoolTransaction) model.ParentUTXOsInPool { +func (mpus *mempoolUTXOSet) getParentsInPool(transaction *externalapi.DomainTransaction) model.ParentUTXOsInPool { parentsInPool := model.ParentUTXOsInPool{} outpoint := &externalapi.DomainOutpoint{ - TransactionID: *transaction.TransactionID(), + TransactionID: *consensushashing.TransactionID(transaction), } - for i := range transaction.Transaction.Inputs { + for i := range transaction.Inputs { outpoint.Index = uint32(i) utxo, ok := mpus.poolUnspentOutputs[*outpoint] if ok { diff --git a/domain/miningmanager/mempool/model/mempool_transaction.go b/domain/miningmanager/mempool/model/mempool_transaction.go index 172603faf..9ec2a364e 100644 --- a/domain/miningmanager/mempool/model/mempool_transaction.go +++ b/domain/miningmanager/mempool/model/mempool_transaction.go @@ -8,7 +8,7 @@ import ( // MempoolTransaction represents a transaction inside the main TransactionPool type MempoolTransaction struct { Transaction *externalapi.DomainTransaction - ParentsInPool IDToTransaction + ParentsInPool ParentUTXOsInPool IsHighPriority bool AddedAtDAAScore uint64 } diff --git a/domain/miningmanager/mempool/orphan_pool.go b/domain/miningmanager/mempool/orphan_pool.go index 07aafeeef..b97a82e7c 100644 --- a/domain/miningmanager/mempool/orphan_pool.go +++ b/domain/miningmanager/mempool/orphan_pool.go @@ -37,8 +37,37 @@ func (op *orphansPool) processOrphansAfterAcceptedTransaction(acceptedTransactio panic("orphansPool.processOrphansAfterAcceptedTransaction not implemented") // TODO (Mike) } -func (op *orphansPool) unorphanTransaction(orphanTransactionID *externalapi.DomainTransactionID) (model.MempoolTransaction, error) { - panic("orphansPool.unorphanTransaction not implemented") // TODO (Mike) +func (op *orphansPool) unorphanTransaction(orphanTransactionID *externalapi.DomainTransactionID) (*model.MempoolTransaction, error) { + orphanTransaction, ok := op.allOrphans[*orphanTransactionID] + if !ok { + return nil, errors.Errorf("Transaction %s is not an orphan", orphanTransactionID) + } + err := op.removeOrphan(orphanTransactionID, false) + if err != nil { + return nil, err + } + + err = op.mempool.validateTransactionInContext(orphanTransaction.Transaction) + if err != nil { + return nil, err + } + + virtualDAAScore, err := op.mempool.virtualDAAScore() + if err != nil { + return nil, err + } + mempoolTransaction := &model.MempoolTransaction{ + Transaction: orphanTransaction.Transaction, + ParentsInPool: op.mempool.mempoolUTXOSet.getParentsInPool(orphanTransaction.Transaction), + IsHighPriority: false, + AddedAtDAAScore: virtualDAAScore, + } + err = op.mempool.transactionsPool.addMempoolTransaction(mempoolTransaction) + if err != nil { + return nil, err + } + + return mempoolTransaction, nil } func (op *orphansPool) removeOrphan(orphanTransactionID *externalapi.DomainTransactionID, removeRedeemers bool) error { @@ -96,7 +125,9 @@ func (op *orphansPool) expireOrphanTransactions() error { // Remove all transactions whose addedAtDAAScore is older then transactionExpireIntervalDAAScore if virtualDAAScore-orphanTransaction.AddedAtDAAScore > op.mempool.config.orphanExpireIntervalDAAScore { - err = op.removeOrphan(orphanTransaction.TransactionID()) + // Don't remove redeemers in the case of a random eviction since + // it is quite possible it might be needed again shortly. + err = op.removeOrphan(orphanTransaction.TransactionID(), false) if err != nil { return err } diff --git a/domain/miningmanager/mempool/transactions_pool.go b/domain/miningmanager/mempool/transactions_pool.go index f38443dc1..5f1a239ba 100644 --- a/domain/miningmanager/mempool/transactions_pool.go +++ b/domain/miningmanager/mempool/transactions_pool.go @@ -29,7 +29,7 @@ func (tp *transactionsPool) addTransaction(transaction *externalapi.DomainTransa panic("transactionsPool.addTransaction not implemented") // TODO (Mike) } -func (tp *transactionsPool) addMempoolTransaction(transaction model.MempoolTransaction) error { +func (tp *transactionsPool) addMempoolTransaction(transaction *model.MempoolTransaction) error { panic("transactionsPool.addMempoolTransaction not implemented") // TODO (Mike) }