#include #include "primitives/transaction.h" #include "zcash/Note.hpp" #include "zcash/Address.hpp" #include extern ZCJoinSplit* params; extern int GenZero(int n); extern int GenMax(int n); TEST(Transaction, JSDescriptionRandomized) { // construct a merkle tree SproutMerkleTree merkleTree; libzcash::SproutSpendingKey k = libzcash::SproutSpendingKey::random(); libzcash::SproutPaymentAddress addr = k.address(); libzcash::SproutNote note(addr.a_pk, 100, uint256(), uint256()); // commitment from coin uint256 commitment = note.cm(); // insert commitment into the merkle tree merkleTree.append(commitment); // compute the merkle root we will be working with uint256 rt = merkleTree.root(); auto witness = merkleTree.witness(); // create JSDescription uint256 joinSplitPubKey; std::array inputs = { libzcash::JSInput(witness, note, k), libzcash::JSInput() // dummy input of zero value }; std::array outputs = { libzcash::JSOutput(addr, 50), libzcash::JSOutput(addr, 50) }; std::array inputMap; std::array outputMap; { auto jsdesc = JSDescription::Randomized( false, *params, joinSplitPubKey, rt, inputs, outputs, inputMap, outputMap, 0, 0, false); std::set inputSet(inputMap.begin(), inputMap.end()); std::set expectedInputSet {0, 1}; EXPECT_EQ(expectedInputSet, inputSet); std::set outputSet(outputMap.begin(), outputMap.end()); std::set expectedOutputSet {0, 1}; EXPECT_EQ(expectedOutputSet, outputSet); } { auto jsdesc = JSDescription::Randomized( false, *params, joinSplitPubKey, rt, inputs, outputs, inputMap, outputMap, 0, 0, false, nullptr, GenZero); std::array expectedInputMap {1, 0}; std::array expectedOutputMap {1, 0}; EXPECT_EQ(expectedInputMap, inputMap); EXPECT_EQ(expectedOutputMap, outputMap); } { auto jsdesc = JSDescription::Randomized( false, *params, joinSplitPubKey, rt, inputs, outputs, inputMap, outputMap, 0, 0, false, nullptr, GenMax); std::array expectedInputMap {0, 1}; std::array expectedOutputMap {0, 1}; EXPECT_EQ(expectedInputMap, inputMap); EXPECT_EQ(expectedOutputMap, outputMap); } }