From 0fdacbe01a75b89b1d5fe2e92fccd7e63dbd7d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex?= Date: Fri, 29 May 2026 21:14:17 +0200 Subject: [PATCH] feat: Rapidsnark crate (#39) --- rust/Cargo.lock | 7 +++++ rust/Cargo.toml | 2 ++ .../src/lib.rs | 28 +++++++++++++++---- .../build.rs | 2 +- .../build.rs | 2 +- .../build.rs | 2 +- .../Cargo.toml | 22 +++++++++++++++ .../build.rs | 3 ++ .../src/lib.rs | 26 +++++++++++++++++ .../build.rs | 2 +- 10 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 rust/logos-blockchain-circuits-rapidsnark-sys/Cargo.toml create mode 100644 rust/logos-blockchain-circuits-rapidsnark-sys/build.rs create mode 100644 rust/logos-blockchain-circuits-rapidsnark-sys/src/lib.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index b2350bc..d896bb1 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -231,6 +231,13 @@ dependencies = [ "serde_json", ] +[[package]] +name = "logos-blockchain-circuits-rapidsnark-sys" +version = "0.5.0" +dependencies = [ + "logos-blockchain-circuits-build", +] + [[package]] name = "logos-blockchain-circuits-signature-sys" version = "0.5.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 5075ed9..98b69e2 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -18,6 +18,7 @@ members = [ "logos-blockchain-circuits-tests", "logos-blockchain-circuits-types", "logos-blockchain-circuits-common", + "logos-blockchain-circuits-rapidsnark-sys", ] resolver = "3" @@ -28,6 +29,7 @@ lbc-build = { package = "logos-blockchain-circuits-build", path = "./logos-block lbc-poc-sys = { package = "logos-blockchain-circuits-poc-sys", path = "./logos-blockchain-circuits-poc-sys" } lbc-pol-sys = { package = "logos-blockchain-circuits-pol-sys", path = "./logos-blockchain-circuits-pol-sys" } lbc-poq-sys = { package = "logos-blockchain-circuits-poq-sys", path = "./logos-blockchain-circuits-poq-sys" } +lbc-rapidsnark-sys = { package = "logos-blockchain-circuits-rapidsnark-sys", path = "./logos-blockchain-circuits-rapidsnark-sys" } lbc-signature-sys = { package = "logos-blockchain-circuits-signature-sys", path = "./logos-blockchain-circuits-signature-sys" } lbc-types = { default-features = false, package = "logos-blockchain-circuits-types", path = "./logos-blockchain-circuits-types" } diff --git a/rust/logos-blockchain-circuits-build/src/lib.rs b/rust/logos-blockchain-circuits-build/src/lib.rs index 6ba58c0..b445c70 100644 --- a/rust/logos-blockchain-circuits-build/src/lib.rs +++ b/rust/logos-blockchain-circuits-build/src/lib.rs @@ -115,13 +115,13 @@ mod prebuilt { } } -pub fn build(circuit_name: &str) { +fn resolve_root() -> PathBuf { println!("cargo:rerun-if-env-changed={LBC_ROOT_DIR}"); println!("cargo:rerun-if-env-changed=CARGO_PKG_VERSION"); println!("cargo:rerun-if-changed=Cargo.toml"); println!("cargo:rerun-if-changed=build.rs"); - let lbc_root_dir = std::env::var(LBC_ROOT_DIR).map_or_else( + let root = std::env::var(LBC_ROOT_DIR).map_or_else( |_| { #[cfg(not(feature = "prebuilt"))] panic!( @@ -150,23 +150,30 @@ pub fn build(circuit_name: &str) { }, ); - let lbc_root_dir_str = lbc_root_dir + let root_str = root .to_str() .expect("Failed to convert the root directory path to a string"); - let circuit_dir = lbc_root_dir.join(circuit_name); + println!("cargo:rustc-env={LBC_ROOT_DIR}={root_str}"); + + root +} + +pub fn build_circuit(circuit_name: &str) { + let root = resolve_root(); + + let circuit_dir = root.join(circuit_name); let circuit_dir_str = circuit_dir .to_str() .expect("Failed to convert the circuit directory path to a string"); - let lib_dir = lbc_root_dir.join("lib"); + let lib_dir = root.join("lib"); let lib_dir_str = lib_dir .to_str() .expect("Failed to convert the lib directory path to a string"); println!("cargo:rerun-if-changed={circuit_dir_str}"); println!("cargo:rerun-if-changed={lib_dir_str}"); - println!("cargo:rustc-env={LBC_ROOT_DIR}={lbc_root_dir_str}"); println!("cargo:rustc-link-search=native={circuit_dir_str}"); println!("cargo:rustc-link-search=native={lib_dir_str}"); println!("cargo:rustc-link-lib=static={circuit_name}"); @@ -177,3 +184,12 @@ pub fn build(circuit_name: &str) { println!("cargo:rustc-link-lib={cpp_lib}"); println!("cargo:rustc-link-lib=static=gmp"); } + +pub fn build_rapidsnark() { + let root = resolve_root(); + + for binary in ["prover", "verifier"] { + let path = root.join(binary); + println!("cargo:rerun-if-changed={}", path.display()); + } +} diff --git a/rust/logos-blockchain-circuits-poc-sys/build.rs b/rust/logos-blockchain-circuits-poc-sys/build.rs index 699bb69..02c2d57 100644 --- a/rust/logos-blockchain-circuits-poc-sys/build.rs +++ b/rust/logos-blockchain-circuits-poc-sys/build.rs @@ -1,3 +1,3 @@ fn main() { - lbc_build::build("poc"); + lbc_build::build_circuit("poc"); } diff --git a/rust/logos-blockchain-circuits-pol-sys/build.rs b/rust/logos-blockchain-circuits-pol-sys/build.rs index 7385330..853dcaa 100644 --- a/rust/logos-blockchain-circuits-pol-sys/build.rs +++ b/rust/logos-blockchain-circuits-pol-sys/build.rs @@ -1,3 +1,3 @@ fn main() { - lbc_build::build("pol"); + lbc_build::build_circuit("pol"); } diff --git a/rust/logos-blockchain-circuits-poq-sys/build.rs b/rust/logos-blockchain-circuits-poq-sys/build.rs index e5df6dc..28d8682 100644 --- a/rust/logos-blockchain-circuits-poq-sys/build.rs +++ b/rust/logos-blockchain-circuits-poq-sys/build.rs @@ -1,3 +1,3 @@ fn main() { - lbc_build::build("poq"); + lbc_build::build_circuit("poq"); } diff --git a/rust/logos-blockchain-circuits-rapidsnark-sys/Cargo.toml b/rust/logos-blockchain-circuits-rapidsnark-sys/Cargo.toml new file mode 100644 index 0000000..a672026 --- /dev/null +++ b/rust/logos-blockchain-circuits-rapidsnark-sys/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "logos-blockchain-circuits-rapidsnark-sys" +categories.workspace = true +description.workspace = true +edition.workspace = true +keywords.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true + +[features] +default = ["prebuilt"] +prebuilt = ["lbc-build/prebuilt"] + +[lints] +workspace = true + +[dependencies] + +[build-dependencies] +lbc-build = { workspace = true } diff --git a/rust/logos-blockchain-circuits-rapidsnark-sys/build.rs b/rust/logos-blockchain-circuits-rapidsnark-sys/build.rs new file mode 100644 index 0000000..33c686c --- /dev/null +++ b/rust/logos-blockchain-circuits-rapidsnark-sys/build.rs @@ -0,0 +1,3 @@ +fn main() { + lbc_build::build_rapidsnark(); +} diff --git a/rust/logos-blockchain-circuits-rapidsnark-sys/src/lib.rs b/rust/logos-blockchain-circuits-rapidsnark-sys/src/lib.rs new file mode 100644 index 0000000..72411e4 --- /dev/null +++ b/rust/logos-blockchain-circuits-rapidsnark-sys/src/lib.rs @@ -0,0 +1,26 @@ +use std::path::PathBuf; + +#[cfg(target_os = "windows")] +const PROVER_BINARY: &str = "prover.exe"; +#[cfg(not(target_os = "windows"))] +const PROVER_BINARY: &str = "prover"; + +#[cfg(target_os = "windows")] +const VERIFIER_BINARY: &str = "verifier.exe"; +#[cfg(not(target_os = "windows"))] +const VERIFIER_BINARY: &str = "verifier"; + +#[must_use] +fn lbc_root_dir() -> PathBuf { + PathBuf::from(env!("LBC_ROOT_DIR")) +} + +#[must_use] +pub fn prover() -> PathBuf { + lbc_root_dir().join(PROVER_BINARY) +} + +#[must_use] +pub fn verifier() -> PathBuf { + lbc_root_dir().join(VERIFIER_BINARY) +} diff --git a/rust/logos-blockchain-circuits-signature-sys/build.rs b/rust/logos-blockchain-circuits-signature-sys/build.rs index f244ed1..8514c91 100644 --- a/rust/logos-blockchain-circuits-signature-sys/build.rs +++ b/rust/logos-blockchain-circuits-signature-sys/build.rs @@ -1,3 +1,3 @@ fn main() { - lbc_build::build("signature"); + lbc_build::build_circuit("signature"); }