Skip to content

Commit b87620e

Browse files
committed
Use pre-computed generator tables
1 parent d89f1bb commit b87620e

File tree

3 files changed

+23
-22
lines changed

3 files changed

+23
-22
lines changed

ergo-chain-types/src/ec_point.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use alloc::string::String;
44
use core::convert::TryFrom;
55
use core::ops::{Add, Mul, Neg};
66
use derive_more::{From, Into};
7+
use elliptic_curve::ops::MulByGenerator;
78
use k256::elliptic_curve::group::prime::PrimeCurveAffine;
89
use k256::elliptic_curve::sec1::ToEncodedPoint;
910
use k256::{ProjectivePoint, PublicKey, Scalar};
@@ -117,6 +118,11 @@ pub fn exponentiate(base: &EcPoint, exponent: &Scalar) -> EcPoint {
117118
}
118119
}
119120

121+
/// Raise the generator g to the exponent. This is faster than exponentiate(&generator(), exponent)
122+
pub fn exponentiate_gen(exponent: &Scalar) -> EcPoint {
123+
ProjectivePoint::mul_by_generator(exponent).into()
124+
}
125+
120126
impl ScorexSerializable for EcPoint {
121127
fn scorex_serialize<W: WriteSigmaVlqExt>(&self, w: &mut W) -> ScorexSerializeResult {
122128
let caff = self.0.to_affine();

ergotree-interpreter/src/sigma_protocol/dlog_protocol.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@ pub mod interactive_prover {
4848
use crate::sigma_protocol::{private_input::DlogProverInput, Challenge};
4949
use blake2::Blake2b;
5050
use blake2::Digest;
51-
use elliptic_curve::ops::MulByGenerator;
51+
use ergo_chain_types::ec_point::exponentiate_gen;
5252
use ergo_chain_types::{
53-
ec_point::{exponentiate, generator, inverse},
53+
ec_point::{exponentiate, inverse},
5454
EcPoint,
5555
};
5656
use ergotree_ir::serialization::SigmaSerializable;
5757
use ergotree_ir::sigma_protocol::sigma_boolean::ProveDlog;
5858
use k256::elliptic_curve::ops::Reduce;
59-
use k256::{ProjectivePoint, Scalar};
59+
use k256::Scalar;
6060

6161
/// Step 5 from <https://ergoplatform.org/docs/ErgoScript.pdf>
6262
/// For every leaf marked “simulated”, use the simulator of the sigma protocol for that leaf
@@ -77,7 +77,7 @@ pub mod interactive_prover {
7777
let e: Scalar = challenge.clone().into();
7878
let minus_e = e.negate();
7979
let h_to_e = exponentiate(&public_input.h, &minus_e);
80-
let g_to_z = exponentiate(&generator(), &z);
80+
let g_to_z = exponentiate_gen(&z);
8181
let a = g_to_z * &h_to_e;
8282
(
8383
FirstDlogProverMessage { a: a.into() },
@@ -91,11 +91,10 @@ pub mod interactive_prover {
9191
#[cfg(feature = "std")]
9292
pub fn first_message() -> (Wscalar, FirstDlogProverMessage) {
9393
use ergotree_ir::sigma_protocol::dlog_group;
94-
let r = dlog_group::random_scalar_in_group_range(
95-
crate::sigma_protocol::crypto_utils::secure_rng(),
96-
);
97-
let g = generator();
98-
let a = exponentiate(&g, &r);
94+
95+
use crate::sigma_protocol::crypto_utils;
96+
let r = dlog_group::random_scalar_in_group_range(crypto_utils::secure_rng());
97+
let a = exponentiate_gen(&r);
9998
(r.into(), FirstDlogProverMessage { a: a.into() })
10099
}
101100

@@ -137,7 +136,7 @@ pub mod interactive_prover {
137136
(
138137
r.into(),
139138
FirstDlogProverMessage {
140-
a: Box::new(ProjectivePoint::mul_by_generator(&r).into()),
139+
a: Box::new(exponentiate_gen(&r)),
141140
},
142141
)
143142
}
@@ -169,10 +168,9 @@ pub mod interactive_prover {
169168
challenge: &Challenge,
170169
second_message: &SecondDlogProverMessage,
171170
) -> EcPoint {
172-
let g = generator();
173171
let h = *proposition.h.clone();
174172
let e: Scalar = challenge.clone().into();
175-
let g_z = exponentiate(&g, second_message.z.as_scalar_ref());
173+
let g_z = exponentiate_gen(second_message.z.as_scalar_ref());
176174
let h_e = exponentiate(&h, &e);
177175
g_z * &inverse(&h_e)
178176
}

ergotree-interpreter/src/sigma_protocol/private_input.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use core::convert::TryInto;
33
use core::fmt::Formatter;
44

55
use alloc::vec::Vec;
6-
use elliptic_curve::ops::MulByGenerator;
6+
use ergo_chain_types::ec_point::exponentiate_gen;
77
use ergo_chain_types::EcPoint;
88
use ergotree_ir::serialization::SigmaSerializable;
99
use ergotree_ir::sigma_protocol::sigma_boolean::ProveDhTuple;
@@ -14,7 +14,6 @@ use ergotree_ir::sigma_protocol::sigma_boolean::SigmaBoolean;
1414
extern crate derive_more;
1515
use derive_more::From;
1616
use k256::elliptic_curve::PrimeField;
17-
use k256::ProjectivePoint;
1817
use num_bigint::BigUint;
1918
use num_traits::ToPrimitive;
2019

@@ -56,7 +55,7 @@ impl DlogProverInput {
5655
/// Create new DlogProverInput
5756
pub fn new(w: Wscalar) -> DlogProverInput {
5857
Self {
59-
pk: EcPoint::from(ProjectivePoint::mul_by_generator(w.as_scalar_ref())),
58+
pk: exponentiate_gen(w.as_scalar_ref()),
6059
w,
6160
}
6261
}
@@ -154,15 +153,13 @@ impl DhTupleProverInput {
154153
pub fn random() -> DhTupleProverInput {
155154
use ergo_chain_types::ec_point::{exponentiate, generator};
156155
use ergotree_ir::sigma_protocol::dlog_group;
157-
let g = generator();
158-
let h = exponentiate(
159-
&generator(),
160-
&dlog_group::random_scalar_in_group_range(super::crypto_utils::secure_rng()),
161-
);
156+
let h = exponentiate_gen(&dlog_group::random_scalar_in_group_range(
157+
super::crypto_utils::secure_rng(),
158+
));
162159
let w = dlog_group::random_scalar_in_group_range(super::crypto_utils::secure_rng());
163-
let u = exponentiate(&g, &w);
160+
let u = exponentiate_gen(&w);
164161
let v = exponentiate(&h, &w);
165-
let common_input = ProveDhTuple::new(g, h, u, v);
162+
let common_input = ProveDhTuple::new(generator(), h, u, v);
166163
DhTupleProverInput {
167164
w: w.into(),
168165
common_input,

0 commit comments

Comments
 (0)