Fix tests for wallet operations on legacy Sapling keys.

This commit is contained in:
Kris Nuttycombe 2021-09-29 10:11:29 -06:00
parent 290b2e4e39
commit f99f2e4b3f
2 changed files with 32 additions and 15 deletions

View File

@ -29,15 +29,18 @@ TEST(WalletZkeysTest, StoreAndLoadSaplingZkeys) {
ASSERT_EQ(0, addrs.size());
// No HD seed in the wallet
EXPECT_ANY_THROW(wallet.GenerateNewLegacySaplingZKey());
auto legacyKey = wallet.GenerateNewLegacySaplingZKey();
ASSERT_FALSE(legacyKey.has_value());
// Load the all-zeroes seed
std::string mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art");
MnemonicSeed seed(English, mnemonic);
wallet.LoadMnemonicSeed(seed);
wallet.LoadLegacyHDSeed(seed);
// Now this call succeeds
auto address = wallet.GenerateNewLegacySaplingZKey().value();
legacyKey = wallet.GenerateNewLegacySaplingZKey();
ASSERT_TRUE(legacyKey.has_value());
auto address = legacyKey.value();
// wallet should have one key
wallet.GetSaplingPaymentAddresses(addrs);
@ -68,9 +71,8 @@ TEST(WalletZkeysTest, StoreAndLoadSaplingZkeys) {
// Generate a diversified address different to the default
// If we can't get an early diversified address, we are very unlucky
blob88 diversifier;
diversifier.begin()[0] = 10;
auto dpa = sk.ToXFVK().Address(diversifier).value();
blob88 diversifier(2);
auto dpa = sk.ToXFVK().FindAddress(diversifier).first;
// verify wallet only has the default address
EXPECT_TRUE(wallet.HaveSaplingIncomingViewingKey(sk.ToXFVK().DefaultAddress()));
@ -98,7 +100,7 @@ TEST(WalletZkeysTest, StoreAndLoadSaplingZkeys) {
ASSERT_EQ(wallet.mapSaplingZKeyMetadata[ivk2].nCreateTime, now);
// Load a diversified address for the third key into the wallet
auto dpa2 = sk2.ToXFVK().Address(diversifier).value();
auto dpa2 = sk2.ToXFVK().FindAddress(diversifier).first;
EXPECT_TRUE(wallet.HaveSaplingIncomingViewingKey(sk2.ToXFVK().DefaultAddress()));
EXPECT_FALSE(wallet.HaveSaplingIncomingViewingKey(dpa2));
EXPECT_TRUE(wallet.LoadSaplingPaymentAddress(dpa2, ivk2));
@ -411,7 +413,7 @@ TEST(WalletZkeysTest, WriteCryptedzkeyDirectToDb) {
/**
* This test covers methods on CWalletDB to load/save crypted sapling z keys.
*/
TEST(wallet_zkeys_tests, WriteCryptedSaplingZkeyDirectToDb) {
TEST(WalletZkeysTest, WriteCryptedSaplingZkeyDirectToDb) {
SelectParams(CBaseChainParams::TESTNET);
// Get temporary and unique path for file.
@ -428,8 +430,12 @@ TEST(wallet_zkeys_tests, WriteCryptedSaplingZkeyDirectToDb) {
// No default CPubKey set
ASSERT_TRUE(fFirstRun);
ASSERT_FALSE(wallet.HaveMnemonicSeed());
wallet.GenerateNewSeed();
ASSERT_FALSE(wallet.HaveLegacyHDSeed());
// Load the all-zeroes seed as the legacy seed
std::string mnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art");
MnemonicSeed seed(English, mnemonic);
wallet.LoadLegacyHDSeed(seed);
// wallet should be empty
std::set<libzcash::SaplingPaymentAddress> addrs;
@ -447,9 +453,8 @@ TEST(wallet_zkeys_tests, WriteCryptedSaplingZkeyDirectToDb) {
// If we can't get an early diversified address, we are very unlucky
libzcash::SaplingExtendedSpendingKey extsk;
EXPECT_TRUE(wallet.GetSaplingExtendedSpendingKey(address, extsk));
blob88 diversifier;
diversifier.begin()[0] = 10;
auto dpa = extsk.ToXFVK().Address(diversifier).value();
blob88 diversifier(2);
auto dpa = extsk.ToXFVK().FindAddress(diversifier).first;
// Add diversified address to the wallet
auto ivk = extsk.expsk.full_viewing_key().in_viewing_key();
@ -462,11 +467,13 @@ TEST(wallet_zkeys_tests, WriteCryptedSaplingZkeyDirectToDb) {
ASSERT_TRUE(wallet.EncryptWallet(strWalletPass));
// adding a new key will fail as the wallet is locked
EXPECT_ANY_THROW(wallet.GenerateNewLegacySaplingZKey());
EXPECT_FALSE(wallet.GenerateNewLegacySaplingZKey().has_value());
// unlock wallet and then add
wallet.Unlock(strWalletPass);
auto address2 = wallet.GenerateNewLegacySaplingZKey().value();
auto address2Opt = wallet.GenerateNewLegacySaplingZKey();
EXPECT_TRUE(address2Opt.has_value());
auto address2 = address2Opt.value();
// flush the wallet to prevent race conditions
wallet.Flush();

View File

@ -225,6 +225,16 @@ struct SaplingExtendedFullViewingKey {
// given this xfvk.
std::optional<libzcash::SaplingPaymentAddress> Address(diversifier_index_t j) const;
std::pair<SaplingPaymentAddress, diversifier_index_t> FindAddress(diversifier_index_t j) const {
auto addr = Address(j);
while (!addr.has_value()) {
if (!j.increment())
throw std::runtime_error(std::string(__func__) + ": diversifier index overflow.");;
addr = Address(j);
}
return std::make_pair(addr.value(), j);
}
libzcash::SaplingPaymentAddress DefaultAddress() const;
friend inline bool operator==(const SaplingExtendedFullViewingKey& a, const SaplingExtendedFullViewingKey& b) {