libzcash::PaymentAddress has been renamed to libzcash::SproutPaymentAddress, and a new typedef boost::variant is now libzcash::PaymentAddress. Similarly for ViewingKey and SpendingKey. A new class InvalidEncoding is introduced as the default boost::variant option for each address and key type; it is used during decoding instead of boost::optional. All address and key storage functions in the wallet have been modified to refer specifically to the Sprout types, as they are used very precisely. In most other cases, the more general type is leveraged as much as possible, and we convert to the Sprout type when necessary. This will be subsequently wrapped in, or replaced with, context-specific functions once Sapling types are implemented.
86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include "primitives/transaction.h"
|
|
#include "zcash/Note.hpp"
|
|
#include "zcash/Address.hpp"
|
|
|
|
extern ZCJoinSplit* params;
|
|
extern int GenZero(int n);
|
|
extern int GenMax(int n);
|
|
|
|
TEST(Transaction, JSDescriptionRandomized) {
|
|
// construct a merkle tree
|
|
ZCIncrementalMerkleTree 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 pubKeyHash;
|
|
boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS> inputs = {
|
|
libzcash::JSInput(witness, note, k),
|
|
libzcash::JSInput() // dummy input of zero value
|
|
};
|
|
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs = {
|
|
libzcash::JSOutput(addr, 50),
|
|
libzcash::JSOutput(addr, 50)
|
|
};
|
|
boost::array<size_t, ZC_NUM_JS_INPUTS> inputMap;
|
|
boost::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap;
|
|
|
|
{
|
|
auto jsdesc = JSDescription::Randomized(
|
|
*params, pubKeyHash, rt,
|
|
inputs, outputs,
|
|
inputMap, outputMap,
|
|
0, 0, false);
|
|
|
|
std::set<size_t> inputSet(inputMap.begin(), inputMap.end());
|
|
std::set<size_t> expectedInputSet {0, 1};
|
|
EXPECT_EQ(expectedInputSet, inputSet);
|
|
|
|
std::set<size_t> outputSet(outputMap.begin(), outputMap.end());
|
|
std::set<size_t> expectedOutputSet {0, 1};
|
|
EXPECT_EQ(expectedOutputSet, outputSet);
|
|
}
|
|
|
|
{
|
|
auto jsdesc = JSDescription::Randomized(
|
|
*params, pubKeyHash, rt,
|
|
inputs, outputs,
|
|
inputMap, outputMap,
|
|
0, 0, false, nullptr, GenZero);
|
|
|
|
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {1, 0};
|
|
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {1, 0};
|
|
EXPECT_EQ(expectedInputMap, inputMap);
|
|
EXPECT_EQ(expectedOutputMap, outputMap);
|
|
}
|
|
|
|
{
|
|
auto jsdesc = JSDescription::Randomized(
|
|
*params, pubKeyHash, rt,
|
|
inputs, outputs,
|
|
inputMap, outputMap,
|
|
0, 0, false, nullptr, GenMax);
|
|
|
|
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {0, 1};
|
|
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {0, 1};
|
|
EXPECT_EQ(expectedInputMap, inputMap);
|
|
EXPECT_EQ(expectedOutputMap, outputMap);
|
|
}
|
|
}
|