From 6f71c0bcd30ceb100ae3cb0f9c8aae69f4a98915 Mon Sep 17 00:00:00 2001 From: koloz193 Date: Thu, 8 Feb 2024 11:14:57 -0500 Subject: [PATCH] added some better error handling (#31) --- README.md | 6 +++++- src/block_header.rs | 4 ++++ src/outputs.rs | 4 ++++ src/requests.rs | 13 ++++++++----- src/snark_wrapper_verifier.rs | 9 ++++++++- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6f953b8..6be96b6 100644 --- a/README.md +++ b/README.md @@ -76,8 +76,12 @@ Below is a list of the error codes that can be seen in the json output of the cl - 12 => `FailedToCallRPC` - 13 => `VerificationKeyHashMismatch` - 14 => `FailedToDownloadVerificationKey` -- 15=> `FailedToWriteVerificationKeyToDisk` +- 15 => `FailedToWriteVerificationKeyToDisk` - 16 => `ProofVerificationFailed` +- 17 => `FailedToLoadVerificationKey`, +- 18 => `BadCalldataLength`, +- 19 => `FailedToCallRPCJsonError`, +- 20 => `FailedToCallRPCResponseError`, # Future plans diff --git a/src/block_header.rs b/src/block_header.rs index 0927d6a..514bb0a 100644 --- a/src/block_header.rs +++ b/src/block_header.rs @@ -36,6 +36,10 @@ impl BlockAuxilaryOutput { pub fn parse_aux_data(func: &Function, calldata: &[u8]) -> Result { use ethers::abi; + if calldata.len() < 5 { + return Err(StatusCode::BadCalldataLength); + } + let mut parsed_calldata = func.decode_input(&calldata[4..]).unwrap(); assert_eq!(parsed_calldata.len(), 2); diff --git a/src/outputs.rs b/src/outputs.rs index 15e9bf4..274abaf 100644 --- a/src/outputs.rs +++ b/src/outputs.rs @@ -28,6 +28,10 @@ pub enum StatusCode { FailedToDownloadVerificationKey, FailedToWriteVerificationKeyToDisk, ProofVerificationFailed, + FailedToLoadVerificationKey, + BadCalldataLength, + FailedToCallRPCJsonError, + FailedToCallRPCResponseError, } #[derive(Default)] diff --git a/src/requests.rs b/src/requests.rs index b33d497..b1609ee 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -69,7 +69,7 @@ pub async fn fetch_l1_data( ) -> Result { let commit_data = fetch_l1_commit_data(batch_number, network, rpc_url).await; if commit_data.is_err() { - return Err(StatusCode::FailedToGetDataFromL1); + return Err(commit_data.err().unwrap()); } let (batch_l1_data, aux_output) = commit_data.unwrap(); @@ -112,8 +112,7 @@ pub async fn fetch_l1_commit_data( let mut curr_batch_commitment = H256::default(); for b_number in [previous_batch_number, batch_number] { let commit_tx = fetch_batch_commit_tx(b_number, network) - .await - .map_err(|_| StatusCode::FailedToFindCommitTxn); + .await; if commit_tx.is_err() { return Err(commit_tx.err().unwrap()); @@ -363,14 +362,14 @@ pub async fn fetch_batch_commit_tx( .await; if json.is_err() { - return Err(StatusCode::FailedToCallRPC); + return Err(StatusCode::FailedToCallRPCJsonError); } let json = json.unwrap(); return Ok((json.result.commitTxHash, json.result.proveTxHash)); } else { - return Err(StatusCode::FailedToCallRPC); + return Err(StatusCode::FailedToCallRPCResponseError); } } @@ -381,6 +380,10 @@ fn find_state_data_from_log( ) -> Result)>, StatusCode> { use ethers::abi; + if calldata.len() < 5 { + return Err(StatusCode::BadCalldataLength); + } + let mut parsed_input = function.decode_input(&calldata[4..]).unwrap(); assert_eq!(parsed_input.len(), 2); let second_param = parsed_input.pop().unwrap(); diff --git a/src/snark_wrapper_verifier.rs b/src/snark_wrapper_verifier.rs index e123435..12e3211 100644 --- a/src/snark_wrapper_verifier.rs +++ b/src/snark_wrapper_verifier.rs @@ -80,9 +80,16 @@ pub async fn verify_snark( ); println!("=== Loading verification key."); + let verification_key = &fs::read_to_string(snark_vk_scheduler_key_file.clone()); + + if verification_key.is_err() { + println!("Unable to load verification key from: {}", snark_vk_scheduler_key_file.clone()); + return Err(StatusCode::FailedToLoadVerificationKey); + } + use circuit_definitions::snark_wrapper::franklin_crypto::bellman::plonk::better_better_cs::verifier::verify; let vk_inner : VerificationKey = serde_json::from_str( - &fs::read_to_string(snark_vk_scheduler_key_file.clone()).unwrap() + &verification_key.as_ref().unwrap() ) .unwrap();