#path #bip-32 #hierarchical #deterministic #index #standard #bitcoin

hdpath

分层确定性路径(BIP32, BIP43, BIP44, BIP49, BIP84)

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魔法豆

Download history 875/week @ 2024-03-13 787/week @ 2024-03-20 540/week @ 2024-03-27 1238/week @ 2024-04-03 699/week @ 2024-04-10 768/week @ 2024-04-17 1101/week @ 2024-04-24 952/week @ 2024-05-01 654/week @ 2024-05-08 653/week @ 2024-05-15 554/week @ 2024-05-22 1172/week @ 2024-05-29 1323/week @ 2024-06-05 509/week @ 2024-06-12 622/week @ 2024-06-19 554/week @ 2024-06-26

每月下载 3,418
11 个crate(6 个直接) 中使用

Apache-2.0

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