Skip to content

Commit 6738813

Browse files
committed
Merge #12924: Fix hdmaster-key / seed-key confusion (scripted diff)
6249021 [docs] Add release notes for HD master key -> HD seed rename (John Newbery) 79053a5 [rpc] [wallet] Add 'hdmasterkeyid' alias return values. (John Newbery) c75c351 [refactor] manually change remaining instances of master key to seed. (John Newbery) 131d445 scripted-diff: Rename master key to seed (John Newbery) Pull request description: Addresses #12084 and #8684 This renames a couple of functions and members (no functional changes, expect log prints): - Rename CKey::SetMaster to CKey::SetSeed - Rename CHDChain::masterKeyId to CHDChain::seedID - Rename CHDChain::hdMasterKeyID to CHDChain::hdSeedID - Rename CWallet::GenerateNewHDMasterKey to CWallet::GenerateNewHDSeed - Rename CWallet::SetHDMasterKey to CWallet::SetHDSeed As well it introduces a tiny API change: - RPC API change: Rename "hdmasterkeyid" to "hdseedid", rename "hdmaster" in wallet-dump output to "hdseed" Fixes also a bug: - Bugfix: use "s" instead of the incorrect "m" for the seed-key hd-keypath key metadata Tree-SHA512: c913252636f213135a3b64df5de5d21844fb9c2d646567c1aad0ec65745188587de26119de99492c67e559bd49fdd9606b54276f00dddb84301785beba58f281
2 parents d792e47 + 6249021 commit 6738813

File tree

12 files changed

+98
-76
lines changed

12 files changed

+98
-76
lines changed

doc/release-notes-pr12924.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
RPC changes
2+
------------
3+
4+
### Low-level changes
5+
6+
- The `getwalletinfo` RPC method now returns an `hdseedid` value, which is always the same as the incorrectly-named `hdmasterkeyid` value. `hdmasterkeyid` will be removed in V0.18.
7+
- The `getaddressinfo` RPC method now returns an `hdseedid` value, which is always the same as the incorrectly-named `hdmasterkeyid` value. `hdmasterkeyid` will be removed in V0.18.
8+
9+
Other API changes
10+
-----------------
11+
12+
- The `inactivehdmaster` property in the `dumpwallet` output has been corrected to `inactivehdseed`

src/key.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
273273
return key.Derive(out.key, out.chaincode, _nChild, chaincode);
274274
}
275275

