public byte[] TxSignature(byte[] scriptPubKey, Transaction tx, int inputIndex, byte hashType) { ///TODO Debug.Assert(inputIndex < tx.Inputs.Length); // Blank out other inputs' signatures var empty = ImmutableArray.Create<byte>(); var newInputs = ImmutableArray.CreateBuilder<TxInput>(tx.Inputs.Length); for (var i = 0; i < tx.Inputs.Length; i++) { var oldInput = tx.Inputs[i]; var newInput = oldInput.With(scriptSignature: i == inputIndex ? scriptPubKey.ToImmutableArray() : empty); newInputs.Add(newInput); } //// Blank out some of the outputs //if ((hashType & 0x1F) == (int)ScriptHashType.SIGHASH_NONE) //{ // //TODO // Debug.Assert(false); // // Wildcard payee // // Let the others update at will //} //else if ((hashType & 0x1F) == (int)ScriptHashType.SIGHASH_SINGLE) //{ // //TODO // Debug.Assert(false); // // Only lock-in the txout payee at same index as txin // // Let the others update at will //} //// Blank out other inputs completely, not recommended for open transactions //if ((hashType & 0x80) == (int)ScriptHashType.SIGHASH_ANYONECANPAY) //{ // //TODO // Debug.Assert(false); //} // create simplified transaction var newTx = tx.With(Inputs: newInputs.ToImmutable()); // return wire-encoded simplified transaction with the 4-byte hashType tacked onto the end using (var stream = new MemoryStream()) using (var writer = new BinaryWriter(stream)) { writer.WriteBytes(DataEncoder.EncodeTransaction(newTx)); writer.WriteUInt32(hashType); return stream.ToArray(); } }
public Transaction CreateSpendTransaction(Transaction prevTx, int prevInputIndex, byte hashType, UInt64 value, ECPrivateKeyParameters fromPrivateKey, ECPublicKeyParameters fromPublicKey, ECPublicKeyParameters toPublicKey) { var tx = new Transaction ( version: 1, inputs: ImmutableArray.Create ( new TxInput ( previousTxOutputKey: new TxOutputKey ( txHash: prevTx.Hash, txOutputIndex: (UInt32)prevInputIndex ), scriptSignature: ImmutableArray.Create<byte>(), sequence: 0 ) ), outputs: ImmutableArray.Create ( new TxOutput ( value: value, scriptPublicKey: CreatePublicKeyScript(toPublicKey).ToImmutableArray() ) ), lockTime: 0 ); // sign the transaction var scriptSignature = CreatePrivateKeyScript(tx, 0, hashType, fromPrivateKey, fromPublicKey).ToImmutableArray(); // add the signature script to the transaction tx = tx.With(Inputs: ImmutableArray.Create(tx.Inputs[0].With(scriptSignature: scriptSignature))); return tx; }