diff --git a/lgn-provers/src/provers/v1/groth16/euclid_prover.rs b/lgn-provers/src/provers/v1/groth16/euclid_prover.rs index c10e73b..ad02735 100644 --- a/lgn-provers/src/provers/v1/groth16/euclid_prover.rs +++ b/lgn-provers/src/provers/v1/groth16/euclid_prover.rs @@ -21,17 +21,26 @@ impl Groth16EuclidProver { pk_file: &str, checksums: &HashMap, ) -> Result { - let circuit_bytes = - params::download_and_checksum(url, dir, circuit_file, checksums).await?; - let r1cs_bytes = params::download_and_checksum(url, dir, r1cs_file, checksums).await?; - let pk_bytes = params::download_and_checksum(url, dir, pk_file, checksums).await?; + let (circuit_bytes, r1cs_bytes, pk_bytes) = tokio::join!( + params::download_and_checksum(url, dir, circuit_file, checksums), + params::download_and_checksum(url, dir, r1cs_file, checksums), + params::download_and_checksum(url, dir, pk_file, checksums), + ); + + let circuit_bytes = circuit_bytes?; + let r1cs_bytes = r1cs_bytes?; + let pk_bytes = pk_bytes?; debug!("Creating Groth16 prover"); - let inner = Groth16Prover::from_bytes( - r1cs_bytes.to_vec(), - pk_bytes.to_vec(), - circuit_bytes.to_vec(), - )?; + + let inner = tokio::task::spawn_blocking(move || { + Groth16Prover::from_bytes( + r1cs_bytes.to_vec(), + pk_bytes.to_vec(), + circuit_bytes.to_vec(), + ) + }) + .await??; debug!("Groth16 prover created"); Ok(Self { inner }) diff --git a/lgn-provers/src/provers/v1/preprocessing/euclid_prover.rs b/lgn-provers/src/provers/v1/preprocessing/euclid_prover.rs index ebd39dc..f1168b8 100644 --- a/lgn-provers/src/provers/v1/preprocessing/euclid_prover.rs +++ b/lgn-provers/src/provers/v1/preprocessing/euclid_prover.rs @@ -43,8 +43,11 @@ impl PreprocessingEuclidProver { checksums: &HashMap, ) -> anyhow::Result { let params = params::download_and_checksum(url, dir, file, checksums).await?; - let reader = std::io::BufReader::new(params.as_ref()); - let params = bincode::deserialize_from(reader)?; + let params = tokio::task::spawn_blocking(move || { + let reader = std::io::BufReader::new(params.as_ref()); + bincode::deserialize_from(reader) + }) + .await??; Ok(Self { params }) } diff --git a/lgn-provers/src/provers/v1/query/euclid_prover.rs b/lgn-provers/src/provers/v1/query/euclid_prover.rs index 26f74b1..09bffaa 100644 --- a/lgn-provers/src/provers/v1/query/euclid_prover.rs +++ b/lgn-provers/src/provers/v1/query/euclid_prover.rs @@ -66,8 +66,11 @@ impl QueryEuclidProver { checksums: &HashMap, ) -> anyhow::Result { let params = params::download_and_checksum(url, dir, file, checksums).await?; - let reader = std::io::BufReader::new(params.as_ref()); - let params = bincode::deserialize_from(reader)?; + let params = tokio::task::spawn_blocking(move || { + let reader = std::io::BufReader::new(params.as_ref()); + bincode::deserialize_from(reader) + }) + .await??; Ok(Self { params }) } diff --git a/lgn-worker/src/manager.rs b/lgn-worker/src/manager.rs index 1647880..2d82ad4 100644 --- a/lgn-worker/src/manager.rs +++ b/lgn-worker/src/manager.rs @@ -9,6 +9,7 @@ use lgn_messages::types::MessageReplyEnvelope; use lgn_messages::types::ProverType; use lgn_messages::types::TaskDifficulty; use lgn_provers::provers::LgnProver; +use tokio::task::JoinSet; use tracing::info; use crate::config::Config; @@ -35,47 +36,71 @@ impl ProversManager { ) -> anyhow::Result { info!("Registering the provers"); - let mut provers = HashMap::>::new(); + let mut join_set: JoinSet)>> = + JoinSet::new(); if config.worker.instance_type >= TaskDifficulty::Small { - let query_prover = lgn_provers::provers::v1::query::create_prover( - &config.public_params.params_base_url(), - &config.public_params.dir, - &config.public_params.query_params.file, - checksums, - ) - .await - .context("initializing Small prover")?; - - provers.insert(ProverType::V1Query, Box::new(query_prover)); + let config = config.clone(); + let checksums = checksums.clone(); + join_set.spawn(async move { + let query_prover = lgn_provers::provers::v1::query::create_prover( + &config.public_params.params_base_url(), + &config.public_params.dir, + &config.public_params.query_params.file, + &checksums, + ) + .await + .context("initializing Small prover")?; + + let query_prover: Box = Box::new(query_prover); + Ok((ProverType::V1Query, query_prover)) + }); } if config.worker.instance_type >= TaskDifficulty::Medium { - let preprocessing_prover = lgn_provers::provers::v1::preprocessing::create_prover( - &config.public_params.params_base_url(), - &config.public_params.dir, - &config.public_params.preprocessing_params.file, - checksums, - ) - .await - .context("initializing Medium prover")?; - - provers.insert(ProverType::V1Preprocessing, Box::new(preprocessing_prover)); + let config = config.clone(); + let checksums = checksums.clone(); + join_set.spawn(async move { + let preprocessing_prover = lgn_provers::provers::v1::preprocessing::create_prover( + &config.public_params.params_base_url(), + &config.public_params.dir, + &config.public_params.preprocessing_params.file, + &checksums, + ) + .await + .context("initializing Medium prover")?; + + let preprocessing_prover: Box = + Box::new(preprocessing_prover); + Ok((ProverType::V1Preprocessing, preprocessing_prover)) + }); } if config.worker.instance_type >= TaskDifficulty::Large { - let groth16_prover = lgn_provers::provers::v1::groth16::create_prover( - &config.public_params.params_base_url(), - &config.public_params.dir, - &config.public_params.groth16_assets.circuit_file, - checksums, - &config.public_params.groth16_assets.r1cs_file, - &config.public_params.groth16_assets.pk_file, - ) - .await - .context("initializing Large prover")?; - - provers.insert(ProverType::V1Groth16, Box::new(groth16_prover)); + let config = config.clone(); + let checksums = checksums.clone(); + join_set.spawn(async move { + let groth16_prover = lgn_provers::provers::v1::groth16::create_prover( + &config.public_params.params_base_url(), + &config.public_params.dir, + &config.public_params.groth16_assets.circuit_file, + &checksums, + &config.public_params.groth16_assets.r1cs_file, + &config.public_params.groth16_assets.pk_file, + ) + .await + .context("initializing Large prover")?; + + let groth16_prover: Box = Box::new(groth16_prover); + Ok((ProverType::V1Groth16, groth16_prover)) + }); + } + + let mut provers = HashMap::>::new(); + + while let Some(res) = join_set.join_next().await { + let (prover_type, prover) = res??; + provers.insert(prover_type, prover); } info!("Finished registering the provers.");