primitives: delete Script and ScriptSig
What changed, and why it matters
This commit is a routine internal cleanup in the rust-bitcoin library. It removes the old untyped Script and ScriptBuf aliases and finishes switching all remaining code to use specific tagged script types (such as ScriptPubKey, ScriptSig, WitnessScript, etc.). There is no security vulnerability here; it is purely a refactoring change to make type usage more precise.
No security action needed. Treat as normal refactoring; verify downstream consumers no longer rely on the removed Script/ScriptBuf aliases before upgrading.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch deletes the untyped GenericScript
Changed components
bitcoin/src/blockdata/script/*bitcoin/src/blockdata/transaction.rsbitcoin/src/blockdata/witness.rsbitcoin/src/crypto/sighash.rsbitcoin/src/network/params.rsbitcoin/tests/serde.rsbitcoin/examples/script.rsp2p/src/message.rsprimitives/src/script/*primitives/tests/api.rsfuzz/fuzz_targets/bitcoin/script_bytes_to_asm_fmt.rsInspect captured patch +69 / −92
diff --git a/bitcoin/examples/script.rs b/bitcoin/examples/script.rs
index 5198b58c..36b7b11f 100644
--- a/bitcoin/examples/script.rs
+++ b/bitcoin/examples/script.rs
@@ -10,7 +10,7 @@
use bitcoin::consensus::encode;
use bitcoin::key::WPubkeyHash;
use bitcoin::script::{self, GenericScriptBufExt as _, GenericScriptExt as _};
-use bitcoin::{ScriptBuf, WitnessScriptBuf};
+use bitcoin::WitnessScriptBuf;
fn main() {
let pk = "b472a266d0bd89c13706a4132ccfb16f7c3b9fcb".parse::<WPubkeyHash>().unwrap();
@@ -31,16 +31,16 @@ fn main() {
println!("human-readable script: {script_code}");
// We do not implement parsing scripts from human-readable format.
- // let decoded = s.parse::<ScriptBuf>().unwrap();
+ // let decoded = s.parse::<WitnessScriptBuf>().unwrap();
// This is not equivalent to consensus encoding i.e., does not include the length prefix.
let hex_lower_hex_trait = format!("{script_code:x}");
println!("hex created using `LowerHex`: {hex_lower_hex_trait}");
// The `deserialize_hex` function requires the length prefix.
- assert!(encode::deserialize_hex::<ScriptBuf>(&hex_lower_hex_trait).is_err());
+ assert!(encode::deserialize_hex::<WitnessScriptBuf>(&hex_lower_hex_trait).is_err());
// And so does `from_hex_prefixed`.
- assert!(ScriptBuf::from_hex_prefixed(&hex_lower_hex_trait).is_err());
+ assert!(WitnessScriptBuf::from_hex_prefixed(&hex_lower_hex_trait).is_err());
// But we provide an explicit constructor that does not.
assert_eq!(
WitnessScriptBuf::from_hex_no_length_prefix(&hex_lower_hex_trait).unwrap(),
diff --git a/bitcoin/src/blockdata/script/borrowed.rs b/bitcoin/src/blockdata/script/borrowed.rs
index 90874cd6..be5205d2 100644
--- a/bitcoin/src/blockdata/script/borrowed.rs
+++ b/bitcoin/src/blockdata/script/borrowed.rs
@@ -24,7 +24,7 @@ use crate::taproot::{LeafVersion, TapLeafHash, TapNodeHash};
use crate::{internal_macros, Amount, FeeRate, ScriptPubKeyBuf, WitnessScriptBuf};
internal_macros::define_extension_trait! {
- /// Extension functionality for the [`Script`] type.
+ /// Extension functionality for the [`GenericScript`] type.
pub trait GenericScriptExt<T> impl<T> for GenericScript<T> {
/// Constructs a new script builder
fn builder() -> Builder<T> { Builder::new() }
@@ -252,7 +252,7 @@ internal_macros::define_extension_trait! {
}
internal_macros::define_extension_trait! {
- /// Extension functionality for the [`Script`] type.
+ /// Extension functionality for the [`WitnessScript`] type.
pub trait WitnessScriptExt impl for WitnessScript {
/// Returns 256-bit hash of the script for P2WSH outputs.
#[inline]
@@ -269,7 +269,7 @@ internal_macros::define_extension_trait! {
}
crate::internal_macros::define_extension_trait! {
- /// Extension functionality for the [`Script`] type.
+ /// Extension functionality for the [`TapScript`] type.
pub trait TapScriptExt impl for TapScript {
/// Computes leaf hash of tapscript.
#[inline]
@@ -293,7 +293,7 @@ crate::internal_macros::define_extension_trait! {
}
internal_macros::define_extension_trait! {
- /// Extension functionality for the [`Script`] type.
+ /// Extension functionality for the [`ScriptPubKey`] type.
pub trait ScriptPubKeyExt impl for ScriptPubKey {
/// Checks whether a script pubkey is a P2PK output.
///
@@ -447,7 +447,7 @@ internal_macros::define_extension_trait! {
///
/// To use a custom value, use [`minimal_non_dust_custom`].
///
- /// [`minimal_non_dust_custom`]: Script::minimal_non_dust_custom
+ /// [`minimal_non_dust_custom`]: Self::minimal_non_dust_custom
fn minimal_non_dust(&self) -> Amount {
self.minimal_non_dust_internal(DUST_RELAY_TX_FEE.into())
.expect("dust_relay_fee or script length should not be absurdly large")
@@ -463,7 +463,7 @@ internal_macros::define_extension_trait! {
///
/// To use the default Bitcoin Core value, use [`minimal_non_dust`].
///
- /// [`minimal_non_dust`]: Script::minimal_non_dust
+ /// [`minimal_non_dust`]: Self::minimal_non_dust
fn minimal_non_dust_custom(&self, dust_relay: FeeRate) -> Option<Amount> {
self.minimal_non_dust_internal(dust_relay.to_sat_per_kvb_ceil())
}
@@ -588,10 +588,10 @@ internal_macros::define_extension_trait! {
pub trait ScriptSigExt impl for ScriptSig {
/// Get redeemScript following BIP-0016 rules regarding P2SH spending.
///
- /// This does not guarantee that this represents a P2SH input [`Script`].
+ /// This does not guarantee that this represents a P2SH input [`ScriptSig`].
/// It merely gets the last push of the script.
///
- /// Use [`Script::is_p2sh`] on the scriptPubKey to check whether it is actually a P2SH script.
+ /// Use [`ScriptPubKey::is_p2sh`] on the scriptPubKey to check whether it is actually a P2SH script.
fn redeem_script(&self) -> Option<&RedeemScript> {
// Script must consist entirely of pushes.
if self.instructions().any(|i| i.is_err() || i.unwrap().push_bytes().is_none()) {
diff --git a/bitcoin/src/blockdata/script/mod.rs b/bitcoin/src/blockdata/script/mod.rs
index 9ffc15a4..34b54d56 100644
--- a/bitcoin/src/blockdata/script/mod.rs
+++ b/bitcoin/src/blockdata/script/mod.rs
@@ -2,8 +2,6 @@
//! Bitcoin scripts.
//!
-//! *[See also the `Script` type](Script).*
-//!
//! This module provides the structures and functions needed to support scripts.
//!
//! <details>
@@ -83,10 +81,9 @@ pub use self::{
#[doc(inline)]
pub use primitives::script::{
GenericScript, GenericScriptBuf, RedeemScript, RedeemScriptBuf, RedeemScriptSizeError,
- RedeemScriptTag, Script, ScriptBuf, ScriptHash, ScriptHashableTag, ScriptPubKey,
- ScriptPubKeyBuf, ScriptPubKeyTag, ScriptSig, ScriptSigBuf, ScriptSigTag, Tag, TapScript,
- TapScriptBuf, WScriptHash, Whatever, WitnessScript, WitnessScriptBuf, WitnessScriptSizeError,
- WitnessScriptTag,
+ RedeemScriptTag, ScriptHash, ScriptHashableTag, ScriptPubKey, ScriptPubKeyBuf, ScriptPubKeyTag,
+ ScriptSig, ScriptSigBuf, ScriptSigTag, Tag, TapScript, TapScriptBuf, WScriptHash,
+ WitnessScript, WitnessScriptBuf, WitnessScriptSizeError, WitnessScriptTag,
};
pub(crate) use self::borrowed::GenericScriptExtPriv;
@@ -94,7 +91,7 @@ pub(crate) use self::owned::GenericScriptBufExtPriv;
impl_asref_push_bytes!(ScriptHash, WScriptHash);
-/// Constructs a new [`ScriptBuf`] containing the script code used for spending a P2WPKH output.
+/// Constructs a new [`WitnessScriptBuf`] containing the script code used for spending a P2WPKH output.
///
/// The `scriptCode` is described in [BIP-0143].
///
diff --git a/bitcoin/src/blockdata/script/owned.rs b/bitcoin/src/blockdata/script/owned.rs
index c2ed73a9..0d8d7d50 100644
--- a/bitcoin/src/blockdata/script/owned.rs
+++ b/bitcoin/src/blockdata/script/owned.rs
@@ -9,7 +9,7 @@ use secp256k1::{Secp256k1, Verification};
use super::{
opcode_to_verify, Builder, GenericScriptBuf, GenericScriptExtPriv as _, Instruction, PushBytes,
- ScriptBuf, ScriptPubKeyBuf,
+ ScriptPubKeyBuf,
};
use crate::key::{
PubkeyHash, PublicKey, TapTweak, TweakedPublicKey, UntweakedPublicKey, WPubkeyHash,
@@ -24,7 +24,7 @@ use crate::taproot::TapNodeHash;
use crate::{consensus, internal_macros};
internal_macros::define_extension_trait! {
- /// Extension functionality for the [`ScriptBuf`] type.
+ /// Extension functionality for the [`GenericScriptBuf`] type.
pub trait GenericScriptBufExt<T> impl<T> for GenericScriptBuf<T> {
/// Constructs a new script builder
fn builder() -> Builder<T> { Builder::new() }
@@ -54,7 +54,7 @@ internal_macros::define_extension_trait! {
/// [CheckMinimalPush]: <https://github.com/bitcoin/bitcoin/blob/99a4ddf5ab1b3e514d08b90ad8565827fda7b63b/src/script/script.cpp#L366>
fn push_slice_non_minimal<D: AsRef<PushBytes>>(&mut self, data: D) {
let data = data.as_ref();
- self.reserve(ScriptBuf::reserved_len_for_slice(data.len()));
+ self.reserve(Self::reserved_len_for_slice(data.len()));
self.push_slice_no_opt(data);
}
@@ -95,7 +95,7 @@ internal_macros::define_extension_trait! {
/// multiple times.
fn scan_and_push_verify(&mut self) { self.push_verify(self.last_opcode()); }
- /// Constructs a new [`ScriptBuf`] from a hex string.
+ /// Constructs a new [`GenericScriptBuf`] from a hex string.
///
/// The input string is expected to be consensus encoded i.e., includes the length prefix.
fn from_hex_prefixed(s: &str) -> Result<Self, consensus::FromHexError>
@@ -104,7 +104,7 @@ internal_macros::define_extension_trait! {
consensus::encode::deserialize_hex(s)
}
- /// Constructs a new [`ScriptBuf`] from a hex string.
+ /// Constructs a new [`GenericScriptBuf`] from a hex string.
#[deprecated(since = "TBD", note = "use `from_hex_string_no_length_prefix()` instead")]
fn from_hex(s: &str) -> Result<Self, hex::HexToBytesError>
where Self: Sized
@@ -112,10 +112,10 @@ internal_macros::define_extension_trait! {
Self::from_hex_no_length_prefix(s)
}
- /// Constructs a new [`ScriptBuf`] from a hex string.
+ /// Constructs a new [`GenericScriptBuf`] from a hex string.
///
/// This is **not** consensus encoding. If your hex string is a consensus encoded script
- /// then use `ScriptBuf::from_hex_prefixed`.
+ /// then use `GenericScriptBuf::from_hex_prefixed`.
fn from_hex_no_length_prefix(s: &str) -> Result<Self, hex::HexToBytesError>
where Self: Sized
{
@@ -134,7 +134,7 @@ internal_macros::define_extension_trait! {
}
crate::internal_macros::define_extension_trait! {
- /// Extension functionality for the [`ScriptBuf`] type.
+ /// Extension functionality for the [`ScriptPubKeyBuf`] type.
pub trait ScriptPubKeyBufExt impl for ScriptPubKeyBuf {
/// Generates OP_RETURN-type of scriptPubkey for the given data.
fn new_op_return<T: AsRef<PushBytes>>(data: T) -> Self {
@@ -278,18 +278,18 @@ internal_macros::define_extension_trait! {
}
}
-impl<'a> core::iter::FromIterator<Instruction<'a>> for ScriptBuf {
+impl<'a, Tg> core::iter::FromIterator<Instruction<'a>> for GenericScriptBuf<Tg> {
fn from_iter<T>(iter: T) -> Self
where
T: IntoIterator<Item = Instruction<'a>>,
{
- let mut script = ScriptBuf::new();
+ let mut script = Self::new();
script.extend(iter);
script
}
}
-impl<'a> Extend<Instruction<'a>> for ScriptBuf {
+impl<'a, Tg> Extend<Instruction<'a>> for GenericScriptBuf<Tg> {
fn extend<T>(&mut self, iter: T)
where
T: IntoIterator<Item = Instruction<'a>>,
diff --git a/bitcoin/src/blockdata/script/tests.rs b/bitcoin/src/blockdata/script/tests.rs
index 7e9efc8b..f4c8fa92 100644
--- a/bitcoin/src/blockdata/script/tests.rs
+++ b/bitcoin/src/blockdata/script/tests.rs
@@ -10,7 +10,10 @@ use crate::script::witness_program::WitnessProgram;
use crate::script::witness_version::WitnessVersion;
use crate::{opcodes, Amount, FeeRate};
-type Tag = primitives::script::Whatever;
+// Tests should compile and pass no matter what these are.
+type Tag = primitives::script::ScriptSigTag;
+type Script = crate::ScriptSig;
+type ScriptBuf = crate::ScriptSigBuf;
#[test]
#[rustfmt::skip]
diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs
index 0b067b16..3049c86c 100644
--- a/bitcoin/src/blockdata/transaction.rs
+++ b/bitcoin/src/blockdata/transaction.rs
@@ -22,8 +22,8 @@ use crate::consensus::{self, encode, Decodable, Encodable};
use crate::locktime::absolute::{self, Height, MedianTimePast};
use crate::prelude::{Borrow, Vec};
use crate::script::{
- GenericScriptExt as _, GenericScriptExtPriv as _, Script, ScriptPubKey, ScriptPubKeyBuf,
- ScriptPubKeyExt as _,
+ GenericScriptExt as _, GenericScriptExtPriv as _, RedeemScript, ScriptPubKey, ScriptPubKeyBuf,
+ ScriptPubKeyExt as _, WitnessScript,
};
#[cfg(doc)]
use crate::sighash::{EcdsaSighashType, TapSighashType};
@@ -491,8 +491,8 @@ impl TransactionExtPriv for Transaction {
let mut count: usize = 0;
if prevout.script_pubkey.is_p2sh() {
if let Some(redeem) = input.script_sig.last_pushdata() {
- count =
- count.saturating_add(Script::from_bytes(redeem.as_bytes()).count_sigops());
+ count = count
+ .saturating_add(RedeemScript::from_bytes(redeem.as_bytes()).count_sigops());
}
}
count
@@ -520,7 +520,7 @@ impl TransactionExtPriv for Transaction {
1
} else if witness_program.is_p2wsh() {
// Treat the last item of the witness as the witnessScript
- witness.last().map(Script::from_bytes).map(|s| s.count_sigops()).unwrap_or(0)
+ witness.last().map(WitnessScript::from_bytes).map(|s| s.count_sigops()).unwrap_or(0)
} else {
0
}
diff --git a/bitcoin/src/blockdata/witness.rs b/bitcoin/src/blockdata/witness.rs
index 300be3c5..43ef966b 100644
--- a/bitcoin/src/blockdata/witness.rs
+++ b/bitcoin/src/blockdata/witness.rs
@@ -155,7 +155,6 @@ internal_macros::define_extension_trait! {
/// assumes a leaf version may be subtly broken once a new Tapscript version
/// is deployed.
#[deprecated(since = "TBD", note = "use taproot_leaf_script instead")]
- /// See [`WitnessScript::is_p2tr`] to check whether this is actually a Taproot witness.
fn tapscript(&self) -> Option<&TapScript> {
match P2TrSpend::from_witness(self) {
Some(P2TrSpend::Script { leaf_script, .. }) => Some(leaf_script),
diff --git a/bitcoin/src/crypto/sighash.rs b/bitcoin/src/crypto/sighash.rs
index feb2a66a..e223a749 100644
--- a/bitcoin/src/crypto/sighash.rs
+++ b/bitcoin/src/crypto/sighash.rs
@@ -810,7 +810,7 @@ impl<R: Borrow<Transaction>> SighashCache<R> {
/// [`std::io::Write`] trait.
///
/// `script_code` is dependent on the type of the spend transaction. For p2wpkh use
- /// [`Script::p2wpkh_script_code`], for p2wsh just pass in the witness script. (Also see
+ /// [`WitnessScript::p2wpkh_script_code`], for p2wsh just pass in the witness script. (Also see
/// [`Self::p2wpkh_signature_hash`] and [`SighashCache::p2wsh_signature_hash`].)
///
/// In order to sign, the data written by this function must be hashed using a double SHA256
diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs
index b938f5ef..6b824a41 100644
--- a/bitcoin/src/lib.rs
+++ b/bitcoin/src/lib.rs
@@ -153,8 +153,8 @@ pub use primitives::{
merkle_tree::{TxMerkleNode, WitnessMerkleNode},
pow::CompactTarget, // No `pow` module outside of `primitives`.
script::{
- RedeemScript, RedeemScriptBuf, Script, ScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig,
- ScriptSigBuf, TapScript, TapScriptBuf, WitnessScript, WitnessScriptBuf,
+ RedeemScript, RedeemScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf,
+ TapScript, TapScriptBuf, WitnessScript, WitnessScriptBuf,
},
sequence::{self, Sequence}, // No `sequence` module outside of `primitives`.
transaction::{OutPoint, Transaction, TxIn, TxOut, Txid, Version as TransactionVersion, Wtxid},
diff --git a/bitcoin/src/network/params.rs b/bitcoin/src/network/params.rs
index 69a136ed..35f467fd 100644
--- a/bitcoin/src/network/params.rs
+++ b/bitcoin/src/network/params.rs
@@ -12,13 +12,13 @@
//!
//! ```
//! use bitcoin::network::Params;
-//! use bitcoin::{Script, ScriptBuf, Network, Target};
+//! use bitcoin::{WitnessScript, WitnessScriptBuf, Network, Target};
//!
//! const POW_TARGET_SPACING: u64 = 120; // Two minutes.
//!
//! pub struct CustomParams {
//! params: Params,
-//! challenge_script: ScriptBuf,
+//! challenge_script: WitnessScriptBuf,
//! }
//!
//! impl CustomParams {
@@ -28,7 +28,7 @@
//! params.pow_target_spacing = POW_TARGET_SPACING;
//!
//! // This would be something real (see BIP-325).
-//! let challenge_script = ScriptBuf::new();
+//! let challenge_script = WitnessScriptBuf::new();
//!
//! Self {
//! params,
@@ -37,7 +37,7 @@
//! }
//!
//! /// Returns the custom signet challenge script.
-//! pub fn challenge_script(&self) -> &Script { &self.challenge_script }
+//! pub fn challenge_script(&self) -> &WitnessScript { &self.challenge_script }
//! }
//!
//! impl AsRef<Params> for CustomParams {
diff --git a/bitcoin/tests/serde.rs b/bitcoin/tests/serde.rs
index 625b45da..a81602ee 100644
--- a/bitcoin/tests/serde.rs
+++ b/bitcoin/tests/serde.rs
@@ -12,7 +12,7 @@
//
// use std::fs::File;
// use std::io::Write;
-// let script = ScriptBuf::from(vec![0u8, 1u8, 2u8]);
+// let script = WitnessScriptBuf::from(vec![0u8, 1u8, 2u8]);
// let got = serialize(&script).unwrap();
// let mut file = File::create("/tmp/script_bincode").unwrap();
// file.write_all(&got).unwrap();
@@ -32,7 +32,7 @@ use bitcoin::sighash::{EcdsaSighashType, TapSighashType};
use bitcoin::taproot::{self, ControlBlock, LeafVersion, TapTree, TaprootBuilder};
use bitcoin::witness::Witness;
use bitcoin::{
- ecdsa, transaction, Address, Amount, NetworkKind, OutPoint, PrivateKey, PublicKey, ScriptBuf,
+ ecdsa, transaction, Address, Amount, NetworkKind, OutPoint, PrivateKey, PublicKey,
ScriptPubKeyBuf, ScriptSigBuf, Sequence, TapScriptBuf, Target, Transaction, TxIn, TxOut, Txid,
Work,
};
@@ -76,7 +76,7 @@ fn serde_regression_relative_lock_time_time() {
#[test]
fn serde_regression_script() {
- let script = ScriptBuf::from(vec![0u8, 1u8, 2u8]);
+ let script = ScriptSigBuf::from(vec![0u8, 1u8, 2u8]);
let got = serialize(&script).unwrap();
let want = include_bytes!("data/serde/script_bincode") as &[_];
diff --git a/fuzz/fuzz_targets/bitcoin/script_bytes_to_asm_fmt.rs b/fuzz/fuzz_targets/bitcoin/script_bytes_to_asm_fmt.rs
index bea9fc10..07b4d1f8 100644
--- a/fuzz/fuzz_targets/bitcoin/script_bytes_to_asm_fmt.rs
+++ b/fuzz/fuzz_targets/bitcoin/script_bytes_to_asm_fmt.rs
@@ -13,7 +13,7 @@ impl fmt::Write for NullWriter {
fn do_test(data: &[u8]) {
let mut writer = NullWriter;
- let script = bitcoin::Script::from_bytes(data);
+ let script = bitcoin::WitnessScript::from_bytes(data);
write!(writer, "{script}").unwrap();
}
diff --git a/p2p/src/message.rs b/p2p/src/message.rs
index 324e0673..4867e96a 100644
--- a/p2p/src/message.rs
+++ b/p2p/src/message.rs
@@ -868,7 +868,6 @@ mod test {
use bitcoin::bip158::{FilterHash, FilterHeader};
use bitcoin::block::{Block, BlockHash};
use bitcoin::consensus::encode::{deserialize, deserialize_partial, serialize};
- use bitcoin::script::ScriptBuf;
use bitcoin::transaction::{Transaction, Txid};
use hex_lit::hex;
use units::BlockHeight;
@@ -892,8 +891,7 @@ mod test {
let tx: Transaction = deserialize(&hex!("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000")).unwrap();
let block: Block = deserialize(&hex!("00608e2e094d41aecfbcbf8fe70cb60be57516b07db1bafee4c4de5dad760000000000004aec16eab3be95abe9c54e01cf850c14b8c5cad1bc6b2e73e811db5d5998ada404503e66fcff031b4ebd99d701010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff3402983a000404503e6604f1f617271083bc3d6600000000000000000007bb1b0a636b706f6f6c0d506f72746c616e642e484f444cffffffff0200f2052a010000001976a9142ce72b25fe97b52638c199acfaa5e3891ddfed5b88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000")).unwrap();
let header: block::Header = deserialize(&hex!("010000004ddccd549d28f385ab457e98d1b11ce80bfea2c5ab93015ade4973e400000000bf4473e53794beae34e64fccc471dace6ae544180816f89591894e0f417a914cd74d6e49ffff001d323b3a7b")).unwrap();
- let script: ScriptBuf =
- deserialize(&hex!("1976a91431a420903c05a0a7de2de40c9f02ebedbacdc17288ac")).unwrap();
+ let script = &hex!("1976a91431a420903c05a0a7de2de40c9f02ebedbacdc17288ac");
let merkle_block: MerkleBlock = deserialize(&hex!("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101")).unwrap();
let cmptblock = deserialize(&hex!("00000030d923ad36ff2d955abab07f8a0a6e813bc6e066b973e780c5e36674cad5d1cd1f6e265f2a17a0d35cbe701fe9d06e2c6324cfe135f6233e8b767bfa3fb4479b71115dc562ffff7f2006000000000000000000000000010002000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0302ee00ffffffff0100f9029500000000015100000000")).unwrap();
let blocktxn = deserialize(&hex!("2e93c0cff39ff605020072d96bc3a8d20b8447e294d08092351c8583e08d9b5a01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0402dc0000ffffffff0200f90295000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000")).unwrap();
@@ -943,7 +941,7 @@ mod test {
tweak: 2,
flags: BloomFlags::All,
}),
- NetworkMessage::FilterAdd(FilterAdd { data: script.as_bytes().to_vec() }),
+ NetworkMessage::FilterAdd(FilterAdd { data: script.to_vec() }),
NetworkMessage::FilterAdd(FilterAdd {
data: hash([29u8; 32]).as_byte_array().to_vec(),
}),
diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs
index 8e2c251a..7877d73d 100644
--- a/primitives/src/lib.rs
+++ b/primitives/src/lib.rs
@@ -75,8 +75,8 @@ pub use self::{
Block, Checked as BlockChecked, Unchecked as BlockUnchecked, Validation as BlockValidation,
},
script::{
- RedeemScript, RedeemScriptBuf, Script, ScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig,
- ScriptSigBuf, TapScript, TapScriptBuf, WitnessScript, WitnessScriptBuf,
+ RedeemScript, RedeemScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf,
+ TapScript, TapScriptBuf, WitnessScript, WitnessScriptBuf,
},
transaction::{Transaction, TxIn, TxOut},
witness::Witness,
diff --git a/primitives/src/script/borrowed.rs b/primitives/src/script/borrowed.rs
index 1a2f9c1d..96e0ceed 100644
--- a/primitives/src/script/borrowed.rs
+++ b/primitives/src/script/borrowed.rs
@@ -189,11 +189,12 @@ delegate_index!(
#[cfg(test)]
mod tests {
+ // All tests should compile and pass no matter which script type you put here.
+ type Script = super::super::ScriptSig;
+
#[cfg(feature = "alloc")]
use alloc::{borrow::ToOwned, vec};
- use super::super::Script;
-
#[test]
fn script_from_bytes() {
let script = Script::from_bytes(&[1, 2, 3]);
diff --git a/primitives/src/script/mod.rs b/primitives/src/script/mod.rs
index 8ed2378f..e49c085b 100644
--- a/primitives/src/script/mod.rs
+++ b/primitives/src/script/mod.rs
@@ -30,15 +30,9 @@ use crate::prelude::{Borrow, BorrowMut, Box, Cow, ToOwned, Vec};
pub use self::{
borrowed::GenericScript,
owned::GenericScriptBuf,
- tag::{Tag, RedeemScriptTag, ScriptPubKeyTag, ScriptSigTag, TapScriptTag, Whatever, WitnessScriptTag},
+ tag::{Tag, RedeemScriptTag, ScriptPubKeyTag, ScriptSigTag, TapScriptTag, WitnessScriptTag},
};
-/// Placeholder doc (will be replaced in later commit)
-pub type Script = GenericScript<Whatever>;
-
-/// Placeholder doc (will be replaced in later commit)
-pub type ScriptBuf = GenericScriptBuf<Whatever>;
-
/// A P2SH redeem script.
pub type RedeemScriptBuf = GenericScriptBuf<RedeemScriptTag>;
@@ -684,6 +678,10 @@ mod tests {
use super::*;
+ // All tests should compile and pass no matter which script type you put here.
+ type Script = ScriptSig;
+ type ScriptBuf = ScriptSigBuf;
+
#[test]
fn scriptbuf_from_vec_u8() {
let vec = vec![0x51, 0x52, 0x53];
diff --git a/primitives/src/script/owned.rs b/primitives/src/script/owned.rs
index 769535bb..daa7aeb3 100644
--- a/primitives/src/script/owned.rs
+++ b/primitives/src/script/owned.rs
@@ -154,11 +154,12 @@ impl<'a, T> Arbitrary<'a> for GenericScriptBuf<T> {
#[cfg(test)]
mod tests {
+ // All tests should compile and pass no matter which script type you put here.
+ type ScriptBuf = super::super::ScriptSigBuf;
+
#[cfg(feature = "alloc")]
use alloc::vec;
- use super::super::ScriptBuf;
-
#[test]
fn script_buf_from_bytes() {
let bytes = vec![1, 2, 3];
diff --git a/primitives/src/script/tag.rs b/primitives/src/script/tag.rs
index 34081064..d5d5162b 100644
--- a/primitives/src/script/tag.rs
+++ b/primitives/src/script/tag.rs
@@ -8,12 +8,6 @@
/// Sealed trait representing a type of script.
pub trait Tag {}
-/// Placeholder tag.
-#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
-pub enum Whatever {}
-
-impl Tag for Whatever {}
-
/// A P2SH redeem script.
#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub enum RedeemScriptTag {}
diff --git a/primitives/tests/api.rs b/primitives/tests/api.rs
index f0581dc7..afecb1d1 100644
--- a/primitives/tests/api.rs
+++ b/primitives/tests/api.rs
@@ -18,9 +18,8 @@ use bitcoin_primitives::block::{Checked, Unchecked};
use bitcoin_primitives::script::{self, ScriptHash, WScriptHash};
use bitcoin_primitives::{
absolute, block, merkle_tree, pow, relative, transaction, witness, OutPoint, RedeemScript,
- RedeemScriptBuf, Script, ScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf,
- Sequence, TapScript, TapScriptBuf, Transaction, TxIn, TxOut, Txid, Witness, WitnessScript,
- WitnessScriptBuf, Wtxid,
+ RedeemScriptBuf, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf, Sequence, TapScript,
+ TapScriptBuf, Transaction, TxIn, TxOut, Txid, Witness, WitnessScript, WitnessScriptBuf, Wtxid,
};
use hashes::sha256t;
@@ -45,7 +44,6 @@ struct Structs<'a> {
g: merkle_tree::TxMerkleNode,
h: merkle_tree::WitnessMerkleNode,
i: pow::CompactTarget,
- j: &'a Script,
j1: &'a RedeemScript,
j2: &'a ScriptPubKey,
j3: &'a ScriptSig,
@@ -53,7 +51,6 @@ struct Structs<'a> {
j5: &'a WitnessScript,
k: ScriptHash,
l: WScriptHash,
- m: ScriptBuf,
m1: RedeemScriptBuf,
m2: ScriptPubKeyBuf,
m3: ScriptSigBuf,
@@ -71,7 +68,6 @@ struct Structs<'a> {
// w: witness::Iter<'a>,
}
-static SCRIPT: ScriptBuf = ScriptBuf::new();
static REDEEM_SCRIPT: RedeemScriptBuf = RedeemScriptBuf::new();
static SCRIPT_SIG: ScriptSigBuf = ScriptSigBuf::new();
static SCRIPT_PUB_KEY: ScriptPubKeyBuf = ScriptPubKeyBuf::new();
@@ -95,7 +91,6 @@ struct CommonTraits {
// j: &'a Script,
k: ScriptHash,
l: WScriptHash,
- m: ScriptBuf,
m1: RedeemScriptBuf,
m2: ScriptPubKeyBuf,
m3: ScriptSigBuf,
@@ -128,7 +123,6 @@ struct Clone<'a> {
// j: &'a Script,
k: ScriptHash,
l: WScriptHash,
- m: ScriptBuf,
m1: RedeemScriptBuf,
m2: ScriptPubKeyBuf,
m3: ScriptSigBuf,
@@ -162,7 +156,6 @@ struct Ord {
// j: &'a Script, // Doesn't implement `Clone`.
k: ScriptHash,
l: WScriptHash,
- m: ScriptBuf,
m1: RedeemScriptBuf,
m2: ScriptPubKeyBuf,
m3: ScriptSigBuf,
@@ -184,13 +177,11 @@ struct Ord {
#[derive(Default, Debug, PartialEq, Eq)] // C-COMMON-TRAITS: `Default` (others just so we can test).
struct Default {
a: block::Version,
- b: &'static Script,
b1: &'static RedeemScript,
b2: &'static ScriptPubKey,
b3: &'static ScriptSig,
b4: &'static TapScript,
b5: &'static WitnessScript,
- c: ScriptBuf,
c1: RedeemScriptBuf,
c2: ScriptPubKeyBuf,
c3: ScriptSigBuf,
@@ -250,10 +241,9 @@ fn api_can_use_modules_from_crate_root() {
#[test]
fn api_can_use_types_from_crate_root() {
use bitcoin_primitives::{
- Block, BlockHash, BlockHeader, BlockVersion, CompactTarget, OutPoint, Script, ScriptBuf,
- ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf, Sequence, Transaction,
- TransactionVersion, TxIn, TxMerkleNode, TxOut, Txid, Witness, WitnessCommitment,
- WitnessMerkleNode, Wtxid,
+ Block, BlockHash, BlockHeader, BlockVersion, CompactTarget, OutPoint, ScriptPubKey,
+ ScriptPubKeyBuf, ScriptSig, ScriptSigBuf, Sequence, Transaction, TransactionVersion, TxIn,
+ TxMerkleNode, TxOut, Txid, Witness, WitnessCommitment, WitnessMerkleNode, Wtxid,
};
}
@@ -269,8 +259,8 @@ fn api_can_use_all_types_from_module_locktime() {
#[test]
fn api_can_use_all_types_from_module_script() {
use bitcoin_primitives::script::{
- RedeemScriptSizeError, Script, ScriptBuf, ScriptHash, ScriptPubKey, ScriptPubKeyBuf,
- ScriptSig, ScriptSigBuf, WScriptHash, WitnessScriptSizeError,
+ RedeemScriptSizeError, ScriptHash, ScriptPubKey, ScriptPubKeyBuf, ScriptSig, ScriptSigBuf,
+ WScriptHash, WitnessScriptSizeError,
};
}
@@ -308,7 +298,6 @@ fn api_all_non_error_types_have_non_empty_debug() {
merkle_tree::TxMerkleNode::from_byte_array(BYTES);
merkle_tree::WitnessMerkleNode::from_byte_array(BYTES);
pow::CompactTarget::from_consensus(0x1d00_ffff);
- SCRIPT.as_script();
REDEEM_SCRIPT.as_script();
SCRIPT_SIG.as_script();
SCRIPT_PUB_KEY.as_script();
@@ -316,7 +305,6 @@ fn api_all_non_error_types_have_non_empty_debug() {
WITNESS_SCRIPT.as_script();
ScriptHash::from_script(&REDEEM_SCRIPT).unwrap();
WScriptHash::from_script(&WITNESS_SCRIPT).unwrap();
- SCRIPT.clone();
REDEEM_SCRIPT.clone();
SCRIPT_SIG.clone();
SCRIPT_PUB_KEY.clone();
@@ -356,13 +344,11 @@ fn regression_default() {
let got: Default = Default::default();
let want = Default {
a: block::Version::NO_SOFT_FORK_SIGNALLING,
- b: Script::from_bytes(&[]),
b1: RedeemScript::from_bytes(&[]),
b2: ScriptPubKey::from_bytes(&[]),
b3: ScriptSig::from_bytes(&[]),
b4: TapScript::from_bytes(&[]),
b5: WitnessScript::from_bytes(&[]),
- c: ScriptBuf::from_bytes(Vec::new()),
c1: RedeemScriptBuf::from_bytes(Vec::new()),
c2: ScriptPubKeyBuf::from_bytes(Vec::new()),
c3: ScriptSigBuf::from_bytes(Vec::new()),
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.