276-
void CExtKey::SetMaster(const unsigned char *seed, unsigned int nSeedLen) {
276+
void CExtKey::SetSeed(const unsigned char *seed, unsigned int nSeedLen) {
277277
static const unsigned char hashkey[] = {'B','i','t','c','o','i','n',' ','s','e','e','d'};
278278
std::vector<unsigned char, secure_allocator<unsigned char>> vout(64);
279279
CHMAC_SHA512(hashkey, sizeof(hashkey)).Write(seed, nSeedLen).Finalize(vout.data());

src/key.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ struct CExtKey {
158158
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE]);
159159
bool Derive(CExtKey& out, unsigned int nChild) const;
160160
CExtPubKey Neuter() const;
161-
void SetMaster(const unsigned char* seed, unsigned int nSeedLen);
161+
void SetSeed(const unsigned char* seed, unsigned int nSeedLen);
162162
template <typename Stream>
163163
void Serialize(Stream& s) const
164164
{

src/test/bip32_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static void RunTest(const TestVector &test) {
9191
std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
9292
CExtKey key;
9393
CExtPubKey pubkey;
94-
key.SetMaster(seed.data(), seed.size());
94+
key.SetSeed(seed.data(), seed.size());
9595
pubkey = key.Neuter();
9696
for (const TestDerivation &derive : test.vDerive) {
9797
unsigned char data[74];

src/wallet/rpcdump.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -752,13 +752,13 @@ UniValue dumpwallet(const JSONRPCRequest& request)
752752
file << "\n";
753753

754754
// add the base58check encoded extended master if the wallet uses HD
755-
CKeyID masterKeyID = pwallet->GetHDChain().masterKeyID;
756-
if (!masterKeyID.IsNull())
755+
CKeyID seed_id = pwallet->GetHDChain().seed_id;
756+
if (!seed_id.IsNull())
757757
{
758-
CKey key;
759-
if (pwallet->GetKey(masterKeyID, key)) {
758+
CKey seed;
759+
if (pwallet->GetKey(seed_id, seed)) {
760760
CExtKey masterKey;
761-
masterKey.SetMaster(key.begin(), key.size());
761+
masterKey.SetSeed(seed.begin(), seed.size());
762762

763763
file << "# extended private masterkey: " << EncodeExtKey(masterKey) << "\n\n";
764764
}
@@ -773,12 +773,12 @@ UniValue dumpwallet(const JSONRPCRequest& request)
773773
file << strprintf("%s %s ", EncodeSecret(key), strTime);
774774
if (GetWalletAddressesForKey(pwallet, keyid, strAddr, strLabel)) {
775775
file << strprintf("label=%s", strLabel);
776-
} else if (keyid == masterKeyID) {
777-
file << "hdmaster=1";
776+
} else if (keyid == seed_id) {
777+
file << "hdseed=1";
778778
} else if (mapKeyPool.count(keyid)) {
779779
file << "reserve=1";
780-
} else if (pwallet->mapKeyMetadata[keyid].hdKeypath == "m") {
781-
file << "inactivehdmaster=1";
780+
} else if (pwallet->mapKeyMetadata[keyid].hdKeypath == "s") {
781+
file << "inactivehdseed=1";
782782
} else {
783783
file << "change=1";
784784
}

src/wallet/rpcwallet.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,7 +2925,8 @@ static UniValue getwalletinfo(const JSONRPCRequest& request)
29252925
" \"keypoolsize_hd_internal\": xxxx, (numeric) how many new keys are pre-generated for internal use (used for change outputs, only appears if the wallet is using this feature, otherwise external keys are used)\n"
29262926
" \"unlocked_until\": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked\n"
29272927
" \"paytxfee\": x.xxxx, (numeric) the transaction fee configuration, set in " + CURRENCY_UNIT + "/kB\n"
2928-
" \"hdmasterkeyid\": \"<hash160>\" (string, optional) the Hash160 of the HD master pubkey (only present when HD is enabled)\n"
2928+
" \"hdseedid\": \"<hash160>\" (string, optional) the Hash160 of the HD seed (only present when HD is enabled)\n"
2929+
" \"hdmasterkeyid\": \"<hash160>\" (string, optional) alias for hdseedid retained for backwards-compatibility. Will be removed in V0.18.\n"
29292930
"}\n"
29302931
"\nExamples:\n"
29312932
+ HelpExampleCli("getwalletinfo", "")
@@ -2949,16 +2950,18 @@ static UniValue getwalletinfo(const JSONRPCRequest& request)
29492950
obj.pushKV("txcount", (int)pwallet->mapWallet.size());
29502951
obj.pushKV("keypoololdest", pwallet->GetOldestKeyPoolTime());
29512952
obj.pushKV("keypoolsize", (int64_t)kpExternalSize);
2952-
CKeyID masterKeyID = pwallet->GetHDChain().masterKeyID;
2953-
if (!masterKeyID.IsNull() && pwallet->CanSupportFeature(FEATURE_HD_SPLIT)) {
2953+
CKeyID seed_id = pwallet->GetHDChain().seed_id;
2954+
if (!seed_id.IsNull() && pwallet->CanSupportFeature(FEATURE_HD_SPLIT)) {
29542955
obj.pushKV("keypoolsize_hd_internal", (int64_t)(pwallet->GetKeyPoolSize() - kpExternalSize));
29552956
}
29562957
if (pwallet->IsCrypted()) {
29572958
obj.pushKV("unlocked_until", pwallet->nRelockTime);
29582959
}
29592960
obj.pushKV("paytxfee", ValueFromAmount(pwallet->m_pay_tx_fee.GetFeePerK()));
2960-
if (!masterKeyID.IsNull())
2961-
obj.pushKV("hdmasterkeyid", masterKeyID.GetHex());
2961+
if (!seed_id.IsNull()) {
2962+
obj.pushKV("hdseedid", seed_id.GetHex());
2963+
obj.pushKV("hdmasterkeyid", seed_id.GetHex());
2964+
}
29622965
return obj;
29632966
}
29642967

@@ -3948,13 +3951,14 @@ UniValue getaddressinfo(const JSONRPCRequest& request)
39483951
" ]\n"
39493952
" \"sigsrequired\" : xxxxx (numeric, optional) Number of signatures required to spend multisig output (only if \"script\" is \"multisig\")\n"
39503953
" \"pubkey\" : \"publickeyhex\", (string, optional) The hex value of the raw public key, for single-key addresses (possibly embedded in P2SH or P2WSH)\n"
3951-
" \"embedded\" : {...}, (object, optional) Information about the address embedded in P2SH or P2WSH, if relevant and known. It includes all getaddressinfo output fields for the embedded address, excluding metadata (\"timestamp\", \"hdkeypath\", \"hdmasterkeyid\") and relation to the wallet (\"ismine\", \"iswatchonly\", \"account\").\n"
3954+
" \"embedded\" : {...}, (object, optional) Information about the address embedded in P2SH or P2WSH, if relevant and known. It includes all getaddressinfo output fields for the embedded address, excluding metadata (\"timestamp\", \"hdkeypath\", \"hdseedid\") and relation to the wallet (\"ismine\", \"iswatchonly\", \"account\").\n"
39523955
" \"iscompressed\" : true|false, (boolean) If the address is compressed\n"
39533956
" \"label\" : \"label\" (string) The label associated with the address, \"\" is the default account\n"
39543957
" \"account\" : \"account\" (string) DEPRECATED. This field will be removed in V0.18. To see this deprecated field, start bitcoind with -deprecatedrpc=accounts. The account associated with the address, \"\" is the default account\n"
39553958
" \"timestamp\" : timestamp, (number, optional) The creation time of the key if available in seconds since epoch (Jan 1 1970 GMT)\n"
39563959
" \"hdkeypath\" : \"keypath\" (string, optional) The HD keypath if the key is HD and available\n"
3957-
" \"hdmasterkeyid\" : \"<hash160>\" (string, optional) The Hash160 of the HD master pubkey\n"
3960+
" \"hdseedid\" : \"<hash160>\" (string, optional) The Hash160 of the HD seed\n"
3961+
" \"hdmasterkeyid\" : \"<hash160>\" (string, optional) alias for hdseedid maintained for backwards compatibility. Will be removed in V0.18.\n"
39583962
" \"labels\" (object) Array of labels associated with the address.\n"
39593963
" [\n"
39603964
" { (json object of label data)\n"
@@ -4014,7 +4018,8 @@ UniValue getaddressinfo(const JSONRPCRequest& request)
40144018
ret.pushKV("timestamp", meta->nCreateTime);
40154019
if (!meta->hdKeypath.empty()) {
40164020
ret.pushKV("hdkeypath", meta->hdKeypath);
4017-
ret.pushKV("hdmasterkeyid", meta->hdMasterKeyID.GetHex());
4021+
ret.pushKV("hdseedid", meta->hd_seed_id.GetHex());
4022+
ret.pushKV("hdmasterkeyid", meta->hd_seed_id.GetHex());
40184023
}
40194024
}
40204025

@@ -4147,7 +4152,7 @@ UniValue sethdseed(const JSONRPCRequest& request)
41474152
" If false, addresses (including change addresses if the wallet already had HD Chain Split enabled) from the existing\n"
41484153
" keypool will be used until it has been depleted.\n"
41494154
"2. \"seed\" (string, optional) The WIF private key to use as the new HD seed; if not provided a random seed will be used.\n"
4150-
" The seed value can be retrieved using the dumpwallet command. It is the private key marked hdmaster=1\n"
4155+
" The seed value can be retrieved using the dumpwallet command. It is the private key marked hdseed=1\n"
41514156
"\nExamples:\n"
41524157
+ HelpExampleCli("sethdseed", "")
41534158
+ HelpExampleCli("sethdseed", "false")
@@ -4176,7 +4181,7 @@ UniValue sethdseed(const JSONRPCRequest& request)
41764181

41774182
CPubKey master_pub_key;
41784183
if (request.params[1].isNull()) {
4179-
master_pub_key = pwallet->GenerateNewHDMasterKey();
4184+
master_pub_key = pwallet->GenerateNewSeed();
41804185
} else {
41814186
CKey key = DecodeSecret(request.params[1].get_str());
41824187
if (!key.IsValid()) {
@@ -4187,10 +4192,10 @@ UniValue sethdseed(const JSONRPCRequest& request)
41874192
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Already have this key (either as an HD seed or as a loose private key)");
41884193
}
41894194

4190-
master_pub_key = pwallet->DeriveNewMasterHDKey(key);
4195+
master_pub_key = pwallet->DeriveNewSeed(key);
41914196
}
41924197

4193-
pwallet->SetHDMasterKey(master_pub_key);
4198+
pwallet->SetHDSeed(master_pub_key);
41944199
if (flush_key_pool) pwallet->NewKeyPool();
41954200

41964201
return NullUniValue;

src/wallet/wallet.cpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -191,17 +191,17 @@ CPubKey CWallet::GenerateNewKey(WalletBatch &batch, bool internal)
191191
void CWallet::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata& metadata, CKey& secret, bool internal)
192192
{
193193
// for now we use a fixed keypath scheme of m/0'/0'/k
194-
CKey key; //master key seed (256bit)
194+
CKey seed; //seed (256bit)
195195
CExtKey masterKey; //hd master key
196196
CExtKey accountKey; //key at m/0'
197197
CExtKey chainChildKey; //key at m/0'/0' (external) or m/0'/1' (internal)
198198
CExtKey childKey; //key at m/0'/0'/<n>'
199199

200-
// try to get the master key
201-
if (!GetKey(hdChain.masterKeyID, key))
202-
throw std::runtime_error(std::string(__func__) + ": Master key not found");
200+
// try to get the seed
201+
if (!GetKey(hdChain.seed_id, seed))
202+
throw std::runtime_error(std::string(__func__) + ": seed not found");
203203

204-
masterKey.SetMaster(key.begin(), key.size());
204+
masterKey.SetSeed(seed.begin(), seed.size());
205205

206206
// derive m/0'
207207
// use hardened derivation (child keys >= 0x80000000 are hardened after bip32)
@@ -228,7 +228,7 @@ void CWallet::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata& metadata, CKey
228228
}
229229
} while (HaveKey(childKey.key.GetPubKey().GetID()));
230230
secret = childKey.key;
231-
metadata.hdMasterKeyID = hdChain.masterKeyID;
231+
metadata.hd_seed_id = hdChain.seed_id;
232232
// update the chain model in the database
233233
if (!batch.WriteHDChain(hdChain))
234234
throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed");
@@ -689,9 +689,9 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
689689
Lock();
690690
Unlock(strWalletPassphrase);
691691

692-
// if we are using HD, replace the HD master key (seed) with a new one
692+
// if we are using HD, replace the HD seed with a new one
693693
if (IsHDEnabled()) {
694-
if (!SetHDMasterKey(GenerateNewHDMasterKey())) {
694+
if (!SetHDSeed(GenerateNewSeed())) {
695695
return false;
696696
}
697697
}
@@ -1450,49 +1450,49 @@ CAmount CWallet::GetChange(const CTransaction& tx) const
14501450
return nChange;
14511451
}
14521452

1453-
CPubKey CWallet::GenerateNewHDMasterKey()
1453+
CPubKey CWallet::GenerateNewSeed()
14541454
{
14551455
CKey key;
14561456
key.MakeNewKey(true);
1457-
return DeriveNewMasterHDKey(key);
1457+
return DeriveNewSeed(key);
14581458
}
14591459

1460-
CPubKey CWallet::DeriveNewMasterHDKey(const CKey& key)
1460+
CPubKey CWallet::DeriveNewSeed(const CKey& key)
14611461
{
14621462
int64_t nCreationTime = GetTime();
14631463
CKeyMetadata metadata(nCreationTime);
14641464

1465-
// calculate the pubkey
1466-
CPubKey pubkey = key.GetPubKey();
1467-
assert(key.VerifyPubKey(pubkey));
1465+
// calculate the seed
1466+
CPubKey seed = key.GetPubKey();
1467+
assert(key.VerifyPubKey(seed));
14681468

1469-
// set the hd keypath to "m" -> Master, refers the masterkeyid to itself
1470-
metadata.hdKeypath = "m";
1471-
metadata.hdMasterKeyID = pubkey.GetID();
1469+
// set the hd keypath to "s" -> Seed, refers the seed to itself
1470+
metadata.hdKeypath = "s";
1471+
metadata.hd_seed_id = seed.GetID();
14721472

14731473
{
14741474
LOCK(cs_wallet);
14751475

14761476
// mem store the metadata
1477-
mapKeyMetadata[pubkey.GetID()] = metadata;
1477+
mapKeyMetadata[seed.GetID()] = metadata;
14781478

14791479
// write the key&metadata to the database
1480-
if (!AddKeyPubKey(key, pubkey))
1480+
if (!AddKeyPubKey(key, seed))
14811481
throw std::runtime_error(std::string(__func__) + ": AddKeyPubKey failed");
14821482
}
14831483

1484-
return pubkey;
1484+
return seed;
14851485
}
14861486

1487-
bool CWallet::SetHDMasterKey(const CPubKey& pubkey)
1487+
bool CWallet::SetHDSeed(const CPubKey& seed)
14881488
{
14891489
LOCK(cs_wallet);
14901490
// store the keyid (hash160) together with
14911491
// the child index counter in the database
14921492
// as a hdchain object
14931493
CHDChain newHdChain;
14941494
newHdChain.nVersion = CanSupportFeature(FEATURE_HD_SPLIT) ? CHDChain::VERSION_HD_CHAIN_SPLIT : CHDChain::VERSION_HD_BASE;
1495-
newHdChain.masterKeyID = pubkey.GetID();
1495+
newHdChain.seed_id = seed.GetID();
14961496
SetHDChain(newHdChain, false);
14971497

14981498
return true;
@@ -1510,7 +1510,7 @@ bool CWallet::SetHDChain(const CHDChain& chain, bool memonly)
15101510

15111511
bool CWallet::IsHDEnabled() const
15121512
{
1513-
return !hdChain.masterKeyID.IsNull();
1513+
return !hdChain.seed_id.IsNull();
15141514
}
15151515

15161516
int64_t CWalletTx::GetTxTime() const
@@ -4130,8 +4130,8 @@ CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path&
41304130
walletInstance->SetMinVersion(FEATURE_HD);
41314131

41324132
// generate a new master key
4133-
CPubKey masterPubKey = walletInstance->GenerateNewHDMasterKey();
4134-
if (!walletInstance->SetHDMasterKey(masterPubKey)) {
4133+
CPubKey masterPubKey = walletInstance->GenerateNewSeed();
4134+
if (!walletInstance->SetHDSeed(masterPubKey)) {
41354135
throw std::runtime_error(std::string(__func__) + ": Storing master key failed");
41364136
}
41374137
hd_upgrade = true;
@@ -4164,10 +4164,10 @@ CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path&
41644164
}
41654165
walletInstance->SetMinVersion(FEATURE_LATEST);
41664166

4167-
// generate a new master key
4168-
CPubKey masterPubKey = walletInstance->GenerateNewHDMasterKey();
4169-
if (!walletInstance->SetHDMasterKey(masterPubKey))
4170-
throw std::runtime_error(std::string(__func__) + ": Storing master key failed");
4167+
// generate a new seed
4168+
CPubKey seed = walletInstance->GenerateNewSeed();
4169+
if (!walletInstance->SetHDSeed(seed))
4170+
throw std::runtime_error(std::string(__func__) + ": Storing HD seed failed");
41714171

41724172
// Top up the keypool
41734173
if (!walletInstance->TopUpKeyPool()) {

src/wallet/wallet.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,17 +1139,17 @@ class CWallet final : public CCryptoKeyStore, public CValidationInterface
11391139
/* Returns true if HD is enabled */
11401140
bool IsHDEnabled() const;
11411141

1142-
/* Generates a new HD master key (will not be activated) */
1143-
CPubKey GenerateNewHDMasterKey();
1142+
/* Generates a new HD seed (will not be activated) */
1143+
CPubKey GenerateNewSeed();
11441144

11451145
/* Derives a new HD master key (will not be activated) */
1146-
CPubKey DeriveNewMasterHDKey(const CKey& key);
1146+
CPubKey DeriveNewSeed(const CKey& key);
11471147

1148-
/* Set the current HD master key (will reset the chain child index counters)
1149-
Sets the master key's version based on the current wallet version (so the
1148+
/* Set the current HD seed (will reset the chain child index counters)
1149+
Sets the seed's version based on the current wallet version (so the
11501150
caller must ensure the current wallet version is correct before calling
11511151
this function). */
1152-
bool SetHDMasterKey(const CPubKey& key);
1152+
bool SetHDSeed(const CPubKey& key);
11531153

11541154
/**
11551155
* Blocks until the wallet state is up-to-date to /at least/ the current

src/wallet/walletdb.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class CHDChain
6262
public:
6363
uint32_t nExternalChainCounter;
6464
uint32_t nInternalChainCounter;
65-
CKeyID masterKeyID; //!< master key hash160
65+
CKeyID seed_id; //!< seed hash160
6666

6767
static const int VERSION_HD_BASE = 1;
6868
static const int VERSION_HD_CHAIN_SPLIT = 2;
@@ -76,7 +76,7 @@ class CHDChain
7676
{
7777
READWRITE(this->nVersion);
7878
READWRITE(nExternalChainCounter);
79-
READWRITE(masterKeyID);
79+
READWRITE(seed_id);
8080
if (this->nVersion >= VERSION_HD_CHAIN_SPLIT)
8181
READWRITE(nInternalChainCounter);
8282
}
@@ -86,7 +86,7 @@ class CHDChain
8686
nVersion = CHDChain::CURRENT_VERSION;
8787
nExternalChainCounter = 0;
8888
nInternalChainCounter = 0;
89-
masterKeyID.SetNull();
89+
seed_id.SetNull();
9090
}
9191
};
9292

@@ -99,7 +99,7 @@ class CKeyMetadata
9999
int nVersion;
100100
int64_t nCreateTime; // 0 means unknown
101101
std::string hdKeypath; //optional HD/bip32 keypath
102-
CKeyID hdMasterKeyID; //id of the HD masterkey used to derive this key
102+
CKeyID hd_seed_id; //id of the HD seed used to derive this key
103103

104104
CKeyMetadata()
105105
{
@@ -120,7 +120,7 @@ class CKeyMetadata
120120
if (this->nVersion >= VERSION_WITH_HDDATA)
121121
{
122122
READWRITE(hdKeypath);
123-
READWRITE(hdMasterKeyID);
123+
READWRITE(hd_seed_id);
124124
}
125125
}
126126

@@ -129,7 +129,7 @@ class CKeyMetadata
129129
nVersion = CKeyMetadata::CURRENT_VERSION;
130130
nCreateTime = 0;
131131
hdKeypath.clear();
132-
hdMasterKeyID.SetNull();
132+
hd_seed_id.SetNull();
133133
}
134134
};
135135

0 commit comments

Comments
 (0)