From acf9d82841f0a117b5f9384fb76775c3c2c4a16e Mon Sep 17 00:00:00 2001 From: Alejandro Cabeza Romero Date: Wed, 22 Apr 2026 18:25:15 +0200 Subject: [PATCH] Implement FFI types. Add placeholder for native types. --- .gitignore | 3 ++ .../Cargo.lock | 16 +++++++ .../Cargo.toml | 7 +++ .../src/ffi/bytes.rs | 38 ++++++++++++++++ .../src/ffi/mod.rs | 7 +++ .../src/ffi/status.rs | 44 +++++++++++++++++++ .../src/ffi/witness_input.rs | 7 +++ .../src/lib.rs | 2 + .../src/types/bytes.rs | 0 .../src/types/mod.rs | 3 ++ .../src/types/status.rs | 0 .../src/types/witness_input.rs | 0 12 files changed, 127 insertions(+) create mode 100644 rust/logos-blockchain-circuits-types/Cargo.lock create mode 100644 rust/logos-blockchain-circuits-types/Cargo.toml create mode 100644 rust/logos-blockchain-circuits-types/src/ffi/bytes.rs create mode 100644 rust/logos-blockchain-circuits-types/src/ffi/mod.rs create mode 100644 rust/logos-blockchain-circuits-types/src/ffi/status.rs create mode 100644 rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs create mode 100644 rust/logos-blockchain-circuits-types/src/lib.rs create mode 100644 rust/logos-blockchain-circuits-types/src/types/bytes.rs create mode 100644 rust/logos-blockchain-circuits-types/src/types/mod.rs create mode 100644 rust/logos-blockchain-circuits-types/src/types/status.rs create mode 100644 rust/logos-blockchain-circuits-types/src/types/witness_input.rs diff --git a/.gitignore b/.gitignore index 4e1ae71..317abd5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ result *.r1cs **/input.json **/*-input.json + +# Rust Codebase +rust/**/target/ diff --git a/rust/logos-blockchain-circuits-types/Cargo.lock b/rust/logos-blockchain-circuits-types/Cargo.lock new file mode 100644 index 0000000..9f11a54 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "libc" +version = "0.2.185" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" + +[[package]] +name = "logos-blockchain-circuits-types" +version = "0.1.0" +dependencies = [ + "libc", +] diff --git a/rust/logos-blockchain-circuits-types/Cargo.toml b/rust/logos-blockchain-circuits-types/Cargo.toml new file mode 100644 index 0000000..081d099 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "logos-blockchain-circuits-types" +version = "0.1.0" +edition = "2024" + +[dependencies] +libc = "0.2.185" diff --git a/rust/logos-blockchain-circuits-types/src/ffi/bytes.rs b/rust/logos-blockchain-circuits-types/src/ffi/bytes.rs new file mode 100644 index 0000000..ddf3c84 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/ffi/bytes.rs @@ -0,0 +1,38 @@ +use libc::free; + +mod inner { + #[repr(C)] + pub struct Buffer { + pub data: T, + pub size: usize, + } +} + +pub type Bytes = inner::Buffer<*mut u8>; +pub type ConstBytes = inner::Buffer<*const u8>; + +/// Frees the data buffer inside a [`Bytes`] struct allocated by the C API. +/// +/// Only the inner data buffer is freed, not the struct itself, since the latter is managed by the +/// caller. +/// +/// # Arguments +/// +/// - `bytes`: A pointer to a [`Bytes`] struct whose data buffer was allocated by the C API and +/// needs to be freed. +/// +/// # Safety +/// +/// Dereferences raw pointers. The caller must ensure that the pointer is valid. +pub unsafe fn free_bytes(bytes: *mut Bytes) { + if bytes.is_null() { + return; + } + + let bytes = unsafe { &mut *bytes }; + if !bytes.data.is_null() { + unsafe { free(bytes.data as *mut libc::c_void) }; + } + bytes.data = std::ptr::null_mut(); + bytes.size = 0; +} diff --git a/rust/logos-blockchain-circuits-types/src/ffi/mod.rs b/rust/logos-blockchain-circuits-types/src/ffi/mod.rs new file mode 100644 index 0000000..1ab276d --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/ffi/mod.rs @@ -0,0 +1,7 @@ +pub mod status; +pub mod bytes; +pub mod witness_input; + +pub use status::Status; +pub use bytes::{Bytes, ConstBytes, free_bytes}; +pub use witness_input::WitnessInput; diff --git a/rust/logos-blockchain-circuits-types/src/ffi/status.rs b/rust/logos-blockchain-circuits-types/src/ffi/status.rs new file mode 100644 index 0000000..6cb4b68 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/ffi/status.rs @@ -0,0 +1,44 @@ +use std::cmp::PartialEq; + +#[repr(C)] +#[derive(Debug, PartialEq)] +pub enum Code { + Ok = 0, + DynError = 1, + InvalidInput = 2, + OutOfMemory = 3, +} + +impl Code { + pub fn is_ok(&self) -> bool { + self == &Code::Ok + } + + pub fn is_error(&self) -> bool { + !self.is_ok() + } +} + +#[repr(C)] +#[derive(Debug)] +pub struct Status { + pub code: Code, + pub message: String, +} + +impl Status { + pub fn ok() -> Self { + Status { + code: Code::Ok, + message: String::new(), + } + } + + pub fn is_ok(&self) -> bool { + self.code.is_ok() + } + + pub fn is_error(&self) -> bool { + self.code.is_error() + } +} diff --git a/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs b/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs new file mode 100644 index 0000000..d22bd18 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs @@ -0,0 +1,7 @@ +use std::ffi::c_char; +use crate::ffi::ConstBytes; + +pub struct WitnessInput { + pub dat: ConstBytes, + pub inputs_json: *const c_char, +} diff --git a/rust/logos-blockchain-circuits-types/src/lib.rs b/rust/logos-blockchain-circuits-types/src/lib.rs new file mode 100644 index 0000000..865ec31 --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/lib.rs @@ -0,0 +1,2 @@ +pub mod ffi; +pub mod types; diff --git a/rust/logos-blockchain-circuits-types/src/types/bytes.rs b/rust/logos-blockchain-circuits-types/src/types/bytes.rs new file mode 100644 index 0000000..e69de29 diff --git a/rust/logos-blockchain-circuits-types/src/types/mod.rs b/rust/logos-blockchain-circuits-types/src/types/mod.rs new file mode 100644 index 0000000..adabe2d --- /dev/null +++ b/rust/logos-blockchain-circuits-types/src/types/mod.rs @@ -0,0 +1,3 @@ +pub mod bytes; +pub mod status; +pub mod witness_input; diff --git a/rust/logos-blockchain-circuits-types/src/types/status.rs b/rust/logos-blockchain-circuits-types/src/types/status.rs new file mode 100644 index 0000000..e69de29 diff --git a/rust/logos-blockchain-circuits-types/src/types/witness_input.rs b/rust/logos-blockchain-circuits-types/src/types/witness_input.rs new file mode 100644 index 0000000..e69de29