Merge pull request #480 from LNP-BP/feat/keysource

Introducing `bip32::KeySource`: wrapper for `(Fingerprint, DerivationPath)`
This commit is contained in:
Andrew Poelstra 2020-10-07 22:23:39 +00:00 committed by GitHub
commit 8c82129442
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 13 deletions

View File

@ -367,6 +367,10 @@ 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.
pub type KeySource = (Fingerprint, 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();

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())