From 62c0c9fd0a6249e352493fe3909acce53aa6d202 Mon Sep 17 00:00:00 2001 From: Alejandro Cabeza Romero Date: Mon, 27 Apr 2026 18:50:08 +0200 Subject: [PATCH] Use dat slice. --- .../tests/generate_witness.rs | 33 +++++++++++++++++++ .../src/native/witness_input.rs | 10 +++--- 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 rust/logos-blockchain-circuits-poq-sys/tests/generate_witness.rs diff --git a/rust/logos-blockchain-circuits-poq-sys/tests/generate_witness.rs b/rust/logos-blockchain-circuits-poq-sys/tests/generate_witness.rs new file mode 100644 index 0000000..c6c50a8 --- /dev/null +++ b/rust/logos-blockchain-circuits-poq-sys/tests/generate_witness.rs @@ -0,0 +1,33 @@ +use std::path::PathBuf; +use logos_blockchain_circuits_poq_sys::{generate_witness, generate_witness_from_files}; +use lbc_types::native::WitnessInput; + +fn lib_dir() -> PathBuf { + PathBuf::from( + std::env::var("POQ_LIB_DIR").expect("POQ_LIB_DIR must point to the poq library directory"), + ) +} + +fn inputs_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../blend/poq-input.json") +} + +#[test] +fn generate_witness_matches_from_files() { + let dat = lib_dir().join("witness_generator"); + let inputs = inputs_path(); + let witness_path = std::env::temp_dir().join("poq_test_witness.wtns"); + + generate_witness_from_files(&dat, &inputs, &witness_path) + .expect("generate_witness_from_files failed"); + + let dat_bytes = std::fs::read(dat.with_extension("dat")) + .expect("failed to read witness_generator.dat"); + let inputs_json = std::fs::read_to_string(&inputs).expect("failed to read poq-input.json"); + + let input = WitnessInput::new(dat_bytes.as_slice(), inputs_json).expect("failed to construct WitnessInput"); + let output = generate_witness(input).expect("generate_witness failed"); + + let expected = std::fs::read(&witness_path).expect("failed to read witness output file"); + assert_eq!(output.as_slice(), expected.as_slice()); +} diff --git a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs index ced2660..9dd1a09 100644 --- a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs +++ b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs @@ -3,15 +3,15 @@ use crate::ffi; use crate::native::Error; /// Input for witness generators -pub struct WitnessInput { +pub struct WitnessInput<'a> { /// The circuit's dat file contents. - dat: Vec, + dat: &'a [u8], /// The JSON string containing the circuit inputs. inputs_json: CString, } -impl WitnessInput { - pub fn new(dat: Vec, inputs_json: String) -> Result { +impl<'a> WitnessInput<'a> { + pub fn new(dat: &'a [u8], inputs_json: String) -> Result { let inputs_json = CString::new(inputs_json).map_err( |error| Error::InvalidInput(Some( format!("The parameter inputs_json could not be converted to CString: {}", error) @@ -29,7 +29,7 @@ impl WitnessInput { /// Temporary FFI view of a [`WitnessInput`], which makes [`ffi::WitnessInput`] lifetime-aware. pub struct WitnessInputFfiGuard<'a> { ffi: ffi::WitnessInput, - _lifetime: std::marker::PhantomData<&'a WitnessInput>, + _lifetime: std::marker::PhantomData<&'a WitnessInput<'a>>, } impl<'a> WitnessInputFfiGuard<'a> {