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; 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) { if (fOverwintered && nVersion >= ZIP225_TX_VERSION) {
// ORCHARD TODO: serialize/deserialize orchard bits using a pointer READWRITE(mapOrchardActionData);
// to the Orchard wallet & the txid as referents
} }
if (ser_action.ForRead()) if (ser_action.ForRead())

View File

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

View File

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