# Stealth Address Kit The Stealth Address Kit leverages the [arkworks-rs](https://github.com/arkworks-rs/curves) suite of libraries to provide a robust implementation of stealth addresses. ## Supported Curves The following curves are currently supported: 1. `ark_bn254` 2. `ark_bls_12_381` 3. `ark_bls_12_377` 4. `secp256k1` 5. `secp256r1` 6. `pallas` 7. `vesta` 8. `bw6_761` 9. `baby_jub_jub` ## Benchmarks See the [benchmarks](./benchmarks/report/index.html) for performance comparisons across supported curves. ## Usage Example Below is an example demonstrating how to use the Stealth Address Kit with the `ark_bn254` curve: ```rust use stealth_address_kit::StealthAddressOnCurve; use ark_bn254::Bn254; fn main() { let (spending_key, spending_public_key) = Bn254::random_keypair(); let (viewing_key, viewing_public_key) = Bn254::random_keypair(); // Generate ephemeral keypair let (ephemeral_private_key, ephemeral_public_key) = Bn254::random_keypair(); let (stealth_address, view_tag) = Bn254::generate_stealth_address(viewing_public_key, spending_public_key, ephemeral_private_key); let stealth_private_key_opt = Bn254::generate_stealth_private_key(ephemeral_public_key, viewing_key, spending_key, view_tag); if stealth_private_key_opt.is_none() { panic!("View tags did not match"); } let derived_stealth_address = Bn254::derive_public_key(&stealth_private_key_opt.unwrap()); assert_eq!(derived_stealth_address, stealth_address); } ``` ## Adding a New Curve To add support for a new curve, follow these steps: 1. Add the curve to the `Cargo.toml` file as a feature. 2. Create a new module in the `src` directory with the curve name, suffixed by `_impl.rs`. 3. Implement the `StealthAddressOnCurve` trait for the curve. 4. Define the macro `define_curve_ffi`. 5. Add the curve to the `lib.rs` file in the `mod` declaration, and re-export if required. 6. Update the README to include the new curve. 7. Add the curve to the nightly release workflow. 8. Add the curve to the benchmarks. ## Building and Testing ### Building To build the project, use the following command: ```sh cargo build --release --features ``` ### Testing To run tests, use the following command: ```sh cargo test --release --features ``` ### Benchmarks To run benchmarks, use the following command: ```sh make bench ``` This will run benchmarks for all supported curves, and output the results to the `benchmarks` directory. ## FFI API The exposed FFI API supports all curves, prefixed by the curve name. Ensure that the correct feature is enabled when building the library. ## Precompiled Libraries Precompiled libraries are available in the nightly releases. ## Acknowledgements This project is inspired by the [ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) EIP and the [proof of concept](https://github.com/nerolation/EIP-Stealth-Address-ERC/blob/main/minimal_poc.ipynb) by Nerolation.