The difficulty is with the push_slice API in current 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 certain instantly.
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 massive 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 the event you want a reference) validates the size and provides 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’ll be able to deal with thePushBytesErrorif you wish to be additional defensive. - The ensuing
script_sigcan be a legitimate P2SH unlocking script:<0>(all pushes).
Different one-liners (in the event you want)
.push_slice(PushBytesBuf::from(redeem_script.as_bytes())) // panics on >4 GiB (inconceivable)
or
.push_slice(redeem_script.as_bytes().try_into().unwrap())
(utilizing the TryInto impl that PushBytesBuf supplies).
That is the idiomatic method in present rust-bitcoin. Your redeem script builder and total P2SH circulate look right—solely the ultimate push wanted the sort adjustment.
