Skip to content

Commit

Permalink
zcash_address: Remove private type aliases for raw data sizes
Browse files Browse the repository at this point in the history
These served no type safety purpose; they were just to make developing
the crate easier. However, while docs.rs correctly shows these in trait
APIs as their plain `[u8; N]` form, editor LSPs like `rust-analyzer`
assume the crate-private types are public and auto-create stubs that
reference them, which is not good UX for downstream developers.
  • Loading branch information
str4d committed Jan 12, 2024
1 parent 2d5bf5d commit 3f006bf
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 44 deletions.
3 changes: 3 additions & 0 deletions components/zcash_address/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this library adheres to Rust's notion of
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
### Fixed
- Stubs for `zcash_address::convert` traits that are created by `rust-analyzer`
and similar LSPs no longer reference crate-private type aliases.

## [0.3.0] - 2023-06-06
### Changed
Expand Down
48 changes: 20 additions & 28 deletions components/zcash_address/src/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,12 @@ pub trait TryFromRawAddress: Sized {
/// [`Self::try_from_raw_sapling`] as a valid Sapling address).
type Error;

fn try_from_raw_sprout(data: sprout::Data) -> Result<Self, ConversionError<Self::Error>> {
fn try_from_raw_sprout(data: [u8; 64]) -> Result<Self, ConversionError<Self::Error>> {
let _ = data;
Err(ConversionError::Unsupported(UnsupportedAddress("Sprout")))
}

fn try_from_raw_sapling(data: sapling::Data) -> Result<Self, ConversionError<Self::Error>> {
fn try_from_raw_sapling(data: [u8; 43]) -> Result<Self, ConversionError<Self::Error>> {
let _ = data;
Err(ConversionError::Unsupported(UnsupportedAddress("Sapling")))
}
Expand All @@ -123,17 +123,15 @@ pub trait TryFromRawAddress: Sized {
}

fn try_from_raw_transparent_p2pkh(
data: p2pkh::Data,
data: [u8; 20],
) -> Result<Self, ConversionError<Self::Error>> {
let _ = data;
Err(ConversionError::Unsupported(UnsupportedAddress(
"transparent P2PKH",
)))
}

fn try_from_raw_transparent_p2sh(
data: p2sh::Data,
) -> Result<Self, ConversionError<Self::Error>> {
fn try_from_raw_transparent_p2sh(data: [u8; 20]) -> Result<Self, ConversionError<Self::Error>> {
let _ = data;
Err(ConversionError::Unsupported(UnsupportedAddress(
"transparent P2SH",
Expand Down Expand Up @@ -187,17 +185,14 @@ pub trait TryFromAddress: Sized {
/// [`Self::try_from_sapling`] as a valid Sapling address).
type Error;

fn try_from_sprout(
net: Network,
data: sprout::Data,
) -> Result<Self, ConversionError<Self::Error>> {
fn try_from_sprout(net: Network, data: [u8; 64]) -> Result<Self, ConversionError<Self::Error>> {
let _ = (net, data);
Err(ConversionError::Unsupported(UnsupportedAddress("Sprout")))
}

fn try_from_sapling(
net: Network,
data: sapling::Data,
data: [u8; 43],
) -> Result<Self, ConversionError<Self::Error>> {
let _ = (net, data);
Err(ConversionError::Unsupported(UnsupportedAddress("Sapling")))
Expand All @@ -213,7 +208,7 @@ pub trait TryFromAddress: Sized {

fn try_from_transparent_p2pkh(
net: Network,
data: p2pkh::Data,
data: [u8; 20],
) -> Result<Self, ConversionError<Self::Error>> {
let _ = (net, data);
Err(ConversionError::Unsupported(UnsupportedAddress(
Expand All @@ -223,7 +218,7 @@ pub trait TryFromAddress: Sized {

fn try_from_transparent_p2sh(
net: Network,
data: p2sh::Data,
data: [u8; 20],
) -> Result<Self, ConversionError<Self::Error>> {
let _ = (net, data);
Err(ConversionError::Unsupported(UnsupportedAddress(
Expand All @@ -235,16 +230,13 @@ pub trait TryFromAddress: Sized {
impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {
type Error = T::Error;

fn try_from_sprout(
net: Network,
data: sprout::Data,
) -> Result<Self, ConversionError<Self::Error>> {
fn try_from_sprout(net: Network, data: [u8; 64]) -> Result<Self, ConversionError<Self::Error>> {
T::try_from_raw_sprout(data).map(|addr| (net, addr))
}

fn try_from_sapling(
net: Network,
data: sapling::Data,
data: [u8; 43],
) -> Result<Self, ConversionError<Self::Error>> {
T::try_from_raw_sapling(data).map(|addr| (net, addr))
}
Expand All @@ -258,14 +250,14 @@ impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {

fn try_from_transparent_p2pkh(
net: Network,
data: p2pkh::Data,
data: [u8; 20],
) -> Result<Self, ConversionError<Self::Error>> {
T::try_from_raw_transparent_p2pkh(data).map(|addr| (net, addr))
}

fn try_from_transparent_p2sh(
net: Network,
data: p2sh::Data,
data: [u8; 20],
) -> Result<Self, ConversionError<Self::Error>> {
T::try_from_raw_transparent_p2sh(data).map(|addr| (net, addr))
}
Expand Down Expand Up @@ -303,19 +295,19 @@ impl<T: TryFromRawAddress> TryFromAddress for (Network, T) {
/// );
/// ```
pub trait ToAddress: private::Sealed {
fn from_sprout(net: Network, data: sprout::Data) -> Self;
fn from_sprout(net: Network, data: [u8; 64]) -> Self;

fn from_sapling(net: Network, data: sapling::Data) -> Self;
fn from_sapling(net: Network, data: [u8; 43]) -> Self;

fn from_unified(net: Network, data: unified::Address) -> Self;

fn from_transparent_p2pkh(net: Network, data: p2pkh::Data) -> Self;
fn from_transparent_p2pkh(net: Network, data: [u8; 20]) -> Self;

fn from_transparent_p2sh(net: Network, data: p2sh::Data) -> Self;
fn from_transparent_p2sh(net: Network, data: [u8; 20]) -> Self;
}

impl ToAddress for ZcashAddress {
fn from_sprout(net: Network, data: sprout::Data) -> Self {
fn from_sprout(net: Network, data: [u8; 64]) -> Self {
ZcashAddress {
net: if let Network::Regtest = net {
Network::Test
Expand All @@ -326,7 +318,7 @@ impl ToAddress for ZcashAddress {
}
}

fn from_sapling(net: Network, data: sapling::Data) -> Self {
fn from_sapling(net: Network, data: [u8; 43]) -> Self {
ZcashAddress {
net,
kind: AddressKind::Sapling(data),
Expand All @@ -340,7 +332,7 @@ impl ToAddress for ZcashAddress {
}
}

fn from_transparent_p2pkh(net: Network, data: p2pkh::Data) -> Self {
fn from_transparent_p2pkh(net: Network, data: [u8; 20]) -> Self {
ZcashAddress {
net: if let Network::Regtest = net {
Network::Test
Expand All @@ -351,7 +343,7 @@ impl ToAddress for ZcashAddress {
}
}

fn from_transparent_p2sh(net: Network, data: p2sh::Data) -> Self {
fn from_transparent_p2sh(net: Network, data: [u8; 20]) -> Self {
ZcashAddress {
net: if let Network::Regtest = net {
Network::Test
Expand Down
2 changes: 0 additions & 2 deletions components/zcash_address/src/kind/p2pkh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,3 @@ pub(crate) const MAINNET: [u8; 2] = [0x1c, 0xb8];

/// The prefix for a Base58Check-encoded testnet transparent P2PKH address.
pub(crate) const TESTNET: [u8; 2] = [0x1d, 0x25];

pub(crate) type Data = [u8; 20];
2 changes: 0 additions & 2 deletions components/zcash_address/src/kind/p2sh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,3 @@ pub(crate) const MAINNET: [u8; 2] = [0x1c, 0xbd];

/// The prefix for a Base58Check-encoded testnet transparent P2SH address.
pub(crate) const TESTNET: [u8; 2] = [0x1c, 0xba];

pub(crate) type Data = [u8; 20];
2 changes: 0 additions & 2 deletions components/zcash_address/src/kind/sapling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,3 @@ pub(crate) const TESTNET: &str = "ztestsapling";
///
/// [the `zcashd` codebase]: https://github.com/zcash/zcash/blob/128d863fb8be39ee294fda397c1ce3ba3b889cb2/src/chainparams.cpp#L493
pub(crate) const REGTEST: &str = "zregtestsapling";

pub(crate) type Data = [u8; 43];
2 changes: 0 additions & 2 deletions components/zcash_address/src/kind/sprout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,3 @@ pub(crate) const MAINNET: [u8; 2] = [0x16, 0x9a];
///
/// [sproutpaymentaddrencoding]: https://zips.z.cash/protocol/protocol.pdf#sproutpaymentaddrencoding
pub(crate) const TESTNET: [u8; 2] = [0x16, 0xb6];

pub(crate) type Data = [u8; 64];
7 changes: 3 additions & 4 deletions components/zcash_address/src/kind/unified/address.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
use super::{private::SealedItem, ParseError, Typecode};
use crate::kind;

use std::convert::{TryFrom, TryInto};

/// The set of known Receivers for Unified Addresses.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Receiver {
Orchard([u8; 43]),
Sapling(kind::sapling::Data),
P2pkh(kind::p2pkh::Data),
P2sh(kind::p2sh::Data),
Sapling([u8; 43]),
P2pkh([u8; 20]),
P2sh([u8; 20]),
Unknown { typecode: u32, data: Vec<u8> },
}

Expand Down
8 changes: 4 additions & 4 deletions components/zcash_address/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ pub enum Network {
/// Known kinds of Zcash addresses.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
enum AddressKind {
Sprout(kind::sprout::Data),
Sapling(kind::sapling::Data),
Sprout([u8; 64]),
Sapling([u8; 43]),
Unified(unified::Address),
P2pkh(kind::p2pkh::Data),
P2sh(kind::p2sh::Data),
P2pkh([u8; 20]),
P2sh([u8; 20]),
}

impl ZcashAddress {
Expand Down

0 comments on commit 3f006bf

Please sign in to comment.