コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: TestTransaction.cs プロジェクト: wtcoin/dotblock
        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);
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }