Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10615249
D3132.id8931.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Subscribers
None
D3132.id8931.diff
View Options
diff --git a/src/keystore.h b/src/keystore.h
--- a/src/keystore.h
+++ b/src/keystore.h
@@ -62,6 +62,8 @@
ScriptMap mapScripts;
WatchOnlySet setWatchOnly;
+ void ImplicitlyLearnRelatedKeyScripts(const CPubKey &pubkey);
+
public:
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override;
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override;
diff --git a/src/keystore.cpp b/src/keystore.cpp
--- a/src/keystore.cpp
+++ b/src/keystore.cpp
@@ -13,6 +13,22 @@
return AddKeyPubKey(key, key.GetPubKey());
}
+void CBasicKeyStore::ImplicitlyLearnRelatedKeyScripts(const CPubKey &pubkey) {
+ AssertLockHeld(cs_KeyStore);
+ CKeyID key_id = pubkey.GetID();
+ // We must actually know about this key already.
+ assert(HaveKey(key_id) || mapWatchKeys.count(key_id));
+ // This adds the redeemscripts necessary to detect alternative outputs using
+ // the same keys. Also note that having superfluous scripts in the keystore
+ // never hurts. They're only used to guide recursion in signing and IsMine
+ // logic - if a script is present but we can't do anything with it, it has
+ // no effect. "Implicitly" refers to fact that scripts are derived
+ // automatically from existing keys, and are present in memory, even without
+ // being explicitly loaded (e.g. from a file).
+
+ // Riht now there are none so do nothing.
+}
+
bool CBasicKeyStore::GetPubKey(const CKeyID &address,
CPubKey &vchPubKeyOut) const {
CKey key;
@@ -32,6 +48,7 @@
bool CBasicKeyStore::AddKeyPubKey(const CKey &key, const CPubKey &pubkey) {
LOCK(cs_KeyStore);
mapKeys[pubkey.GetID()] = key;
+ ImplicitlyLearnRelatedKeyScripts(pubkey);
return true;
}
@@ -121,6 +138,7 @@
CPubKey pubKey;
if (ExtractPubKey(dest, pubKey)) {
mapWatchKeys[pubKey.GetID()] = pubKey;
+ ImplicitlyLearnRelatedKeyScripts(pubKey);
}
return true;
}
@@ -132,6 +150,8 @@
if (ExtractPubKey(dest, pubKey)) {
mapWatchKeys.erase(pubKey.GetID());
}
+ // Related CScripts are not removed; having superfluous scripts around is
+ // harmless (see comment in ImplicitlyLearnRelatedKeyScripts).
return true;
}
diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp
--- a/src/wallet/crypter.cpp
+++ b/src/wallet/crypter.cpp
@@ -270,6 +270,7 @@
}
mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret);
+ ImplicitlyLearnRelatedKeyScripts(vchPubKey);
return true;
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 22, 10:02 (21 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4559220
Default Alt Text
D3132.id8931.diff (2 KB)
Attached To
D3132: Implicitly know about P2WPKH redeemscripts
Event Timeline
Log In to Comment