Uses the arkworks-rs suite of libraries.
ark_bn254
ark_bls_12_381
ark_bls_12_377
secp256k1
secp256r1
pallas
vesta
bw6_761
baby_jub_jub
use stealth_address_kit::StealthAddressOnCurve;
use ark_bn254::Bn254; // or ark_bls_12_381::Bls12_381 or ark_bls_12_377::Bls12_377, stealth_address_kit::Secp256k1, stealth_address_kit::Secp256r1, etc
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);
}
- Add the curve to the
Cargo.toml
file, as a feature - Create a new module in the
src
directory, with the curve name, suffixed by_impl.rs
- Implement the
StealthAddressOnCurve
trait for the curve - Define the macro
define_curve_ffi
- Add the curve to the
lib.rs
file, in themod
declaration, as well as re-export if required - Add the curve to the README
- Add the curve to the nightly release workflow
-
Building
cargo build --release --features <bn254/bls12_381/bls12_377/secp256k1/secp256r1/etc>
-
Testing
cargo test --release --features <bn254/bls12_381/bls12_377/secp256k1/secp256r1/etc>
The exposed FFI API supports all curves, prefixed by the curve name. Ensure that the correct feature is enabled when building the library.
Check out the nightly releases.