Skip to content
Logo

signer_message

Runnable example from the signers package.

Run

git clone https://github.com/throgxyz/examples.git
cd examples
cargo run -p examples-signers --example signer_message

Source

//! Sign, recover, and verify a TronWeb-compatible plaintext message.
//!
//! `TronSigner::sign_message` matches TronWeb's `signMessageV2`. The signature
//! can be exported with a legacy `v` value (`27`/`28`) for TronWeb consumers.
//!
//! No network access required.
//!
//! Optional env:
//!   TRON_PRIVATE_KEY — hex key (defaults to a throwaway demo key)
//!   TRON_MESSAGE     — message to sign (default: "hello from tronz")
//!
//! ```bash
//! cargo run -p examples-signers --example signer_message
//! ```
 
use tronz::{LocalSigner, TronSigner, recover_message_address, verify_message};
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let key_hex = std::env::var("TRON_PRIVATE_KEY").unwrap_or_else(|_| {
        "0000000000000000000000000000000000000000000000000000000000000001".to_owned()
    });
    let message = std::env::var("TRON_MESSAGE").unwrap_or_else(|_| "hello from tronz".to_owned());
 
    let signer = LocalSigner::from_hex(&key_hex)?;
    let expected = signer.address();
    let signature = signer.sign_message(message.as_bytes()).await?;
 
    // TronWeb accepts the recoverable signature as r || s || v with legacy
    // recovery values 27/28.
    let tronweb_signature = signature.to_legacy_bytes();
    let recovered = recover_message_address(message.as_bytes(), &signature)?;
    let verified = verify_message(message.as_bytes(), &signature, expected);
 
    println!("=== TronWeb-compatible message signature ===");
    println!("  message   : {message:?}");
    println!("  signer    : {expected}");
    println!("  signature : 0x{}", hex::encode(tronweb_signature));
    println!("  recovered : {recovered}");
    println!("  verified  : {verified}");
 
    assert_eq!(recovered, expected);
    assert!(verified);
    assert!(!verify_message(b"a different message", &signature, expected));
 
    Ok(())
}

View this example on GitHub.