From 2b61923e7bf875feba6768b6c05e849c9ed67ebf Mon Sep 17 00:00:00 2001 From: Zach Kolodny Date: Mon, 13 May 2024 16:33:14 -0400 Subject: [PATCH 1/3] fix(vk): handle overrides of verification key for a given protocol version --- .../24/scheduler_key_old.json | 399 ++++++++++++++++++ src/main.rs | 20 +- src/requests.rs | 4 +- src/utils.rs | 12 + 4 files changed, 428 insertions(+), 7 deletions(-) create mode 100644 src/keys/protocol_version/24/scheduler_key_old.json diff --git a/src/keys/protocol_version/24/scheduler_key_old.json b/src/keys/protocol_version/24/scheduler_key_old.json new file mode 100644 index 0000000..48f65c2 --- /dev/null +++ b/src/keys/protocol_version/24/scheduler_key_old.json @@ -0,0 +1,399 @@ +{ + "n": 16777215, + "num_inputs": 1, + "state_width": 4, + "num_witness_polys": 0, + "gate_setup_commitments": [ + { + "x": [ + 13368816467732756588, + 12631704582998645112, + 2875950984924293274, + 3113194142004855172 + ], + "y": [ + 3570060617207608740, + 2032397225743366002, + 5866786775367305329, + 1313634009443853971 + ], + "infinity": false + }, + { + "x": [ + 11488992528554025682, + 12016824828223971094, + 11942004360057333370, + 316831626296641307 + ], + "y": [ + 304673622018339856, + 7139037552557818730, + 12475560967982555143, + 1055588351918295250 + ], + "infinity": false + }, + { + "x": [ + 2274984630539920017, + 5398167177582250136, + 16440396753384808945, + 1037682586893548769 + ], + "y": [ + 10168660308952593373, + 16526369642614237721, + 569062739734175056, + 155645558476901406 + ], + "infinity": false + }, + { + "x": [ + 14005362797509427677, + 2662603874351919260, + 14261489165672308143, + 1470528288349794782 + ], + "y": [ + 11144229651170108862, + 11439490264313454962, + 114993091474760680, + 1037267173208738614 + ], + "infinity": false + }, + { + "x": [ + 10726125240955612787, + 1916320162213728495, + 1058608086768277905, + 1651114031905829493 + ], + "y": [ + 13237242732587628574, + 4774776044666137690, + 14401013098807103799, + 2514139699916115771 + ], + "infinity": false + }, + { + "x": [ + 14434760601334248377, + 5316938318287831815, + 6221098547630910324, + 980422841280734466 + ], + "y": [ + 9201886393750447942, + 3840149540273146267, + 18179910191622136829, + 1563809864380914603 + ], + "infinity": false + }, + { + "x": [ + 13727181310656943815, + 296737807969282193, + 6059560013411781327, + 1793671435315065066 + ], + "y": [ + 1522594187298952706, + 6626811309287846888, + 8870954808386738181, + 171006237191164060 + ], + "infinity": false + }, + { + "x": [ + 11830690209042008764, + 11761396005838073769, + 18271188400274886574, + 2896734446482773484 + ], + "y": [ + 1890606551566554401, + 10220931290312275762, + 3256711195869515344, + 2466626485328709457 + ], + "infinity": false + } + ], + "gate_selectors_commitments": [ + { + "x": [ + 10865727529243127085, + 4083978853392244827, + 14303622309482785753, + 2263042021033673595 + ], + "y": [ + 3019601017411802529, + 880444282195426618, + 9998743525359587628, + 2891421025832200233 + ], + "infinity": false + }, + { + "x": [ + 5208608554346323426, + 8575970970223832576, + 2966209169082345602, + 239576408267301488 + ], + "y": [ + 17715084817752316452, + 2726293100894160682, + 17920596859559317135, + 3485576345363305439 + ], + "infinity": false + } + ], + "permutation_commitments": [ + { + "x": [ + 14761045450946573029, + 17157644513453531531, + 2555518804134782053, + 1415819224310783987 + ], + "y": [ + 17265629196749977462, + 4128711855633066822, + 8435602817910411328, + 1408116296902303196 + ], + "infinity": false + }, + { + "x": [ + 3307267823832528482, + 2406249680085831639, + 9091964031261402109, + 2846274000290842933 + ], + "y": [ + 17374905554931807856, + 6690578002079222163, + 11809376320193686210, + 2676076649992974574 + ], + "infinity": false + }, + { + "x": [ + 3159118708748226574, + 5508845413629697013, + 13350869305506486049, + 689297560178790472 + ], + "y": [ + 15696011303896469684, + 12551611148155235140, + 14438660833518031207, + 425021756161657108 + ], + "infinity": false + }, + { + "x": [ + 18349397811516917436, + 4473982696343317918, + 13070312540813307819, + 2109468484629113245 + ], + "y": [ + 13254534552549721008, + 17388411854346636521, + 17875890960520499518, + 1062184221180884481 + ], + "infinity": false + } + ], + "total_lookup_entries_length": 1787472, + "lookup_selector_commitment": { + "x": [ + 9324906502432882695, + 14977861238256290580, + 12538013124354067293, + 3408438202312564138 + ], + "y": [ + 14942105932194201701, + 12210090881357612547, + 14774705021036784261, + 2531694948512337448 + ], + "infinity": false + }, + "lookup_tables_commitments": [ + { + "x": [ + 10873859091125335643, + 3906092213625635374, + 17046157606087980048, + 3193402705223440293 + ], + "y": [ + 10158946293873382504, + 2171386304067884865, + 6918663094168980658, + 350601565475975409 + ], + "infinity": false + }, + { + "x": [ + 12822112641313049260, + 3646552465186399021, + 10324071010773924047, + 2209084192380614662 + ], + "y": [ + 11045141628975531869, + 12589678537679955590, + 3065046617868727674, + 2099447669854151830 + ], + "infinity": false + }, + { + "x": [ + 11395032673621937545, + 3000063650268118516, + 7857619430005721792, + 805706808484810738 + ], + "y": [ + 6817063666434679427, + 1646386051225388537, + 4677946977082722827, + 1369650305976868514 + ], + "infinity": false + }, + { + "x": [ + 2885179371868476351, + 159944842081142878, + 6092294387055034894, + 213843603626505240 + ], + "y": [ + 11868113133779277990, + 8509646480531194854, + 14088068011597639414, + 707070630614027545 + ], + "infinity": false + } + ], + "lookup_table_type_commitment": { + "x": [ + 1732877442096985191, + 7537030715658833452, + 14073502080301311448, + 2178792007727681099 + ], + "y": [ + 8513095304113652904, + 6581396660744182779, + 13939755637576387431, + 2477157044961106453 + ], + "infinity": false + }, + "non_residues": [ + [ + 5, + 0, + 0, + 0 + ], + [ + 7, + 0, + 0, + 0 + ], + [ + 10, + 0, + 0, + 0 + ] + ], + "g2_elements": [ + { + "x": { + "c0": [ + 5106727233969649389, + 7440829307424791261, + 4785637993704342649, + 1729627375292849782 + ], + "c1": [ + 10945020018377822914, + 17413811393473931026, + 8241798111626485029, + 1841571559660931130 + ] + }, + "y": { + "c0": [ + 5541340697920699818, + 16416156555105522555, + 5380518976772849807, + 1353435754470862315 + ], + "c1": [ + 6173549831154472795, + 13567992399387660019, + 17050234209342075797, + 650358724130500725 + ] + }, + "infinity": false + }, + { + "x": { + "c0": [ + 9089143573911733168, + 11482283522806384523, + 13585589533905622862, + 79029415676722370 + ], + "c1": [ + 5692040832573735873, + 16884514497384809355, + 16717166481813659368, + 2742131088506155463 + ] + }, + "y": { + "c0": [ + 9604638503594647125, + 1289961608472612514, + 6217038149984805214, + 2521661352385209130 + ], + "c1": [ + 17168069778630926308, + 11309277837895768996, + 15154989611154567813, + 359271377050603491 + ] + }, + "infinity": false + } + ] + } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 7986e6a..ab0f6e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,8 +27,8 @@ use crate::requests::L1BatchAndProofData; use crate::snark_wrapper_verifier::{ generate_solidity_test, verify_snark, verify_snark_from_storage, L1BatchProofForL1, }; -use crate::utils::check_verification_key; use crate::utils::ensure_key_file_exists; +use crate::utils::{check_verification_key, get_scheduler_key_override}; pub mod block_header; use circuit_definitions::boojum::{ @@ -217,7 +217,13 @@ async fn main() { let contract = ContractConfig::new(l1_rpc.clone().unwrap(), network.clone()); - let resp = requests::fetch_l1_data(batch_number, protocol_version_id, &network, &l1_rpc.clone().unwrap()).await; + let resp = requests::fetch_l1_data( + batch_number, + protocol_version_id, + &network, + &l1_rpc.clone().unwrap(), + ) + .await; let output = if let Ok(L1BatchAndProofData { aux_output, @@ -229,12 +235,16 @@ async fn main() { { let vk_hash = contract.get_verification_key_hash(block_number).await; - let snark_vk_scheduler_key_file = match scheduler_key_override { - None => format!( + let snark_vk_scheduler_key_file = match ( + scheduler_key_override, + get_scheduler_key_override(&network, &protocol_version, batch_number), + ) { + (None, None) => format!( "src/keys/protocol_version/{}/scheduler_key.json", protocol_version.clone() ), - Some(scheduler_key_str) => scheduler_key_str, + (None, Some(scheduler_key)) => scheduler_key, + (Some(scheduler_key_str), _) => scheduler_key_str, }; let mut batch_proof = L1BatchProofForL1 { diff --git a/src/requests.rs b/src/requests.rs index 43a0181..474b66d 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -103,7 +103,7 @@ pub async fn fetch_l1_commit_data( let client = Provider::::try_from(rpc_url).expect("Failed to connect to provider"); let contract_abi: Abi = Abi::load(&include_bytes!("../abis/IZkSync.json")[..]).unwrap(); - + let function_name: &str; if !protocol_version.is_post_1_5_0() { function_name = "commitBatches"; @@ -512,7 +512,7 @@ fn find_state_data_from_log( } let mut parsed_input = function.decode_input(&calldata[4..]).unwrap(); - + let second_param = parsed_input.pop().unwrap(); let first_param = parsed_input.pop().unwrap(); diff --git a/src/utils.rs b/src/utils.rs index 0a58b85..c1a4e19 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -23,3 +23,15 @@ pub async fn ensure_key_file_exists(file_path: &String, err_msg: &String) { std::process::exit(1) } } + +pub fn get_scheduler_key_override( + network: &str, + protocol_version: &str, + batch_number: u64, +) -> Option { + if protocol_version == "24" && network == "sepolia" && batch_number <= 8853u64 { + Some("src/keys/protocol_version/24/scheduler_key_old.json".to_string()) + } else { + None + } +} From 4bc5f90ea3d105b75301db74a029bde8b212abc3 Mon Sep 17 00:00:00 2001 From: Zach Kolodny Date: Mon, 13 May 2024 16:58:14 -0400 Subject: [PATCH 2/3] handle block right after upgrade --- src/requests.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/requests.rs b/src/requests.rs index 474b66d..b5bea66 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -104,14 +104,18 @@ pub async fn fetch_l1_commit_data( let contract_abi: Abi = Abi::load(&include_bytes!("../abis/IZkSync.json")[..]).unwrap(); - let function_name: &str; - if !protocol_version.is_post_1_5_0() { - function_name = "commitBatches"; + let (function_name, fallback_fn_name) = if !protocol_version.is_post_1_5_0() { + ("commitBatches", None) } else { - function_name = "commitBatchesSharedBridge"; - } + ("commitBatchesSharedBridge", Some("commitBatches")) + }; let function = contract_abi.functions_by_name(&function_name).unwrap()[0].clone(); + let fallback_function = match fallback_fn_name { + None => None, + Some(fn_name) => Some(contract_abi.functions_by_name(&fn_name).unwrap()[0].clone()), + }; + let previous_batch_number = batch_number - 1; let address = get_diamond_proxy_address(network.to_string()); @@ -142,7 +146,8 @@ pub async fn fetch_l1_commit_data( l1_block_number = tx.block_number.unwrap().as_u64(); calldata = tx.input.to_vec(); - let found_data = find_state_data_from_log(b_number, &function, &calldata); + let found_data = + find_state_data_from_log(b_number, &function, fallback_function.clone(), &calldata); if found_data.is_err() || found_data.clone().unwrap().is_none() { return Err(StatusCode::InvalidLog); @@ -503,6 +508,7 @@ pub async fn fetch_batch_protocol_version( fn find_state_data_from_log( batch_number: u64, function: &Function, + fallback_function: Option, calldata: &[u8], ) -> Result)>, StatusCode> { use ethers::abi; @@ -511,7 +517,12 @@ fn find_state_data_from_log( return Err(StatusCode::BadCalldataLength); } - let mut parsed_input = function.decode_input(&calldata[4..]).unwrap(); + let mut parsed_input = function.decode_input(&calldata[4..]).unwrap_or_else(|_| { + fallback_function + .unwrap() + .decode_input(&calldata[4..]) + .unwrap() + }); let second_param = parsed_input.pop().unwrap(); let first_param = parsed_input.pop().unwrap(); From 3a5e843d9d09a62bc51619f0c83233dda13dd224 Mon Sep 17 00:00:00 2001 From: Zach Kolodny Date: Tue, 14 May 2024 09:05:27 -0400 Subject: [PATCH 3/3] added context to vk override --- src/utils.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/utils.rs b/src/utils.rs index c1a4e19..03517e1 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -29,6 +29,9 @@ pub fn get_scheduler_key_override( protocol_version: &str, batch_number: u64, ) -> Option { + // This override is needed because we discovered a deviation between our in and out of circuit + // vms. The choice was made to update the verifier vs bumping the protocol version as it would have + // required a batch rollback. if protocol_version == "24" && network == "sepolia" && batch_number <= 8853u64 { Some("src/keys/protocol_version/24/scheduler_key_old.json".to_string()) } else {