Clean up handling of mnemonic seed metadata.

This commit is contained in:
Kris Nuttycombe 2021-11-03 11:36:57 -06:00
parent 4080f48868
commit d84845d199
2 changed files with 15 additions and 18 deletions

View File

@ -31,13 +31,9 @@ TEST(WalletZkeysTest, StoreAndLoadSaplingZkeys) {
// No HD seed in the wallet
EXPECT_ANY_THROW(wallet.GenerateNewLegacySaplingZKey());
// Load the all-zeroes seed
SecureString 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);
// The legacy seed used to be automatically derived from randomness; since
// non-mnemonic random generation has been removed we just use the
// all-zeros mnemonic for these tests.
wallet.LoadMnemonicSeed(seed);
// Add a random seed to the wallet.
wallet.GenerateNewSeed();
auto seed = wallet.GetMnemonicSeed().value();
// Now this call succeeds
auto address = wallet.GenerateNewLegacySaplingZKey();
@ -432,10 +428,8 @@ TEST(WalletZkeysTest, WriteCryptedSaplingZkeyDirectToDb) {
ASSERT_FALSE(wallet.HaveMnemonicSeed());
// Load the all-zeroes seed as the legacy seed
SecureString 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);
// Add a mnemonic seed to the wallet.
wallet.GenerateNewSeed();
ASSERT_TRUE(wallet.HaveMnemonicSeed());
// wallet should be empty

View File

@ -121,7 +121,8 @@ SaplingPaymentAddress CWallet::GenerateNewLegacySaplingZKey() {
AssertLockHeld(cs_wallet);
if (!mnemonicHDChain.has_value()) {
mnemonicHDChain = CHDChain(GetMnemonicSeed().value().Fingerprint(), GetTime());
throw std::runtime_error(
"CWallet::GenerateNewLegacySaplingZKey(): Wallet is missing mnemonic seed metadata.");
}
CHDChain& hdChain = mnemonicHDChain.value();
@ -140,7 +141,7 @@ SaplingPaymentAddress CWallet::GenerateNewLegacySaplingZKey() {
// Update the persisted chain information
if (fFileBacked && !CWalletDB(strWalletFile).WriteMnemonicHDChain(hdChain)) {
throw std::runtime_error(
"CWallet::GenerateLegacySaplingZKey(): Writing HD chain model failed");
"CWallet::GenerateNewLegacySaplingZKey(): Writing HD chain model failed");
}
return xfvk.DefaultAddress();
@ -267,7 +268,8 @@ CPubKey CWallet::GenerateNewKey()
auto seed = seedOpt.value();
if (!mnemonicHDChain.has_value()) {
mnemonicHDChain = CHDChain(seed.Fingerprint(), GetTime());
throw std::runtime_error(
"CWallet::GenerateNewKey(): Wallet is missing mnemonic seed metadata.");
}
CHDChain& hdChain = mnemonicHDChain.value();
@ -409,6 +411,10 @@ bool CWallet::AddCryptedSaplingSpendingKey(const libzcash::SaplingExtendedFullVi
ZcashdUnifiedSpendingKey CWallet::GenerateNewUnifiedSpendingKey() {
AssertLockHeld(cs_wallet);
if (!mnemonicHDChain.has_value()) {
throw std::runtime_error(
"CWallet::GenerateNewUnifiedSpendingKey(): Wallet is missing mnemonic seed metadata.");
}
CHDChain& hdChain = mnemonicHDChain.value();
while (true) {
auto usk = GenerateUnifiedSpendingKeyForAccount(hdChain.GetAccountCounter());
@ -2359,10 +2365,7 @@ bool CWallet::VerifyMnemonicSeed(const SecureString& mnemonic) {
LOCK(cs_wallet);
auto seed = GetMnemonicSeed();
if (seed.has_value() && seed.value().GetMnemonic() == mnemonic) {
if (!mnemonicHDChain.has_value()) {
mnemonicHDChain = CHDChain(seed.value().Fingerprint(), GetTime());
}
if (seed.has_value() && mnemonicHDChain.has_value() && seed.value().GetMnemonic() == mnemonic) {
CHDChain& hdChain = mnemonicHDChain.value();
hdChain.SetMnemonicSeedBackupConfirmed();
// Update the persisted chain information