Skip to content
This repository was archived by the owner on Jul 5, 2024. It is now read-only.

Commit 8ef1481

Browse files
committed
is_key_equal added to WrongExtNodeGadget
1 parent 46627dd commit 8ef1481

File tree

3 files changed

+56
-70
lines changed

3 files changed

+56
-70
lines changed

zkevm-circuits/src/mpt_circuit/account_leaf.rs

+13-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use halo2_proofs::{
66
};
77

88
use super::{
9-
helpers::{KeyDataWitness, ListKeyGadget, MainData, ParentDataWitness},
9+
helpers::{ext_key_rlc_calc_value, KeyDataWitness, ListKeyGadget, MainData, ParentDataWitness},
1010
mod_extension::ModExtensionGadget,
1111
rlp_gadgets::RLPItemWitness,
1212
witness_row::{AccountRowType, Node},
@@ -742,9 +742,19 @@ impl<F: Field> AccountLeafConfig<F> {
742742
true,
743743
parent_data[1].is_extension,
744744
key_data[true.idx()].clone(),
745-
key_data_prev,
746745
region.key_r,
747-
)?;
746+
)?;
747+
748+
let wrong_ext_middle = rlp_values[AccountRowType::LongExtNodeKey as usize].clone();
749+
let wrong_ext_middle_nibbles = rlp_values[AccountRowType::LongExtNodeNibbles as usize].clone();
750+
self.wrong_ext_node.assign(
751+
region,
752+
offset,
753+
wrong_ext_middle,
754+
wrong_ext_middle_nibbles,
755+
key_data[true.idx()].clone(),
756+
key_data_prev.clone(),
757+
);
748758

