bulletproofs: add multi output bulletproofs to rct

This commit is contained in:
moneromooo-monero 2018-01-17 21:50:03 +00:00
parent f34e2e20bd
commit 9ce9f8caf6
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
13 changed files with 247 additions and 97 deletions

View file

@ -31,7 +31,9 @@
#include "gtest/gtest.h"
#include "ringct/rctOps.h"
#include "ringct/rctSigs.h"
#include "ringct/bulletproofs.h"
#include "device/device.hpp"
#include "misc_log_ex.h"
TEST(bulletproofs, valid_zero)
@ -72,6 +74,67 @@ TEST(bulletproofs, valid_multi_random)
}
}
TEST(bulletproofs, multi_splitting)
{
rct::ctkeyV sc, pc;
rct::ctkey sctmp, pctmp;
std::tie(sctmp, pctmp) = rct::ctskpkGen(6000);
sc.push_back(sctmp);
pc.push_back(pctmp);
std::tie(sctmp, pctmp) = rct::ctskpkGen(7000);
sc.push_back(sctmp);
pc.push_back(pctmp);
const int mixin = 3, max_outputs = 16;
for (int n_outputs = 1; n_outputs <= max_outputs; ++n_outputs)
{
std::vector<uint64_t> amounts;
rct::keyV amount_keys;
rct::keyV destinations;
rct::key Sk, Pk;
uint64_t available = 6000 + 7000;
uint64_t amount;
rct::ctkeyM mixRing(mixin+1);
//add output
for (size_t i = 0; i < n_outputs; ++i)
{
amount = rct::randXmrAmount(available);
amounts.push_back(amount);
amount_keys.push_back(rct::hash_to_scalar(rct::zero()));
rct::skpkGen(Sk, Pk);
destinations.push_back(Pk);
available -= amount;
}
if (!amounts.empty())
amounts.back() += available;
for (size_t j = 0; j <= mixin; ++j)
{
for (size_t i = 0; i < sc.size(); ++i)
{
if (j == 1)
mixRing[j].push_back(pc[i]);
else
mixRing[j].push_back({rct::scalarmultBase(rct::skGen()), rct::scalarmultBase(rct::skGen())});
}
}
rct::ctkeyV outSk;
rct::rctSig s = rct::genRct(rct::zero(), sc, destinations, amounts, mixRing, amount_keys, NULL, NULL, 1, outSk, rct::RangeProofMultiOutputBulletproof, hw::get_device("default"));
ASSERT_TRUE(rct::verRct(s));
for (size_t i = 0; i < n_outputs; ++i)
{
rct::key mask;
rct::decodeRct(s, amount_keys[i], i, mask, hw::get_device("default"));
ASSERT_TRUE(mask == outSk[i].mask);
}
}
}
TEST(bulletproofs, invalid_8)
{