Persist Orchard action index/IVK mappings in CWalletTx
This commit is contained in:
parent
ecd0d24baa
commit
0149451217
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue