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 potential and prevents outsized pushes. &[u8] (what redeem_script.as_bytes() returns) now not satisfies that certain 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 appropriate) ...
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 sound 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 nonetheless you are attaching it
Why this works
PushBytesBuf::try_from(&[u8])(or&PushBytes::try_from(&[u8])in case you favor a reference) validates the size and offers you a sort that implementsAsRef.- For a 1-of-1 P2MS redeem script the dimensions is tiny (~36 bytes), so the
count on/unwrapis secure. In manufacturing you may deal with thePushBytesErrorif you wish to be additional defensive. - The ensuing
script_sigwill likely be a sound P2SH unlocking script:<0>(all pushes).
Different one-liners (in case you favor)
.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 manner in present rust-bitcoin. Your redeem script builder and general P2SH move look appropriate—solely the ultimate push wanted the sort adjustment.
