After creating a new NBitcoin transaction (with a single pay-to-script hash input and multiple outputs), is there any way to calculate the transaction signature and manually put it in the inputs[0].ScriptSig, along with other parameters used by the script?

A related issue is whether (and how) non-standard scripts can be used in P2SH transactions.

1 Answer 1


It seems the first question can be accomplished with something like:

//after creating newtx and specifying input and outputs  
newtx.Inputs[0].ScriptSig = privatekey.ScriptPubKey;  
newtx.Sign(privatekey, false);  //puts signature and pubkey in ScriptSig  
//use those plus additional parameters in script  
newtx.Inputs[0].ScriptSig = new Script(  
   newtx.Inputs[0].ScriptSig + " " +  
   //leave signature and pubkey as first parameters pushed onto stack  
   //then add additional parameter (type PubKey)  
   Op.GetPushOp(additionalParameter.ToBytes()) + " " +  
   //then add script whose hash was in original P2SH trans  

The scriptIn is the same as the usual P2KH script preceded by a check for the hash of another parameter

scriptIn = new Script(  
        "OP_HASH160 "  
        + Op.GetPushOp(additionalParameter.Hash.ToBytes())  
        + " OP_EQUALVERIFY"  
        + " OP_DUP"  
        + " OP_HASH160 "  
        + Op.GetPushOp(pubkeyhash.ToBytes())  
        + " OP_EQUALVERIFY"  
        + " OP_CHECKSIG"  

But when the transaction is sent it gets the following error:
16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation)

Not sure why it's failing.

  • the signature you are providing in newtx.Inputs[0].ScriptSig might not be valid for the script in scriptIn.
    – Mani T
    Dec 19, 2023 at 6:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.