From d358d145ca0eef5a8c661731dddd4ce6646dcb8d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Aug 2018 11:20:51 -0700 Subject: [PATCH 1/5] Refactor: rename setLockedNotes -> setLockedSproutNotes --- src/wallet/wallet.cpp | 20 ++++++++++---------- src/wallet/wallet.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 62b344522..608eb727d 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3828,33 +3828,33 @@ void CWallet::ListLockedCoins(std::vector& vOutpts) void CWallet::LockNote(const JSOutPoint& output) { - AssertLockHeld(cs_wallet); // setLockedNotes - setLockedNotes.insert(output); + AssertLockHeld(cs_wallet); // setLockedSproutNotes + setLockedSproutNotes.insert(output); } void CWallet::UnlockNote(const JSOutPoint& output) { - AssertLockHeld(cs_wallet); // setLockedNotes - setLockedNotes.erase(output); + AssertLockHeld(cs_wallet); // setLockedSproutNotes + setLockedSproutNotes.erase(output); } void CWallet::UnlockAllNotes() { - AssertLockHeld(cs_wallet); // setLockedNotes - setLockedNotes.clear(); + AssertLockHeld(cs_wallet); // setLockedSproutNotes + setLockedSproutNotes.clear(); } bool CWallet::IsLockedNote(const JSOutPoint& outpt) const { - AssertLockHeld(cs_wallet); // setLockedNotes + AssertLockHeld(cs_wallet); // setLockedSproutNotes - return (setLockedNotes.count(outpt) > 0); + return (setLockedSproutNotes.count(outpt) > 0); } std::vector CWallet::ListLockedNotes() { - AssertLockHeld(cs_wallet); // setLockedNotes - std::vector vOutpts(setLockedNotes.begin(), setLockedNotes.end()); + AssertLockHeld(cs_wallet); // setLockedSproutNotes + std::vector vOutpts(setLockedSproutNotes.begin(), setLockedSproutNotes.end()); return vOutpts; } diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 6c57d6112..79e9c6fc7 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -941,7 +941,7 @@ public: CPubKey vchDefaultKey; std::set setLockedCoins; - std::set setLockedNotes; + std::set setLockedSproutNotes; int64_t nTimeFirstKey; From 9ae73247e23e272a866e681d4150df4d8d563201 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Aug 2018 11:25:32 -0700 Subject: [PATCH 2/5] Refactor: rename UnlockAllNotes -> UnlockAllSproutNotes --- src/wallet/gtest/test_wallet.cpp | 2 +- src/wallet/wallet.cpp | 2 +- src/wallet/wallet.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/gtest/test_wallet.cpp b/src/wallet/gtest/test_wallet.cpp index 86e3e2a2b..cfaab1f6d 100644 --- a/src/wallet/gtest/test_wallet.cpp +++ b/src/wallet/gtest/test_wallet.cpp @@ -1995,7 +1995,7 @@ TEST(WalletTests, SproutNoteLocking) { EXPECT_TRUE(wallet.IsLockedNote(jsoutpt2)); // Test unlock all - wallet.UnlockAllNotes(); + wallet.UnlockAllSproutNotes(); EXPECT_FALSE(wallet.IsLockedNote(jsoutpt)); EXPECT_FALSE(wallet.IsLockedNote(jsoutpt2)); } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 608eb727d..9ee752937 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3838,7 +3838,7 @@ void CWallet::UnlockNote(const JSOutPoint& output) setLockedSproutNotes.erase(output); } -void CWallet::UnlockAllNotes() +void CWallet::UnlockAllSproutNotes() { AssertLockHeld(cs_wallet); // setLockedSproutNotes setLockedSproutNotes.clear(); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 79e9c6fc7..1432af95d 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -967,7 +967,7 @@ public: bool IsLockedNote(const JSOutPoint& outpt) const; void LockNote(const JSOutPoint& output); void UnlockNote(const JSOutPoint& output); - void UnlockAllNotes(); + void UnlockAllSproutNotes(); std::vector ListLockedNotes(); From 0f62cacf0c310b061c565537c74491a01058f9c1 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Aug 2018 11:26:39 -0700 Subject: [PATCH 3/5] Refactor: rename ListLockedNotes -> ListLockedSproutNotes --- src/wallet/wallet.cpp | 2 +- src/wallet/wallet.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 9ee752937..be6c6ea7f 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3851,7 +3851,7 @@ bool CWallet::IsLockedNote(const JSOutPoint& outpt) const return (setLockedSproutNotes.count(outpt) > 0); } -std::vector CWallet::ListLockedNotes() +std::vector CWallet::ListLockedSproutNotes() { AssertLockHeld(cs_wallet); // setLockedSproutNotes std::vector vOutpts(setLockedSproutNotes.begin(), setLockedSproutNotes.end()); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 1432af95d..31d228442 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -968,7 +968,7 @@ public: void LockNote(const JSOutPoint& output); void UnlockNote(const JSOutPoint& output); void UnlockAllSproutNotes(); - std::vector ListLockedNotes(); + std::vector ListLockedSproutNotes(); /** From b1c693e5329204adc98ba77431c8bbe0cbdff204 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Aug 2018 11:41:03 -0700 Subject: [PATCH 4/5] Add methods to store SaplingOutPoint in setLockedSaplingNotes --- src/wallet/wallet.cpp | 31 +++++++++++++++++++++++++++++++ src/wallet/wallet.h | 7 ++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index be6c6ea7f..770a18d38 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3858,6 +3858,37 @@ std::vector CWallet::ListLockedSproutNotes() return vOutpts; } +void CWallet::LockNote(const SaplingOutPoint& output) +{ + AssertLockHeld(cs_wallet); + setLockedSaplingNotes.insert(output); +} + +void CWallet::UnlockNote(const SaplingOutPoint& output) +{ + AssertLockHeld(cs_wallet); + setLockedSaplingNotes.erase(output); +} + +void CWallet::UnlockAllSaplingNotes() +{ + AssertLockHeld(cs_wallet); + setLockedSaplingNotes.clear(); +} + +bool CWallet::IsLockedNote(const SaplingOutPoint& output) const +{ + AssertLockHeld(cs_wallet); + return (setLockedSaplingNotes.count(output) > 0); +} + +std::vector CWallet::ListLockedSaplingNotes() +{ + AssertLockHeld(cs_wallet); + std::vector vOutputs(setLockedSaplingNotes.begin(), setLockedSaplingNotes.end()); + return vOutputs; +} + /** @} */ // end of Actions class CAffectedKeysVisitor : public boost::static_visitor { diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 31d228442..ade0d4143 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -942,6 +942,7 @@ public: std::set setLockedCoins; std::set setLockedSproutNotes; + std::set setLockedSaplingNotes; int64_t nTimeFirstKey; @@ -963,13 +964,17 @@ public: void UnlockAllCoins(); void ListLockedCoins(std::vector& vOutpts); - bool IsLockedNote(const JSOutPoint& outpt) const; void LockNote(const JSOutPoint& output); void UnlockNote(const JSOutPoint& output); void UnlockAllSproutNotes(); std::vector ListLockedSproutNotes(); + bool IsLockedNote(const SaplingOutPoint& output) const; + void LockNote(const SaplingOutPoint& output); + void UnlockNote(const SaplingOutPoint& output); + void UnlockAllSaplingNotes(); + std::vector ListLockedSaplingNotes(); /** * keystore implementation From 761f8c8bb8e80e70ed8c12ce2957c7453d6b101d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Aug 2018 14:34:08 -0700 Subject: [PATCH 5/5] Add unit test SaplingNoteLocking --- src/wallet/gtest/test_wallet.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/wallet/gtest/test_wallet.cpp b/src/wallet/gtest/test_wallet.cpp index cfaab1f6d..991b19a69 100644 --- a/src/wallet/gtest/test_wallet.cpp +++ b/src/wallet/gtest/test_wallet.cpp @@ -1999,3 +1999,35 @@ TEST(WalletTests, SproutNoteLocking) { EXPECT_FALSE(wallet.IsLockedNote(jsoutpt)); EXPECT_FALSE(wallet.IsLockedNote(jsoutpt2)); } + +TEST(WalletTests, SaplingNoteLocking) { + TestWallet wallet; + SaplingOutPoint sop1 {uint256(), 1}; + SaplingOutPoint sop2 {uint256(), 2}; + + // Test selective locking + wallet.LockNote(sop1); + EXPECT_TRUE(wallet.IsLockedNote(sop1)); + EXPECT_FALSE(wallet.IsLockedNote(sop2)); + + // Test selective unlocking + wallet.UnlockNote(sop1); + EXPECT_FALSE(wallet.IsLockedNote(sop1)); + + // Test multiple locking + wallet.LockNote(sop1); + wallet.LockNote(sop2); + EXPECT_TRUE(wallet.IsLockedNote(sop1)); + EXPECT_TRUE(wallet.IsLockedNote(sop2)); + + // Test list + auto v = wallet.ListLockedSaplingNotes(); + EXPECT_EQ(v.size(), 2); + EXPECT_TRUE(std::find(v.begin(), v.end(), sop1) != v.end()); + EXPECT_TRUE(std::find(v.begin(), v.end(), sop2) != v.end()); + + // Test unlock all + wallet.UnlockAllSaplingNotes(); + EXPECT_FALSE(wallet.IsLockedNote(sop1)); + EXPECT_FALSE(wallet.IsLockedNote(sop2)); +}