Introduce `zcsamplejoinsplit` for creating a raw joinsplit description, and use it to construct the joinsplit for the performance tests that verify joinsplits.

This commit is contained in:
Sean Bowe 2016-07-19 15:49:11 -06:00
parent d20d866d89
commit 1737627c4e
4 changed files with 49 additions and 18 deletions

View File

@ -52,6 +52,17 @@ function zcashd_valgrind_stop {
cat valgrind.out cat valgrind.out
} }
# Precomputation
case "$1" in
*)
case "$2" in
verifyjoinsplit)
zcashd_start
RAWJOINSPLIT=$(zcash_rpc zcsamplejoinsplit)
zcashd_stop
esac
esac
case "$1" in case "$1" in
time) time)
zcashd_start zcashd_start
@ -66,7 +77,7 @@ case "$1" in
zcash_rpc zcbenchmark createjoinsplit 10 zcash_rpc zcbenchmark createjoinsplit 10
;; ;;
verifyjoinsplit) verifyjoinsplit)
zcash_rpc zcbenchmark verifyjoinsplit 1000 zcash_rpc zcbenchmark verifyjoinsplit 1000 "$RAWJOINSPLIT"
;; ;;
solveequihash) solveequihash)
zcash_rpc zcbenchmark solveequihash 10 zcash_rpc zcbenchmark solveequihash 10
@ -97,7 +108,7 @@ case "$1" in
zcash_rpc zcbenchmark createjoinsplit 1 zcash_rpc zcbenchmark createjoinsplit 1
;; ;;
verifyjoinsplit) verifyjoinsplit)
zcash_rpc zcbenchmark verifyjoinsplit 1 zcash_rpc zcbenchmark verifyjoinsplit 1 "$RAWJOINSPLIT"
;; ;;
solveequihash) solveequihash)
zcash_rpc zcbenchmark solveequihash 1 zcash_rpc zcbenchmark solveequihash 1
@ -126,7 +137,7 @@ case "$1" in
zcash_rpc zcbenchmark createjoinsplit 1 zcash_rpc zcbenchmark createjoinsplit 1
;; ;;
verifyjoinsplit) verifyjoinsplit)
zcash_rpc zcbenchmark verifyjoinsplit 1 zcash_rpc zcbenchmark verifyjoinsplit 1 "$RAWJOINSPLIT"
;; ;;
solveequihash) solveequihash)
zcash_rpc zcbenchmark solveequihash 1 zcash_rpc zcbenchmark solveequihash 1

View File

@ -380,7 +380,8 @@ static const CRPCCommand vRPCCommands[] =
{ "wallet", "zcbenchmark", &zc_benchmark, true }, { "wallet", "zcbenchmark", &zc_benchmark, true },
{ "wallet", "zcrawkeygen", &zc_raw_keygen, true }, { "wallet", "zcrawkeygen", &zc_raw_keygen, true },
{ "wallet", "zcrawjoinsplit", &zc_raw_joinsplit, true }, { "wallet", "zcrawjoinsplit", &zc_raw_joinsplit, true },
{ "wallet", "zcrawreceive", &zc_raw_receive, true } { "wallet", "zcrawreceive", &zc_raw_receive, true },
{ "wallet", "zcsamplejoinsplit", &zc_sample_joinsplit, true }
#endif // ENABLE_WALLET #endif // ENABLE_WALLET
}; };

View File

@ -212,6 +212,7 @@ extern json_spirit::Value zc_benchmark(const json_spirit::Array& params, bool fH
extern json_spirit::Value zc_raw_keygen(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value zc_raw_keygen(const json_spirit::Array& params, bool fHelp);
extern json_spirit::Value zc_raw_joinsplit(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value zc_raw_joinsplit(const json_spirit::Array& params, bool fHelp);
extern json_spirit::Value zc_raw_receive(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value zc_raw_receive(const json_spirit::Array& params, bool fHelp);
extern json_spirit::Value zc_sample_joinsplit(const json_spirit::Array& params, bool fHelp);
extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp
extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp);

View File

@ -2351,6 +2351,34 @@ Value listunspent(const Array& params, bool fHelp)
return results; return results;
} }
Value zc_sample_joinsplit(const json_spirit::Array& params, bool fHelp)
{
if (fHelp) {
throw runtime_error(
"zcsamplejoinsplit\n"
"\n"
"Perform a joinsplit and return the JSDescription.\n"
);
}
LOCK(cs_main);
uint256 pubKeyHash;
uint256 anchor = ZCIncrementalMerkleTree().root();
JSDescription samplejoinsplit(*pzcashParams,
pubKeyHash,
anchor,
{JSInput(), JSInput()},
{JSOutput(), JSOutput()},
0,
0);
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
ss << samplejoinsplit;
return HexStr(ss.begin(), ss.end());
}
Value zc_benchmark(const json_spirit::Array& params, bool fHelp) Value zc_benchmark(const json_spirit::Array& params, bool fHelp)
{ {
if (!EnsureWalletIsAvailable(fHelp)) { if (!EnsureWalletIsAvailable(fHelp)) {
@ -2393,18 +2421,11 @@ Value zc_benchmark(const json_spirit::Array& params, bool fHelp)
pzcashParams->loadProvingKey(); pzcashParams->loadProvingKey();
} }
JSDescription* samplejoinsplit = NULL; JSDescription samplejoinsplit;
if (benchmarktype == "verifyjoinsplit") { if (benchmarktype == "verifyjoinsplit") {
uint256 pubKeyHash; CDataStream ss(ParseHexV(params[2].get_str(), "js"), SER_NETWORK, PROTOCOL_VERSION);
uint256 anchor = ZCIncrementalMerkleTree().root(); ss >> samplejoinsplit;
samplejoinsplit = new JSDescription(*pzcashParams,
pubKeyHash,
anchor,
{JSInput(), JSInput()},
{JSOutput(), JSOutput()},
0,
0);
} }
for (int i = 0; i < samplecount; i++) { for (int i = 0; i < samplecount; i++) {
@ -2415,7 +2436,7 @@ Value zc_benchmark(const json_spirit::Array& params, bool fHelp)
} else if (benchmarktype == "createjoinsplit") { } else if (benchmarktype == "createjoinsplit") {
sample_times.push_back(benchmark_create_joinsplit()); sample_times.push_back(benchmark_create_joinsplit());
} else if (benchmarktype == "verifyjoinsplit") { } else if (benchmarktype == "verifyjoinsplit") {
sample_times.push_back(benchmark_verify_joinsplit(*samplejoinsplit)); sample_times.push_back(benchmark_verify_joinsplit(samplejoinsplit));
} else if (benchmarktype == "solveequihash") { } else if (benchmarktype == "solveequihash") {
sample_times.push_back(benchmark_solve_equihash()); sample_times.push_back(benchmark_solve_equihash());
} else if (benchmarktype == "verifyequihash") { } else if (benchmarktype == "verifyequihash") {
@ -2423,13 +2444,10 @@ Value zc_benchmark(const json_spirit::Array& params, bool fHelp)
} else if (benchmarktype == "validatelargetx") { } else if (benchmarktype == "validatelargetx") {
sample_times.push_back(benchmark_large_tx()); sample_times.push_back(benchmark_large_tx());
} else { } else {
delete samplejoinsplit;
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype"); throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype");
} }
} }
delete samplejoinsplit;
Array results; Array results;
for (int i = 0; i < samplecount; i++) { for (int i = 0; i < samplecount; i++) {
Object result; Object result;