From e7d326f071a368389f087ddb10ee9bbf3552c33a Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Mon, 21 Oct 2024 14:50:22 +1100 Subject: [PATCH] Seal extension traits The extension traits are temporary just while we try to stabalize `primitives`, they are not intended to be implemented by downstream. Seal the extension traits so that downstream crates cannot implement them. Fix: #3231 --- bitcoin/src/address/script_pubkey.rs | 7 +++++++ bitcoin/src/blockdata/block.rs | 5 +++++ bitcoin/src/blockdata/script/borrowed.rs | 5 +++++ bitcoin/src/blockdata/script/owned.rs | 5 +++++ bitcoin/src/blockdata/transaction.rs | 15 +++++++++------ bitcoin/src/blockdata/witness.rs | 5 +++++ bitcoin/src/consensus_validation.rs | 5 +++++ bitcoin/src/internal_macros.rs | 2 +- bitcoin/src/pow.rs | 5 +++++ 9 files changed, 47 insertions(+), 7 deletions(-) diff --git a/bitcoin/src/address/script_pubkey.rs b/bitcoin/src/address/script_pubkey.rs index fac45467e..2d801b0c8 100644 --- a/bitcoin/src/address/script_pubkey.rs +++ b/bitcoin/src/address/script_pubkey.rs @@ -195,6 +195,13 @@ pub(super) fn new_witness_program_unchecked>( Builder::new().push_opcode(version.into()).push_slice(program).into_script() } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Script {} + impl Sealed for super::ScriptBuf {} + impl Sealed for super::Builder {} +} + #[cfg(test)] mod tests { use super::*; diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index a9096e9b8..4ab4ceab8 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -71,6 +71,11 @@ crate::internal_macros::define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Header {} +} + impl Encodable for Version { fn consensus_encode(&self, w: &mut W) -> Result { self.to_consensus().consensus_encode(w) diff --git a/bitcoin/src/blockdata/script/borrowed.rs b/bitcoin/src/blockdata/script/borrowed.rs index 5cc8ffbf4..55181d9c4 100644 --- a/bitcoin/src/blockdata/script/borrowed.rs +++ b/bitcoin/src/blockdata/script/borrowed.rs @@ -387,6 +387,11 @@ crate::internal_macros::define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Script {} +} + crate::internal_macros::define_extension_trait! { pub(crate) trait ScriptExtPriv impl for Script { fn minimal_non_dust_internal(&self, dust_relay_fee: u64) -> crate::Amount { diff --git a/bitcoin/src/blockdata/script/owned.rs b/bitcoin/src/blockdata/script/owned.rs index 281634944..1647806c0 100644 --- a/bitcoin/src/blockdata/script/owned.rs +++ b/bitcoin/src/blockdata/script/owned.rs @@ -81,6 +81,11 @@ crate::internal_macros::define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::ScriptBuf {} +} + crate::internal_macros::define_extension_trait! { pub(crate) trait ScriptBufExtPriv impl for ScriptBuf { /// Pretends to convert `&mut ScriptBuf` to `&mut Vec` so that it can be modified. diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index 469a9a70c..312c078a6 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -61,12 +61,6 @@ pub trait TxIdentifier: sealed::Sealed + AsRef<[u8]> {} impl TxIdentifier for Txid {} impl TxIdentifier for Wtxid {} -mod sealed { - pub trait Sealed {} - impl Sealed for super::Txid {} - impl Sealed for super::Wtxid {} -} - /// The marker MUST be a 1-byte zero value: 0x00. (BIP-141) const SEGWIT_MARKER: u8 = 0x00; /// The flag MUST be a 1-byte non-zero value. Currently, 0x01 MUST be used. (BIP-141) @@ -1334,6 +1328,15 @@ impl<'a> Arbitrary<'a> for Transaction { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Txid {} + impl Sealed for super::Wtxid {} + impl Sealed for super::OutPoint {} + impl Sealed for super::TxOut {} + impl Sealed for super::Version {} +} + #[cfg(test)] mod tests { use hex::{test_hex_unwrap as hex, FromHex}; diff --git a/bitcoin/src/blockdata/witness.rs b/bitcoin/src/blockdata/witness.rs index 08e39d483..85a9a1342 100644 --- a/bitcoin/src/blockdata/witness.rs +++ b/bitcoin/src/blockdata/witness.rs @@ -216,6 +216,11 @@ crate::internal_macros::define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Witness {} +} + /// Correctness Requirements: value must always fit within u32 // This is duplicated in `primitives::witness`, if you change it please do so over there also. #[inline] diff --git a/bitcoin/src/consensus_validation.rs b/bitcoin/src/consensus_validation.rs index b0177ec1e..e6f0f1570 100644 --- a/bitcoin/src/consensus_validation.rs +++ b/bitcoin/src/consensus_validation.rs @@ -161,6 +161,11 @@ define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::Script {} +} + impl Transaction { /// Verifies that this transaction is able to spend its inputs. /// diff --git a/bitcoin/src/internal_macros.rs b/bitcoin/src/internal_macros.rs index 658b099df..c45f47091 100644 --- a/bitcoin/src/internal_macros.rs +++ b/bitcoin/src/internal_macros.rs @@ -252,7 +252,7 @@ macro_rules! define_extension_trait { fn $fn:ident$(<$($gen:ident: $gent:path),*>)?($($params:tt)*) $( -> $ret:ty )? $body:block )* }) => { - $(#[$($trait_attrs)*])* $trait_vis trait $trait_name { + $(#[$($trait_attrs)*])* $trait_vis trait $trait_name: sealed::Sealed { $( $crate::internal_macros::only_doc_attrs! { { $(#[$($fn_attrs)*])* }, diff --git a/bitcoin/src/pow.rs b/bitcoin/src/pow.rs index e62c6a779..5b3539df3 100644 --- a/bitcoin/src/pow.rs +++ b/bitcoin/src/pow.rs @@ -430,6 +430,11 @@ define_extension_trait! { } } +mod sealed { + pub trait Sealed {} + impl Sealed for super::CompactTarget {} +} + impl From for Target { fn from(c: CompactTarget) -> Self { Target::from_compact(c) } }