Кошелёк
Wallet управляет парами ключей ed25519, подписывает сообщения и опционально подключается к RPC-узлу для запросов к блокчейну.
Управление ключами
Создание нового кошелька
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
Подключите кошелёк к узлу для запросов к блокчейну:
// 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);
}
Безопасность
- Обнуление: Материал приватного ключа обнуляется при уничтожении кошелька (трейт
Dropчерез крейтzeroize). - Поведение при клонировании: Клонированные кошельки НЕ наследуют RPC-подключение (они начинают в отключённом состоянии).
- Без постоянства: Кошелёк не сохраняет ключи на диск. Используйте собственное защищённое хранилище.
{
let wallet = Wallet::new();
// ... use wallet ...
} // wallet dropped here — private key bytes are zeroed in memory