Skip to content

Commit 3c89370

Browse files
authored
fix: revert previous commit (#339)
1 parent 8ce56b8 commit 3c89370

File tree

10 files changed

+282
-61
lines changed

10 files changed

+282
-61
lines changed

plonky2x/core/src/backend/circuit/serialization/hints.rs

+4
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ use crate::frontend::eth::beacon::vars::{
5252
BeaconBalancesVariable, BeaconHeaderVariable, BeaconValidatorVariable,
5353
BeaconValidatorsVariable, BeaconWithdrawalVariable, BeaconWithdrawalsVariable,
5454
};
55+
use crate::frontend::eth::mpt::generators::LteGenerator;
5556
use crate::frontend::eth::storage::generators::{
5657
EthBlockGenerator, EthLogGenerator, EthStorageKeyGenerator, EthStorageProofHint,
5758
};
@@ -367,6 +368,9 @@ where
367368
let comparison_generator_id = ComparisonGenerator::<L::Field, D>::id();
368369
r.register_simple::<ComparisonGenerator<L::Field, D>>(comparison_generator_id);
369370

371+
let le_generator_id = LteGenerator::<L, D>::id();
372+
r.register_simple::<LteGenerator<L, D>>(le_generator_id);
373+
370374
r.register_hint::<BeaconBalanceWitnessHint>();
371375

372376
r.register_async_hint::<BeaconAllWithdrawalsHint>();

plonky2x/core/src/frontend/curta/proof.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ mod tests {
929929
let hint = ProofReadHint { proof };
930930
let output_stream = builder.hint(input_stream, hint);
931931
let proof_variable = output_stream.read_stark_proof(&mut builder, &stark, &config);
932-
let public_input_variable = output_stream.read_exact(&mut builder, 3);
932+
let public_input_variable = output_stream.read_exact_unsafe(&mut builder, 3);
933933

934934
builder.verify_stark_proof(
935935
&config,

plonky2x/core/src/frontend/ecc/curve25519/curta/builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
4343
EcOpRequest::Add(_, _)
4444
| EcOpRequest::ScalarMul(_, _)
4545
| EcOpRequest::Decompress(_) => {
46-
let result = output_stream.read_unsafe::<AffinePointVariable<Curve>>(self);
46+
let result = output_stream.read::<AffinePointVariable<Curve>>(self);
4747
self.assert_is_equal(
4848
result,
4949
response.clone().expect("response should not be None"),

plonky2x/core/src/frontend/eth/mpt/builder.rs

+47-24
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use std::marker::PhantomData;
2+
13
use curta::math::field::Field;
24

5+
use super::generators::*;
36
use crate::frontend::vars::Nibbles;
47
use crate::prelude::{
5-
ArrayVariable, ByteVariable, Bytes32Variable, CircuitBuilder, CircuitVariable, PlonkParameters,
6-
U32Variable, Variable,
8+
ArrayVariable, ByteVariable, Bytes32Variable, CircuitBuilder, PlonkParameters, Variable,
79
};
810

911
pub fn transform_proof_to_padded<const ENCODING_LEN: usize, const PROOF_LEN: usize>(
@@ -40,6 +42,27 @@ pub fn transform_proof_to_padded<const ENCODING_LEN: usize, const PROOF_LEN: usi
4042
}
4143

4244
impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
45+
pub fn byte_to_variable(&mut self, lhs: ByteVariable) -> Variable {
46+
let generator: ByteToVariableGenerator<L, D> = ByteToVariableGenerator {
47+
lhs,
48+
output: self.init::<Variable>(),
49+
_phantom: PhantomData,
50+
};
51+
self.add_simple_generator(generator.clone());
52+
generator.output
53+
}
54+
55+
pub fn sub_byte(&mut self, lhs: ByteVariable, rhs: ByteVariable) -> ByteVariable {
56+
let generator: ByteSubGenerator<L, D> = ByteSubGenerator {
57+
lhs,
58+
rhs,
59+
output: self.init::<ByteVariable>(),
60+
_phantom: PhantomData,
61+
};
62+
self.add_simple_generator(generator.clone());
63+
generator.output
64+
}
65+
4366
const PREFIX_EXTENSION_EVEN: u8 = 0;
4467
const PREFIX_EXTENSION_ODD: u8 = 1;
4568
const PREFIX_LEAF_EVEN: u8 = 2;
@@ -50,7 +73,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
5073
&mut self,
5174
key: Bytes32Variable,
5275
proof: ArrayVariable<ArrayVariable<ByteVariable, ENCODING_LEN>, PROOF_LEN>,
53-
len_nodes: ArrayVariable<U32Variable, PROOF_LEN>,
76+
len_nodes: ArrayVariable<Variable, PROOF_LEN>,
5477
root: Bytes32Variable,
5578
value: Bytes32Variable,
5679
) {
@@ -68,8 +91,8 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
6891
let one: Variable = self.one::<Variable>();
6992
let two = self.constant::<Variable>(L::Field::from_canonical_u8(2));
7093
let const_64 = self.constant::<Variable>(L::Field::from_canonical_u8(64));
71-
let const_32 = self.constant::<U32Variable>(32u32);
72-
let const_128 = self.constant::<U32Variable>(128u32);
94+
let const_32 = self.constant::<Variable>(L::Field::from_canonical_u8(32));
95+
let const_128 = self.constant::<ByteVariable>(128);
7396

7497
let mut current_key_idx = self.zero::<Variable>();
7598
let mut finished = self._false();
@@ -79,7 +102,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
79102
padded_root.push(self.constant::<ByteVariable>(0));
80103
}
81104
let mut current_node_id = ArrayVariable::<ByteVariable, ELEMENT_LEN>::new(padded_root);
82-
let hash_key = self.keccak256_witness(&key.as_bytes());
105+
let hash_key = self.keccak256(&key.as_bytes());
83106
let key_path: ArrayVariable<ByteVariable, 64> = hash_key
84107
.as_bytes()
85108
.to_vec()
@@ -89,8 +112,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
89112

90113
for i in 0..PROOF_LEN {
91114
let current_node = proof[i].clone();
92-
let current_node_hash =
93-
self.keccak256_variable_witness(current_node.as_slice(), len_nodes[i].variable);
115+
let current_node_hash = self.keccak256_variable(current_node.as_slice(), len_nodes[i]);
94116

95117
if i == 0 {
96118
self.assert_is_equal(current_node_hash, root);
@@ -103,7 +125,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
103125
current_node_hash,
104126
current_node_id.as_slice()[0..32].into(),
105127
);
106-
let node_len_le_32 = self.lt(len_nodes[i], const_32);
128+
let node_len_le_32 = self.lte(len_nodes[i], const_32);
107129
let case_len_le_32 = self.and(node_len_le_32, first_32_bytes_eq);
108130
let inter = self.not(node_len_le_32);
109131
let case_len_gt_32 = self.and(inter, hash_eq);
@@ -116,7 +138,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
116138
let (decoded_list, decoded_element_lens, len_decoded_list) = self
117139
.decode_element_as_list::<ENCODING_LEN, LIST_LEN, ELEMENT_LEN>(
118140
current_node,
119-
len_nodes[i].variable,
141+
len_nodes[i],
120142
finished,
121143
);
122144

@@ -134,7 +156,7 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
134156
let offset_odd = self.mul(prefix_extension_odd.variable, one);
135157
let offset = self.add(offset_even, offset_odd);
136158
let branch_key = self.select_array(key_path.clone().as_slice(), current_key_idx);
137-
let branch_key_variable = branch_key.to_variable(self);
159+
let branch_key_variable: Variable = self.byte_to_variable(branch_key); // can be unsafe since nibbles are checked
138160

139161
// Case 1
140162
let is_branch_and_key_terminated = self.and(is_branch, key_terminated);
@@ -187,36 +209,37 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
187209
finished = self.or(finished, m);
188210
}
189211

190-
// Can be unsafe because `current_node_id` comes from a ByteVariable.
191-
let current_node_id_u32 =
192-
U32Variable::from_variables_unsafe(&[current_node_id[0].to_variable(self)]);
193-
let current_node_len = self.sub(current_node_id_u32, const_128);
194-
let lhs_offset = self.sub(const_32, current_node_len);
212+
let current_node_len = self.sub_byte(current_node_id[0], const_128);
213+
let current_node_len_as_var = self.byte_to_variable(current_node_len);
214+
let lhs_offset = self.sub(const_32, current_node_len_as_var);
195215

196216
self.assert_subarray_equal(
197217
&value.as_bytes(),
198-
lhs_offset.variable,
218+
lhs_offset,
199219
current_node_id.as_slice(),
200220
one,
201-
current_node_len.variable,
221+
current_node_len_as_var,
202222
);
203223
}
204224
}
205225

206226
#[cfg(test)]
207227
mod tests {
228+
use curta::math::field::Field;
208229
use log::debug;
209230

210231
use super::super::utils::{read_fixture, EIP1186ProofResponse};
211232
use super::*;
212233
use crate::frontend::eth::utils::u256_to_h256_be;
213-
use crate::prelude::DefaultBuilder;
234+
use crate::prelude::{DefaultBuilder, GoldilocksField};
214235
use crate::utils;
215236

216237
#[test]
217238
#[cfg_attr(feature = "ci", ignore)]
218239
fn test_mpt_circuit() {
219240
utils::setup_logger();
241+
type F = GoldilocksField;
242+
220243
let storage_result: EIP1186ProofResponse =
221244
read_fixture("./src/frontend/eth/mpt/fixtures/example.json");
222245

@@ -239,16 +262,16 @@ mod tests {
239262

240263
let (proof_as_fixed, lengths_as_fixed) =
241264
transform_proof_to_padded::<ENCODING_LEN, PROOF_LEN>(storage_proof);
242-
let len_nodes_value = lengths_as_fixed
265+
let len_nodes_field_elements = lengths_as_fixed
243266
.iter()
244-
.map(|x| *x as u32)
245-
.collect::<Vec<_>>();
267+
.map(|x| F::from_canonical_usize(*x))
268+
.collect::<Vec<F>>();
246269

247270
let mut builder = DefaultBuilder::new();
248271
let key_variable = builder.read::<Bytes32Variable>();
249272
let proof_variable =
250273
builder.read::<ArrayVariable<ArrayVariable<ByteVariable, ENCODING_LEN>, PROOF_LEN>>();
251-
let len_nodes = builder.read::<ArrayVariable<U32Variable, PROOF_LEN>>();
274+
let len_nodes = builder.read::<ArrayVariable<Variable, PROOF_LEN>>();
252275
let root_variable = builder.read::<Bytes32Variable>();
253276
let value_variable = builder.read::<Bytes32Variable>();
254277
builder.verify_mpt_proof::<ENCODING_LEN, PROOF_LEN>(
@@ -265,7 +288,7 @@ mod tests {
265288
input.write::<ArrayVariable<ArrayVariable<ByteVariable, ENCODING_LEN>, PROOF_LEN>>(
266289
proof_as_fixed,
267290
);
268-
input.write::<ArrayVariable<U32Variable, PROOF_LEN>>(len_nodes_value);
291+
input.write::<ArrayVariable<Variable, PROOF_LEN>>(len_nodes_field_elements);
269292
input.write::<Bytes32Variable>(root);
270293
input.write::<Bytes32Variable>(value_as_h256);
271294

0 commit comments

Comments
 (0)