libzcash::PaymentAddress has been renamed to libzcash::SproutPaymentAddress, and a new typedef boost::variant is now libzcash::PaymentAddress. Similarly for ViewingKey and SpendingKey. A new class InvalidEncoding is introduced as the default boost::variant option for each address and key type; it is used during decoding instead of boost::optional. All address and key storage functions in the wallet have been modified to refer specifically to the Sprout types, as they are used very precisely. In most other cases, the more general type is leveraged as much as possible, and we convert to the Sprout type when necessary. This will be subsequently wrapped in, or replaced with, context-specific functions once Sapling types are implemented.
129 lines
3.2 KiB
C++
129 lines
3.2 KiB
C++
// 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.
|
|
|
|
#include "keystore.h"
|
|
|
|
#include "key.h"
|
|
#include "util.h"
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
bool CKeyStore::GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const
|
|
{
|
|
CKey key;
|
|
if (!GetKey(address, key))
|
|
return false;
|
|
vchPubKeyOut = key.GetPubKey();
|
|
return true;
|
|
}
|
|
|
|
bool CKeyStore::AddKey(const CKey &key) {
|
|
return AddKeyPubKey(key, key.GetPubKey());
|
|
}
|
|
|
|
bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
mapKeys[pubkey.GetID()] = key;
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
|
|
{
|
|
if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
|
return error("CBasicKeyStore::AddCScript(): redeemScripts > %i bytes are invalid", MAX_SCRIPT_ELEMENT_SIZE);
|
|
|
|
LOCK(cs_KeyStore);
|
|
mapScripts[CScriptID(redeemScript)] = redeemScript;
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::HaveCScript(const CScriptID& hash) const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
return mapScripts.count(hash) > 0;
|
|
}
|
|
|
|
bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
ScriptMap::const_iterator mi = mapScripts.find(hash);
|
|
if (mi != mapScripts.end())
|
|
{
|
|
redeemScriptOut = (*mi).second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CBasicKeyStore::AddWatchOnly(const CScript &dest)
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
setWatchOnly.insert(dest);
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::RemoveWatchOnly(const CScript &dest)
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
setWatchOnly.erase(dest);
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::HaveWatchOnly(const CScript &dest) const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
return setWatchOnly.count(dest) > 0;
|
|
}
|
|
|
|
bool CBasicKeyStore::HaveWatchOnly() const
|
|
{
|
|
LOCK(cs_KeyStore);
|
|
return (!setWatchOnly.empty());
|
|
}
|
|
|
|
bool CBasicKeyStore::AddSpendingKey(const libzcash::SproutSpendingKey &sk)
|
|
{
|
|
LOCK(cs_SpendingKeyStore);
|
|
auto address = sk.address();
|
|
mapSpendingKeys[address] = sk;
|
|
mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(sk.receiving_key())));
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::AddViewingKey(const libzcash::SproutViewingKey &vk)
|
|
{
|
|
LOCK(cs_SpendingKeyStore);
|
|
auto address = vk.address();
|
|
mapViewingKeys[address] = vk;
|
|
mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(vk.sk_enc)));
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::RemoveViewingKey(const libzcash::SproutViewingKey &vk)
|
|
{
|
|
LOCK(cs_SpendingKeyStore);
|
|
mapViewingKeys.erase(vk.address());
|
|
return true;
|
|
}
|
|
|
|
bool CBasicKeyStore::HaveViewingKey(const libzcash::SproutPaymentAddress &address) const
|
|
{
|
|
LOCK(cs_SpendingKeyStore);
|
|
return mapViewingKeys.count(address) > 0;
|
|
}
|
|
|
|
bool CBasicKeyStore::GetViewingKey(const libzcash::SproutPaymentAddress &address,
|
|
libzcash::SproutViewingKey &vkOut) const
|
|
{
|
|
LOCK(cs_SpendingKeyStore);
|
|
ViewingKeyMap::const_iterator mi = mapViewingKeys.find(address);
|
|
if (mi != mapViewingKeys.end()) {
|
|
vkOut = mi->second;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|