Skip to content
Logo

Example: signer_generate

To run this example:

  • Clone the examples repository: git clone https://github.com/throgxyz/examples.git
  • Run: cargo run -p examples-signers --example signer_generate
//! Generate a fresh random secp256k1 key pair.
//!
//! Creates a cryptographically secure random private key, derives the TRON
//! address, and prints the key material. In real usage you would save the
//! private key to secure storage.
//!
//! No network access required.
//!
//! ```bash
//! cargo run -p examples-signers --example signer_generate
//! ```
//!
//! WARNING: This example prints private keys to stdout — only use it for
//! throwaway testnet keys.
 
use k256::ecdsa::SigningKey;
use tronz::{LocalSigner, TronSigner, primitives::Address};
 
fn main() -> anyhow::Result<()> {
    // ── Generate key pair ─────────────────────────────────────────────────────
 
    // k256::ecdsa::SigningKey::random generates a cryptographically secure key
    // using the OS random number generator (getrandom).
    let key = SigningKey::random(&mut rand::rngs::OsRng);
    let key_bytes: [u8; 32] = key.to_bytes().into();
    let key_hex = hex::encode(key_bytes);
 
    let signer = LocalSigner::from_bytes(&key_bytes)?;
    let address: Address = signer.address();
 
    println!("=== Generated key pair ===");
    println!("  private key : {key_hex}");
    println!("  address     : {address}  (base58check)");
    println!("  address hex : {}", address.to_hex());
    println!("  address evm : 0x{}", hex::encode(address.as_evm_bytes()));
 
    // ── Every run produces a different key ────────────────────────────────────
 
    let key2 = SigningKey::random(&mut rand::rngs::OsRng);
    let signer2 = LocalSigner::from_bytes(&key2.to_bytes().into())?;
    assert_ne!(signer.address(), signer2.address(), "fresh keys are unique");
    println!("\n  second run  : {}", signer2.address());
    println!("  unique      : {}", signer.address() != signer2.address());
 
    // ── How to fund the address on Nile testnet ───────────────────────────────
 
    println!("\n=== Next steps ===");
    println!("  1. Save the private key to a secure location.");
    println!("  2. Get Nile TRX from the faucet: https://nileex.io/");
    println!("     (send to: {address})");
    println!(
        "  3. Run examples with: TRON_PRIVATE_KEY={key_hex} cargo run -p examples-signers --example transfer_trx"
    );
 
    Ok(())
}

Find the source code on GitHub here.