From 7f0aa74666acf962bc37dca21339bb438a2195b1 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 18 Oct 2016 00:22:58 -0500 Subject: [PATCH] Implement static method for creating a randomized JSDescription --- src/primitives/transaction.cpp | 24 ++++++++++++++++++++++++ src/primitives/transaction.h | 13 +++++++++++++ src/test/transaction_tests.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 1cedd6f27..704b10a5c 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -6,6 +6,7 @@ #include "primitives/transaction.h" #include "hash.h" +#include "random.h" #include "tinyformat.h" #include "utilstrencodings.h" @@ -41,6 +42,29 @@ JSDescription::JSDescription(ZCJoinSplit& params, ); } +JSDescription JSDescription::Randomized( + ZCJoinSplit& params, + const uint256& pubKeyHash, + const uint256& anchor, + boost::array& inputs, + boost::array& outputs, + boost::array& inputMap, + boost::array& outputMap, + CAmount vpub_old, + CAmount vpub_new, + bool computeProof) +{ + // Randomize the order of the inputs and outputs + inputMap = {0, 1}; + outputMap = {0, 1}; + MappedShuffle(inputs.begin(), inputMap.begin(), ZC_NUM_JS_INPUTS, GetRandInt); + MappedShuffle(outputs.begin(), outputMap.begin(), ZC_NUM_JS_OUTPUTS, GetRandInt); + + return JSDescription( + params, pubKeyHash, anchor, inputs, outputs, + vpub_old, vpub_new, computeProof); +} + bool JSDescription::Verify( ZCJoinSplit& params, const uint256& pubKeyHash diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 2e83773c4..b665033d8 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -78,6 +78,19 @@ public: bool computeProof = true // Set to false in some tests ); + static JSDescription Randomized( + ZCJoinSplit& params, + const uint256& pubKeyHash, + const uint256& rt, + boost::array& inputs, + boost::array& outputs, + boost::array& inputMap, + boost::array& outputMap, + CAmount vpub_old, + CAmount vpub_new, + bool computeProof = true // Set to false in some tests + ); + // Verifies that the JoinSplit proof is correct. bool Verify(ZCJoinSplit& params, const uint256& pubKeyHash) const; diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index c2b0a7017..e7a932a4f 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -368,6 +368,32 @@ BOOST_AUTO_TEST_CASE(test_basic_joinsplit_verification) BOOST_CHECK(!test.Verify(*p, pubKeyHash)); } + { + boost::array inputMap; + boost::array outputMap; + auto jsdesc = JSDescription::Randomized( + *p, pubKeyHash, rt, + inputs, outputs, + inputMap, outputMap, + 0, 0); + BOOST_CHECK(jsdesc.Verify(*p, pubKeyHash)); + + std::set inputSet; + for (size_t i = 0; i < ZC_NUM_JS_INPUTS; i++) { + inputSet.insert(inputMap[i]); + } + std::set expectedInputSet {0, 1}; + BOOST_CHECK(expectedInputSet == inputSet); + + std::set outputSet; + for (size_t i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + outputSet.insert(outputMap[i]); + } + std::set expectedOutputSet {0, 1}; + BOOST_CHECK(expectedOutputSet == outputSet); + } + + delete p; }