]> Git Repo - VerusCoin.git/blobdiff - src/keystore.h
Merge branch 'dev' of https://github.com/miketout/VerusCoin into dev
[VerusCoin.git] / src / keystore.h
index 980ac4403f182fd17361b23d1e1ec78804f60929..0a0f6e69c1a739d1695b8138fe7c4cfc092ec49f 100644 (file)
@@ -1,7 +1,7 @@
 // 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
@@ -14,6 +14,8 @@
 #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>
@@ -28,6 +30,12 @@ protected:
 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);
@@ -49,40 +57,100 @@ public:
     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
     {
@@ -123,27 +191,40 @@ public:
     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 *>> &notmine);
+
     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;
@@ -151,7 +232,7 @@ public:
         }
         return false;
     }
-    bool GetNoteDecryptor(const libzcash::PaymentAddress &address, ZCNoteDecryption &decOut) const
+    bool GetNoteDecryptor(const libzcash::SproutPaymentAddress &address, ZCNoteDecryption &decOut) const
     {
         {
             LOCK(cs_SpendingKeyStore);
@@ -164,34 +245,103 @@ public:
         }
         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
This page took 0.036811 seconds and 4 git commands to generate.