diff --git a/src/executor.rs b/src/executor.rs index 8f52165..712c34d 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -1,6 +1,6 @@ +use core::str; use serde::Deserialize; use serde::Serialize; -use core::str; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct TestData { @@ -15,7 +15,7 @@ pub struct Request { } #[derive(Serialize, Deserialize, Debug)] -pub struct Edges{ +pub struct Edges { pub requests: Vec, } @@ -37,23 +37,21 @@ pub struct ProofResult { pub data: ProofData, } - pub fn get_datadir() -> String { - let datadir_path = - std::env::var("DATADIR").unwrap_or_else(|_| ".".to_string()); - return datadir_path; + let datadir_path = std::env::var("DATADIR").unwrap_or_else(|_| ".".to_string()); + datadir_path } -pub fn succinct_org_name() -> String{ +pub fn succinct_org_name() -> String { let succinct_org_name = std::env::var("SUCCINCT_ORG_NAME").expect("SUCCINCT_ORG_NAME env variable is not set"); - return succinct_org_name; + succinct_org_name } pub fn succinct_project_name() -> String { - let succinct_project_name = - std::env::var("SUCCINCT_PROJECT_NAME").expect("SUCCINCT_PROJECT_NAME env variable is not set"); - return succinct_project_name; + let succinct_project_name = std::env::var("SUCCINCT_PROJECT_NAME") + .expect("SUCCINCT_PROJECT_NAME env variable is not set"); + succinct_project_name } pub fn proof_wait_time_sec() -> u64 { @@ -63,14 +61,17 @@ pub fn proof_wait_time_sec() -> u64 { if u64.is_err() { return 600; //10 minutes } - return u64.expect(format!("Failed to parse PROOF_WAIT_TIME_SEC: {}", succinct_project_name).as_str()); + return u64.unwrap_or_else(|_| { + panic!( + "Failed to parse PROOF_WAIT_TIME_SEC: {}", + succinct_project_name + ) + }); } - - pub async fn get_proof(trusted_height: u64, height: u64) -> Option { let datadir = get_datadir(); - + let path = format!("{}/data_proof_{}_{}.json", datadir, trusted_height, height); log::info!(target: "prover", "Reading proof from file: {}", path); let proof = std::fs::read_to_string(path.clone()); @@ -87,14 +88,13 @@ pub async fn get_proof(trusted_height: u64, height: u64) -> Option { } pub async fn generate_proof( - msg: Vec>, - sigs: Vec>, - pubkeys: Vec>, + _msg: Vec>, + _sigs: Vec>, + _pubkeys: Vec>, trusted_height: u64, height: u64, trusted_hash: String, ) { - if trusted_height >= height { log::error!(target: "prover", "Trusted height is greater than the height trusted_height: {}, height: {}", trusted_height, height); return; @@ -105,13 +105,16 @@ pub async fn generate_proof( let datadir: String = get_datadir(); let command: &str = "/usr/local/bin/tendermintx"; - let args: [String; 3] = [trusted_height.to_string(), height.to_string(), trusted_hash.to_string()]; + let args: [String; 3] = [ + trusted_height.to_string(), + height.to_string(), + trusted_hash.to_string(), + ]; log::info!(target: "prover", "Executing command: {} {}", command, args.join(" ")); - - + use std::process::{Command, Stdio}; - + let output = Command::new(command) .args(&args) .stdout(Stdio::piped()) @@ -136,9 +139,9 @@ pub async fn generate_proof( let end_index = end_index.unwrap(); let request_id = &out_str[start_index + "request____start".len()..end_index]; log::info!(target: "prover", "Request ID {} ", request_id); - + //ask http server for to find a proof by request_id - //need to sleep to wait untill request id will be available via api. + //need to sleep to wait untill request id will be available via api. //in meantime if we wait to long the proof is generating so no downtime println!("Waiting 100 secs for request id to be available via api"); @@ -161,8 +164,6 @@ pub async fn generate_proof( } let text = response.unwrap(); println!("{:?}", text.clone()); - - let proofs: Vec = serde_json::from_str(&text).unwrap(); for i in proofs.iter() { @@ -173,21 +174,29 @@ pub async fn generate_proof( //todo remove - let proof = proofs.iter().find(|proof| proof.edges.requests.iter().any(|request| request.id == request_id)); + let proof = proofs.iter().find(|proof| { + proof + .edges + .requests + .iter() + .any(|request| request.id == request_id) + }); if proof.is_none() { log::error!(target: "prover", "Failed to find a proof with request_id: {}", request_id); return; } - use std::time::{SystemTime}; + use std::time::SystemTime; let before = SystemTime::now(); loop { - log::info!(target: "prover", "Waiting for the proof to be ready in a loop"); //https://alpha.succinct.xyz/api/proof/4a6f8491-94c6-4cbc-b890-9708b376471a/result - - let url = format!("https://alpha.succinct.xyz/api/proof/{}/result", proof.unwrap().id); + + let url = format!( + "https://alpha.succinct.xyz/api/proof/{}/result", + proof.unwrap().id + ); log::info!(target: "prover", "url: {}", url); let response = reqwest::get(url).await; if response.is_err() { @@ -214,11 +223,11 @@ pub async fn generate_proof( continue; } - let proof_result: Result:: = serde_json::from_str(&text); + let proof_result: Result = serde_json::from_str(&text); if proof_result.is_err() { log::info!(target: "prover", "failed to deseerizlie text"); log::info!(target: "prover", "failed to deseerizlie text : {}", text); - log::info!(target: "prover", "need to wait more time and ask again"); + log::info!(target: "prover", "need to wait more time and ask again"); std::thread::sleep(std::time::Duration::from_secs(20)); let last = SystemTime::now(); let difference = last.duration_since(before).expect("Time went backwards"); @@ -230,7 +239,7 @@ pub async fn generate_proof( continue; } let proof_result = proof_result.unwrap(); - + log::info!(target: "prover", "Writing data to circuts folder: {}", ".."); let proof_path = format!("{}/data_proof_{}_{}.json", datadir, trusted_height, height); match std::fs::write(proof_path.clone(), proof_result.data.proof) { @@ -246,8 +255,6 @@ pub async fn generate_proof( } log::info!(target: "prover", "Proof generation finished for : {}", height); - - } use log::LevelFilter; @@ -285,23 +292,14 @@ mod tests { assert!(proof.is_some()); } - - fn set_evn_vars() { - let ed25519_circom_path = std::env::var("SUCCINCT_ORG_NAME"); if ed25519_circom_path.is_err() { - std::env::set_var( - "SUCCINCT_ORG_NAME", - "blasrodri", - ); + std::env::set_var("SUCCINCT_ORG_NAME", "blasrodri"); } let ed25519_circom_path = std::env::var("SUCCINCT_PROJECT_NAME"); if ed25519_circom_path.is_err() { - std::env::set_var( - "SUCCINCT_ORG_NAME", - "tendermintx", - ); + std::env::set_var("SUCCINCT_ORG_NAME", "tendermintx"); } } @@ -311,8 +309,7 @@ mod tests { println!("Setting ED25519CIRCOM_PATH"); std::env::set_var("ED25519CIRCOM_PATH", "/home/mike/services/ed25519circom"); println!("/home/mike/services/ed25519circom"); - } - else { + } else { println!("{}", ed25519_circom_path.unwrap()); } let ed25519_circom_path = std::env::var("GNARK_JS_PATH"); @@ -321,18 +318,19 @@ mod tests { println!("Setting GNARK_JS_PATH"); std::env::set_var("GNARK_JS_PATH", "/usr/local/bin/snarkjs"); println!("/usr/local/bin/snarkjs"); - } - else { + } else { println!("{}", ed25519_circom_path.unwrap()); } let ed25519_circom_path = std::env::var("RAPIDSNARK_PATH"); if ed25519_circom_path.is_err() { println!("Setting RAPIDSNARK_PATH"); - std::env::set_var("RAPIDSNARK_PATH", "/home/mike/services/rapidsnark/package/bin/prover"); + std::env::set_var( + "RAPIDSNARK_PATH", + "/home/mike/services/rapidsnark/package/bin/prover", + ); println!("/home/mike/services/rapidsnark/package/bin/prover"); - } - else { + } else { println!("{}", ed25519_circom_path.unwrap()); } @@ -340,7 +338,7 @@ mod tests { } fn get_pub_inputs() -> TestData { - let mut data = TestData { + let data = TestData { msg: vec![vec![ 111, 8, 2, 17, 36, 0, 0, 0, 0, 0, 0, 0, 34, 72, 10, 32, 66, 15, 32, 152, 208, 7, 69, 219, 166, 26, 244, 231, 127, 247, 196, 94, 155, 127, 207, 55, 136, 84, 147, @@ -360,7 +358,6 @@ mod tests { 100, 157, 6, 199, 160, 237, 149, 254, 14, 202, 131, 61, 183, 163, ]], }; - return data; + data } - } diff --git a/src/main.rs b/src/main.rs index f40ffe6..54ce5a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,13 +3,13 @@ use rocket::serde::json::{json, Value}; use rocket::time::Instant; use rocket::tokio::sync::RwLock; use serde::{Deserialize, Serialize}; -use std::borrow::{Borrow}; +use std::borrow::Borrow; use std::collections::HashMap; use std::ops::Deref; mod executor; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; #[derive(Debug, Serialize, Deserialize)] struct ProofRequestByID { @@ -26,7 +26,6 @@ struct ProofCreationRequest { pub trusted_height: u64, pub height: u64, pub trusted_hash: String, - } #[derive(Debug, Eq, PartialEq, Serialize)] @@ -36,27 +35,23 @@ enum ProverStateStatus { } struct ProverState { - db: ProofDatabase, + _db: ProofDatabase, state: Arc>, } struct ProofDatabase { - inner: RwLock)>>, + _inner: RwLock)>>, } impl ProverState { fn new() -> Self { Self { - db: ProofDatabase { - inner: HashMap::new().into(), + _db: ProofDatabase { + _inner: HashMap::new().into(), }, state: Arc::new(RwLock::new(ProverStateStatus::IDLE)), } } - - async fn is_idle(&self) -> bool { - self.state.read().await.deref() == &ProverStateStatus::IDLE - } } #[rocket::get("/status")] @@ -64,24 +59,28 @@ async fn status(state: &rocket::State) -> Value { let status = state.borrow().state.clone(); if *status.read().await.deref() == ProverStateStatus::PROVING { - return json!({ + json!({ "status": "PROVING", - }); + }) } else { - return json!({ + json!({ "status": "IDLE", - }); + }) } } #[rocket::post("/get_proof", format = "json", data = "")] async fn get_proof( - state: &rocket::State, + _state: &rocket::State, proof_request_by_id: Json, ) -> Value { log::info!(target: "prover", "Get proof request by id: {:?}", proof_request_by_id); log::info!(target: "prover", "Get proof request by height: {:?} trusted_height: {:?}", proof_request_by_id.height, proof_request_by_id.trusted_height); - let proof = executor::get_proof(proof_request_by_id.trusted_height, proof_request_by_id.height).await; + let proof = executor::get_proof( + proof_request_by_id.trusted_height, + proof_request_by_id.height, + ) + .await; if let Some(proof) = proof { log::info!(target: "prover", "Proof id {:?}. Status: COMPLETED. Proof: {:?}", proof_request_by_id.proof_id, proof); @@ -93,25 +92,32 @@ async fn get_proof( } log::info!(target: "prover", "Proof id {:?}. Status: PROVING.", proof_request_by_id.proof_id); - return json!({ + json!({ "status": ProverStateStatus::PROVING, "proof": Option::<&[u8]>::None, - }); + }) } #[rocket::post("/create_proof", format = "json", data = "")] async fn create_proof( - mut state: &rocket::State, + state: &rocket::State, create_proof_request: Json, ) -> Value { log::info!(target: "prover", "Create proof request by height: {:?} trusted_height: {:?}, trusted_hash : {}", create_proof_request.height, create_proof_request.trusted_height, create_proof_request.trusted_hash); // log::info!(target: "prover", "Create proof request : {:?}", create_proof_request); - let proof_id = format!("{}{}", create_proof_request.trusted_height.to_string(), create_proof_request.height.to_string()); + let proof_id = format!( + "{}{}", + create_proof_request.trusted_height, create_proof_request.height + ); //important we do not need to start regeneration of the proof if it is already generated - let proof = executor::get_proof(create_proof_request.trusted_height, create_proof_request.height).await; - if let Some(proof) = proof { + let proof = executor::get_proof( + create_proof_request.trusted_height, + create_proof_request.height, + ) + .await; + if let Some(_proof) = proof { log::info!(target: "prover", "Proof ready for block_height: {:?}. No need to generate new proof.", create_proof_request.height); return json!({ "status": "COMPLETED", @@ -121,8 +127,6 @@ async fn create_proof( let status = state.borrow().state.clone(); - - if *status.read().await.deref() == ProverStateStatus::PROVING { log::info!(target: "prover", "Proof generation already in progress. Proof block_height: {:?}", proof_id); return json!({ @@ -138,7 +142,7 @@ async fn create_proof( log::info!(target: "prover", "Server went to PROVING status"); log::info!(target: "prover", "Proof generation started for block_height: {:?}", create_proof_request.height); - let x = executor::generate_proof( + let _ = executor::generate_proof( create_proof_request.msgs.clone(), create_proof_request.signatures.clone(), create_proof_request.public_keys.clone(), @@ -172,7 +176,7 @@ fn rocket() -> _ { PORT="7777" ADDRESS="0.0.0.0" SUCCINCT_ORG_NAME="blasrodri" SUCCINCT_PROJECT_NAME="tendermintx-mainnet" TENDERMINTX_PATH="/home/ubuntu/zk-prover/tendermintx-private/" DATADIR="/home/ubuntu/zk-prover/zk-server" cargo run - + */ executor::setup_logging(); @@ -204,13 +208,10 @@ fn rocket() -> _ { log::warn!(target: "prover", "To specify the path to the PROOF_WAIT_TIME_SEC, set the PROOF_WAIT_TIME_SEC environment variable."); log::info!(target: "prover", "PROOF_WAIT_TIME_SEC: {:?}", proof_wait_time_sec); - - - let prover_state = ProverState::new(); let config = rocket::config::Config { address: address.parse().unwrap(), - port: port, + port, ..Default::default() }; // rocket::build() @@ -219,7 +220,7 @@ fn rocket() -> _ { .manage(prover_state) } -pub fn get_string_from_env(s: &str) -> String { +pub fn get_string_from_env(_s: &str) -> String { let env_str = std::env::var("s").unwrap_or("".to_string()); - return env_str; + env_str }