Skip to content

Commit 0235312

Browse files
committed
Use UTXO hasher in VaultManager.
The VaultManager class needs a TransactionUtxoHasher instance so that it can properly track spent outputs with the outputTracker_. This adds a reference to the UTXO hasher to the instance and uses it in the proper place.
1 parent 078782e commit 0235312

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

divi/src/VaultManager.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <WalletTx.h>
66
#include <WalletTransactionRecord.h>
77
#include <SpentOutputTracker.h>
8+
#include <UtxoCheckingAndUpdating.h>
89
#include <I_VaultManagerDatabase.h>
910
#include <I_MerkleTxConfirmationNumberCalculator.h>
1011
#include <Logging.h>
@@ -13,8 +14,10 @@ constexpr const char* VAULT_DEPOSIT_DESCRIPTION = "isVaultDeposit";
1314

1415
VaultManager::VaultManager(
1516
const I_MerkleTxConfirmationNumberCalculator& confirmationsCalculator,
17+
const TransactionUtxoHasher& utxoHasher,
1618
I_VaultManagerDatabase& vaultManagerDB
1719
): confirmationsCalculator_(confirmationsCalculator)
20+
, utxoHasher_(utxoHasher)
1821
, vaultManagerDB_(vaultManagerDB)
1922
, cs_vaultManager_()
2023
, transactionOrderingIndex_(0)
@@ -222,7 +225,6 @@ UnspentOutputs VaultManager::getManagedUTXOs(VaultUTXOFilters filter) const
222225
auto managedScriptsLimitsCopy = managedScripts_;
223226
for(const auto& hashAndTransaction: walletTxRecord_->mapWallet)
224227
{
225-
uint256 hash = hashAndTransaction.first;
226228
const CWalletTx& tx = hashAndTransaction.second;
227229
if(!( (allInputsAreKnown(tx) && tx.IsCoinStake()) || tx.mapValue.count(VAULT_DEPOSIT_DESCRIPTION) > 0 )) continue;
228230

@@ -236,6 +238,7 @@ UnspentOutputs VaultManager::getManagedUTXOs(VaultUTXOFilters filter) const
236238
if( (filter & VaultUTXOFilters::MATURED) > 0 && blocksTillMaturity > 0 ) continue;
237239
if( (filter & VaultUTXOFilters::INMATURE) > 0 && blocksTillMaturity < 1 ) continue;
238240

241+
const uint256 hash = utxoHasher_.GetUtxoHash(tx);
239242
for(unsigned outputIndex = 0; outputIndex < tx.vout.size(); ++outputIndex)
240243
{
241244
const CTxOut& output = tx.vout[outputIndex];

divi/src/VaultManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ using UnspentOutputs = std::vector<COutput>;
1414
class CTransaction;
1515
class CBlock;
1616
class CWalletTx;
17+
class TransactionUtxoHasher;
1718
class uint256;
1819
class CTxOut;
1920

@@ -38,6 +39,7 @@ class VaultManager
3839
I_VaultManagerDatabase& vaultManagerDB_;
3940
mutable CCriticalSection cs_vaultManager_;
4041
uint64_t transactionOrderingIndex_;
42+
const TransactionUtxoHasher& utxoHasher_;
4143
std::unique_ptr<WalletTransactionRecord> walletTxRecord_;
4244
std::unique_ptr<SpentOutputTracker> outputTracker_;
4345
ManagedScripts managedScripts_;
@@ -51,6 +53,7 @@ class VaultManager
5153
public:
5254
VaultManager(
5355
const I_MerkleTxConfirmationNumberCalculator& confirmationsCalculator,
56+
const TransactionUtxoHasher& utxoHasher,
5457
I_VaultManagerDatabase& vaultManagerDB);
5558
~VaultManager();
5659

divi/src/test/VaultManager_tests.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <FakeBlockIndexChain.h>
88
#include <primitives/block.h>
99
#include <chain.h>
10+
#include <MockUtxoHasher.h>
1011
#include <MockVaultManagerDatabase.h>
1112
#include <WalletTx.h>
1213
#include <streams.h>
@@ -21,6 +22,7 @@ using ::testing::Invoke;
2122
struct VaultManagerTestFixture
2223
{
2324
public:
25+
MockUtxoHasher utxoHasher;
2426
std::unique_ptr<NiceMock<MockVaultManagerDatabase>> mockPtr;
2527
std::unique_ptr<FakeBlockIndexWithHashes> fakeBlockIndexWithHashesResource;
2628
std::unique_ptr<I_MerkleTxConfirmationNumberCalculator> confirmationsCalculator;
@@ -36,7 +38,7 @@ struct VaultManagerTestFixture
3638
*(fakeBlockIndexWithHashesResource->blockIndexByHash)
3739
))
3840
, scriptGenerator()
39-
, manager( new VaultManager(*confirmationsCalculator,*mockPtr ))
41+
, manager( new VaultManager(*confirmationsCalculator, utxoHasher, *mockPtr))
4042
{
4143
}
4244
~VaultManagerTestFixture()
@@ -190,7 +192,7 @@ BOOST_AUTO_TEST_CASE(willDiscountSpentUTXOs)
190192
manager->addTransaction(tx,&blockMiningFirstTx, true);
191193

192194
CMutableTransaction otherTx;
193-
otherTx.vin.emplace_back( COutPoint(tx.GetHash(), 1u) );
195+
otherTx.vin.emplace_back( COutPoint(utxoHasher.GetUtxoHash(tx), 1u) );
194196
otherTx.vout.push_back(CTxOut(100,managedScript));
195197
otherTx.vout.push_back(CTxOut(100,managedScript));
196198
otherTx.vout.push_back(CTxOut(100,managedScript));
@@ -245,7 +247,7 @@ BOOST_AUTO_TEST_CASE(willCheckThatCoinstakeTransactionsAreDeepEnoughToSpend)
245247
manager->addTransaction(fundingTransaction,&blockMiningFundingTx, true);
246248

247249
CMutableTransaction tx;
248-
tx.vin.push_back(CTxIn(fundingTransaction.GetHash(),0u));
250+
tx.vin.push_back(CTxIn(utxoHasher.GetUtxoHash(fundingTransaction),0u));
249251
CTxOut emptyFirstOutput;
250252
emptyFirstOutput.SetEmpty();
251253
tx.vout.push_back(emptyFirstOutput);
@@ -271,7 +273,7 @@ BOOST_AUTO_TEST_CASE(willLoadTransactionsFromDatabase)
271273
dummyTransaction.vout.push_back(CTxOut(100,scriptGenerator(10)));
272274

273275
CMutableTransaction tx;
274-
tx.vin.push_back(CTxIn(dummyTransaction.GetHash(),0u));
276+
tx.vin.push_back(CTxIn(utxoHasher.GetUtxoHash(dummyTransaction),0u));
275277
tx.vout.push_back(CTxOut(100,managedScript));
276278
tx.vout.push_back(CTxOut(100,managedScript));
277279
tx.vout.push_back(CTxOut(100,managedScript));
@@ -309,7 +311,7 @@ BOOST_AUTO_TEST_CASE(willLoadTransactionsFromDatabase)
309311
return true;
310312
}
311313
));
312-
manager.reset(new VaultManager(*confirmationsCalculator, *mockPtr ));
314+
manager.reset(new VaultManager(*confirmationsCalculator, utxoHasher, *mockPtr ));
313315

