메인 콘텐츠로 건너뛰기

Wallet

Wallet은 ed25519 키 쌍을 관리하고, 메시지에 서명하며, 온체인 조회를 위해 RPC 노드에 선택적으로 연결합니다.

키 관리

새 Wallet 생성

use savitri_sdk::Wallet;

// Random keypair (cryptographically secure)
let wallet = Wallet::new();
println!("Address: {}", wallet.address()); // 64 hex chars (32-byte pubkey)

개인 키에서 가져오기

// From raw bytes
let private_key: [u8; 32] = [/* your key */];
let wallet = Wallet::from_private_key(&private_key)?;

// From hex string
let wallet = Wallet::from_private_key_hex("aabbccdd...64hexchars")?;

// With 0x prefix
let wallet = Wallet::from_private_key_hex("0xaabbccdd...64hexchars")?;

키 내보내기

// Public key (safe to share)
let pubkey = wallet.public_key();
println!("Public key: {}", hex::encode(pubkey.as_bytes()));

// Address (derived from public key)
println!("Address: {}", wallet.address());

// Private key (NEVER share or log)
let privkey: [u8; 32] = wallet.private_key();

서명

메시지 서명

let message = b"Hello, Savitri!";
let signature: [u8; 64] = wallet.sign_message(message);

서명 검증

wallet.verify_signature(message, &signature)?;
// Returns Ok(()) if valid, Err if invalid

서명 스키마는 Ed25519 (ed25519-dalek)를 사용합니다. 트랜잭션 서명의 경우, 메시지는 먼저 SHA-256으로 해시됩니다:

message = from_hex || to_hex || amount_le_u64 || nonce_le_u64 || fee_le_u128
hash = SHA-256(message)
sig = Ed25519_sign(hash)

RPC 통합

온체인 조회를 위해 wallet을 노드에 연결합니다:

// Create with RPC connection
let wallet = Wallet::with_rpc("http://localhost:8545")?;

// Or connect later
let mut wallet = Wallet::new();
wallet.connect_rpc("http://localhost:8545")?;

// Query balance (requires RPC)
let balance: String = wallet.get_balance().await?;
println!("Balance: {}", balance);

// Query nonce (requires RPC)
let nonce: u64 = wallet.get_nonce().await?;
println!("Nonce: {}", nonce);

// Access underlying RPC client
if let Some(rpc) = wallet.rpc() {
let height = rpc.get_block_number().await?;
println!("Height: {}", height);
}

보안

  • 제로화: 개인 키 자료는 wallet이 소멸될 때 제로화됩니다 (zeroize 크레이트를 통한 Drop 트레이트).
  • 복제 동작: 복제된 wallet은 RPC 연결을 상속하지 않습니다 (연결 해제된 상태로 시작).
  • 영속성 없음: wallet은 키를 디스크에 저장하지 않습니다. 별도의 안전한 저장 시스템을 사용하세요.
{
let wallet = Wallet::new();
// ... use wallet ...
} // wallet dropped here — private key bytes are zeroed in memory