Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions lgn-provers/src/provers/v1/groth16/euclid_prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,26 @@ impl Groth16EuclidProver {
pk_file: &str,
checksums: &HashMap<String, blake3::Hash>,
) -> Result<Self> {
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 })
Expand Down
7 changes: 5 additions & 2 deletions lgn-provers/src/provers/v1/preprocessing/euclid_prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,11 @@ impl PreprocessingEuclidProver {
checksums: &HashMap<String, blake3::Hash>,
) -> anyhow::Result<Self> {
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 })
}

Expand Down
7 changes: 5 additions & 2 deletions lgn-provers/src/provers/v1/query/euclid_prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,11 @@ impl QueryEuclidProver {
checksums: &HashMap<String, blake3::Hash>,
) -> anyhow::Result<Self> {
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 })
}

Expand Down
91 changes: 58 additions & 33 deletions lgn-worker/src/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -35,47 +36,71 @@ impl ProversManager {
) -> anyhow::Result<Self> {
info!("Registering the provers");

let mut provers = HashMap::<ProverType, Box<dyn LgnProver>>::new();
let mut join_set: JoinSet<anyhow::Result<(ProverType, Box<dyn LgnProver + Send>)>> =
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<dyn LgnProver + Send> = 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<dyn LgnProver + Send> =
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<dyn LgnProver + Send> = Box::new(groth16_prover);
Ok((ProverType::V1Groth16, groth16_prover))
});
}

let mut provers = HashMap::<ProverType, Box<dyn LgnProver>>::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.");
Expand Down