diff --git a/src/Stratis.Bitcoin.Features.Consensus/CoinViews/CoinviewHelper.cs b/src/Stratis.Bitcoin.Features.Consensus/CoinViews/CoinviewHelper.cs index bc3f268f2a..c8b041204e 100644 --- a/src/Stratis.Bitcoin.Features.Consensus/CoinViews/CoinviewHelper.cs +++ b/src/Stratis.Bitcoin.Features.Consensus/CoinViews/CoinviewHelper.cs @@ -20,8 +20,10 @@ public OutPoint[] GetIdsToFetch(Block block, bool enforceBIP30) { if (enforceBIP30) { + // Calculate the hash outside the loop. + var txId = tx.GetHash(); foreach (var utxo in tx.Outputs.AsIndexedOutputs()) - ids.Add(utxo.ToOutPoint()); + ids.Add(new OutPoint() { Hash = txId, N = utxo.N }); } if (!tx.IsCoinBase) diff --git a/src/Stratis.Bitcoin.Features.Consensus/UnspentOutputSet.cs b/src/Stratis.Bitcoin.Features.Consensus/UnspentOutputSet.cs index 41b71318de..2aa58e4ce2 100644 --- a/src/Stratis.Bitcoin.Features.Consensus/UnspentOutputSet.cs +++ b/src/Stratis.Bitcoin.Features.Consensus/UnspentOutputSet.cs @@ -52,9 +52,12 @@ public void Update(Network network, Transaction transaction, int height) } } - foreach (IndexedTxOut output in transaction.Outputs.AsIndexedOutputs()) + // Hash calculations are slow. Do this one outside the loop... + var txHash = transaction.GetHash(); + + foreach (IndexedTxOut output in transaction.Outputs.AsIndexedOutputs().ToList()) { - var outpoint = output.ToOutPoint(); + var outpoint = new OutPoint() { Hash = txHash, N = output.N }; var coinbase = transaction.IsCoinBase; var coinstake = network.Consensus.IsProofOfStake ? transaction.IsCoinStake : false;