Persist Orchard action index/IVK mappings in CWalletTx

This commit is contained in:
Kris Nuttycombe 2022-03-04 14:44:53 -07:00
parent ecd0d24baa
commit 0149451217
4 changed files with 17 additions and 7 deletions

View File

@ -2872,7 +2872,9 @@ bool CWallet::UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx)
wtx.mapSaplingNoteData = tmp;
}
return !unchangedSproutFlag || !unchangedSaplingFlag;
bool unchangedOrchardFlag = (wtxIn.mapOrchardActionData.empty() || wtxIn.mapOrchardActionData == wtx.mapOrchardActionData);
return !unchangedSproutFlag || !unchangedSaplingFlag || !unchangedOrchardFlag;
}
/**

View File

@ -581,8 +581,7 @@ public:
}
if (fOverwintered && nVersion >= ZIP225_TX_VERSION) {
// ORCHARD TODO: serialize/deserialize orchard bits using a pointer
// to the Orchard wallet & the txid as referents
READWRITE(mapOrchardActionData);
}
if (ser_action.ForRead())

View File

@ -7,10 +7,12 @@
namespace libzcash {
OrchardRawAddress OrchardIncomingViewingKey::Address(const diversifier_index_t& j) const {
assert(inner.get() != nullptr);
return OrchardRawAddress(orchard_incoming_viewing_key_to_address(inner.get(), j.begin()));
}
std::optional<diversifier_index_t> OrchardIncomingViewingKey::DecryptDiversifier(const OrchardRawAddress& addr) const {
assert(inner.get() != nullptr);
diversifier_index_t j_ret;
if (orchard_incoming_viewing_key_decrypt_diversifier(inner.get(), addr.inner.get(), j_ret.begin())) {
return j_ret;
@ -20,10 +22,12 @@ std::optional<diversifier_index_t> OrchardIncomingViewingKey::DecryptDiversifier
}
OrchardIncomingViewingKey OrchardFullViewingKey::ToIncomingViewingKey() const {
assert(inner.get() != nullptr);
return OrchardIncomingViewingKey(orchard_full_viewing_key_to_incoming_viewing_key(inner.get()));
}
OrchardIncomingViewingKey OrchardFullViewingKey::ToInternalIncomingViewingKey() const {
assert(inner.get() != nullptr);
return OrchardIncomingViewingKey(orchard_full_viewing_key_to_internal_incoming_viewing_key(inner.get()));
}

View File

@ -97,17 +97,17 @@ class OrchardIncomingViewingKey
private:
std::unique_ptr<OrchardIncomingViewingKeyPtr, decltype(&orchard_incoming_viewing_key_free)> inner;
OrchardIncomingViewingKey() :
inner(nullptr, orchard_incoming_viewing_key_free) {}
OrchardIncomingViewingKey(OrchardIncomingViewingKeyPtr* key) :
inner(key, orchard_incoming_viewing_key_free) {}
friend class OrchardFullViewingKey;
friend class OrchardSpendingKey;
friend class ::OrchardWallet;
public:
// DO NOT USE - this is exposed for serialization purposes only.
OrchardIncomingViewingKey() :
inner(nullptr, orchard_incoming_viewing_key_free) {}
OrchardIncomingViewingKey(OrchardIncomingViewingKey&& key) : inner(std::move(key.inner)) {}
OrchardIncomingViewingKey(const OrchardIncomingViewingKey& key) :
@ -139,15 +139,20 @@ public:
friend bool operator==(const OrchardIncomingViewingKey& a, const OrchardIncomingViewingKey& b)
{
assert(a.inner.get() != nullptr);
assert(b.inner.get() != nullptr);
return orchard_incoming_viewing_key_eq(a.inner.get(), b.inner.get());
}
friend bool operator<(const OrchardIncomingViewingKey& c1, const OrchardIncomingViewingKey& c2) {
assert(c1.inner.get() != nullptr);
assert(c2.inner.get() != nullptr);
return orchard_incoming_viewing_key_lt(c1.inner.get(), c2.inner.get());
}
template<typename Stream>
void Serialize(Stream& s) const {
assert(inner.get() != nullptr);
RustStream rs(s);
if (!orchard_incoming_viewing_key_serialize(inner.get(), &rs, RustStream<Stream>::write_callback)) {
throw std::ios_base::failure("Failed to serialize Orchard incoming viewing key");