Add SaplingNote class and test_sapling_note unit test.

This commit is contained in:
Simon
2018-06-08 15:25:15 -07:00
parent 847df81f09
commit 36e2e7cc32
5 changed files with 150 additions and 2 deletions

View File

@@ -2,10 +2,12 @@
#include "prf.h"
#include "crypto/sha256.h"
#include "random.h"
#include "version.h"
#include "streams.h"
#include "zcash/util.h"
#include "librustzcash.h"
namespace libzcash {
@@ -38,6 +40,59 @@ uint256 SproutNote::nullifier(const SproutSpendingKey& a_sk) const {
return PRF_nf(a_sk, rho);
}
// Create a note based on a given spending key, with random r and value. Useful for testing.
SaplingNote SaplingNote::random(const SaplingSpendingKey& sk) {
auto addr = sk.default_address().get();
auto d = addr.d;
auto pk_d = addr.pk_d;
uint256 r;
librustzcash_sapling_generate_r(r.begin());
auto value = GetRand(10000);
return SaplingNote(d, pk_d, value, r);
}
// Call librustzcash to compute the commitment
uint256 SaplingNote::cm() const {
uint256 result;
if (!librustzcash_sapling_compute_cm(
d.data(),
pk_d.begin(),
value(),
r.begin(),
result.begin()
))
{
throw std::runtime_error("librustzcash_sapling_compute_cm returned false");
}
return result;
}
// Call librustzcash to compute the nullifier
uint256 SaplingNote::nullifier(const SaplingSpendingKey& sk, const uint64_t position) const
{
auto vk = sk.full_viewing_key();
auto ak = vk.ak;
auto nk = vk.nk;
uint256 result;
if (!librustzcash_sapling_compute_nf(
d.data(),
pk_d.begin(),
value(),
r.begin(),
ak.begin(),
nk.begin(),
position,
result.begin()
))
{
throw std::runtime_error("librustzcash_sapling_compute_nf returned false");
}
return result;
}
SproutNotePlaintext::SproutNotePlaintext(
const SproutNote& note,
std::array<unsigned char, ZC_MEMO_SIZE> memo) : BaseNotePlaintext(note, memo)