/// <summary> /// Create the signing bag with matching scripts and private keys /// Then sign the inputs. /// </summary> public Transaction Sign(CoinParameters parameters, SignRawTransaction rawTransactions) { var transaction = this.Serializer.FromHex(rawTransactions.RawTransactionHex); var bag = new TransactionSigner.SignerBag { Items = new List <TransactionSigner.RedeemScript>() }; var keys = rawTransactions.PrivateKeys.Select(s => new BitcoinPrivateKey(parameters, s)).ToList(); // create a linked object between the pub key hash and its outpoint var inputs = rawTransactions.Inputs .Select(input => new { Input = input, PubKeyHash = new Script.Script(CryptoUtil.ConvertHex(input.ScriptPubKey)).TryGetPubKeyHash() }) .Where(p => p.PubKeyHash.IsNotNull()).ToList(); // compare private keys with redeem script pub key hash and add to the bag foreach (var key in keys) { // there should be at least one redeem script per private key var inserts = inputs.Where(f => f.PubKeyHash.SequenceEqual(key.Hash160)).ToList(); Thrower.If(inserts.None()).Throw <TransactionException>("Private key had no matching redeem script '{0}'".StringFormat(key.PublicKey.ToAddress(parameters).ToString())); inserts.ForEach(insert => bag.Add(insert.Input.TransactionId, insert.Input.Output, insert.Input.ScriptPubKey, key)); } this.Signer.SignInputs(transaction, bag); return(transaction); }
public void Given_a_signed_transaction_When_serialized_to_hex_Then_is_valid() { var param = new CoinParameters { CoinTag = "BTC", PublicKeyAddressVersion = 0, PrivateKeyVersion = 128 }; var builder = TransactionBuilder.Create(param); var prv = "KxSFAwxgg1kh2CKqmVGDJfQBKypAabiJ7UgDbJcvnRQ3ccbCm8oz"; var key = new BitcoinPrivateKey(param, prv); var destination = Address.Create(param, "19vrUuKgwKvAhiXfwVBaeHDQo7wMJg4VjD"); var change = Address.Create(param, "1KC4ZkESbdjYVfdYWuAkmSscQfD1VEWb32"); var create = new CreateRawTransaction() .AddInput("9e779dbc84fe9c4082bc6fff332ddee81a6f56908720f25cb83ea9441cfa801b", 0) .AddOutput(destination.ToString(), 0.00010000M) .AddOutput(change.ToString(), 0.00030000M); var trx = builder.CreatePubKeyHashTransaction(param, create); var unsigned = builder.Serializer.ToHex(trx); var sign = new SignRawTransaction(unsigned) .AddKey(key.ToWifKey(param)) .AddInput("9e779dbc84fe9c4082bc6fff332ddee81a6f56908720f25cb83ea9441cfa801b", 0, "76a914c789d0b3ec2bee3b2e057e2b759d1bd249095cd888ac"); trx = builder.Sign(param, sign); var signed = builder.Serializer.ToHex(trx); Assert.AreEqual("01000000011b80fa1c44a93eb85cf2208790566f1ae8de2d33ff6fbc82409cfe84bc9d779e000000006b483045022100911e4ffada078f43c792b797b0d864a519cb088083b89003810aaf28325a6ecd02207f2e9790511710ae93309f4b3b30c0379b8917b6a0fb1cdcc9c711fc6f1831ef01210396c9b0b5664c28c4667e9931a9665a7d99222794b3a1d514e3dd198c2cc688e0ffffffff0210270000000000001976a91461f05b61eb47be1d96e417272d3d3d3c346e2e9188ac30750000000000001976a914c789d0b3ec2bee3b2e057e2b759d1bd249095cd888ac00000000", signed); }
/// <summary> /// Version 0.7: Adds signatures to a raw transaction and returns the resulting raw transaction. /// </summary> /// <param name="rawTransaction">The raw transaction to sign.</param> /// <returns>The signed transaction.</returns> public SignedRawTransaction SignRawTransaction(SignRawTransaction rawTransaction) { var hex = rawTransaction.RawTransactionHex; var inputs = rawTransaction.Inputs.Any() ? rawTransaction.Inputs : null; var privateKeys = rawTransaction.PrivateKeys.Any() ? rawTransaction.PrivateKeys : null; return(MakeRequest <SignedRawTransaction>("signrawtransaction", hex, inputs, privateKeys)); }
/// <inheritdoc /> public async Task <SignedRawTransaction> SignRawTransactionAsync(SignRawTransaction rawTransaction) { var hex = rawTransaction.RawTransactionHex; var inputs = rawTransaction.Inputs.Any() ? rawTransaction.Inputs : null; var privateKeys = rawTransaction.PrivateKeys.Any() ? rawTransaction.PrivateKeys : null; var res = await this.CallAsync <SignedRawTransaction>("signrawtransaction", hex, inputs, privateKeys); return(res); }
/// <inheritdoc /> public async Task <SignedRawTransaction> SignRawTransactionAsync(SignRawTransaction rawTransaction) { string hex = rawTransaction.RawTransactionHex; List <SignRawTransactionInput> inputs = rawTransaction.Inputs.Any() ? rawTransaction.Inputs : null; List <string> privateKeys = rawTransaction.PrivateKeys.Any() ? rawTransaction.PrivateKeys : null; SignedRawTransaction res = await CallAsync <SignedRawTransaction>("signrawtransaction", hex, inputs, privateKeys); return(res); }