1 #include <gtest/gtest.h>
3 #include "primitives/transaction.h"
4 #include "zcash/Note.hpp"
5 #include "zcash/Address.hpp"
7 extern ZCJoinSplit* params;
8 extern int GenZero(int n);
9 extern int GenMax(int n);
11 TEST(Transaction, JSDescriptionRandomized) {
12 // construct a merkle tree
13 ZCIncrementalMerkleTree merkleTree;
15 libzcash::SpendingKey k = libzcash::SpendingKey::random();
16 libzcash::PaymentAddress addr = k.address();
18 libzcash::Note note(addr.a_pk, 100, uint256(), uint256());
20 // commitment from coin
21 uint256 commitment = note.cm();
23 // insert commitment into the merkle tree
24 merkleTree.append(commitment);
26 // compute the merkle root we will be working with
27 uint256 rt = merkleTree.root();
29 auto witness = merkleTree.witness();
31 // create JSDescription
33 boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS> inputs = {
34 libzcash::JSInput(witness, note, k),
35 libzcash::JSInput() // dummy input of zero value
37 boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs = {
38 libzcash::JSOutput(addr, 50),
39 libzcash::JSOutput(addr, 50)
41 std::array<size_t, ZC_NUM_JS_INPUTS> inputMap;
42 std::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap;
45 auto jsdesc = JSDescription::Randomized(
46 *params, pubKeyHash, rt,
51 #ifdef __LP64__ // required for building on MacOS
52 std::set<uint64_t> inputSet(inputMap.begin(), inputMap.end());
53 std::set<uint64_t> expectedInputSet {0, 1};
55 std::set<size_t> inputSet(inputMap.begin(), inputMap.end());
56 std::set<size_t> expectedInputSet {0, 1};
58 EXPECT_EQ(expectedInputSet, inputSet);
60 std::set<size_t> outputSet(outputMap.begin(), outputMap.end());
61 std::set<size_t> expectedOutputSet {0, 1};
62 EXPECT_EQ(expectedOutputSet, outputSet);
66 auto jsdesc = JSDescription::Randomized(
67 *params, pubKeyHash, rt,
70 0, 0, false, GenZero);
72 std::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {1, 0};
73 std::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {1, 0};
74 EXPECT_EQ(expectedInputMap, inputMap);
75 EXPECT_EQ(expectedOutputMap, outputMap);
79 auto jsdesc = JSDescription::Randomized(
80 *params, pubKeyHash, rt,
85 boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {0, 1};
86 boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {0, 1};
87 EXPECT_EQ(expectedInputMap, inputMap);
88 EXPECT_EQ(expectedOutputMap, outputMap);