Add unified address tracking to KeyStore
This commit is contained in:
parent
ef068c51a9
commit
e56f252a86
|
@ -298,13 +298,6 @@ bool CBasicKeyStore::AddUnifiedFullViewingKey(
|
||||||
{
|
{
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
|
|
||||||
auto tKey = ufvk.GetTransparentKey();
|
|
||||||
if (tKey.has_value()) {
|
|
||||||
// FIXME: this is probably not the right thing; we need to actually track
|
|
||||||
// addresses, not the id at the FVK level?
|
|
||||||
mapTKeyUnified.insert(std::make_pair(tKey.value().GetPubKey().GetID(), keyId));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto saplingKey = ufvk.GetSaplingKey();
|
auto saplingKey = ufvk.GetSaplingKey();
|
||||||
if (saplingKey.has_value()) {
|
if (saplingKey.has_value()) {
|
||||||
auto ivk = saplingKey.value().fvk.in_viewing_key();
|
auto ivk = saplingKey.value().fvk.in_viewing_key();
|
||||||
|
@ -315,3 +308,26 @@ bool CBasicKeyStore::AddUnifiedFullViewingKey(
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CBasicKeyStore::AddUnifiedAddress(
|
||||||
|
const libzcash::UFVKId& keyId,
|
||||||
|
const libzcash::UnifiedAddress& ua)
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
|
||||||
|
// It's only necessary to add p2pkh and p2sh components of
|
||||||
|
// the UA; all other lookups of the associated UFVK will be
|
||||||
|
// made via the protocol-specific viewing key that is used
|
||||||
|
// to trial-decrypt a transaction.
|
||||||
|
|
||||||
|
auto p2pkhReceiver = ua.GetP2PKHReceiver();
|
||||||
|
if (p2pkhReceiver.has_value()) {
|
||||||
|
mapP2PKHUnified.insert(std::make_pair(p2pkhReceiver.value(), keyId));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto p2shReceiver = ua.GetP2SHReceiver();
|
||||||
|
if (p2shReceiver.has_value()) {
|
||||||
|
mapP2SHUnified.insert(std::make_pair(p2shReceiver.value(), keyId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,11 @@ public:
|
||||||
const libzcash::UFVKId& keyId,
|
const libzcash::UFVKId& keyId,
|
||||||
const libzcash::ZcashdUnifiedFullViewingKey &ufvk
|
const libzcash::ZcashdUnifiedFullViewingKey &ufvk
|
||||||
) = 0;
|
) = 0;
|
||||||
|
|
||||||
|
virtual bool AddUnifiedAddress(
|
||||||
|
const libzcash::UFVKId& keyId,
|
||||||
|
const libzcash::UnifiedAddress &ua
|
||||||
|
) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<CKeyID, CKey> KeyMap;
|
typedef std::map<CKeyID, CKey> KeyMap;
|
||||||
|
@ -128,6 +133,12 @@ typedef std::map<
|
||||||
// Only maps from default addresses to ivk, may need to be reworked when adding diversified addresses.
|
// Only maps from default addresses to ivk, may need to be reworked when adding diversified addresses.
|
||||||
typedef std::map<libzcash::SaplingPaymentAddress, libzcash::SaplingIncomingViewingKey> SaplingIncomingViewingKeyMap;
|
typedef std::map<libzcash::SaplingPaymentAddress, libzcash::SaplingIncomingViewingKey> SaplingIncomingViewingKeyMap;
|
||||||
|
|
||||||
|
struct UnifiedAddressMetadata {
|
||||||
|
libzcash::UFVKId keyId;
|
||||||
|
libzcash::diversifier_index_t j;
|
||||||
|
std::vector<libzcash::ReceiverType> receiverTypes;
|
||||||
|
};
|
||||||
|
|
||||||
/** Basic key store, that keeps keys in an address->secret map */
|
/** Basic key store, that keeps keys in an address->secret map */
|
||||||
class CBasicKeyStore : public CKeyStore
|
class CBasicKeyStore : public CKeyStore
|
||||||
{
|
{
|
||||||
|
@ -150,7 +161,8 @@ protected:
|
||||||
SaplingIncomingViewingKeyMap mapSaplingIncomingViewingKeys;
|
SaplingIncomingViewingKeyMap mapSaplingIncomingViewingKeys;
|
||||||
|
|
||||||
// Unified key support
|
// Unified key support
|
||||||
std::map<CKeyID, libzcash::UFVKId> mapTKeyUnified;
|
std::map<CKeyID, libzcash::UFVKId> mapP2PKHUnified;
|
||||||
|
std::map<CScriptID, libzcash::UFVKId> mapP2SHUnified;
|
||||||
std::map<libzcash::SaplingIncomingViewingKey, libzcash::UFVKId> mapSaplingKeyUnified;
|
std::map<libzcash::SaplingIncomingViewingKey, libzcash::UFVKId> mapSaplingKeyUnified;
|
||||||
std::map<libzcash::UFVKId, libzcash::ZcashdUnifiedFullViewingKey> mapUnifiedFullViewingKeys;
|
std::map<libzcash::UFVKId, libzcash::ZcashdUnifiedFullViewingKey> mapUnifiedFullViewingKeys;
|
||||||
public:
|
public:
|
||||||
|
@ -329,6 +341,14 @@ public:
|
||||||
virtual bool AddUnifiedFullViewingKey(
|
virtual bool AddUnifiedFullViewingKey(
|
||||||
const libzcash::UFVKId& keyId,
|
const libzcash::UFVKId& keyId,
|
||||||
const libzcash::ZcashdUnifiedFullViewingKey &ufvk);
|
const libzcash::ZcashdUnifiedFullViewingKey &ufvk);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the transparent component of the unified address, if any,
|
||||||
|
* to the keystore to make it possible to identify the
|
||||||
|
*/
|
||||||
|
virtual bool AddUnifiedAddress(
|
||||||
|
const libzcash::UFVKId& keyId,
|
||||||
|
const libzcash::UnifiedAddress &ua);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
||||||
|
|
|
@ -43,6 +43,37 @@ bool UnifiedAddress::AddReceiver(Receiver receiver) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<CKeyID> UnifiedAddress::GetP2PKHReceiver() const {
|
||||||
|
for (const auto& r : receivers) {
|
||||||
|
if (std::holds_alternative<CKeyID>(r)) {
|
||||||
|
return std::get<CKeyID>(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<CScriptID> UnifiedAddress::GetP2SHReceiver() const {
|
||||||
|
for (const auto& r : receivers) {
|
||||||
|
if (std::holds_alternative<CScriptID>(r)) {
|
||||||
|
return std::get<CScriptID>(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<SaplingPaymentAddress> UnifiedAddress::GetSaplingReceiver() const {
|
||||||
|
for (const auto& r : receivers) {
|
||||||
|
if (std::holds_alternative<SaplingPaymentAddress>(r)) {
|
||||||
|
return std::get<SaplingPaymentAddress>(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::pair<std::string, PaymentAddress> AddressInfoFromSpendingKey::operator()(const SproutSpendingKey &sk) const {
|
std::pair<std::string, PaymentAddress> AddressInfoFromSpendingKey::operator()(const SproutSpendingKey &sk) const {
|
||||||
return std::make_pair("sprout", sk.address());
|
return std::make_pair("sprout", sk.address());
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,6 +123,12 @@ public:
|
||||||
return receivers.size();
|
return receivers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<CKeyID> GetP2PKHReceiver() const;
|
||||||
|
|
||||||
|
std::optional<CScriptID> GetP2SHReceiver() const;
|
||||||
|
|
||||||
|
std::optional<SaplingPaymentAddress> GetSaplingReceiver() const;
|
||||||
|
|
||||||
friend inline bool operator==(const UnifiedAddress& a, const UnifiedAddress& b) {
|
friend inline bool operator==(const UnifiedAddress& a, const UnifiedAddress& b) {
|
||||||
return a.receivers == b.receivers;
|
return a.receivers == b.receivers;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue