mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-12 05:34:57 +01:00
Move WatchOnly stuff from SigningProvider to CWallet
This commit is contained in:
@@ -73,8 +73,6 @@ void FillableSigningProvider::ImplicitlyLearnRelatedKeyScripts(const CPubKey& pu
|
||||
{
|
||||
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 P2WPKH and P2SH-P2WPKH
|
||||
// outputs. Technically P2WPKH outputs don't have a redeemscript to be
|
||||
// spent. However, our current IsMine logic requires the corresponding
|
||||
@@ -98,12 +96,6 @@ bool FillableSigningProvider::GetPubKey(const CKeyID &address, CPubKey &vchPubKe
|
||||
{
|
||||
CKey key;
|
||||
if (!GetKey(address, key)) {
|
||||
LOCK(cs_KeyStore);
|
||||
WatchKeyMap::const_iterator it = mapWatchKeys.find(address);
|
||||
if (it != mapWatchKeys.end()) {
|
||||
vchPubKeyOut = it->second;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
vchPubKeyOut = key.GetPubKey();
|
||||
@@ -183,59 +175,6 @@ bool FillableSigningProvider::GetCScript(const CScriptID &hash, CScript& redeemS
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool ExtractPubKey(const CScript &dest, CPubKey& pubKeyOut)
|
||||
{
|
||||
//TODO: Use Solver to extract this?
|
||||
CScript::const_iterator pc = dest.begin();
|
||||
opcodetype opcode;
|
||||
std::vector<unsigned char> vch;
|
||||
if (!dest.GetOp(pc, opcode, vch) || !CPubKey::ValidSize(vch))
|
||||
return false;
|
||||
pubKeyOut = CPubKey(vch);
|
||||
if (!pubKeyOut.IsFullyValid())
|
||||
return false;
|
||||
if (!dest.GetOp(pc, opcode, vch) || opcode != OP_CHECKSIG || dest.GetOp(pc, opcode, vch))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FillableSigningProvider::AddWatchOnly(const CScript &dest)
|
||||
{
|
||||
LOCK(cs_KeyStore);
|
||||
setWatchOnly.insert(dest);
|
||||
CPubKey pubKey;
|
||||
if (ExtractPubKey(dest, pubKey)) {
|
||||
mapWatchKeys[pubKey.GetID()] = pubKey;
|
||||
ImplicitlyLearnRelatedKeyScripts(pubKey);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FillableSigningProvider::RemoveWatchOnly(const CScript &dest)
|
||||
{
|
||||
LOCK(cs_KeyStore);
|
||||
setWatchOnly.erase(dest);
|
||||
CPubKey pubKey;
|
||||
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;
|
||||
}
|
||||
|
||||
bool FillableSigningProvider::HaveWatchOnly(const CScript &dest) const
|
||||
{
|
||||
LOCK(cs_KeyStore);
|
||||
return setWatchOnly.count(dest) > 0;
|
||||
}
|
||||
|
||||
bool FillableSigningProvider::HaveWatchOnly() const
|
||||
{
|
||||
LOCK(cs_KeyStore);
|
||||
return (!setWatchOnly.empty());
|
||||
}
|
||||
|
||||
CKeyID GetKeyForDestination(const SigningProvider& store, const CTxDestination& dest)
|
||||
{
|
||||
// Only supports destinations which map to single public keys, i.e. P2PKH,
|
||||
|
||||
@@ -66,14 +66,10 @@ protected:
|
||||
mutable CCriticalSection cs_KeyStore;
|
||||
|
||||
using KeyMap = std::map<CKeyID, CKey>;
|
||||
using WatchKeyMap = std::map<CKeyID, CPubKey>;
|
||||
using ScriptMap = std::map<CScriptID, CScript>;
|
||||
using WatchOnlySet = std::set<CScript>;
|
||||
|
||||
KeyMap mapKeys GUARDED_BY(cs_KeyStore);
|
||||
WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore);
|
||||
ScriptMap mapScripts GUARDED_BY(cs_KeyStore);
|
||||
WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore);
|
||||
|
||||
void ImplicitlyLearnRelatedKeyScripts(const CPubKey& pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
||||
|
||||
@@ -88,11 +84,6 @@ public:
|
||||
virtual bool HaveCScript(const CScriptID &hash) const override;
|
||||
virtual std::set<CScriptID> GetCScripts() const;
|
||||
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const override;
|
||||
|
||||
virtual bool AddWatchOnly(const CScript &dest);
|
||||
virtual bool RemoveWatchOnly(const CScript &dest);
|
||||
virtual bool HaveWatchOnly(const CScript &dest) const;
|
||||
virtual bool HaveWatchOnly() const;
|
||||
};
|
||||
|
||||
/** Return the CKeyID of the key involved in a script (if there is a unique one). */
|
||||
|
||||
Reference in New Issue
Block a user