Skip to content

Commit 54ee88d

Browse files
process scalar_to_epns digits 2 by 2 to avoid dealing with alternating scalar_negative bool (-30%) (#324)
1 parent 704a8c6 commit 54ee88d

File tree

6 files changed

+32
-79
lines changed

6 files changed

+32
-79
lines changed

hydra/garaga/starknet/groth16_contract_generator/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from garaga.starknet.cli.utils import create_directory, get_package_version
99
from garaga.starknet.groth16_contract_generator.parsing_utils import Groth16VerifyingKey
1010

11-
ECIP_OPS_CLASS_HASH = 0x54234B153BAA38A35C69A075C50F3F868B3436A60AE5D19E1A7687E716B30F7
11+
ECIP_OPS_CLASS_HASH = 0x25387ED45CD336DBDCA62F1EEC9AC2A393EFA68AE197843CBD1BC7F15CBF1B3
1212
CAIRO_VERSION = "2.11.2"
1313

1414

src/contracts/groth16_example_bls12_381/src/groth16_verifier.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ mod Groth16VerifierBLS12_381 {
1818
use super::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk};
1919

2020
const ECIP_OPS_CLASS_HASH: felt252 =
21-
0x54234b153baa38a35c69a075c50f3f868b3436a60ae5d19e1a7687e716b30f7;
21+
0x25387ed45cd336dbdca62f1eec9ac2a393efa68ae197843cbd1bc7f15cbf1b3;
2222

2323
#[storage]
2424
struct Storage {}

src/contracts/groth16_example_bn254/src/groth16_verifier.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ mod Groth16VerifierBN254 {
1818
use super::{N_PUBLIC_INPUTS, ic, precomputed_lines, vk};
1919

2020
const ECIP_OPS_CLASS_HASH: felt252 =
21-
0x54234b153baa38a35c69a075c50f3f868b3436a60ae5d19e1a7687e716b30f7;
21+
0x25387ed45cd336dbdca62f1eec9ac2a393efa68ae197843cbd1bc7f15cbf1b3;
2222

2323
#[storage]
2424
struct Storage {}

src/contracts/risc0_sample_app/fibonacci_sequencer/src/lib.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod FibonacciSequencer {
1111
use core::starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
1212

1313
pub const RISC_ZERO_VERIFIER_CLASS_HASH: felt252 =
14-
0x69048809c792c02edfcdb2237889207a89cd030ec0dd7a8c763e21453ff51a8;
14+
0x5c3032adf35586059bcbf2ab30aaf42f024eff74a0a5f43196d194f2db93402;
1515

1616
#[storage]
1717
struct Storage {

src/contracts/risc0_verifier_bn254/src/groth16_verifier.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ mod Risc0Groth16VerifierBN254 {
1919
use super::{N_FREE_PUBLIC_INPUTS, T, ic, precomputed_lines, vk};
2020

2121
const ECIP_OPS_CLASS_HASH: felt252 =
22-
0x54234b153baa38a35c69a075c50f3f868b3436a60ae5d19e1a7687e716b30f7;
22+
0x25387ed45cd336dbdca62f1eec9ac2a393efa68ae197843cbd1bc7f15cbf1b3;
2323

2424
#[storage]
2525
struct Storage {}

src/src/utils/neg_3.cairo

Lines changed: 27 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -25,49 +25,6 @@ pub fn sign_to_u384(sign: felt252, curve_index: usize) -> u384 {
2525
}
2626
}
2727

28-
// Decomposes a scalar into base -3 representation.
29-
// :param scalar: The integer to be decomposed.
30-
// :return: A list of coefficients in base -3 representation. (Least significant bit first),
31-
// with digits [-1, 0, 1] such that scalar = sum((-3) ** i * d for (i, d) in enumerate(digits))
32-
pub fn neg_3_base_le(scalar: u128) -> Array<felt252> {
33-
let mut digits: Array<felt252> = ArrayTrait::new();
34-
35-
if scalar == 0 {
36-
digits.append(0);
37-
return digits;
38-
}
39-
40-
let mut scalar: u128 = scalar;
41-
42-
let mut scalar_negative: bool = false;
43-
44-
while scalar != 0 {
45-
let (q, r) = core::traits::DivRem::div_rem(scalar, 3);
46-
let r: felt252 = r.into();
47-
48-
if r == 2 {
49-
if scalar_negative {
50-
scalar = q + 1;
51-
digits.append(1);
52-
} else {
53-
scalar = q + 1;
54-
digits.append(-1);
55-
}
56-
} else {
57-
if scalar_negative {
58-
scalar = q;
59-
digits.append(-r);
60-
} else {
61-
scalar = q;
62-
digits.append(r);
63-
}
64-
}
65-
scalar_negative = !scalar_negative;
66-
}
67-
68-
return digits;
69-
}
70-
7128
pub fn u256_array_to_low_high_epns(
7229
scalars: Span<u256>,
7330
scalars_digits_decompositions: Option<Span<(Span<felt252>, Span<felt252>)>>,
@@ -146,31 +103,35 @@ pub fn scalar_to_epns(mut scalar: u128) -> (felt252, felt252, felt252, felt252)
146103

147104
let mut base_power = 1; // Init to (-3)^0
148105

149-
let mut scalar_negative: bool = false;
150-
151106
while scalar != 0 {
152-
let (q, r) = core::traits::DivRem::div_rem(scalar, 3);
153-
let r: felt252 = r.into();
154-
if r == 0 {
155-
scalar = q;
156-
} else if r == 2 {
157-
if scalar_negative {
158-
scalar = q + 1;
159-
sum_p += base_power;
160-
} else {
161-
scalar = q + 1;
162-
sum_n += base_power;
163-
}
107+
let (q0, r0) = core::traits::DivRem::div_rem(scalar, 3);
108+
let r0: felt252 = r0.into();
109+
if r0 == 0 {
110+
scalar = q0;
111+
} else if r0 == 2 {
112+
scalar = q0 + 1;
113+
sum_n += base_power;
164114
} else {
165-
if scalar_negative {
166-
scalar = q;
167-
sum_n += base_power;
168-
} else {
169-
scalar = q;
170-
sum_p += base_power;
171-
}
115+
scalar = q0;
116+
sum_p += base_power;
117+
}
118+
if scalar == 0 {
119+
break;
172120
}
173-
scalar_negative = !scalar_negative;
121+
base_power = base_power * (-3);
122+
let (q1, r1) = core::traits::DivRem::div_rem(scalar, 3);
123+
let r1: felt252 = r1.into();
124+
125+
if r1 == 0 {
126+
scalar = q1;
127+
} else if r1 == 2 {
128+
scalar = q1 + 1;
129+
sum_p += base_power;
130+
} else {
131+
scalar = q1;
132+
sum_n += base_power;
133+
}
134+
174135
base_power = base_power * (-3);
175136
}
176137

@@ -216,7 +177,7 @@ pub fn scalar_to_epns_with_digits(
216177
mod tests {
217178
use core::circuit::u384;
218179
use core::traits::TryInto;
219-
use super::{neg_3_base_le, scalar_to_epns};
180+
use super::scalar_to_epns;
220181

221182
#[test]
222183
fn test_scalar_to_epns() {
@@ -278,13 +239,5 @@ mod tests {
278239
assert_eq!(sign_p, 1);
279240
assert_eq!(sign_n, -1);
280241
}
281-
#[test]
282-
fn test_neg_3_base_le_single() {
283-
let digits: Array<felt252> = neg_3_base_le(16);
284-
285-
let expected: Array<felt252> = array![1, 1, -1, -1];
286-
287-
assert_eq!(digits, expected);
288-
}
289242
}
290243

0 commit comments

Comments
 (0)