Browse Source

Return optional for Sapling commitments and nullifiers.

Unlike Sprout, they are not always computable in Sapling.
pull/4/head
Simon 6 years ago
parent
commit
268e5dfa50
  1. 2
      src/gtest/test_sapling_note.cpp
  2. 12
      src/zcash/Note.cpp
  3. 9
      src/zcash/Note.hpp

2
src/gtest/test_sapling_note.cpp

@ -45,7 +45,7 @@ TEST(SaplingNote, TestVectors)
// Test commitment // Test commitment
SaplingNote note = SaplingNote(diversifier, pk_d, v, r); SaplingNote note = SaplingNote(diversifier, pk_d, v, r);
ASSERT_EQ(note.cm(), cm); ASSERT_EQ(note.cm().get(), cm);
// Test nullifier // Test nullifier
SaplingSpendingKey spendingKey(sk); SaplingSpendingKey spendingKey(sk);

12
src/zcash/Note.cpp

@ -9,7 +9,7 @@
#include "zcash/util.h" #include "zcash/util.h"
#include "librustzcash.h" #include "librustzcash.h"
namespace libzcash { using namespace libzcash;
SproutNote::SproutNote() { SproutNote::SproutNote() {
a_pk = random_uint256(); a_pk = random_uint256();
@ -48,7 +48,7 @@ SaplingNote::SaplingNote(const SaplingPaymentAddress& address, const uint64_t va
} }
// Call librustzcash to compute the commitment // Call librustzcash to compute the commitment
uint256 SaplingNote::cm() const { boost::optional<uint256> SaplingNote::cm() const {
uint256 result; uint256 result;
if (!librustzcash_sapling_compute_cm( if (!librustzcash_sapling_compute_cm(
d.data(), d.data(),
@ -58,14 +58,14 @@ uint256 SaplingNote::cm() const {
result.begin() result.begin()
)) ))
{ {
throw std::runtime_error("librustzcash_sapling_compute_cm returned false"); return boost::none;
} }
return result; return result;
} }
// Call librustzcash to compute the nullifier // Call librustzcash to compute the nullifier
uint256 SaplingNote::nullifier(const SaplingSpendingKey& sk, const uint64_t position) const boost::optional<uint256> SaplingNote::nullifier(const SaplingSpendingKey& sk, const uint64_t position) const
{ {
auto vk = sk.full_viewing_key(); auto vk = sk.full_viewing_key();
auto ak = vk.ak; auto ak = vk.ak;
@ -83,7 +83,7 @@ uint256 SaplingNote::nullifier(const SaplingSpendingKey& sk, const uint64_t posi
result.begin() result.begin()
)) ))
{ {
throw std::runtime_error("librustzcash_sapling_compute_nf returned false"); return boost::none;
} }
return result; return result;
@ -137,5 +137,3 @@ ZCNoteEncryption::Ciphertext SproutNotePlaintext::encrypt(ZCNoteEncryption& encr
return encryptor.encrypt(pk_enc, pt); return encryptor.encrypt(pk_enc, pt);
} }
}

9
src/zcash/Note.hpp

@ -7,6 +7,7 @@
#include "NoteEncryption.hpp" #include "NoteEncryption.hpp"
#include <array> #include <array>
#include <boost/optional.hpp>
namespace libzcash { namespace libzcash {
@ -18,7 +19,6 @@ public:
BaseNote(uint64_t value) : value_(value) {}; BaseNote(uint64_t value) : value_(value) {};
virtual ~BaseNote() {}; virtual ~BaseNote() {};
virtual uint256 cm() const = 0;
inline uint64_t value() const { return value_; }; inline uint64_t value() const { return value_; };
}; };
@ -35,7 +35,7 @@ public:
virtual ~SproutNote() {}; virtual ~SproutNote() {};
virtual uint256 cm() const override; uint256 cm() const;
uint256 nullifier(const SproutSpendingKey& a_sk) const; uint256 nullifier(const SproutSpendingKey& a_sk) const;
}; };
@ -56,9 +56,8 @@ public:
virtual ~SaplingNote() {}; virtual ~SaplingNote() {};
virtual uint256 cm() const override; boost::optional<uint256> cm() const;
boost::optional<uint256> nullifier(const SaplingSpendingKey &sk, const uint64_t position) const;
uint256 nullifier(const SaplingSpendingKey &sk, const uint64_t position) const;
}; };
class BaseNotePlaintext { class BaseNotePlaintext {

Loading…
Cancel
Save