diff --git a/src/zcash/Address.cpp b/src/zcash/Address.cpp index a3db85a20..d12e82cdc 100644 --- a/src/zcash/Address.cpp +++ b/src/zcash/Address.cpp @@ -67,8 +67,19 @@ SaplingIncomingViewingKey SaplingFullViewingKey::in_viewing_key() const { return SaplingIncomingViewingKey(ivk); } +bool SaplingFullViewingKey::is_valid() const { + uint256 ivk; + librustzcash_crh_ivk(ak.begin(), nk.begin(), ivk.begin()); + return !ivk.IsNull(); +} + SaplingSpendingKey SaplingSpendingKey::random() { - return SaplingSpendingKey(random_uint256()); + while (true) { + auto sk = SaplingSpendingKey(random_uint256()); + if (sk.full_viewing_key().is_valid()) { + return sk; + } + } } boost::optional SaplingIncomingViewingKey::address(diversifier_t d) const { @@ -90,7 +101,6 @@ SaplingPaymentAddress SaplingSpendingKey::default_address() const { } - bool IsValidPaymentAddress(const libzcash::PaymentAddress& zaddr) { return zaddr.which() != 0; } diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index 5a6ec2a60..34e56a592 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -153,6 +153,7 @@ public: } SaplingIncomingViewingKey in_viewing_key() const; + bool is_valid() const; friend inline bool operator==(const SaplingFullViewingKey& a, const SaplingFullViewingKey& b) { return a.ak == b.ak && a.nk == b.nk && a.ovk == b.ovk;