aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-09-21 20:42:41 +0200
committerRiccardo Spagni <ric@spagni.net>2018-09-21 20:42:41 +0200
commit4a652d6b52c60d169a0ccdc537afa5353c206b7c (patch)
treeecbf9038109f3f8d852078deff572d25936dffc8
parentMerge pull request #4378 (diff)
parentrct: avoid repeated unnecessary conversions when accummulating (diff)
downloadmonero-4a652d6b52c60d169a0ccdc537afa5353c206b7c.tar.xz
Merge pull request #4379
607301bf rct: avoid repeated unnecessary conversions when accummulating (moneromooo-monero)
-rw-r--r--src/ringct/rctOps.cpp19
-rw-r--r--src/ringct/rctOps.h1
-rw-r--r--src/ringct/rctSigs.cpp12
3 files changed, 25 insertions, 7 deletions
diff --git a/src/ringct/rctOps.cpp b/src/ringct/rctOps.cpp
index 6c3c4500e..41bbf6ca3 100644
--- a/src/ringct/rctOps.cpp
+++ b/src/ringct/rctOps.cpp
@@ -252,6 +252,25 @@ namespace rct {
return k;
}
+ rct::key addKeys(const keyV &A) {
+ if (A.empty())
+ return rct::identity();
+ ge_p3 p3, tmp;
+ CHECK_AND_ASSERT_THROW_MES_L1(ge_frombytes_vartime(&p3, A[0].bytes) == 0, "ge_frombytes_vartime failed at "+boost::lexical_cast<std::string>(__LINE__));
+ for (size_t i = 1; i < A.size(); ++i)
+ {
+ CHECK_AND_ASSERT_THROW_MES_L1(ge_frombytes_vartime(&tmp, A[i].bytes) == 0, "ge_frombytes_vartime failed at "+boost::lexical_cast<std::string>(__LINE__));
+ ge_cached p2;
+ ge_p3_to_cached(&p2, &tmp);
+ ge_p1p1 p1;
+ ge_add(&p1, &p3, &p2);
+ ge_p1p1_to_p3(&p3, &p1);
+ }
+ rct::key res;
+ ge_p3_tobytes(res.bytes, &p3);
+ return res;
+ }
+
//addKeys1
//aGB = aG + B where a is a scalar, G is the basepoint, and B is a point
void addKeys1(key &aGB, const key &a, const key & B) {
diff --git a/src/ringct/rctOps.h b/src/ringct/rctOps.h
index 50645821c..60e920b3a 100644
--- a/src/ringct/rctOps.h
+++ b/src/ringct/rctOps.h
@@ -132,6 +132,7 @@ namespace rct {
//for curve points: AB = A + B
void addKeys(key &AB, const key &A, const key &B);
rct::key addKeys(const key &A, const key &B);
+ rct::key addKeys(const keyV &A);
//aGB = aG + B where a is a scalar, G is the basepoint, and B is a point
void addKeys1(key &aGB, const key &a, const key & B);
//aGbB = aG + bB where a, b are scalars, G is the basepoint and B is a point
diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp
index fe0cd9c57..0d1789a38 100644
--- a/src/ringct/rctSigs.cpp
+++ b/src/ringct/rctSigs.cpp
@@ -963,18 +963,16 @@ namespace rct {
const bool bulletproof = is_rct_bulletproof(rv.type);
const keyV &pseudoOuts = bulletproof ? rv.p.pseudoOuts : rv.pseudoOuts;
- key sumOutpks = identity();
+ rct::keyV masks(rv.outPk.size());
for (size_t i = 0; i < rv.outPk.size(); i++) {
- addKeys(sumOutpks, sumOutpks, rv.outPk[i].mask);
+ masks[i] = rv.outPk[i].mask;
}
+ key sumOutpks = addKeys(masks);
DP(sumOutpks);
- key txnFeeKey = scalarmultH(d2h(rv.txnFee));
+ const key txnFeeKey = scalarmultH(d2h(rv.txnFee));
addKeys(sumOutpks, txnFeeKey, sumOutpks);
- key sumPseudoOuts = identity();
- for (size_t i = 0 ; i < pseudoOuts.size() ; i++) {
- addKeys(sumPseudoOuts, sumPseudoOuts, pseudoOuts[i]);
- }
+ key sumPseudoOuts = addKeys(pseudoOuts);
DP(sumPseudoOuts);
//check pseudoOuts vs Outs..