12个版本
0.6.3 | 2023年5月14日 |
---|---|
0.6.1 | 2022年6月6日 |
0.6.0 | 2020年11月5日 |
0.2.0 | 2020年7月15日 |
0.1.1 | 2020年3月25日 |
#936 在 魔法豆
每月下载 3,418 次
在 11 个crate(6 个直接) 中使用
84KB
2K SLoC
提供操作比特币BIP-32标准定义的HD路径的常见结构和实用工具。
分层确定性钱包的主要规范是BIP-32,HD路径是其一部分,它指定了层次路径的格式。
该crate不尝试实现密钥派生规范,而是实现了创建、解析和显示HD路径的所有常见功能,特别是BIP-44和相关标准定义的标准路径。
BIP-43定义的常见结构是m/purpose'/coin_type'/account'/change/address_index
,例如m/44'/0'/0'/0/0
支持的所有标准
示例
基本使用
use hdpath::StandardHDPath;
use std::str::FromStr;
let hd_path = StandardHDPath::from_str("m/44'/0'/0'/0/0").unwrap();
// prints "m/44'/0'/0'/0/0"
println!("{:?}", hd_path);
// prints "0", which is account id
println!("{:?}", hd_path.account());
// prints: "purpose: Pubkey, coin: 0, account: 0, change: 0, index: 0"
println!("purpose: {:?}, coin: {}, account: {}, change: {}, index: {}",
hd_path.purpose(),
hd_path.coin_type(),
hd_path.account(),
hd_path.change(),
hd_path.index())
从值创建
use hdpath::{StandardHDPath, Purpose};
let hd_path = StandardHDPath::new(Purpose::Witness, 0, 1, 0, 101);
// prints "m/84'/0'/1'/0/101"
println!("{:?}", hd_path);
创建账户并派生地址
use hdpath::{AccountHDPath, StandardHDPath, Purpose};
let hd_account = AccountHDPath::new(Purpose::Witness, 0, 1);
// prints "m/44'/0'/1'/x/x"
println!("{:?}", hd_account);
// get actual address on the account path. Returns StandardHDPath
let hd_path = hd_account.address_at(0, 7);
//prints: "m/44'/0'/1'/0/7"
println!("{:?}", hd_path);
创建前验证
请注意,HD Path 的值限于 2^31-1
,因为最高位被保留用于标记一个 加固 值。因此,如果您从某些用户输入中获取单个值,在传递给 ::new
之前应该验证该值。否则,如果传递了一个无效的值,构造函数可能会因 panic 而失败。
use hdpath::{StandardHDPath, PathValue, Purpose};
fn user_path(index: u32) -> Result<StandardHDPath, ()> {
let user_id = 1234 as u32;
if PathValue::is_ok(index) {
Ok(StandardHDPath::new(Purpose::Witness, 0, user_id, 0, index))
} else {
Err(())
}
}
如何与比特币库一起使用
启用 with-bitcoin
功能,该功能提供与比特币库兼容的额外方法。它包括转换为 Vec<ChildNumber>
和 DerivationPath
。
hdpath = { version = "0.5.0", features = ["with-bitcoin"] }
在需要时转换为 DerivationPath
use hdpath::{StandardHDPath};
use secp256k1::Secp256k1;
use bitcoin::{
network::constants::Network,
util::bip32::{ExtendedPrivKey, DerivationPath}
};
fn get_pk(seed: &[u8], hd_path: &StandardHDPath) -> ExtendedPrivKey {
let secp = Secp256k1::new();
ExtendedPrivKey::new_master(Network::Bitcoin, seed)
// we convert HD Path to bitcoin lib format (DerivationPath)
.and_then(|k| k.derive_priv(&secp, &DerivationPath::from(hd_path)))
.unwrap()
}
依赖项
~0–1.3MB
~16K SLoC