From cf800a1b07133e159f1a65bfbeb50ebaf68cb06d Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Thu, 27 Jun 2024 15:37:27 +1000 Subject: [PATCH 1/2] Remove bech32 dependency from blockdata We have a single usage of the `bech32` crate inside the `blockdata` module, to convert a `WitnessVersion` to a `Fe32`. We then have a single call site where we use the conversion in the `address` module. This code was written without thinking to hard about the introduced dependency on `bech32`, in hindsite it shouldn't have been added. In preparation for splitting a bunch of code in `blockdata` out into the `primitives` crate remove the `bech32` stuff from the `witness_version` module. --- bitcoin/src/address/mod.rs | 6 ++++-- bitcoin/src/blockdata/script/witness_version.rs | 16 ---------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/bitcoin/src/address/mod.rs b/bitcoin/src/address/mod.rs index 1bb77e1ab..99d539e80 100644 --- a/bitcoin/src/address/mod.rs +++ b/bitcoin/src/address/mod.rs @@ -33,6 +33,7 @@ use core::marker::PhantomData; use core::str::FromStr; use bech32::primitives::hrp::Hrp; +use bech32::primitives::gf32::Fe32; use hashes::{sha256, HashEngine}; use secp256k1::{Secp256k1, Verification, XOnlyPublicKey}; @@ -168,7 +169,8 @@ impl fmt::Display for AddressInner { } Segwit { program, hrp } => { let hrp = hrp.to_hrp(); - let version = program.version().to_fe(); + let version = Fe32::try_from(program.version().to_num()) + .expect("version nums 0-16 are valid fe32 values"); let program = program.program().as_ref(); if fmt.alternate() { @@ -829,7 +831,7 @@ impl FromStr for Address { fn from_str(s: &str) -> Result, ParseError> { if let Ok((hrp, witness_version, data)) = bech32::segwit::decode(s) { - let version = WitnessVersion::try_from(witness_version)?; + let version = WitnessVersion::try_from(witness_version.to_u8())?; let program = WitnessProgram::new(version, &data) .expect("bech32 guarantees valid program length for witness"); diff --git a/bitcoin/src/blockdata/script/witness_version.rs b/bitcoin/src/blockdata/script/witness_version.rs index 0974da625..826286929 100644 --- a/bitcoin/src/blockdata/script/witness_version.rs +++ b/bitcoin/src/blockdata/script/witness_version.rs @@ -10,7 +10,6 @@ use core::fmt; use core::str::FromStr; -use bech32::Fe32; use internals::write_err; use units::{parse, ParseIntError}; @@ -71,11 +70,6 @@ impl WitnessVersion { /// version in bitcoin script. Thus, there is no function to directly convert witness version /// into a byte since the conversion requires context (bitcoin script or just a version number). pub fn to_num(self) -> u8 { self as u8 } - - /// Converts this witness version to a GF32 field element. - pub fn to_fe(self) -> Fe32 { - Fe32::try_from(self.to_num()).expect("0-16 are valid fe32 values") - } } /// Prints [`WitnessVersion`] number (from 0 to 16) as integer, without any prefix or suffix. @@ -92,12 +86,6 @@ impl FromStr for WitnessVersion { } } -impl TryFrom for WitnessVersion { - type Error = TryFromError; - - fn try_from(value: Fe32) -> Result { Self::try_from(value.to_u8()) } -} - impl TryFrom for WitnessVersion { type Error = TryFromError; @@ -152,10 +140,6 @@ impl<'a> TryFrom> for WitnessVersion { } } -impl From for Fe32 { - fn from(version: WitnessVersion) -> Self { version.to_fe() } -} - impl From for Opcode { fn from(version: WitnessVersion) -> Opcode { match version { From 010141ecc9a96b0d019c1cca1ef67a95e7b3f623 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Fri, 28 Jun 2024 08:31:08 +1000 Subject: [PATCH 2/2] api: Run just check-api --- api/bitcoin/all-features.txt | 5 ----- api/bitcoin/default-features.txt | 5 ----- api/bitcoin/no-features.txt | 5 ----- 3 files changed, 15 deletions(-) diff --git a/api/bitcoin/all-features.txt b/api/bitcoin/all-features.txt index 20a318d28..8bb085b79 100644 --- a/api/bitcoin/all-features.txt +++ b/api/bitcoin/all-features.txt @@ -1838,7 +1838,6 @@ impl core::convert::From for bitcoin::address::error::ParseError impl core::convert::From for bitcoin::blockdata::script::witness_version::FromStrError impl core::convert::From for bitcoin::blockdata::script::witness_version::TryFromInstructionError -impl core::convert::From for bech32::primitives::gf32::Fe32 impl core::convert::From for bitcoin::blockdata::opcodes::Opcode impl core::convert::From for bitcoin::blockdata::transaction::InputsIndexError impl core::convert::From for bitcoin::blockdata::transaction::OutputsIndexError @@ -1984,7 +1983,6 @@ impl core::convert::TryFrom for bitcoin::blockdata::trans impl core::convert::TryFrom for bitcoin::p2p::message::CommandString impl core::convert::TryFrom> for bitcoin::taproot::merkle_branch::TaprootMerkleBranch impl core::convert::TryFrom> for bitcoin::blockdata::script::PushBytesBuf -impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion impl core::convert::TryFrom for bitcoin::CompressedPublicKey impl core::convert::TryFrom for bitcoin::network::Network impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion @@ -6985,7 +6983,6 @@ pub fn alloc::vec::Vec::consensus_decode_from_finite_reader::consensus_encode(&self, w: &mut W) -> core::result::Result pub fn alloc::vec::Vec::from(v: bitcoin::blockdata::script::ScriptBuf) -> Self pub fn alloc::vec::Vec::from(value: bitcoin::blockdata::script::PushBytesBuf) -> Self -pub fn bech32::primitives::gf32::Fe32::from(version: bitcoin::blockdata::script::witness_version::WitnessVersion) -> Self pub fn bitcoin::CompressedPublicKey::clone(&self) -> bitcoin::CompressedPublicKey pub fn bitcoin::CompressedPublicKey::cmp(&self, other: &bitcoin::CompressedPublicKey) -> core::cmp::Ordering pub fn bitcoin::CompressedPublicKey::deserialize>(d: D) -> core::result::Result::Error> @@ -8323,12 +8320,10 @@ pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::fmt(&self, f pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::from_str(s: &str) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::hash<__H: core::hash::Hasher>(&self, state: &mut __H) pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::partial_cmp(&self, other: &bitcoin::blockdata::script::witness_version::WitnessVersion) -> core::option::Option -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_fe(self) -> bech32::primitives::gf32::Fe32 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_num(self) -> u8 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(instruction: bitcoin::blockdata::script::Instruction<'_>) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(no: u8) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(opcode: bitcoin::blockdata::opcodes::Opcode) -> core::result::Result -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(value: bech32::primitives::gf32::Fe32) -> core::result::Result pub fn bitcoin::blockdata::script::write_scriptint(out: &mut [u8; 8], n: i64) -> usize pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::clone(&self) -> bitcoin::blockdata::transaction::IndexOutOfBoundsError pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::eq(&self, other: &bitcoin::blockdata::transaction::IndexOutOfBoundsError) -> bool diff --git a/api/bitcoin/default-features.txt b/api/bitcoin/default-features.txt index 0643c7c0f..4dc97e18f 100644 --- a/api/bitcoin/default-features.txt +++ b/api/bitcoin/default-features.txt @@ -1798,7 +1798,6 @@ impl core::convert::From for bitcoin::address::error::ParseError impl core::convert::From for bitcoin::blockdata::script::witness_version::FromStrError impl core::convert::From for bitcoin::blockdata::script::witness_version::TryFromInstructionError -impl core::convert::From for bech32::primitives::gf32::Fe32 impl core::convert::From for bitcoin::blockdata::opcodes::Opcode impl core::convert::From for bitcoin::blockdata::transaction::InputsIndexError impl core::convert::From for bitcoin::blockdata::transaction::OutputsIndexError @@ -1941,7 +1940,6 @@ impl core::convert::TryFrom for bitcoin::blockdata::trans impl core::convert::TryFrom for bitcoin::p2p::message::CommandString impl core::convert::TryFrom> for bitcoin::taproot::merkle_branch::TaprootMerkleBranch impl core::convert::TryFrom> for bitcoin::blockdata::script::PushBytesBuf -impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion impl core::convert::TryFrom for bitcoin::CompressedPublicKey impl core::convert::TryFrom for bitcoin::network::Network impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion @@ -6679,7 +6677,6 @@ pub fn alloc::vec::Vec::consensus_decode_from_finite_reader::consensus_encode(&self, w: &mut W) -> core::result::Result pub fn alloc::vec::Vec::from(v: bitcoin::blockdata::script::ScriptBuf) -> Self pub fn alloc::vec::Vec::from(value: bitcoin::blockdata::script::PushBytesBuf) -> Self -pub fn bech32::primitives::gf32::Fe32::from(version: bitcoin::blockdata::script::witness_version::WitnessVersion) -> Self pub fn bitcoin::CompressedPublicKey::clone(&self) -> bitcoin::CompressedPublicKey pub fn bitcoin::CompressedPublicKey::cmp(&self, other: &bitcoin::CompressedPublicKey) -> core::cmp::Ordering pub fn bitcoin::CompressedPublicKey::eq(&self, other: &bitcoin::CompressedPublicKey) -> bool @@ -7934,12 +7931,10 @@ pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::fmt(&self, f pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::from_str(s: &str) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::hash<__H: core::hash::Hasher>(&self, state: &mut __H) pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::partial_cmp(&self, other: &bitcoin::blockdata::script::witness_version::WitnessVersion) -> core::option::Option -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_fe(self) -> bech32::primitives::gf32::Fe32 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_num(self) -> u8 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(instruction: bitcoin::blockdata::script::Instruction<'_>) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(no: u8) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(opcode: bitcoin::blockdata::opcodes::Opcode) -> core::result::Result -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(value: bech32::primitives::gf32::Fe32) -> core::result::Result pub fn bitcoin::blockdata::script::write_scriptint(out: &mut [u8; 8], n: i64) -> usize pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::clone(&self) -> bitcoin::blockdata::transaction::IndexOutOfBoundsError pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::eq(&self, other: &bitcoin::blockdata::transaction::IndexOutOfBoundsError) -> bool diff --git a/api/bitcoin/no-features.txt b/api/bitcoin/no-features.txt index 5dc7e5b1f..b99c9a907 100644 --- a/api/bitcoin/no-features.txt +++ b/api/bitcoin/no-features.txt @@ -1634,7 +1634,6 @@ impl core::convert::From for bitcoin::address::error::ParseError impl core::convert::From for bitcoin::blockdata::script::witness_version::FromStrError impl core::convert::From for bitcoin::blockdata::script::witness_version::TryFromInstructionError -impl core::convert::From for bech32::primitives::gf32::Fe32 impl core::convert::From for bitcoin::blockdata::opcodes::Opcode impl core::convert::From for bitcoin::blockdata::transaction::InputsIndexError impl core::convert::From for bitcoin::blockdata::transaction::OutputsIndexError @@ -1767,7 +1766,6 @@ impl core::convert::TryFrom<&bitcoin::blockdata::script::ScriptBuf> for bitcoin: impl core::convert::TryFrom> for bitcoin::taproot::merkle_branch::TaprootMerkleBranch impl core::convert::TryFrom> for bitcoin::taproot::merkle_branch::TaprootMerkleBranch impl core::convert::TryFrom> for bitcoin::blockdata::script::PushBytesBuf -impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion impl core::convert::TryFrom for bitcoin::CompressedPublicKey impl core::convert::TryFrom for bitcoin::network::Network impl core::convert::TryFrom for bitcoin::blockdata::script::witness_version::WitnessVersion @@ -6049,7 +6047,6 @@ pub fn alloc::vec::Vec::consensus_decode_from_finite_reader::consensus_encode(&self, w: &mut W) -> core::result::Result pub fn alloc::vec::Vec::from(v: bitcoin::blockdata::script::ScriptBuf) -> Self pub fn alloc::vec::Vec::from(value: bitcoin::blockdata::script::PushBytesBuf) -> Self -pub fn bech32::primitives::gf32::Fe32::from(version: bitcoin::blockdata::script::witness_version::WitnessVersion) -> Self pub fn bitcoin::CompressedPublicKey::clone(&self) -> bitcoin::CompressedPublicKey pub fn bitcoin::CompressedPublicKey::cmp(&self, other: &bitcoin::CompressedPublicKey) -> core::cmp::Ordering pub fn bitcoin::CompressedPublicKey::eq(&self, other: &bitcoin::CompressedPublicKey) -> bool @@ -7286,12 +7283,10 @@ pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::fmt(&self, f pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::from_str(s: &str) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::hash<__H: core::hash::Hasher>(&self, state: &mut __H) pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::partial_cmp(&self, other: &bitcoin::blockdata::script::witness_version::WitnessVersion) -> core::option::Option -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_fe(self) -> bech32::primitives::gf32::Fe32 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::to_num(self) -> u8 pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(instruction: bitcoin::blockdata::script::Instruction<'_>) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(no: u8) -> core::result::Result pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(opcode: bitcoin::blockdata::opcodes::Opcode) -> core::result::Result -pub fn bitcoin::blockdata::script::witness_version::WitnessVersion::try_from(value: bech32::primitives::gf32::Fe32) -> core::result::Result pub fn bitcoin::blockdata::script::write_scriptint(out: &mut [u8; 8], n: i64) -> usize pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::clone(&self) -> bitcoin::blockdata::transaction::IndexOutOfBoundsError pub fn bitcoin::blockdata::transaction::IndexOutOfBoundsError::eq(&self, other: &bitcoin::blockdata::transaction::IndexOutOfBoundsError) -> bool