]> Git Repo - VerusCoin.git/blob - src/keystore.cpp
Merge pull request #128 from miketout/dev
[VerusCoin.git] / src / keystore.cpp
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 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 #include "keystore.h"
7
8 #include "key.h"
9 #include "util.h"
10
11 #include <boost/foreach.hpp>
12
13 bool CKeyStore::GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const
14 {
15     CKey key;
16     if (!GetKey(address, key))
17         return false;
18     vchPubKeyOut = key.GetPubKey();
19     return true;
20 }
21
22 bool CKeyStore::AddKey(const CKey &key) {
23     return AddKeyPubKey(key, key.GetPubKey());
24 }
25
26 bool CBasicKeyStore::SetHDSeed(const HDSeed& seed)
27 {
28     LOCK(cs_SpendingKeyStore);
29     if (!hdSeed.IsNull()) {
30         // Don't allow an existing seed to be changed. We can maybe relax this
31         // restriction later once we have worked out the UX implications.
32         return false;
33     }
34     hdSeed = seed;
35     return true;
36 }
37
38 bool CBasicKeyStore::HaveHDSeed() const
39 {
40     LOCK(cs_SpendingKeyStore);
41     return !hdSeed.IsNull();
42 }
43
44 bool CBasicKeyStore::GetHDSeed(HDSeed& seedOut) const
45 {
46     LOCK(cs_SpendingKeyStore);
47     if (hdSeed.IsNull()) {
48         return false;
49     } else {
50         seedOut = hdSeed;
51         return true;
52     }
53 }
54
55 bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
56 {
57     LOCK(cs_KeyStore);
58     mapKeys[pubkey.GetID()] = key;
59     return true;
60 }
61
62 bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
63 {
64     if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
65         return error("CBasicKeyStore::AddCScript(): redeemScripts > %i bytes are invalid", MAX_SCRIPT_ELEMENT_SIZE);
66
67     LOCK(cs_KeyStore);
68     mapScripts[CScriptID(redeemScript)] = redeemScript;
69     return true;
70 }
71
72 bool CBasicKeyStore::HaveCScript(const CScriptID& hash) const
73 {
74     LOCK(cs_KeyStore);
75     return mapScripts.count(hash) > 0;
76 }
77
78 bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const
79 {
80     LOCK(cs_KeyStore);
81     ScriptMap::const_iterator mi = mapScripts.find(hash);
82     if (mi != mapScripts.end())
83     {
84         redeemScriptOut = (*mi).second;
85         return true;
86     }
87     return false;
88 }
89
90 bool CBasicKeyStore::AddWatchOnly(const CScript &dest)
91 {
92     LOCK(cs_KeyStore);
93     setWatchOnly.insert(dest);
94     return true;
95 }
96
97 bool CBasicKeyStore::RemoveWatchOnly(const CScript &dest)
98 {
99     LOCK(cs_KeyStore);
100     setWatchOnly.erase(dest);
101     return true;
102 }
103
104 bool CBasicKeyStore::HaveWatchOnly(const CScript &dest) const
105 {
106     LOCK(cs_KeyStore);
107     return setWatchOnly.count(dest) > 0;
108 }
109
110 bool CBasicKeyStore::HaveWatchOnly() const
111 {
112     LOCK(cs_KeyStore);
113     return (!setWatchOnly.empty());
114 }
115
116 bool CBasicKeyStore::AddSproutSpendingKey(const libzcash::SproutSpendingKey &sk)
117 {
118     LOCK(cs_SpendingKeyStore);
119     auto address = sk.address();
120     mapSproutSpendingKeys[address] = sk;
121     mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(sk.receiving_key())));
122     return true;
123 }
124
125 //! Sapling 
126 bool CBasicKeyStore::AddSaplingSpendingKey(
127     const libzcash::SaplingExtendedSpendingKey &sk,
128     const libzcash::SaplingPaymentAddress &defaultAddr)
129 {
130     LOCK(cs_SpendingKeyStore);
131     auto fvk = sk.expsk.full_viewing_key();
132
133     // if SaplingFullViewingKey is not in SaplingFullViewingKeyMap, add it
134     if (!AddSaplingFullViewingKey(fvk, defaultAddr)) {
135         return false;
136     }
137
138     mapSaplingSpendingKeys[fvk] = sk;
139
140     return true;
141 }
142
143 bool CBasicKeyStore::AddSproutViewingKey(const libzcash::SproutViewingKey &vk)
144 {
145     LOCK(cs_SpendingKeyStore);
146     auto address = vk.address();
147     mapSproutViewingKeys[address] = vk;
148     mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(vk.sk_enc)));
149     return true;
150 }
151
152 bool CBasicKeyStore::AddSaplingFullViewingKey(
153     const libzcash::SaplingFullViewingKey &fvk,
154     const libzcash::SaplingPaymentAddress &defaultAddr)
155 {
156     LOCK(cs_SpendingKeyStore);
157     auto ivk = fvk.in_viewing_key();
158     mapSaplingFullViewingKeys[ivk] = fvk;
159
160     return CBasicKeyStore::AddSaplingIncomingViewingKey(ivk, defaultAddr);
161 }
162
163 // This function updates the wallet's internal address->ivk map. 
164 // If we add an address that is already in the map, the map will
165 // remain unchanged as each address only has one ivk.
166 bool CBasicKeyStore::AddSaplingIncomingViewingKey(
167     const libzcash::SaplingIncomingViewingKey &ivk,
168     const libzcash::SaplingPaymentAddress &addr)
169 {
170     LOCK(cs_SpendingKeyStore);
171
172     // Add addr -> SaplingIncomingViewing to SaplingIncomingViewingKeyMap
173     mapSaplingIncomingViewingKeys[addr] = ivk;
174
175     return true;
176 }
177
178 bool CBasicKeyStore::RemoveSproutViewingKey(const libzcash::SproutViewingKey &vk)
179 {
180     LOCK(cs_SpendingKeyStore);
181     mapSproutViewingKeys.erase(vk.address());
182     return true;
183 }
184
185 bool CBasicKeyStore::HaveSproutViewingKey(const libzcash::SproutPaymentAddress &address) const
186 {
187     LOCK(cs_SpendingKeyStore);
188     return mapSproutViewingKeys.count(address) > 0;
189 }
190
191 bool CBasicKeyStore::HaveSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk) const
192 {
193     LOCK(cs_SpendingKeyStore);
194     return mapSaplingFullViewingKeys.count(ivk) > 0;
195 }
196
197 bool CBasicKeyStore::HaveSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr) const
198 {
199     LOCK(cs_SpendingKeyStore);
200     return mapSaplingIncomingViewingKeys.count(addr) > 0;
201 }
202
203 bool CBasicKeyStore::GetSproutViewingKey(
204     const libzcash::SproutPaymentAddress &address,
205     libzcash::SproutViewingKey &vkOut) const
206 {
207     LOCK(cs_SpendingKeyStore);
208     SproutViewingKeyMap::const_iterator mi = mapSproutViewingKeys.find(address);
209     if (mi != mapSproutViewingKeys.end()) {
210         vkOut = mi->second;
211         return true;
212     }
213     return false;
214 }
215
216 bool CBasicKeyStore::GetSaplingFullViewingKey(const libzcash::SaplingIncomingViewingKey &ivk,
217                                    libzcash::SaplingFullViewingKey &fvkOut) const
218 {
219     LOCK(cs_SpendingKeyStore);
220     SaplingFullViewingKeyMap::const_iterator mi = mapSaplingFullViewingKeys.find(ivk);
221     if (mi != mapSaplingFullViewingKeys.end()) {
222         fvkOut = mi->second;
223         return true;
224     }
225     return false;
226 }
227
228 bool CBasicKeyStore::GetSaplingIncomingViewingKey(const libzcash::SaplingPaymentAddress &addr,
229                                    libzcash::SaplingIncomingViewingKey &ivkOut) const
230 {
231     LOCK(cs_SpendingKeyStore);
232     SaplingIncomingViewingKeyMap::const_iterator mi = mapSaplingIncomingViewingKeys.find(addr);
233     if (mi != mapSaplingIncomingViewingKeys.end()) {
234         ivkOut = mi->second;
235         return true;
236     }
237     return false;
238 }
239
240 bool CBasicKeyStore::GetSaplingExtendedSpendingKey(const libzcash::SaplingPaymentAddress &addr, 
241                                     libzcash::SaplingExtendedSpendingKey &extskOut) const {
242     libzcash::SaplingIncomingViewingKey ivk;
243     libzcash::SaplingFullViewingKey fvk;
244
245     return GetSaplingIncomingViewingKey(addr, ivk) &&
246             GetSaplingFullViewingKey(ivk, fvk) &&
247             GetSaplingSpendingKey(fvk, extskOut);
248 }
This page took 0.038077 seconds and 4 git commands to generate.