/// <summary> /// Sign a specific coin with the given secret /// </summary> /// <param name="key">Private keys</param> /// <param name="coins">Coins to sign</param> public void Sign(Key[] keys, params ICoin[] coins) { TransactionBuilder builder = new TransactionBuilder(); builder.AddKeys(keys); builder.AddCoins(coins); builder.SignTransactionInPlace(this); }
/// <summary> /// Sign the transaction with a private key /// <para>ScriptSigs should be filled with either previous scriptPubKeys or redeem script (for P2SH)</para> /// <para>For more complex scenario, use TransactionBuilder</para> /// </summary> /// <param name="secret"></param> public void Sign(Key key, bool assumeP2SH) { TransactionBuilder builder = new TransactionBuilder(); builder.AddKeys(key); for (int i = 0; i < Inputs.Count; i++) { var txin = Inputs[i]; if (Script.IsNullOrEmpty(txin.ScriptSig)) { throw new InvalidOperationException("ScriptSigs should be filled with either previous scriptPubKeys or redeem script (for P2SH)"); } if (assumeP2SH) { var p2shSig = PayToScriptHashTemplate.Instance.ExtractScriptSigParameters(txin.ScriptSig); if (p2shSig == null) { builder.AddCoins(new ScriptCoin(txin.PrevOut, new TxOut() { ScriptPubKey = txin.ScriptSig.PaymentScript, }, txin.ScriptSig)); } else { builder.AddCoins(new ScriptCoin(txin.PrevOut, new TxOut() { ScriptPubKey = p2shSig.RedeemScript.PaymentScript }, p2shSig.RedeemScript)); } } else { builder.AddCoins(new Coin(txin.PrevOut, new TxOut() { ScriptPubKey = txin.ScriptSig })); } } builder.SignTransactionInPlace(this); }