749759
// Anything following this node is below the account
750760
MainData::witness_store(

zkevm-circuits/src/mpt_circuit/helpers.rs

+40-63
Original file line numberDiff line numberDiff line change
@@ -1275,30 +1275,18 @@ impl<F: Field> WrongLeafGadget<F> {
12751275
for_placeholder_s: bool,
12761276
is_parent_extension: bool,
12771277
key_data: KeyDataWitness<F>,
1278-
key_data_prev: KeyDataWitness<F>,
12791278
r: F,
12801279
) -> Result<(F, F), Error> {
12811280
if is_non_existing {
12821281
let wrong_witness =
12831282
self.wrong_rlp_key
12841283
.assign(region, offset, list_bytes, expected_item)?;
1285-
let key_rlc_wrong: F;
1286-
if !is_parent_extension {
1287-
(key_rlc_wrong, _) = wrong_witness.key.key(
1288-
wrong_witness.key_item.clone(),
1289-
key_data.rlc,
1290-
key_data.mult,
1291-
r,
1292-
);
1293-
} else {
1294-
(key_rlc_wrong, _) = wrong_witness.key.key(
1295-
wrong_witness.key_item.clone(),
1296-
key_data_prev.rlc,
1297-
key_data_prev.mult,
1298-
r,
1299-
);
1300-
}
1301-
1284+
let (key_rlc_wrong, _) = wrong_witness.key.key(
1285+
wrong_witness.key_item.clone(),
1286+
key_data.rlc,
1287+
key_data.mult,
1288+
r,
1289+
);
13021290
let is_key_equal_witness = self.is_key_equal.assign(
13031291
region,
13041292
offset,
@@ -1318,7 +1306,6 @@ impl<F: Field> WrongLeafGadget<F> {
13181306
/// Handles wrong extension nodes
13191307
#[derive(Clone, Debug, Default)]
13201308
pub struct WrongExtNodeGadget<F> {
1321-
wrong_rlp_key: ListKeyGadget<F>,
13221309
is_key_equal: IsEqualGadget<F>,
13231310
}
13241311

@@ -1346,7 +1333,7 @@ impl<F: Field> WrongExtNodeGadget<F> {
13461333
// tell us about the parity of the second part (depends on the third part as well).
13471334

13481335
let data0 = [wrong_ext_middle.clone(), wrong_ext_middle_nibbles.clone()];
1349-
let mut rlc = key_data_prev.rlc.expr()
1336+
let after_middle_rlc = key_data_prev.rlc.expr()
13501337
+ ext_key_rlc_expr(
13511338
cb,
13521339
wrong_ext_middle.clone(),
@@ -1373,7 +1360,7 @@ impl<F: Field> WrongExtNodeGadget<F> {
13731360
let third_part_is_odd = after_two_parts_is_odd.clone();
13741361

13751362
let data1 = [wrong_ext_after.clone(), wrong_ext_after_nibbles.clone()];
1376-
rlc = rlc
1363+
let rlc = after_middle_rlc.clone()
13771364
+ ext_key_rlc_expr(
13781365
cb,
13791366
wrong_ext_after.clone(),
@@ -1390,60 +1377,50 @@ impl<F: Field> WrongExtNodeGadget<F> {
13901377
);
13911378

13921379
require!(rlc => expected_key);
1380+
1381+
// Make sure the "after_middle" RLC of the wrong extension node and of
1382+
// the "after_middle" enquired key/address are different.
1383+
config.is_key_equal = IsEqualGadget::construct(
1384+
&mut cb.base,
1385+
key_data.rlc.expr(),
1386+
after_middle_rlc.expr(),
1387+
);
1388+
require!(config.is_key_equal.expr() => false);
13931389
}}
13941390
config
13951391
})
13961392
}
13971393

1398-
#[allow(clippy::too_many_arguments)]
13991394
pub(crate) fn assign(
14001395
&self,
14011396
region: &mut CachedRegion<'_, '_, F>,
14021397
offset: usize,
1403-
is_non_existing: bool,
1404-
key_rlc: &[F],
1405-
list_bytes: &[u8],
1406-
expected_item: &RLPItemWitness,
1407-
for_placeholder_s: bool,
1408-
is_parent_extension: bool,
1398+
wrong_ext_middle: RLPItemWitness,
1399+
wrong_ext_middle_nibbles: RLPItemWitness,
14091400
key_data: KeyDataWitness<F>,
14101401
key_data_prev: KeyDataWitness<F>,
1411-
r: F,
1412-
) -> Result<(F, F), Error> {
1413-
if is_non_existing {
1414-
let wrong_witness =
1415-
self.wrong_rlp_key
1416-
.assign(region, offset, list_bytes, expected_item)?;
1417-
let key_rlc_wrong: F;
1418-
if !is_parent_extension {
1419-
(key_rlc_wrong, _) = wrong_witness.key.key(
1420-
wrong_witness.key_item.clone(),
1421-
key_data.rlc,
1422-
key_data.mult,
1423-
r,
1424-
);
1425-
} else {
1426-
(key_rlc_wrong, _) = wrong_witness.key.key(
1427-
wrong_witness.key_item.clone(),
1428-
key_data_prev.rlc,
1429-
key_data_prev.mult,
1430-
r,
1431-
);
1432-
}
1433-
1434-
let is_key_equal_witness = self.is_key_equal.assign(
1435-
region,
1436-
offset,
1437-
key_rlc[for_placeholder_s.idx()],
1438-
key_rlc_wrong,
1439-
)?;
1402+
) {
1403+
let items = [wrong_ext_middle.clone(), wrong_ext_middle_nibbles];
1404+
let (after_middle_rlc, _) = ext_key_rlc_calc_value(
1405+
wrong_ext_middle,
1406+
key_data_prev.mult,
1407+
key_data.is_odd,
1408+
key_data_prev.is_odd,
1409+
items
1410+
.iter()
1411+
.map(|item| item.bytes.clone())
1412+
.collect::<Vec<_>>()
1413+
.try_into()
1414+
.unwrap(),
1415+
region.key_r,
1416+
);
14401417

1441-
// When key is not equal, we have a non existing account
1442-
Ok((key_rlc_wrong, is_key_equal_witness.neg()))
1443-
} else {
1444-
// existing account
1445-
Ok((key_rlc[for_placeholder_s.idx()], false.scalar()))
1446-
}
1418+
let _ = self.is_key_equal.assign(
1419+
region,
1420+
offset,
1421+
key_data.rlc,
1422+
after_middle_rlc,
1423+
);
14471424
}
14481425
}
14491426

zkevm-circuits/src/mpt_circuit/storage_leaf.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub(crate) struct StorageLeafConfig<F> {
4848
is_not_hashed: [LtGadget<F, 1>; 2],
4949
is_placeholder_leaf: [IsPlaceholderLeafGadget<F>; 2],
5050
drifted: DriftedGadget<F>,
51-
wrong: WrongLeafGadget<F>,
51+
wrong_leaf: WrongLeafGadget<F>,
5252
is_storage_mod_proof: IsEqualGadget<F>,
5353
is_non_existing_storage_proof: IsEqualGadget<F>,
5454
is_mod_extension: [Cell<F>; 2],
@@ -287,7 +287,7 @@ impl<F: Field> StorageLeafConfig<F> {
287287
);
288288

289289
// Wrong leaf / extension node handling
290-
config.wrong = WrongLeafGadget::construct(
290+
config.wrong_leaf = WrongLeafGadget::construct(
291291
cb,
292292
key_item.hash_rlc(),
293293
config.is_non_existing_storage_proof.expr(),
@@ -563,7 +563,7 @@ impl<F: Field> StorageLeafConfig<F> {
563563
&mut memory[key_memory(false)],
564564
2, // 2 instead of 1 because default values have already been stored above
565565
)?;
566-
let (_key_rlc, _) = self.wrong.assign(
566+
let (_key_rlc, _) = self.wrong_leaf.assign(
567567
region,
568568
offset,
569569
is_non_existing_proof,
@@ -573,7 +573,6 @@ impl<F: Field> StorageLeafConfig<F> {
573573
false,
574574
parent_data[1].is_extension,
575575
key_data[true.idx()].clone(),
576-
key_data_prev,
577576
region.key_r,
578577
)?;
579578

0 commit comments

Comments
 (0)