The difficulty is with the push_slice API in latest variations of rust-bitcoin (≥ 0.30).
ScriptBuf::builder().push_slice (and Builder::push_slice) now requires T: AsRef for security—it enforces Bitcoin’s push-data limits at compile time the place doable and prevents outsized pushes. &[u8] (what redeem_script.as_bytes() returns) not satisfies that sure immediately.
Repair
Convert the redeem script bytes to PushBytesBuf (the owned model) utilizing TryFrom:
use bitcoin::script::{Builder, PushBytesBuf, ScriptBuf}; // or the total path: bitcoin::blockdata::script::*
// ... your redeem_script development (this half is already right) ...
let redeem_script = Script::builder()
.push_opcode(OP_PUSHNUM_1)
.push_key(&pubkey1)
.push_opcode(OP_PUSHNUM_1)
.push_opcode(OP_CHECKMULTISIG)
.into_script();
// Construct the scriptSig for the P2SH spend (1-of-1 multisig redeem script)
let mut script_sig = Builder::new()
.push_opcode(OP_0) // dummy 0 for CHECKMULTISIG
.push_slice(&signature1.serialize()) // signature (already a legitimate push)
.push_slice(
PushBytesBuf::try_from(redeem_script.as_bytes())
.count on("redeem script too giant to push") // won't ever fail for regular multisig
)
.into_script();
tx.enter[0].script_sig = script_sig; // or nevertheless you are attaching it
Why this works
PushBytesBuf::try_from(&[u8])(or&PushBytes::try_from(&[u8])should you want a reference) validates the size and offers you a kind that implementsAsRef.- For a 1-of-1 P2MS redeem script the dimensions is tiny (~36 bytes), so the
count on/unwrapis protected. In manufacturing you possibly can deal with thePushBytesErrorif you wish to be additional defensive. - The ensuing
script_sigwill likely be a legitimate P2SH unlocking script:<0>(all pushes).
Different one-liners (should you want)
.push_slice(PushBytesBuf::from(redeem_script.as_bytes())) // panics on >4 GiB (unimaginable)
or
.push_slice(redeem_script.as_bytes().try_into().unwrap())
(utilizing the TryInto impl that PushBytesBuf supplies).
That is the idiomatic approach in present rust-bitcoin. Your redeem script builder and general P2SH stream look right—solely the ultimate push wanted the kind adjustment.

