From f1174751fc5eb4f5bb13e103573399b781a4e79b Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Thu, 7 Mar 2024 16:05:59 -0600 Subject: [PATCH 1/3] Add new types for Spending Keys and Receivers --- src/ZcashHaskell/Types.hs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ZcashHaskell/Types.hs b/src/ZcashHaskell/Types.hs index f9fe6f2..38d190f 100644 --- a/src/ZcashHaskell/Types.hs +++ b/src/ZcashHaskell/Types.hs @@ -45,6 +45,18 @@ type Seed = C.ByteString -- | A mnemonic phrase used to derive seeds type Phrase = BS.ByteString +-- | A spending key for Sapling +type SaplingSpendingKey = BS.ByteString + +-- | A spending key for Orchard +type OrchardSpendingKey = BS.ByteString + +-- | A Sapling receiver +type SaplingReceiver = BS.ByteString + +-- | An Orchard receiver +type OrchardReceiver = BS.ByteString + -- | Type to represent data after Bech32 decoding data RawData = RawData { hrp :: !BS.ByteString -- ^ Human-readable part of the Bech32 encoding From 72e87577a772330b886ef01170c37dda29a0f62d Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Thu, 7 Mar 2024 16:06:33 -0600 Subject: [PATCH 2/3] Add generation of Orchard receivers --- librustzcash-wrapper/src/lib.rs | 16 ++++++++++++++++ src/C/Zcash.chs | 8 ++++++++ src/ZcashHaskell/Orchard.hs | 17 +++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/librustzcash-wrapper/src/lib.rs b/librustzcash-wrapper/src/lib.rs index 3b7297a..b3806a2 100644 --- a/librustzcash-wrapper/src/lib.rs +++ b/librustzcash-wrapper/src/lib.rs @@ -632,3 +632,19 @@ pub extern "C" fn rust_wrapper_derive_orchard_spending_key( } } } + +#[no_mangle] +pub extern "C" fn rust_wrapper_derive_orchard_receiver( + spend_key: *const u8, + spend_key_len: usize, + add_id: u32, + out: *mut u8, + out_len: &mut usize + ){ + let sk_in: Vec = marshall_from_haskell_var(spend_key, spend_key_len, RW); + let sk = SpendingKey::from_bytes(sk_in[0..32].try_into().unwrap()).unwrap(); + let fvk = FullViewingKey::from(&sk); + let o_rec = fvk.address_at(add_id, Scope::External); + marshall_to_haskell_var(&o_rec.to_raw_address_bytes().to_vec(), out, out_len, RW); + +} diff --git a/src/C/Zcash.chs b/src/C/Zcash.chs index 84a641b..af0582a 100644 --- a/src/C/Zcash.chs +++ b/src/C/Zcash.chs @@ -142,3 +142,11 @@ import ZcashHaskell.Types } -> `()' #} + +{# fun unsafe rust_wrapper_derive_orchard_receiver as rustWrapperGenOrchardReceiver + { toBorshVar* `BS.ByteString'& + , `Word32' + , getVarBuffer `Buffer (BS.ByteString)'& + } + -> `()' +#} diff --git a/src/ZcashHaskell/Orchard.hs b/src/ZcashHaskell/Orchard.hs index d71ce64..4a0f530 100644 --- a/src/ZcashHaskell/Orchard.hs +++ b/src/ZcashHaskell/Orchard.hs @@ -18,7 +18,8 @@ module ZcashHaskell.Orchard where import C.Zcash - ( rustWrapperGenOrchardSpendKey + ( rustWrapperGenOrchardReceiver + , rustWrapperGenOrchardSpendKey , rustWrapperOrchardCheck , rustWrapperOrchardNoteDecode , rustWrapperUADecode @@ -34,7 +35,8 @@ import ZcashHaskell.Types import ZcashHaskell.Utils (encodeBech32m, f4Jumble) -- | Derives an Orchard spending key for the given seed and account ID -genOrchardSpendingKey :: Seed -> CoinType -> AccountId -> Maybe BS.ByteString +genOrchardSpendingKey :: + Seed -> CoinType -> AccountId -> Maybe OrchardSpendingKey genOrchardSpendingKey s coinType accountId = if BS.length k /= 32 then Nothing @@ -47,6 +49,17 @@ genOrchardSpendingKey s coinType accountId = (getValue coinType) (fromIntegral accountId) +-- | Derives an Orchard receiver for the given spending key and index +genOrchardReceiver :: Int -> OrchardSpendingKey -> Maybe OrchardReceiver +genOrchardReceiver i osk = + if BS.length k /= 43 + then Nothing + else Just k + where + k = + withPureBorshVarBuffer $ + rustWrapperGenOrchardReceiver osk (fromIntegral i) + -- | Checks if given bytestring is a valid encoded unified address isValidUnifiedAddress :: BS.ByteString -> Maybe UnifiedAddress isValidUnifiedAddress str = From b2f56941a43bfeb2c4f678b52b77b1a14616f993 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Thu, 7 Mar 2024 16:07:50 -0600 Subject: [PATCH 3/3] Bump version --- CHANGELOG.md | 2 ++ zcash-haskell.cabal | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a768c4..2a39f77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Function to encode unified addresses from receivers - Function to generate an Orchard spending key - Constants for Zcash protocol +- Types for Spending Keys and Receivers for Sapling and Orchard +- Function to generate an Orchard receiver ### Changed diff --git a/zcash-haskell.cabal b/zcash-haskell.cabal index d6d04ea..b6675d1 100644 --- a/zcash-haskell.cabal +++ b/zcash-haskell.cabal @@ -5,7 +5,7 @@ cabal-version: 3.0 -- see: https://github.com/sol/hpack name: zcash-haskell -version: 0.4.3.1 +version: 0.4.3.2 synopsis: Utilities to interact with the Zcash blockchain description: Please see the README on the repo at category: Blockchain