Add SignetBlockScript/Buf for signet challenge scripts
What changed, and why it matters
This commit is a straightforward code-quality improvement in the rust-bitcoin library. It introduces new type names (SignetBlockScript and SignetBlockScriptBuf) to represent signet challenge scripts more clearly, replacing the previous use of WitnessScript types. There is no security bug being fixed here and no behavior change that would affect users' funds or network safety.
No security action required. Treat as a normal API refactor.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change adds typed script tags SignetBlockScriptTag, SignetBlockScript, and SignetBlockScriptBuf in primitives/src/script, re-exports them in bitcoin/src/blockdata/script and bitcoin/src/lib.rs, and updates the custom signet example in bitcoin/src/network/params.rs to use the new types. It also adds a From
Changed components
primitives/src/script/mod.rsprimitives/src/script/tag.rsprimitives/src/script/tests.rsprimitives/src/lib.rsbitcoin/src/blockdata/script/mod.rsbitcoin/src/lib.rsbitcoin/src/network/params.rsInspect captured patch +37 / −11
diff --git a/bitcoin/src/blockdata/script/mod.rs b/bitcoin/src/blockdata/script/mod.rs
index ab54f748..5340ccde 100644
--- a/bitcoin/src/blockdata/script/mod.rs
+++ b/bitcoin/src/blockdata/script/mod.rs
@@ -84,9 +84,9 @@ pub use primitives::script::ScriptBufDecoderError;
pub use primitives::script::{
RedeemScript, RedeemScriptBuf, RedeemScriptSizeError, RedeemScriptTag, Script, ScriptBuf,
ScriptBufDecoder, ScriptEncoder, ScriptHash, ScriptHashableTag, ScriptPubKey, ScriptPubKeyBuf,
- ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, Tag, TapScript, TapScriptBuf,
- TapScriptTag, WScriptHash, WitnessScript, WitnessScriptBuf, WitnessScriptSizeError,
- WitnessScriptTag,
+ ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, SignetBlockScript,
+ SignetBlockScriptBuf, SignetBlockScriptTag, Tag, TapScript, TapScriptBuf, TapScriptTag,
+ WScriptHash, WitnessScript, WitnessScriptBuf, WitnessScriptSizeError, WitnessScriptTag,
};
pub(crate) use self::borrowed::ScriptExtPriv;
diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs
index 98e890b7..4ee552b9 100644
--- a/bitcoin/src/lib.rs
+++ b/bitcoin/src/lib.rs
@@ -138,8 +138,9 @@ pub use primitives::{
merkle_tree::{TxMerkleNode, WitnessMerkleNode},
script::{
RedeemScript, RedeemScriptBuf, RedeemScriptTag, ScriptHashableTag, ScriptPubKey,
- ScriptPubKeyBuf, ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, Tag, TapScript,
- TapScriptBuf, TapScriptTag, WitnessScript, WitnessScriptBuf, WitnessScriptTag,
+ ScriptPubKeyBuf, ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, SignetBlockScript,
+ SignetBlockScriptBuf, SignetBlockScriptTag, Tag, TapScript, TapScriptBuf, TapScriptTag,
+ WitnessScript, WitnessScriptBuf, WitnessScriptTag,
},
transaction::{
Ntxid, OutPoint, Transaction, TxIn, TxOut, Txid, Version as TransactionVersion, Wtxid,
diff --git a/bitcoin/src/network/params.rs b/bitcoin/src/network/params.rs
index b5f9af7c..37876e8f 100644
--- a/bitcoin/src/network/params.rs
+++ b/bitcoin/src/network/params.rs
@@ -12,13 +12,13 @@
//!
//! ```
//! use bitcoin::network::Params;
-//! use bitcoin::{WitnessScript, WitnessScriptBuf, Network, Target};
+//! use bitcoin::{SignetBlockScript, SignetBlockScriptBuf, Network, Target};
//!
//! const POW_TARGET_SPACING: u32 = 120; // Two minutes.
//!
//! pub struct CustomParams {
//! params: Params,
-//! challenge_script: WitnessScriptBuf,
+//! challenge_script: SignetBlockScriptBuf,
//! }
//!
//! impl CustomParams {
@@ -28,7 +28,7 @@
//! params.pow_target_spacing = POW_TARGET_SPACING;
//!
//! // This would be something real (see BIP-00325).
-//! let challenge_script = WitnessScriptBuf::new();
+//! let challenge_script = SignetBlockScriptBuf::new();
//!
//! Self {
//! params,
@@ -37,7 +37,7 @@
//! }
//!
//! /// Returns the custom signet challenge script.
-//! pub fn challenge_script(&self) -> &WitnessScript { &self.challenge_script }
+//! pub fn challenge_script(&self) -> &SignetBlockScript { &self.challenge_script }
//! }
//!
//! impl AsRef<Params> for CustomParams {
diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs
index d4646b6e..db48b833 100644
--- a/primitives/src/lib.rs
+++ b/primitives/src/lib.rs
@@ -88,7 +88,8 @@ pub use self::{
},
script::{
RedeemScript, RedeemScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf,
- TapScript, TapScriptBuf, WitnessScript, WitnessScriptBuf,
+ SignetBlockScript, SignetBlockScriptBuf, TapScript, TapScriptBuf, WitnessScript,
+ WitnessScriptBuf,
},
transaction::{Transaction, TxIn, TxOut},
witness::Witness,
diff --git a/primitives/src/script/mod.rs b/primitives/src/script/mod.rs
index 6406a558..b9a83da1 100644
--- a/primitives/src/script/mod.rs
+++ b/primitives/src/script/mod.rs
@@ -27,7 +27,7 @@ use crate::prelude::{Borrow, BorrowMut, Box, Cow, ToOwned, Vec};
pub use self::{
borrowed::{Script, ScriptEncoder},
owned::{ScriptBuf, ScriptBufDecoder, ScriptBufDecoderError},
- tag::{Tag, RedeemScriptTag, ScriptPubKeyTag, ScriptSigTag, TapScriptTag, WitnessScriptTag},
+ tag::{Tag, RedeemScriptTag, ScriptPubKeyTag, ScriptSigTag, SignetBlockScriptTag, TapScriptTag, WitnessScriptTag},
};
#[doc(inline)]
pub use crate::hash_types::{
@@ -58,6 +58,12 @@ pub type ScriptSigBuf = ScriptBuf<ScriptSigTag>;
/// A `scriptSig` decoder.
pub type ScriptSigBufDecoder = ScriptBufDecoder<ScriptSigTag>;
+/// A signet block/challenge script.
+pub type SignetBlockScriptBuf = ScriptBuf<SignetBlockScriptTag>;
+
+/// A reference to a signet block/challenge script.
+pub type SignetBlockScript = Script<SignetBlockScriptTag>;
+
/// A Segwit v1 Taproot script.
pub type TapScriptBuf = ScriptBuf<TapScriptTag>;
@@ -150,6 +156,11 @@ impl TryFrom<&WitnessScript> for WScriptHash {
}
}
+impl From<WitnessScriptBuf> for SignetBlockScriptBuf {
+ #[inline]
+ fn from(buf: WitnessScriptBuf) -> Self { Self::from_bytes(buf.into_bytes()) }
+}
+
// We keep all the `Script` and `ScriptBuf` impls together since it's easier to see side-by-side.
impl<T> From<ScriptBuf<T>> for Box<Script<T>> {
diff --git a/primitives/src/script/tag.rs b/primitives/src/script/tag.rs
index d5d5162b..6f9862f8 100644
--- a/primitives/src/script/tag.rs
+++ b/primitives/src/script/tag.rs
@@ -23,6 +23,11 @@ impl Tag for ScriptSigTag {}
pub enum ScriptPubKeyTag {}
impl Tag for ScriptPubKeyTag {}
+/// A signet block challenge script.
+#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
+pub enum SignetBlockScriptTag {}
+impl Tag for SignetBlockScriptTag {}
+
/// A Segwit v1 Taproot script.
#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub enum TapScriptTag {}
diff --git a/primitives/src/script/tests.rs b/primitives/src/script/tests.rs
index ae701aa4..91256a3c 100644
--- a/primitives/src/script/tests.rs
+++ b/primitives/src/script/tests.rs
@@ -561,6 +561,14 @@ fn decoder_full_read_limit() {
assert_eq!(decoder.read_limit(), 31);
}
+#[test]
+fn witness_to_signet_script() {
+ let bytes = vec![0x51, 0x52, 0x53];
+ let witness = WitnessScriptBuf::from(bytes.clone());
+ let signet: SignetBlockScriptBuf = witness.into();
+ assert_eq!(signet.as_bytes(), &bytes);
+}
+
#[test]
fn decoder_error_display() {
#[cfg(feature = "std")]
Why this scored 15/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.