Introducing `bip32::KeySource`: wrapper for `(Fingerprint, DerivationPath)`

This commit is contained in:
Dr Maxim Orlovsky 2020-09-13 22:49:52 +02:00
parent c1ae3b7955
commit aa67f10162
5 changed files with 20 additions and 15 deletions

View File

@ -345,6 +345,11 @@ impl fmt::Debug for DerivationPath {
}
}
/// Full information on the used extended public key: fingerprint of the
/// master extended public key and a derivation path from it.
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct KeySource(pub Fingerprint, pub DerivationPath);
/// A BIP32 error
#[derive(Clone, PartialEq, Eq, Debug)]
pub enum Error {

View File

@ -17,7 +17,7 @@ use std::collections::BTreeMap;
use blockdata::script::Script;
use blockdata::transaction::{SigHashType, Transaction, TxOut};
use consensus::encode;
use util::bip32::{DerivationPath, Fingerprint};
use util::bip32::KeySource;
use util::key::PublicKey;
use util::psbt;
use util::psbt::map::Map;
@ -48,7 +48,7 @@ pub struct Input {
pub witness_script: Option<Script>,
/// A map from public keys needed to sign this input to their corresponding
/// master key fingerprints and derivation paths.
pub hd_keypaths: BTreeMap<PublicKey, (Fingerprint, DerivationPath)>,
pub hd_keypaths: BTreeMap<PublicKey, KeySource>,
/// The finalized, fully-constructed scriptSig with signatures and any other
/// scripts necessary for this input to pass validation.
pub final_script_sig: Option<Script>,
@ -109,7 +109,7 @@ impl Map for Input {
}
6u8 => {
impl_psbt_insert_pair! {
self.hd_keypaths <= <raw_key: PublicKey>|<raw_value: (Fingerprint, DerivationPath)>
self.hd_keypaths <= <raw_key: PublicKey>|<raw_value: KeySource>
}
}
_ => match self.unknown.entry(raw_key) {
@ -149,7 +149,7 @@ impl Map for Input {
}
impl_psbt_get_pair! {
rv.push(self.hd_keypaths as <6u8, PublicKey>|<(Fingerprint, DerivationPath)>)
rv.push(self.hd_keypaths as <6u8, PublicKey>|<KeySource>)
}
impl_psbt_get_pair! {

View File

@ -17,7 +17,7 @@ use std::collections::btree_map::Entry;
use blockdata::script::Script;
use consensus::encode;
use util::bip32::{DerivationPath, Fingerprint};
use util::bip32::KeySource;
use util::key::PublicKey;
use util::psbt;
use util::psbt::map::Map;
@ -34,7 +34,7 @@ pub struct Output {
pub witness_script: Option<Script>,
/// A map from public keys needed to spend this output to their
/// corresponding master key fingerprints and derivation paths.
pub hd_keypaths: BTreeMap<PublicKey, (Fingerprint, DerivationPath)>,
pub hd_keypaths: BTreeMap<PublicKey, KeySource>,
/// Unknown key-value pairs for this output.
pub unknown: BTreeMap<raw::Key, Vec<u8>>,
}
@ -59,7 +59,7 @@ impl Map for Output {
}
2u8 => {
impl_psbt_insert_pair! {
self.hd_keypaths <= <raw_key: PublicKey>|<raw_value: (Fingerprint, DerivationPath)>
self.hd_keypaths <= <raw_key: PublicKey>|<raw_value: KeySource>
}
}
_ => match self.unknown.entry(raw_key) {
@ -83,7 +83,7 @@ impl Map for Output {
}
impl_psbt_get_pair! {
rv.push(self.hd_keypaths as <2u8, PublicKey>|<(Fingerprint, DerivationPath)>)
rv.push(self.hd_keypaths as <2u8, PublicKey>|<KeySource>)
}
for (key, value) in self.unknown.iter() {

View File

@ -173,7 +173,7 @@ mod tests {
use blockdata::transaction::{Transaction, TxIn, TxOut, OutPoint};
use network::constants::Network::Bitcoin;
use consensus::encode::{deserialize, serialize, serialize_hex};
use util::bip32::{ChildNumber, DerivationPath, ExtendedPrivKey, ExtendedPubKey, Fingerprint};
use util::bip32::{ChildNumber, ExtendedPrivKey, ExtendedPubKey, Fingerprint, KeySource};
use util::key::PublicKey;
use util::psbt::map::{Global, Output};
use util::psbt::raw;
@ -206,7 +206,7 @@ mod tests {
let secp = &Secp256k1::new();
let seed = Vec::from_hex("000102030405060708090a0b0c0d0e0f").unwrap();
let mut hd_keypaths: BTreeMap<PublicKey, (Fingerprint, DerivationPath)> = Default::default();
let mut hd_keypaths: BTreeMap<PublicKey, KeySource> = Default::default();
let mut sk: ExtendedPrivKey = ExtendedPrivKey::new_master(Bitcoin, &seed).unwrap();
@ -227,7 +227,7 @@ mod tests {
let pk: ExtendedPubKey = ExtendedPubKey::from_private(&secp, &sk);
hd_keypaths.insert(pk.public_key, (fprint, dpath.into()));
hd_keypaths.insert(pk.public_key, KeySource(fprint, dpath.into()));
let expected: Output = Output {
redeem_script: Some(hex_script!(

View File

@ -22,7 +22,7 @@ use std::io;
use blockdata::script::Script;
use blockdata::transaction::{SigHashType, Transaction, TxOut};
use consensus::encode::{self, serialize, Decodable};
use util::bip32::{ChildNumber, DerivationPath, Fingerprint};
use util::bip32::{ChildNumber, Fingerprint, KeySource};
use util::key::PublicKey;
use util::psbt;
@ -70,7 +70,7 @@ impl Deserialize for PublicKey {
}
}
impl Serialize for (Fingerprint, DerivationPath) {
impl Serialize for KeySource {
fn serialize(&self) -> Vec<u8> {
let mut rv: Vec<u8> = Vec::with_capacity(4 + 4 * (self.1).as_ref().len());
@ -84,7 +84,7 @@ impl Serialize for (Fingerprint, DerivationPath) {
}
}
impl Deserialize for (Fingerprint, DerivationPath) {
impl Deserialize for KeySource {
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
if bytes.len() < 4 {
return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into())
@ -101,7 +101,7 @@ impl Deserialize for (Fingerprint, DerivationPath) {
}
}
Ok((fprint, dpath.into()))
Ok(KeySource(fprint, dpath.into()))
}
}