314316
BOOST_CHECK_EQUAL(manager->getManagedUTXOs().size(), 4u);
315317
BOOST_CHECK(expectedTx==manager->getTransaction(tx.GetHash()));
@@ -329,7 +331,7 @@ BOOST_AUTO_TEST_CASE(willLoadManyTransactionsFromDatabase)
329331
CMutableTransaction dummyTransaction;
330332
dummyTransaction.vout.push_back(CTxOut(100,scriptGenerator(10)));
331333
CMutableTransaction tx;
332-
tx.vin.push_back(CTxIn(dummyTransaction.GetHash(),0u));
334+
tx.vin.push_back(CTxIn(utxoHasher.GetUtxoHash(dummyTransaction),0u));
333335
tx.vout.push_back(CTxOut(randomSentAmount,scriptGenerator(10)));
334336

335337
dummyTransactions.emplace_back(tx);
@@ -352,7 +354,7 @@ BOOST_AUTO_TEST_CASE(willLoadManyTransactionsFromDatabase)
352354
return false;
353355
}
354356
));
355-
manager.reset(new VaultManager(*confirmationsCalculator, *mockPtr ));
357+
manager.reset(new VaultManager(*confirmationsCalculator, utxoHasher, *mockPtr ));
356358

357359
for(unsigned txCount =0 ; txCount < 10u; ++txCount)
358360
{
@@ -698,7 +700,7 @@ BOOST_AUTO_TEST_CASE(willUpdatingDepositStatusWillPersist)
698700
manager->addTransaction(tx,&blockMiningFirstTx, true);
699701
BOOST_CHECK_EQUAL(manager->getTransaction(tx.GetHash()).mapValue.count("isVaultDeposit"),1u);
700702

701-
manager.reset( new VaultManager(*confirmationsCalculator,*mockPtr ));
703+
manager.reset( new VaultManager(*confirmationsCalculator, utxoHasher, *mockPtr));
702704
BOOST_CHECK_EQUAL(manager->getTransaction(tx.GetHash()).mapValue.count("isVaultDeposit"),1u);
703705
}
704706

@@ -966,4 +968,4 @@ BOOST_AUTO_TEST_CASE(willNotEraseManagedScriptToBackendOnRemovalMoreThanOnce)
966968
manager->removeManagedScript(managedScript);
967969
}
968970

969-
BOOST_AUTO_TEST_SUITE_END()
971+
BOOST_AUTO_TEST_SUITE_END()

divi/src/wallet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ void CWallet::activateVaultMode()
263263
const std::string keystring = vchDefaultKey.GetID().ToString();
264264
const std::string vaultID = std::string("vault_") + Hash160(keystring.begin(),keystring.end()).ToString().substr(0,10);
265265
vaultDB_.reset(new VaultManagerDatabase(vaultID,0));
266-
vaultManager_.reset(new VaultManager(*confirmationNumberCalculator_,*vaultDB_));
266+
vaultManager_.reset(new VaultManager(*confirmationNumberCalculator_, *utxoHasher, *vaultDB_));
267267
for(const std::string& whitelistedVaultScript: settings.GetMultiParameter("-whitelisted_vault"))
268268
{
269269
auto byteVector = ParseHex(whitelistedVaultScript);

0 commit comments

Comments
 (0)