From 81b2b1b5545c6080b2050a06f5426fbe7c49e6b8 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Mon, 15 Oct 2018 15:51:40 +0100 Subject: [PATCH] Wallet spending key derivation path --- Cargo.lock | 3 +++ zcash_client_backend/Cargo.toml | 1 + zcash_client_backend/src/constants.rs | 4 ++++ zcash_client_backend/src/constants/mainnet.rs | 4 ++++ zcash_client_backend/src/constants/testnet.rs | 4 ++++ zcash_client_backend/src/keys.rs | 24 +++++++++++++++++++ zcash_client_backend/src/lib.rs | 9 ++----- 7 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 zcash_client_backend/src/constants.rs create mode 100644 zcash_client_backend/src/constants/mainnet.rs create mode 100644 zcash_client_backend/src/constants/testnet.rs create mode 100644 zcash_client_backend/src/keys.rs diff --git a/Cargo.lock b/Cargo.lock index 222965138..d3b592d29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -511,6 +511,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "zcash_client_backend" version = "0.0.0" +dependencies = [ + "zcash_primitives 0.0.0", +] [[package]] name = "zcash_primitives" diff --git a/zcash_client_backend/Cargo.toml b/zcash_client_backend/Cargo.toml index f3c6fd603..d1993baf2 100644 --- a/zcash_client_backend/Cargo.toml +++ b/zcash_client_backend/Cargo.toml @@ -7,3 +7,4 @@ authors = [ edition = "2018" [dependencies] +zcash_primitives = { path = "../zcash_primitives" } diff --git a/zcash_client_backend/src/constants.rs b/zcash_client_backend/src/constants.rs new file mode 100644 index 000000000..8e5727c89 --- /dev/null +++ b/zcash_client_backend/src/constants.rs @@ -0,0 +1,4 @@ +//! Zcash global and per-network constants. + +pub mod mainnet; +pub mod testnet; diff --git a/zcash_client_backend/src/constants/mainnet.rs b/zcash_client_backend/src/constants/mainnet.rs new file mode 100644 index 000000000..753956e5f --- /dev/null +++ b/zcash_client_backend/src/constants/mainnet.rs @@ -0,0 +1,4 @@ +/// The mainnet coin type for ZEC, as defined by [SLIP 44]. +/// +/// [SLIP 44]: https://github.com/satoshilabs/slips/blob/master/slip-0044.md +pub const COIN_TYPE: u32 = 133; diff --git a/zcash_client_backend/src/constants/testnet.rs b/zcash_client_backend/src/constants/testnet.rs new file mode 100644 index 000000000..836340cf0 --- /dev/null +++ b/zcash_client_backend/src/constants/testnet.rs @@ -0,0 +1,4 @@ +/// The testnet coin type for ZEC, as defined by [SLIP 44]. +/// +/// [SLIP 44]: https://github.com/satoshilabs/slips/blob/master/slip-0044.md +pub const COIN_TYPE: u32 = 1; diff --git a/zcash_client_backend/src/keys.rs b/zcash_client_backend/src/keys.rs new file mode 100644 index 000000000..4d4cd6f1a --- /dev/null +++ b/zcash_client_backend/src/keys.rs @@ -0,0 +1,24 @@ +//! Helper functions for managing light client key material. + +use zcash_primitives::zip32::{ChildIndex, ExtendedSpendingKey}; + +/// Derives the ZIP 32 [`ExtendedSpendingKey`] for a given coin type and account from the +/// given seed. +/// +/// # Examples +/// +/// ``` +/// use zcash_client_backend::{constants::testnet::COIN_TYPE, keys::spending_key}; +/// +/// let extsk = spending_key(&[0; 32][..], COIN_TYPE, 0); +/// ``` +pub fn spending_key(seed: &[u8], coin_type: u32, account: u32) -> ExtendedSpendingKey { + ExtendedSpendingKey::from_path( + &ExtendedSpendingKey::master(&seed), + &[ + ChildIndex::Hardened(32), + ChildIndex::Hardened(coin_type), + ChildIndex::Hardened(account), + ], + ) +} diff --git a/zcash_client_backend/src/lib.rs b/zcash_client_backend/src/lib.rs index 056312640..de76975ba 100644 --- a/zcash_client_backend/src/lib.rs +++ b/zcash_client_backend/src/lib.rs @@ -3,10 +3,5 @@ //! `zcash_client_backend` contains Rust structs and traits for creating shielded Zcash //! light clients. -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } -} +pub mod constants; +pub mod keys;