Bitcoin Core  22.0.0
P2P Digital Currency
signingprovider.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2020 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_SCRIPT_SIGNINGPROVIDER_H
7 #define BITCOIN_SCRIPT_SIGNINGPROVIDER_H
8 
9 #include <key.h>
10 #include <pubkey.h>
11 #include <script/script.h>
12 #include <script/standard.h>
13 #include <sync.h>
14 
15 struct KeyOriginInfo;
16 
19 {
20 public:
21  virtual ~SigningProvider() {}
22  virtual bool GetCScript(const CScriptID &scriptid, CScript& script) const { return false; }
23  virtual bool HaveCScript(const CScriptID &scriptid) const { return false; }
24  virtual bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const { return false; }
25  virtual bool GetKey(const CKeyID &address, CKey& key) const { return false; }
26  virtual bool HaveKey(const CKeyID &address) const { return false; }
27  virtual bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const { return false; }
28  virtual bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const { return false; }
29 };
30 
32 
34 {
35 private:
36  const bool m_hide_secret;
37  const bool m_hide_origin;
39 
40 public:
41  HidingSigningProvider(const SigningProvider* provider, bool hide_secret, bool hide_origin) : m_hide_secret(hide_secret), m_hide_origin(hide_origin), m_provider(provider) {}
42  bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
43  bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
44  bool GetKey(const CKeyID& keyid, CKey& key) const override;
45  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
46  bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
47 };
48 
49 struct FlatSigningProvider final : public SigningProvider
50 {
51  std::map<CScriptID, CScript> scripts;
52  std::map<CKeyID, CPubKey> pubkeys;
53  std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> origins;
54  std::map<CKeyID, CKey> keys;
55  std::map<XOnlyPubKey, TaprootSpendData> tr_spenddata;
57  bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
58  bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
59  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
60  bool GetKey(const CKeyID& keyid, CKey& key) const override;
61  bool GetTaprootSpendData(const XOnlyPubKey& output_key, TaprootSpendData& spenddata) const override;
62 };
63 
65 
68 {
69 protected:
70  using KeyMap = std::map<CKeyID, CKey>;
71  using ScriptMap = std::map<CScriptID, CScript>;
72 
78  KeyMap mapKeys GUARDED_BY(cs_KeyStore);
79 
120  ScriptMap mapScripts GUARDED_BY(cs_KeyStore);
121 
123 
124 public:
126 
127  virtual bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
128  virtual bool AddKey(const CKey &key) { return AddKeyPubKey(key, key.GetPubKey()); }
129  virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
130  virtual bool HaveKey(const CKeyID &address) const override;
131  virtual std::set<CKeyID> GetKeys() const;
132  virtual bool GetKey(const CKeyID &address, CKey &keyOut) const override;
133  virtual bool AddCScript(const CScript& redeemScript);
134  virtual bool HaveCScript(const CScriptID &hash) const override;
135  virtual std::set<CScriptID> GetCScripts() const;
136  virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const override;
137 };
138 
140 CKeyID GetKeyForDestination(const SigningProvider& store, const CTxDestination& dest);
141 
142 #endif // BITCOIN_SCRIPT_SIGNINGPROVIDER_H
virtual bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
virtual ~SigningProvider()
std::map< CScriptID, CScript > ScriptMap
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const override
const SigningProvider & DUMMY_SIGNING_PROVIDER
const SigningProvider * m_provider
RecursiveMutex cs_KeyStore
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition: key.cpp:187
virtual bool HaveCScript(const CScriptID &scriptid) const
std::map< CKeyID, CKey > keys
virtual bool AddCScript(const CScript &redeemScript)
virtual std::set< CScriptID > GetCScripts() const
virtual std::set< CKeyID > GetKeys() const
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > origins
bool GetTaprootSpendData(const XOnlyPubKey &output_key, TaprootSpendData &spenddata) const override
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
virtual bool GetTaprootSpendData(const XOnlyPubKey &output_key, TaprootSpendData &spenddata) const
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
std::map< CScriptID, CScript > scripts
virtual bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
An encapsulated public key.
Definition: pubkey.h:32
bool GetKey(const CKeyID &keyid, CKey &key) const override
Fillable signing provider that keeps keys in an address->secret map.
std::map< CKeyID, CPubKey > pubkeys
virtual bool HaveKey(const CKeyID &address) const
void ImplicitlyLearnRelatedKeyScripts(const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:157
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
virtual bool GetKey(const CKeyID &address, CKey &key) const
virtual bool GetKey(const CKeyID &address, CKey &keyOut) const override
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
Map from output key to spend data.
bool GetKey(const CKeyID &keyid, CKey &key) const override
An interface to be implemented by keystores that support signing.
std::map< CKeyID, CKey > KeyMap
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:404
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:22
virtual bool HaveCScript(const CScriptID &hash) const override
std::map< XOnlyPubKey, TaprootSpendData > tr_spenddata
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:25
virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey)
HidingSigningProvider(const SigningProvider *provider, bool hide_secret, bool hide_origin)
An encapsulated private key.
Definition: key.h:27
CKeyID GetKeyForDestination(const SigningProvider &store, const CTxDestination &dest)
Return the CKeyID of the key involved in a script (if there is a unique one).
FlatSigningProvider Merge(const FlatSigningProvider &a, const FlatSigningProvider &b)
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
bool GetTaprootSpendData(const XOnlyPubKey &output_key, TaprootSpendData &spenddata) const override
virtual bool AddKey(const CKey &key)
KeyMap mapKeys GUARDED_BY(cs_KeyStore)
Map of key id to unencrypted private keys known by the signing provider.
virtual bool HaveKey(const CKeyID &address) const override