如何在ethers.rs中将XPriv类型私钥转换为字符串并打印?
如何从ethers.rs的XPriv类型提取并打印私钥字符串?
我是Rust新手,正在探索ethers.rs库。我通过以下代码生成助记词:
let mnemonic = Mnemonic::<English>::new(&mut rand::thread_rng());
现在想通过该助记词提取第一个私钥,使用了这段代码:
let key = mnemonic.derive_key("m/44'/60'/0'/0/0", None).unwrap()
得到的是XPriv类型的结果,但不知道如何将其转换为字符串以在控制台打印。我的完整函数和Cargo.toml如下:
完整函数:
async fn test() { let mnemonic = Mnemonic::<English>::new(&mut rand::thread_rng()); println!("mnemonic: {}", mnemonic.to_phrase()); let key = mnemonic .derive_key("m/44'/60'/0'/0/0", None) .expect("Failed to derive pkey"); }
Cargo.toml:
name = "rust-basics" version = "0.1.0" edition = "2021" [dependencies] ethers="2.0.7" tokio = { version = "1", features = ["full"] } bip39 = "2.0" rand = "0.8" dialoguer = "0.10.4" serde = "1.0.164" serde_json = "1.0.97" password-hash = "0.5.0" bcrypt = "0.14.0"
解决方案
XPriv类型可以通过两种方式提取私钥字符串:
- 直接提取字节并转为十六进制
XPriv提供了to_bytes()方法获取原始私钥字节数组,再用hex::encode()将其转为十六进制字符串:
use hex; // 在test函数中添加以下代码 let private_key_bytes = key.to_bytes(); let private_key_str = hex::encode(private_key_bytes); println!("Private key: {}", private_key_str);
- 转换为LocalWallet后获取私钥
可以将XPriv转换为ethers的LocalWallet类型,然后通过private_key()方法直接获取私钥字符串:
use ethers::signers::LocalWallet; // 在test函数中添加以下代码 let wallet: LocalWallet = key.into(); println!("Private key: {}", wallet.private_key());
修改后的完整函数
use ethers::signers::{LocalWallet, Mnemonic, English}; use hex; use rand; async fn test() { let mnemonic = Mnemonic::<English>::new(&mut rand::thread_rng()); println!("mnemonic: {}", mnemonic.to_phrase()); let key = mnemonic .derive_key("m/44'/60'/0'/0/0", None) .expect("Failed to derive pkey"); // 方法1:转字节后编码为十六进制 let private_key_bytes = key.to_bytes(); let private_key_str = hex::encode(private_key_bytes); println!("Private key (hex): {}", private_key_str); // 方法2:转换为LocalWallet let wallet: LocalWallet = key.into(); println!("Private key (from wallet): {}", wallet.private_key()); }
注意:如果使用hex库,需要在Cargo.toml中添加依赖:
hex = "0.4"
内容的提问来源于stack exchange,提问作者Muhammad Waleed
相关产品推荐
相关产品推荐

