PIVX Core  5.6.99
P2P Digital Currency
keystore.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Copyright (c) 2017-2021 The PIVX Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef PIVX_KEYSTORE_H
8 #define PIVX_KEYSTORE_H
9 
10 #include "key.h"
11 #include "pubkey.h"
12 #include "sapling/address.h"
13 #include "sapling/zip32.h"
14 #include "sync.h"
15 
16 #include <boost/signals2/signal.hpp>
17 
18 class CScript;
19 class CScriptID;
20 
22 class CKeyStore
23 {
24 public:
25  // todo: Make it protected again once we are more advanced in the wallet/spkm decoupling.
27 
28  virtual ~CKeyStore() {}
29 
31  virtual bool AddKeyPubKey(const CKey& key, const CPubKey& pubkey) = 0;
32  virtual bool AddKey(const CKey& key);
33 
35  virtual bool HaveKey(const CKeyID& address) const = 0;
36  virtual bool GetKey(const CKeyID& address, CKey& keyOut) const = 0;
37  virtual std::set<CKeyID> GetKeys() const = 0;
38  virtual bool GetPubKey(const CKeyID& address, CPubKey& vchPubKeyOut) const = 0;
39 
41  virtual bool AddCScript(const CScript& redeemScript) = 0;
42  virtual bool HaveCScript(const CScriptID& hash) const = 0;
43  virtual bool GetCScript(const CScriptID& hash, CScript& redeemScriptOut) const = 0;
44 
46  virtual bool AddWatchOnly(const CScript& dest) = 0;
47  virtual bool RemoveWatchOnly(const CScript& dest) = 0;
48  virtual bool HaveWatchOnly(const CScript& dest) const = 0;
49  virtual bool HaveWatchOnly() const = 0;
50 
52  // Add a Sapling spending key to the store.
54 
55  // Check whether a Sapling spending key corresponding to a given Sapling viewing key is present in the store.
56  virtual bool HaveSaplingSpendingKey(
57  const libzcash::SaplingExtendedFullViewingKey &extfvk) const = 0;
58  virtual bool GetSaplingSpendingKey(
60  libzcash::SaplingExtendedSpendingKey& skOut) const = 0;
61 
67  libzcash::SaplingExtendedFullViewingKey& extfvkOut) const = 0;
68  virtual void GetSaplingPaymentAddresses(std::set<libzcash::SaplingPaymentAddress> &setAddress) const = 0;
69 
73  const libzcash::SaplingPaymentAddress &addr) = 0;
77  libzcash::SaplingIncomingViewingKey& ivkOut) const = 0;
78 };
79 
80 typedef std::map<CKeyID, CKey> KeyMap;
81 typedef std::map<CKeyID, CPubKey> WatchKeyMap;
82 typedef std::map<CScriptID, CScript> ScriptMap;
83 typedef std::set<CScript> WatchOnlySet;
84 
85 // Full viewing key has equivalent functionality to a transparent address
86 // When encrypting wallet, encrypt SaplingSpendingKeyMap, while leaving SaplingFullViewingKeyMap unencrypted
87 typedef std::map<
90 typedef std::map<
93 // Only maps from default addresses to ivk, may need to be reworked when adding diversified addresses.
94 typedef std::map<libzcash::SaplingPaymentAddress, libzcash::SaplingIncomingViewingKey> SaplingIncomingViewingKeyMap;
95 
96 
98 class CBasicKeyStore : public CKeyStore
99 {
100 protected:
105 
106 public:
107 
108  // todo future: Move every Sapling map to the new sspkm box.
112 
113  bool AddKeyPubKey(const CKey& key, const CPubKey& pubkey);
114  bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
115  bool HaveKey(const CKeyID& address) const;
116  bool HaveKey(const CExchangeKeyID& address) const;
117  std::set<CKeyID> GetKeys() const;
118  bool GetKey(const CKeyID& address, CKey& keyOut) const;
119 
120  virtual bool AddCScript(const CScript& redeemScript);
121  virtual bool HaveCScript(const CScriptID& hash) const;
122  virtual bool GetCScript(const CScriptID& hash, CScript& redeemScriptOut) const;
123 
124  virtual bool AddWatchOnly(const CScript& dest);
125  virtual bool RemoveWatchOnly(const CScript& dest);
126  virtual bool HaveWatchOnly(const CScript& dest) const;
127  virtual bool HaveWatchOnly() const;
128 
133 
135  virtual bool HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const;
136  virtual bool GetSaplingFullViewingKey(
138  libzcash::SaplingExtendedFullViewingKey& extfvkOut) const;
139  virtual bool AddSaplingIncomingViewingKey(
141  const libzcash::SaplingPaymentAddress &addr);
142  virtual bool HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const;
143  virtual bool GetSaplingIncomingViewingKey(
146 
149  libzcash::SaplingExtendedSpendingKey &extskOut) const;
150 
151  void GetSaplingPaymentAddresses(std::set<libzcash::SaplingPaymentAddress> &setAddress) const;
152 };
153 
154 typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
155 typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
157 typedef std::map<libzcash::SaplingExtendedFullViewingKey, std::vector<unsigned char> > CryptedSaplingSpendingKeyMap;
158 
159 #endif // PIVX_KEYSTORE_H
Basic key store, that keeps keys in an address->secret map.
Definition: keystore.h:99
virtual bool HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const
Definition: keystore.cpp:199
virtual bool RemoveWatchOnly(const CScript &dest)
Definition: keystore.cpp:94
virtual bool AddWatchOnly(const CScript &dest)
Support for Watch-only addresses.
Definition: keystore.cpp:84
SaplingSpendingKeyMap mapSaplingSpendingKeys
Definition: keystore.h:109
WatchKeyMap mapWatchKeys
Definition: keystore.h:102
virtual bool GetSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk, libzcash::SaplingExtendedFullViewingKey &extfvkOut) const
Definition: keystore.cpp:215
virtual bool HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const
Definition: keystore.cpp:194
void GetSaplingPaymentAddresses(std::set< libzcash::SaplingPaymentAddress > &setAddress) const
Definition: keystore.cpp:252
virtual bool HaveCScript(const CScriptID &hash) const
Definition: keystore.cpp:51
virtual bool AddCScript(const CScript &redeemScript)
Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki.
Definition: keystore.cpp:41
bool GetKey(const CKeyID &address, CKey &keyOut) const
Definition: keystore.cpp:136
virtual bool AddSaplingIncomingViewingKey(const libzcash::SaplingIncomingViewingKey &ivk, const libzcash::SaplingPaymentAddress &addr)
Sapling incoming viewing keys.
Definition: keystore.cpp:177
bool HaveSaplingSpendingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk) const
Definition: keystore.cpp:189
SaplingIncomingViewingKeyMap mapSaplingIncomingViewingKeys
Definition: keystore.h:111
bool GetSaplingSpendingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk, libzcash::SaplingExtendedSpendingKey &skOut) const
Definition: keystore.cpp:204
ScriptMap mapScripts
Definition: keystore.h:103
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const
Definition: keystore.cpp:57
virtual bool HaveWatchOnly() const
Definition: keystore.cpp:110
virtual bool GetSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr, libzcash::SaplingIncomingViewingKey &ivkOut) const
Definition: keystore.cpp:228
virtual bool AddSaplingFullViewingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk)
Support for Sapling full viewing keys.
Definition: keystore.cpp:164
SaplingFullViewingKeyMap mapSaplingFullViewingKeys
Definition: keystore.h:110
WatchOnlySet setWatchOnly
Definition: keystore.h:104
bool AddSaplingSpendingKey(const libzcash::SaplingExtendedSpendingKey &sk)
Sapling.
Definition: keystore.cpp:148
KeyMap mapKeys
Definition: keystore.h:101
std::set< CKeyID > GetKeys() const
Definition: keystore.cpp:126
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey)
Add a key to the store.
Definition: keystore.cpp:34
bool HaveKey(const CExchangeKeyID &address) const
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const
Definition: keystore.cpp:19
bool GetSaplingExtendedSpendingKey(const libzcash::SaplingPaymentAddress &addr, libzcash::SaplingExtendedSpendingKey &extskOut) const
Definition: keystore.cpp:240
bool HaveKey(const CKeyID &address) const
Check whether a key corresponding to a given address is present in the store.
Definition: keystore.cpp:116
A reference to a CKey: the Hash160 of its serialized public key, special case for exchange key.
Definition: pubkey.h:30
An encapsulated private key.
Definition: key.h:30
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:21
A virtual base class for key stores.
Definition: keystore.h:23
virtual bool AddKey(const CKey &key)
Definition: keystore.cpp:14
virtual bool AddWatchOnly(const CScript &dest)=0
Support for Watch-only addresses.
virtual bool HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const =0
virtual bool HaveWatchOnly(const CScript &dest) const =0
virtual bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const =0
virtual bool GetSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr, libzcash::SaplingIncomingViewingKey &ivkOut) const =0
virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey)=0
Add a key to the store.
virtual void GetSaplingPaymentAddresses(std::set< libzcash::SaplingPaymentAddress > &setAddress) const =0
RecursiveMutex cs_KeyStore
Definition: keystore.h:26
virtual bool GetKey(const CKeyID &address, CKey &keyOut) const =0
virtual bool AddCScript(const CScript &redeemScript)=0
Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki.
virtual bool HaveSaplingSpendingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk) const =0
virtual bool AddSaplingSpendingKey(const libzcash::SaplingExtendedSpendingKey &sk)=0
Support for Sapling.
virtual bool HaveCScript(const CScriptID &hash) const =0
virtual bool GetSaplingSpendingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk, libzcash::SaplingExtendedSpendingKey &skOut) const =0
virtual bool HaveWatchOnly() const =0
virtual bool HaveKey(const CKeyID &address) const =0
Check whether a key corresponding to a given address is present in the store.
virtual ~CKeyStore()
Definition: keystore.h:28
virtual bool AddSaplingFullViewingKey(const libzcash::SaplingExtendedFullViewingKey &extfvk)=0
Support for Sapling full viewing keys.
virtual bool AddSaplingIncomingViewingKey(const libzcash::SaplingIncomingViewingKey &ivk, const libzcash::SaplingPaymentAddress &addr)=0
Sapling incoming viewing keys.
virtual bool RemoveWatchOnly(const CScript &dest)=0
virtual bool HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const =0
virtual std::set< CKeyID > GetKeys() const =0
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const =0
virtual bool GetSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk, libzcash::SaplingExtendedFullViewingKey &extfvkOut) const =0
An encapsulated public key.
Definition: pubkey.h:44
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:381
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:24
Sapling functions.
Definition: address.h:30
std::map< CKeyID, CPubKey > WatchKeyMap
Definition: keystore.h:81
std::map< CKeyID, CKey > KeyMap
Definition: keystore.h:80
std::set< CScript > WatchOnlySet
Definition: keystore.h:83
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: keystore.h:154
std::map< libzcash::SaplingExtendedFullViewingKey, std::vector< unsigned char > > CryptedSaplingSpendingKeyMap
Sapling.
Definition: keystore.h:157
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
Definition: keystore.h:155
std::map< libzcash::SaplingPaymentAddress, libzcash::SaplingIncomingViewingKey > SaplingIncomingViewingKeyMap
Definition: keystore.h:94
std::map< CScriptID, CScript > ScriptMap
Definition: keystore.h:82
std::map< libzcash::SaplingIncomingViewingKey, libzcash::SaplingExtendedFullViewingKey > SaplingFullViewingKeyMap
Definition: keystore.h:92
std::map< libzcash::SaplingExtendedFullViewingKey, libzcash::SaplingExtendedSpendingKey > SaplingSpendingKeyMap
Definition: keystore.h:89