// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2014 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+// file COPYING or https://www.opensource.org/licenses/mit-license.php .
#ifndef BITCOIN_KEYSTORE_H
#define BITCOIN_KEYSTORE_H
#include "sync.h"
#include "zcash/Address.hpp"
#include "zcash/NoteEncryption.hpp"
+#include "zcash/zip32.h"
+#include "pbaas/identity.h"
#include <boost/signals2/signal.hpp>
#include <boost/variant.hpp>
public:
virtual ~CKeyStore() {}
+ //! Set the HD seed for this keystore
+ virtual bool SetHDSeed(const HDSeed& seed) =0;
+ virtual bool HaveHDSeed() const =0;
+ //! Get the HD seed for this keystore
+ virtual bool GetHDSeed(HDSeed& seedOut) const =0;
+
//! Add a key to the store.
virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) =0;
virtual bool AddKey(const CKey &key);
virtual bool HaveWatchOnly(const CScript &dest) const =0;
virtual bool HaveWatchOnly() const =0;
+ //! Support for identities
+ virtual bool HaveIdentity(const CIdentityID &idID) const =0;
+ virtual bool AddIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity) =0;
+ virtual bool UpdateIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity) =0;
+ virtual bool AddUpdateIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity) =0;
+ virtual bool RemoveIdentity(const CIdentityMapKey &mapKey, const uint256 &txid=uint256()) =0;
+ virtual bool GetIdentity(const CIdentityID &idID, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity, uint32_t lteHeight=0x7fffffff) const =0;
+ virtual bool GetIdentity(const CIdentityMapKey &keyStart, const CIdentityMapKey &keyEnd, std::vector<std::pair<CIdentityMapKey, CIdentityMapValue>> &keysAndIdentityUpdates) const =0;
+ virtual bool GetIdentity(const CIdentityMapKey &mapKey, const uint256 &txid, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity) = 0;
+ virtual bool GetFirstIdentity(const CIdentityID &idID, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity, uint32_t gteHeight=0) const =0;
+
//! Add a spending key to the store.
- virtual bool AddSpendingKey(const libzcash::SpendingKey &sk) =0;
+ virtual bool AddSproutSpendingKey(const libzcash::SproutSpendingKey &sk) =0;
//! Check whether a spending key corresponding to a given payment address is present in the store.
- virtual bool HaveSpendingKey(const libzcash::PaymentAddress &address) const =0;
- virtual bool GetSpendingKey(const libzcash::PaymentAddress &address, libzcash::SpendingKey& skOut) const =0;
- virtual void GetPaymentAddresses(std::set<libzcash::PaymentAddress> &setAddress) const =0;
-
- //! Support for viewing keys
- virtual bool AddViewingKey(const libzcash::ViewingKey &vk) =0;
- virtual bool RemoveViewingKey(const libzcash::ViewingKey &vk) =0;
- virtual bool HaveViewingKey(const libzcash::PaymentAddress &address) const =0;
- virtual bool GetViewingKey(const libzcash::PaymentAddress &address, libzcash::ViewingKey& vkOut) const =0;
+ virtual bool HaveSproutSpendingKey(const libzcash::SproutPaymentAddress &address) const =0;
+ virtual bool GetSproutSpendingKey(const libzcash::SproutPaymentAddress &address, libzcash::SproutSpendingKey& skOut) const =0;
+ virtual void GetSproutPaymentAddresses(std::set<libzcash::SproutPaymentAddress> &setAddress) const =0;
+
+ //! Add a Sapling spending key to the store.
+ virtual bool AddSaplingSpendingKey(
+ const libzcash::SaplingExtendedSpendingKey &sk,
+ const libzcash::SaplingPaymentAddress &defaultAddr) =0;
+
+ //! Check whether a Sapling spending key corresponding to a given Sapling viewing key is present in the store.
+ virtual bool HaveSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk) const =0;
+ virtual bool GetSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk, libzcash::SaplingExtendedSpendingKey& skOut) const =0;
+
+ //! Support for Sapling full viewing keys
+ virtual bool AddSaplingFullViewingKey(
+ const libzcash::SaplingFullViewingKey &fvk,
+ const libzcash::SaplingPaymentAddress &defaultAddr) =0;
+ virtual bool HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const =0;
+ virtual bool GetSaplingFullViewingKey(
+ const libzcash::SaplingIncomingViewingKey &ivk,
+ libzcash::SaplingFullViewingKey& fvkOut) const =0;
+
+ //! Sapling incoming viewing keys
+ virtual bool AddSaplingIncomingViewingKey(
+ const libzcash::SaplingIncomingViewingKey &ivk,
+ const libzcash::SaplingPaymentAddress &addr) =0;
+ virtual bool HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const =0;
+ virtual bool GetSaplingIncomingViewingKey(
+ const libzcash::SaplingPaymentAddress &addr,
+ libzcash::SaplingIncomingViewingKey& ivkOut) const =0;
+ virtual void GetSaplingPaymentAddresses(std::set<libzcash::SaplingPaymentAddress> &setAddress) const =0;
+
+ //! Support for Sprout viewing keys
+ virtual bool AddSproutViewingKey(const libzcash::SproutViewingKey &vk) =0;
+ virtual bool RemoveSproutViewingKey(const libzcash::SproutViewingKey &vk) =0;
+ virtual bool HaveSproutViewingKey(const libzcash::SproutPaymentAddress &address) const =0;
+ virtual bool GetSproutViewingKey(
+ const libzcash::SproutPaymentAddress &address,
+ libzcash::SproutViewingKey& vkOut) const =0;
};
typedef std::map<CKeyID, CKey> KeyMap;
-typedef std::map<CScriptID, CScript > ScriptMap;
+typedef std::map<CScriptID, CScript> ScriptMap;
+typedef std::multimap<arith_uint256, CIdentityMapValue> IdentityMap;
typedef std::set<CScript> WatchOnlySet;
-typedef std::map<libzcash::PaymentAddress, libzcash::SpendingKey> SpendingKeyMap;
-typedef std::map<libzcash::PaymentAddress, libzcash::ViewingKey> ViewingKeyMap;
-typedef std::map<libzcash::PaymentAddress, ZCNoteDecryption> NoteDecryptorMap;
+typedef std::map<libzcash::SproutPaymentAddress, libzcash::SproutSpendingKey> SproutSpendingKeyMap;
+typedef std::map<libzcash::SproutPaymentAddress, libzcash::SproutViewingKey> SproutViewingKeyMap;
+typedef std::map<libzcash::SproutPaymentAddress, ZCNoteDecryption> NoteDecryptorMap;
+
+// Full viewing key has equivalent functionality to a transparent address
+// When encrypting wallet, encrypt SaplingSpendingKeyMap, while leaving SaplingFullViewingKeyMap unencrypted
+typedef std::map<libzcash::SaplingFullViewingKey, libzcash::SaplingExtendedSpendingKey> SaplingSpendingKeyMap;
+typedef std::map<libzcash::SaplingIncomingViewingKey, libzcash::SaplingFullViewingKey> SaplingFullViewingKeyMap;
+// Only maps from default addresses to ivk, may need to be reworked when adding diversified addresses.
+typedef std::map<libzcash::SaplingPaymentAddress, libzcash::SaplingIncomingViewingKey> SaplingIncomingViewingKeyMap;
/** Basic key store, that keeps keys in an address->secret map */
class CBasicKeyStore : public CKeyStore
{
protected:
+ HDSeed hdSeed;
KeyMap mapKeys;
ScriptMap mapScripts;
+ IdentityMap mapIdentities;
+
WatchOnlySet setWatchOnly;
- SpendingKeyMap mapSpendingKeys;
- ViewingKeyMap mapViewingKeys;
+ SproutSpendingKeyMap mapSproutSpendingKeys;
+ SproutViewingKeyMap mapSproutViewingKeys;
NoteDecryptorMap mapNoteDecryptors;
+ SaplingSpendingKeyMap mapSaplingSpendingKeys;
+ SaplingFullViewingKeyMap mapSaplingFullViewingKeys;
+ SaplingIncomingViewingKeyMap mapSaplingIncomingViewingKeys;
+
public:
+ bool SetHDSeed(const HDSeed& seed);
+ bool HaveHDSeed() const;
+ bool GetHDSeed(HDSeed& seedOut) const;
+
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
bool HaveKey(const CKeyID &address) const
{
virtual bool HaveCScript(const CScriptID &hash) const;
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const;
+ virtual bool HaveIdentity(const CIdentityID &idID) const;
+ virtual bool AddIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity);
+ virtual bool UpdateIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity);
+ virtual bool AddUpdateIdentity(const CIdentityMapKey &mapKey, const CIdentityMapValue &identity);
+ virtual bool RemoveIdentity(const CIdentityMapKey &mapKey, const uint256 &txid=uint256());
+ virtual bool GetIdentity(const CIdentityID &idID, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity, uint32_t lteHeight=INT32_MAX) const;
+ virtual bool GetIdentity(const CIdentityMapKey &keyStart, const CIdentityMapKey &keyEnd, std::vector<std::pair<CIdentityMapKey, CIdentityMapValue>> &keysAndIdentityUpdates) const;
+ virtual bool GetIdentity(const CIdentityMapKey &mapKey, const uint256 &txid, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity);
+ virtual bool GetFirstIdentity(const CIdentityID &idID, std::pair<CIdentityMapKey, CIdentityMapValue> &keyAndIdentity, uint32_t gteHeight=0) const;
+ virtual bool GetIdentities(std::vector<std::pair<CIdentityMapKey, CIdentityMapValue *>> &mine,
+ std::vector<std::pair<CIdentityMapKey, CIdentityMapValue *>> &imsigner,
+ std::vector<std::pair<CIdentityMapKey, CIdentityMapValue *>> ¬mine);
+
virtual bool AddWatchOnly(const CScript &dest);
virtual bool RemoveWatchOnly(const CScript &dest);
virtual bool HaveWatchOnly(const CScript &dest) const;
virtual bool HaveWatchOnly() const;
- bool AddSpendingKey(const libzcash::SpendingKey &sk);
- bool HaveSpendingKey(const libzcash::PaymentAddress &address) const
+ bool AddSproutSpendingKey(const libzcash::SproutSpendingKey &sk);
+ bool HaveSproutSpendingKey(const libzcash::SproutPaymentAddress &address) const
{
bool result;
{
LOCK(cs_SpendingKeyStore);
- result = (mapSpendingKeys.count(address) > 0);
+ result = (mapSproutSpendingKeys.count(address) > 0);
}
return result;
}
- bool GetSpendingKey(const libzcash::PaymentAddress &address, libzcash::SpendingKey &skOut) const
+ bool GetSproutSpendingKey(const libzcash::SproutPaymentAddress &address, libzcash::SproutSpendingKey &skOut) const
{
{
LOCK(cs_SpendingKeyStore);
- SpendingKeyMap::const_iterator mi = mapSpendingKeys.find(address);
- if (mi != mapSpendingKeys.end())
+ SproutSpendingKeyMap::const_iterator mi = mapSproutSpendingKeys.find(address);
+ if (mi != mapSproutSpendingKeys.end())
{
skOut = mi->second;
return true;
}
return false;
}
- bool GetNoteDecryptor(const libzcash::PaymentAddress &address, ZCNoteDecryption &decOut) const
+ bool GetNoteDecryptor(const libzcash::SproutPaymentAddress &address, ZCNoteDecryption &decOut) const
{
{
LOCK(cs_SpendingKeyStore);
}
return false;
}
- void GetPaymentAddresses(std::set<libzcash::PaymentAddress> &setAddress) const
+ void GetSproutPaymentAddresses(std::set<libzcash::SproutPaymentAddress> &setAddress) const
{
setAddress.clear();
{
LOCK(cs_SpendingKeyStore);
- SpendingKeyMap::const_iterator mi = mapSpendingKeys.begin();
- while (mi != mapSpendingKeys.end())
+ SproutSpendingKeyMap::const_iterator mi = mapSproutSpendingKeys.begin();
+ while (mi != mapSproutSpendingKeys.end())
{
setAddress.insert((*mi).first);
mi++;
}
- ViewingKeyMap::const_iterator mvi = mapViewingKeys.begin();
- while (mvi != mapViewingKeys.end())
+ SproutViewingKeyMap::const_iterator mvi = mapSproutViewingKeys.begin();
+ while (mvi != mapSproutViewingKeys.end())
{
setAddress.insert((*mvi).first);
mvi++;
}
}
}
+
+ //! Sapling
+ bool AddSaplingSpendingKey(
+ const libzcash::SaplingExtendedSpendingKey &sk,
+ const libzcash::SaplingPaymentAddress &defaultAddr);
+ bool HaveSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk) const
+ {
+ bool result;
+ {
+ LOCK(cs_SpendingKeyStore);
+ result = (mapSaplingSpendingKeys.count(fvk) > 0);
+ }
+ return result;
+ }
+ bool GetSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk, libzcash::SaplingExtendedSpendingKey &skOut) const
+ {
+ {
+ LOCK(cs_SpendingKeyStore);
+
+ SaplingSpendingKeyMap::const_iterator mi = mapSaplingSpendingKeys.find(fvk);
+ if (mi != mapSaplingSpendingKeys.end())
+ {
+ skOut = mi->second;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ virtual bool AddSaplingFullViewingKey(
+ const libzcash::SaplingFullViewingKey &fvk,
+ const libzcash::SaplingPaymentAddress &defaultAddr);
+ virtual bool HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const;
+ virtual bool GetSaplingFullViewingKey(
+ const libzcash::SaplingIncomingViewingKey &ivk,
+ libzcash::SaplingFullViewingKey& fvkOut) const;
+
+ virtual bool AddSaplingIncomingViewingKey(
+ const libzcash::SaplingIncomingViewingKey &ivk,
+ const libzcash::SaplingPaymentAddress &addr);
+ virtual bool HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const;
+ virtual bool GetSaplingIncomingViewingKey(
+ const libzcash::SaplingPaymentAddress &addr,
+ libzcash::SaplingIncomingViewingKey& ivkOut) const;
+
+ bool GetSaplingExtendedSpendingKey(
+ const libzcash::SaplingPaymentAddress &addr,
+ libzcash::SaplingExtendedSpendingKey &extskOut) const;
+
+ void GetSaplingPaymentAddresses(std::set<libzcash::SaplingPaymentAddress> &setAddress) const
+ {
+ setAddress.clear();
+ {
+ LOCK(cs_SpendingKeyStore);
+ auto mi = mapSaplingIncomingViewingKeys.begin();
+ while (mi != mapSaplingIncomingViewingKeys.end())
+ {
+ setAddress.insert((*mi).first);
+ mi++;
+ }
+ }
+ }
- virtual bool AddViewingKey(const libzcash::ViewingKey &vk);
- virtual bool RemoveViewingKey(const libzcash::ViewingKey &vk);
- virtual bool HaveViewingKey(const libzcash::PaymentAddress &address) const;
- virtual bool GetViewingKey(const libzcash::PaymentAddress &address, libzcash::ViewingKey& vkOut) const;
+ virtual bool AddSproutViewingKey(const libzcash::SproutViewingKey &vk);
+ virtual bool RemoveSproutViewingKey(const libzcash::SproutViewingKey &vk);
+ virtual bool HaveSproutViewingKey(const libzcash::SproutPaymentAddress &address) const;
+ virtual bool GetSproutViewingKey(
+ const libzcash::SproutPaymentAddress &address,
+ libzcash::SproutViewingKey& vkOut) const;
};
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
-typedef std::map<libzcash::PaymentAddress, std::vector<unsigned char> > CryptedSpendingKeyMap;
+typedef std::map<libzcash::SproutPaymentAddress, std::vector<unsigned char> > CryptedSproutSpendingKeyMap;
+
+//! Sapling
+typedef std::map<libzcash::SaplingExtendedFullViewingKey, std::vector<unsigned char> > CryptedSaplingSpendingKeyMap;
+
+CScriptID ScriptOrIdentityID(const CScript& scr);
#endif // BITCOIN_KEYSTORE_H