From 32cd643e8bcabc67fd8fb1e8c7b7a0788398d589 Mon Sep 17 00:00:00 2001 From: Svarog Date: Tue, 2 Mar 2021 17:28:53 +0200 Subject: [PATCH] Clone transactions before returning them out of mempool (#1571) Co-authored-by: Elichai Turkel --- domain/miningmanager/mempool/mempool.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/domain/miningmanager/mempool/mempool.go b/domain/miningmanager/mempool/mempool.go index def4f4084..e7f7a28fe 100644 --- a/domain/miningmanager/mempool/mempool.go +++ b/domain/miningmanager/mempool/mempool.go @@ -11,6 +11,8 @@ import ( "sync" "time" + "github.com/kaspanet/kaspad/infrastructure/logger" + "github.com/kaspanet/kaspad/domain/consensus/utils/constants" "github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper" @@ -937,10 +939,14 @@ func (mp *mempool) ChainedCount() int { func (mp *mempool) BlockCandidateTransactions() []*consensusexternalapi.DomainTransaction { mp.mtx.RLock() defer mp.mtx.RUnlock() + + onEnd := logger.LogAndMeasureExecutionTime(log, "BlockCandidateTransactions") + defer onEnd() + descs := make([]*consensusexternalapi.DomainTransaction, len(mp.pool)) i := 0 for _, desc := range mp.pool { - descs[i] = desc.DomainTransaction + descs[i] = desc.DomainTransaction.Clone() // Clone the transaction to prevent data races. A shallow-copy might do as well i++ }