@@ -85,55 +85,30 @@ impl ScalarMultiplyChip {
85
85
) -> Result < GrumpkinPoint < AssignedCell > , Error > {
86
86
let ScalarMultiplyChipInput { scalar_bits, input } = inputs;
87
87
88
- // let mut input_value: GrumpkinPoint<Value> = input.clone().into();
89
- // let mut result_value: GrumpkinPoint<Value> = GrumpkinPoint::<Fr>::zero().into();
90
- // let mut last_result = None;
91
-
92
- // for (i, bit) in scalar_bits.iter().enumerate() {
93
- // let input = input_value.embed(synthesizer, "input")?;
94
- // let result = result_value.embed(synthesizer, "result")?;
95
- // if i.eq(&0) {
96
- // self.constrain_point_at_infinity(synthesizer, result.clone())?;
97
- // self.constrain_points_equality(synthesizer, input.clone(), inputs.input.clone())?;
98
- // }
99
-
100
- // let mut is_one = false;
101
- // bit.value().map(|f| {
102
- // is_one = Fr::ONE == *f;
103
- // });
104
-
105
- // let mut next_result_value = result_value;
106
- // if is_one {
107
- // next_result_value = curve_arithmetic::points_add(result_value, input_value);
108
- // }
109
-
110
- // let next_result = next_result_value.embed(synthesizer, "next_result")?;
111
-
112
- // let next_input_value = curve_arithmetic::point_double(input_value);
113
- // let next_input = next_input_value.embed(synthesizer, "next_input")?;
114
-
115
- // self.multiply_gate.apply_in_new_region(
116
- // synthesizer,
117
- // ScalarMultiplyGateInput {
118
- // bit: bit.clone(),
119
- // input,
120
- // result,
121
- // next_input,
122
- // next_result: next_result.clone(),
123
- // },
124
- // )?;
125
-
126
- // input_value = next_input_value;
127
- // result_value = next_result_value;
128
-
129
- // if i.eq(&(scalar_bits.len() - 1)) {
130
- // last_result = Some(next_result);
131
- // }
132
- // }
133
-
134
- // Ok(last_result.expect("last result is returned"))
135
-
136
- todo ! ( )
88
+ // let bits: Vec<V> = scalar_bits
89
+ // .iter()
90
+ // .map(|cell| V(cell.value().cloned()))
91
+ // .collect();
92
+ // let bits: [V; 254] = bits.try_into().expect("not 254 bit array");
93
+ // let input: GrumpkinPoint<V> = GrumpkinPoint {
94
+ // x: V(p.x.value().cloned()),
95
+ // y: V(p.y.value().cloned()),
96
+ // z: V(p.z.value().cloned()),
97
+ // };
98
+
99
+ let result_value: GrumpkinPoint < Value > = curve_arithmetic:: scalar_multiply ( input, bits) ;
100
+
101
+ let result = result_value. embed ( synthesizer, "S" ) ?;
102
+
103
+ self . multiply_gate . apply_in_new_region (
104
+ synthesizer,
105
+ ScalarMultiplyGateInput {
106
+ scalar_bits : scalar_bits. clone ( ) ,
107
+ input : input. clone ( ) ,
108
+ } ,
109
+ ) ?;
110
+
111
+ Ok ( result)
137
112
}
138
113
}
139
114
0 commit comments