Do not re-export non-essential hash types
What changed, and why it matters
This commit is a routine API cleanup: it stops publicly re-exporting a few specialized hash types (Ntxid, TxMerkleNode, WitnessMerkleNode) from convenient crate-root locations, so users must import them from their original modules instead. It does not change any logic, cryptography, or data handling, and there is no indication it fixes a security bug.
No security action required. Library consumers should update imports if they were using the removed re-exports.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch removes crate-root re-exports of Ntxid from primitives::transaction, TxMerkleNode/WitnessMerkleNode from primitives::merkle_tree, and the corresponding bitcoin crate re-exports. It updates internal imports to use the original module paths. This is a pure API-organization change with no functional, cryptographic, or memory-safety modifications.
Changed components
bitcoin/src/lib.rs public re-exportsprimitives/src/lib.rs public re-exportsprimitives/src/block.rs importsprimitives/src/transaction.rs test importsprimitives/tests/api.rs API test importsInspect captured patch +14 / −19
diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs
index b8a7c647..03a4ff26 100644
--- a/bitcoin/src/lib.rs
+++ b/bitcoin/src/lib.rs
@@ -144,9 +144,7 @@ pub use primitives::{
ScriptPubKeyBuf, ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, Tag, TapScript,
TapScriptBuf, TapScriptTag, WitnessScript, WitnessScriptBuf, WitnessScriptTag,
},
- transaction::{
- Ntxid, OutPoint, Transaction, TxIn, TxOut, Txid, Version as TransactionVersion, Wtxid,
- },
+ transaction::{OutPoint, Transaction, TxIn, TxOut, Txid, Version as TransactionVersion, Wtxid},
witness::Witness,
};
#[doc(inline)]
diff --git a/bitcoin/src/merkle_tree/mod.rs b/bitcoin/src/merkle_tree/mod.rs
index 621ce768..bac1bb5d 100644
--- a/bitcoin/src/merkle_tree/mod.rs
+++ b/bitcoin/src/merkle_tree/mod.rs
@@ -18,10 +18,7 @@ use io::{BufRead, Write};
#[rustfmt::skip]
#[doc(inline)]
-pub use primitives::{
- TxMerkleNode, WitnessMerkleNode,
- merkle_tree::{TxMerkleNodeDecoder, TxMerkleNodeEncoder},
-};
+pub use primitives::merkle_tree::{TxMerkleNodeDecoder, TxMerkleNodeEncoder, TxMerkleNode, WitnessMerkleNode};
#[doc(no_inline)]
pub use primitives::merkle_tree::TxMerkleNodeDecoderError;
diff --git a/primitives/src/block.rs b/primitives/src/block.rs
index b507068d..d3a3eee4 100644
--- a/primitives/src/block.rs
+++ b/primitives/src/block.rs
@@ -22,14 +22,16 @@ use internals::write_err;
#[cfg(feature = "hex")]
use crate::hex_codec::{HexPrimitive, ParsePrimitiveError};
-use crate::merkle_tree::{TxMerkleNodeDecoder, TxMerkleNodeDecoderError};
+#[cfg(feature = "alloc")]
+use crate::merkle_tree::WitnessMerkleNode;
+use crate::merkle_tree::{TxMerkleNode, TxMerkleNodeDecoder, TxMerkleNodeDecoderError};
use crate::pow::{CompactTargetDecoder, CompactTargetDecoderError};
#[cfg(feature = "alloc")]
use crate::prelude::Vec;
use crate::time::{BlockTimeDecoder, BlockTimeDecoderError};
-use crate::{BlockTime, CompactTarget, TxMerkleNode};
#[cfg(feature = "alloc")]
-use crate::{Transaction, WitnessMerkleNode};
+use crate::Transaction;
+use crate::{BlockTime, CompactTarget};
#[rustfmt::skip] // Keep public re-exports separate.
#[doc(inline)]
diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs
index 48e16e9c..0456ebf1 100644
--- a/primitives/src/lib.rs
+++ b/primitives/src/lib.rs
@@ -96,8 +96,7 @@ pub use self::{
#[doc(inline)]
pub use self::{
block::{BlockHash, Header as BlockHeader, Version as BlockVersion, WitnessCommitment},
- merkle_tree::{TxMerkleNode, WitnessMerkleNode},
- transaction::{Ntxid, OutPoint, Txid, Version as TransactionVersion, Wtxid},
+ transaction::{OutPoint, Txid, Version as TransactionVersion, Wtxid},
};
#[rustfmt::skip]
diff --git a/primitives/src/transaction.rs b/primitives/src/transaction.rs
index 409acbe0..a078672b 100644
--- a/primitives/src/transaction.rs
+++ b/primitives/src/transaction.rs
@@ -2194,9 +2194,8 @@ mod tests {
#[cfg(feature = "alloc")]
#[cfg(feature = "hex")]
fn encode_block() {
- use crate::{
- Block, BlockHash, BlockHeader, BlockTime, BlockVersion, CompactTarget, TxMerkleNode,
- };
+ use crate::merkle_tree::TxMerkleNode;
+ use crate::{Block, BlockHash, BlockHeader, BlockTime, BlockVersion, CompactTarget};
let seconds: u32 = 1_653_195_600; // Arbitrary timestamp: May 22nd, 5am UTC.
diff --git a/primitives/tests/api.rs b/primitives/tests/api.rs
index 6b6605db..c95cd3d0 100644
--- a/primitives/tests/api.rs
+++ b/primitives/tests/api.rs
@@ -269,10 +269,10 @@ fn api_can_use_modules_from_crate_root() {
fn api_can_use_types_from_crate_root() {
use bitcoin_primitives::{
Block, BlockChecked, BlockHash, BlockHeader, BlockUnchecked, BlockValidation, BlockVersion,
- CompactTarget, Ntxid, OutPoint, RedeemScript, RedeemScriptBuf, ScriptPubKey,
- ScriptPubKeyBuf, ScriptSig, ScriptSigBuf, Sequence, TapScript, TapScriptBuf, Transaction,
- TransactionVersion, TxIn, TxMerkleNode, TxOut, Txid, Witness, WitnessCommitment,
- WitnessMerkleNode, WitnessScript, WitnessScriptBuf, Wtxid,
+ CompactTarget, OutPoint, RedeemScript, RedeemScriptBuf, ScriptPubKey, ScriptPubKeyBuf,
+ ScriptSig, ScriptSigBuf, Sequence, TapScript, TapScriptBuf, Transaction,
+ TransactionVersion, TxIn, TxOut, Txid, Witness, WitnessCommitment, WitnessScript,
+ WitnessScriptBuf, Wtxid,
};
}
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.