Skip to main content

Rust bindings

Rust bindings allow you to use ICICLE as a rust library.

icicle-core defines all interfaces, macros and common methods.

icicle-runtime contains runtime APIs for memory management, stream management and more.

icicle-curves / icicle-fields implement all interfaces and macros from icicle-core for each curve. For example icicle-bn254 implements curve bn254. Each curve has its own build script which will build the ICICLE libraries for that curve as part of the rust-toolchain build.

Using ICICLE Rust bindings in your project

Simply add the following to your Cargo.toml.

# GPU Icicle integration
icicle-runtime = { git = "https://github.com/ingonyama-zk/icicle.git" }
icicle-core = { git = "https://github.com/ingonyama-zk/icicle.git" }
icicle-bn254 = { git = "https://github.com/ingonyama-zk/icicle.git" }

icicle-bn254 being the curve you wish to use and icicle-core and icicle-runtime contain ICICLE utilities and CUDA wrappers.

If you wish to point to a specific ICICLE branch add branch = "<name_of_branch>" or tag = "<name_of_tag>" to the ICICLE dependency. For a specific commit add rev = "<commit_id>".

When you build your project ICICLE will be built as part of the build command.

How do the rust bindings work?

The rust bindings are rust crates that wrap the ICICLE Core libraries (C++). Each crate can wrap one or more ICICLE core libraries. They are built too when building the crate.

note

Since ICICLE V3, core libraries are shared-libraries. This means that they must be installed in a directory that can be found by the linker. In addition, installing an application that depends on ICICLE must make sure to install ICICLE or have it installed on the target machine.