Skip to main content

Keystore

Struct Keystore 

pub struct Keystore { /* private fields */ }
Expand description

A wrapper around IOTA’s file-based keystore for signing operations.

Provides convenient methods for loading keys by alias and performing cryptographic operations like signing and address derivation.

Implementations§

§

impl Keystore

pub fn init_with_alias<P>(path: P, alias: &str) -> Result<Address, Error>
where P: Into<PathBuf>,

Creates a new keystore file and generates a new Ed25519 key pair with the given alias.

This is a convenience function that opens the keystore file at the specified path, creating it if it does not exist and keeping any keys already in it, generates a new random Ed25519 key pair, stores it with the provided alias, and returns its address.

§Arguments
  • path - Path where the keystore file should be created (e.g., “./iota.keystore”)
  • alias - Human-readable alias for the new key (e.g., “deployer”, “admin”)
§Returns
  • Ok(Address) - The blockchain address of the newly generated key
  • Err - If keystore creation or key generation fails
§Example
use crypto::keystore::Keystore;

// Create a new keystore and generate a key with alias "my-key"
let address = Keystore::init_with_alias("./iota.keystore", "my-key").unwrap();
println!("Generated new key with address: {}", address);

// Now you can load it using new_with_alias
let keystore = Keystore::new_with_alias("./iota.keystore", "my-key").unwrap();

pub fn generate_new_key_with_alias<P>( path: P, alias: &str, ) -> Result<Address, Error>
where P: Into<PathBuf>,

Generates a new Ed25519 key pair and stores it with the given alias.

This is a convenience function with a more descriptive name that calls init_with_alias. It creates a new keystore file at the specified path (if it doesn’t exist), generates a new random Ed25519 key pair, stores it with the provided alias, and returns the generated address.

§Arguments
  • path - Path where the keystore file should be created (e.g., “./iota.keystore”)
  • alias - Human-readable alias for the new key (e.g., “deployer”, “admin”)
§Returns
  • Ok(Address) - The blockchain address of the newly generated key
  • Err - If keystore creation or key generation fails
§Example
use crypto::keystore::Keystore;

// Generate a new key with alias "my-key"
let address = Keystore::generate_new_key_with_alias("./iota.keystore", "my-key").unwrap();
println!("Generated new key with address: {}", address);

// Now you can load it using new_with_alias
let keystore = Keystore::new_with_alias("./iota.keystore", "my-key").unwrap();

pub fn new_with_alias<P>(path: P, alias: &str) -> Result<Keystore, Error>
where P: Into<PathBuf>,

Creates a new Keystore by loading a key from a file-based keystore using an alias.

§Arguments
  • path - Path to the keystore file (e.g., “./iota.keystore”)
  • alias - Human-readable alias for the key (e.g., “deployer”, “admin”)
§Returns
  • Ok(Keystore) - Successfully loaded keystore
  • Err - If the keystore file cannot be opened or parsed, or the alias is not present
§Panics

Panics if the entry stored under alias is not a key pair: Account and External (e.g. hardware-backed) entries carry no private key, and the load unwraps that error.

§Example
use crypto::keystore::Keystore;

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();

pub fn alias(&self) -> Option<String>

Returns the alias associated with this keystore entry, if any.

§Returns
  • Some(String) - The alias if one was set during initialization
  • None - If no alias is associated

pub fn address(&self) -> String

Returns the IOTA blockchain address derived from the key.

§Returns

The blockchain address as a hex string (e.g., “0x2ade910d…”)

§Example
use crypto::keystore::Keystore;

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();
let address = keystore.address();
assert!(address.starts_with("0x"));

pub fn pubkey(&self) -> String

Returns the base64-encoded public key: the scheme flag byte followed by the key bytes.

§Returns

Base64-encoded public key string

§Example
use crypto::keystore::Keystore;

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();
let pubkey = keystore.pubkey();

pub fn privkey(&self) -> Result<String, Error>

Returns the bech32-encoded private key.

Warning: Handle private keys with extreme care. Never expose them in logs, APIs, or user interfaces.

§Returns
  • Ok(String) - Bech32 private key with the iotaprivkey prefix (e.g., “iotaprivkey1qrsd…”)
  • Err - Encoding failed
§Example
use crypto::keystore::Keystore;

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();
let privkey = keystore.privkey().unwrap();
assert!(privkey.starts_with("iotaprivkey1"));

pub fn sign_message(&self, message: &str) -> String

Signs a message using Ed25519 with IOTA personal message intent.

The message is wrapped in IOTA’s personal message intent; the signed digest is blake2b256 over the BCS encoding of that intent message.

§Arguments
  • message - The message to sign
§Returns

Base64-encoded signature string

§Example
use crypto::keystore::Keystore;

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();
let signature = keystore.sign_message("hello world");

pub fn sign_secure<T>(&self, msg: &T, intent: Intent) -> SimpleSignature
where T: Serialize,

Signs a serializable message with a custom IOTA intent.

This is an advanced signing method that allows you to specify a custom intent for the signature. This is useful for signing transactions, smart contract calls, or other IOTA-specific operations that require specific intent scopes.

§Arguments
  • msg - Any serializable value to sign
  • intent - The IOTA intent to use for signing
§Returns

An iota_sdk_types::SimpleSignature

§Example
use crypto::keystore::Keystore;
use iota_sdk_types::{Intent, IntentAppId, IntentScope, IntentVersion};
use serde::Serialize;

#[derive(Serialize)]
struct Transaction {
    to: String,
    amount: u64,
}

let keystore = Keystore::new_with_alias("./iota.keystore", "deployer").unwrap();
let tx = Transaction { to: "0x123...".to_string(), amount: 1000 };

let intent = Intent {
    app_id: IntentAppId::Iota,
    scope: IntentScope::TransactionData,
    version: IntentVersion::V0,
};

let signature = keystore.sign_secure(&tx, intent);

Trait Implementations§

§

impl Clone for Keystore

§

fn clone(&self) -> Keystore

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Keystore

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl From<Keystore> for Signer

§

fn from(value: Keystore) -> Signer

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more