Пример #1
0
        /// <summary>
        /// The create a pay to pub key hash transaction.
        /// </summary>
        public Transaction CreatePubKeyHashTransaction(CoinParameters parameters, CreateRawTransaction rawTransaction)
        {
            var transaction = new Transaction
            {
                Version   = parameters.TransactionVersion,
                Locktime  = 0,
                Timestamp = (int)DateTime.UtcNow.UnixTimeStampFromDateTime()
            };

            // create the inputs
            transaction.Inputs = rawTransaction.Inputs
                                 .Select(input => new TransactionInput
            {
                Outpoint = new TransactionOutPoint
                {
                    Hash  = input.TransactionId,
                    Index = input.Output
                },
                ScriptBytes = Enumerable.Empty <byte>().ToArray(),

                Sequence = 0xffffffff     // uint.MaxValue
            }).ToList();

            // create the output
            transaction.Outputs = rawTransaction.Outputs
                                  .Select((output, index) => new TransactionOutput
            {
                Index       = index,
                Value       = this.Serializer.ValueToNum(output.Value),
                ScriptBytes = ScriptBuilder.CreateOutputScript(Address.Create(parameters, output.Key)).GetProgram()
            }).ToList();

            return(transaction);
        }
Пример #2
0
        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>
        /// Create a transaction spending the given inputs.
        /// Returns hex-encoded raw transaction.
        /// Note that the transaction's inputs are not signed, and
        /// it is not stored in the wallet or transmitted to the network.
        /// </summary>
        /// <param name="rawInputs">The inputs.</param>
        /// <param name="locktime">Raw locktime. Non-0 value also locktime-activates inputs.</param>
        /// <param name="replaceable">Marks this transaction as BIP125-replaceable.
        /// Allows this transaction to be replaced by a transaction with higher fees. If provided, it is an error if explicit sequence numbers are incompatible.</param>
        /// <returns></returns>
        public async Task <string> CreateRawTransaction(RawInputs rawInputs, int locktime = 0, bool replaceable = false)
        {
            CreateRawTransaction createRawTransaction = new CreateRawTransaction()
            {
                RawInputs   = rawInputs,
                Locktime    = locktime,
                Replaceable = replaceable
            };

            string response = await httpRequest.SendReq(MethodName.createrawtransaction, createRawTransaction);

            return(response);
        }
Пример #4
0
        public void Given_an_unsigned_transaction_When_serialized_to_hex_Then_is_valid()
        {
            var param = new CoinParameters {
                CoinTag = "BTC", PublicKeyAddressVersion = 0, PrivateKeyVersion = 128
            };
            var builder = TransactionBuilder.Create(param);

            var create = new CreateRawTransaction()
                         .AddInput("9e779dbc84fe9c4082bc6fff332ddee81a6f56908720f25cb83ea9441cfa801b", 0)
                         .AddOutput("19vrUuKgwKvAhiXfwVBaeHDQo7wMJg4VjD", 0.00010000M)
                         .AddOutput("1KC4ZkESbdjYVfdYWuAkmSscQfD1VEWb32", 0.00030000M);
            var trx      = builder.CreatePubKeyHashTransaction(param, create);
            var unsigned = builder.Serializer.ToHex(trx);

            Assert.AreEqual("01000000011b80fa1c44a93eb85cf2208790566f1ae8de2d33ff6fbc82409cfe84bc9d779e0000000000ffffffff0210270000000000001976a91461f05b61eb47be1d96e417272d3d3d3c346e2e9188ac30750000000000001976a914c789d0b3ec2bee3b2e057e2b759d1bd249095cd888ac00000000", unsigned);
        }
Пример #5
0
        public void Given_an_unsigned_transaction_with_multipul_inputs_When_serialized_to_hex_Then_is_valid()
        {
            var param = new CoinParameters {
                CoinTag = "BTC", PublicKeyAddressVersion = 0, PrivateKeyVersion = 128
            };
            var builder = TransactionBuilder.Create(param);

            var create = new CreateRawTransaction()
                         .AddInput("2a99b070f457c8f2f6cb0f818b951c2038759af7abd98e57aecaf73989cd3474", 1)
                         .AddInput("2a99b070f457c8f2f6cb0f818b951c2038759af7abd98e57aecaf73989cd3474", 0)
                         .AddOutput("19vrUuKgwKvAhiXfwVBaeHDQo7wMJg4VjD", 0.00020000M)
                         .AddOutput("1227pgTWYNsPNVN647NzsceFeXeLt18fTT", 0.00005000M);
            var trx      = builder.CreatePubKeyHashTransaction(param, create);
            var unsigned = builder.Serializer.ToHex(trx);

            Assert.AreEqual("01000000027434cd8939f7caae578ed9abf79a7538201c958b810fcbf6f2c857f470b0992a0100000000ffffffff7434cd8939f7caae578ed9abf79a7538201c958b810fcbf6f2c857f470b0992a0000000000ffffffff02204e0000000000001976a91461f05b61eb47be1d96e417272d3d3d3c346e2e9188ac88130000000000001976a9140b2e3c8cfae581f5fa526070a705e617d3c61be488ac00000000", unsigned);
        }
Пример #6
0
        public void Given_an_unsigned_timestamped_transaction_with_multipul_inputs_When_serialized_to_hex_Then_is_valid()
        {
            var param = new CoinParameters {
                CoinTag = "PPC", PublicKeyAddressVersion = 55, PrivateKeyVersion = 183
            };
            var builder = TransactionBuilder.Create(param);

            var create = new CreateRawTransaction()
                         .AddInput("c41e47d99557b2c25e72ee3c6bacf9796b09791cda5ea654225621701a2bc87d", 1)
                         .AddInput("32b137d72a26681fa4ac1de3cab1cdcf05e0fd592b0a1cd81a3bd35000dfddf4", 1)
                         .AddInput("69a3b97a4207eb7da766b9a29862acae00d3f3e00965d3b31f879abae1a58a50", 0)
                         .AddOutput("PXCfHLaR2RCMnHsYCAtSoyjwBkhaniC9Ty", 1.10000000M)
                         .AddOutput("PXDHGy2j11atyPoqyNZfccwS46gv6K4BkL", 20.82399100M)
                         .AddOutput("PEBAEAM6R7SZkhQmvHa7eBfCNfTCE5CGYT", 1.40000000M)
                         .AddOutput("PFj9YzkCRiihArX46KM9kZappnWa5svFhe", 2.53000000M);
            var trx = builder.CreatePubKeyHashTransaction(param, create);

            trx.Timestamp = 1461838729; // specific to this transaction
            var unsigned = builder.Serializer.ToHex(trx);

            Assert.AreEqual("0100000089e32157037dc82b1a7021562254a65eda1c79096b79f9ac6b3cee725ec2b25795d9471ec40100000000fffffffff4dddf0050d33b1ad81c0a2b59fde005cfcdb1cae31daca41f68262ad737b1320100000000ffffffff508aa5e1ba9a871fb3d36509e0f3d300aeac6298a2b966a77deb07427ab9a3690000000000ffffffff04e0c81000000000001976a914f808ce1d1a2c111581237f65931e8ae56d6cbfd088acb7bf3d01000000001976a914f826d9dfd3b0dfdacf09ea6cc7d48c9569ace1b288acc05c1500000000001976a9143d45ff4529a9326804aa1fe2800e55418c00604c88acd09a2600000000001976a9144e4adeb9f14731d0370b10cff700e12c36571b7e88ac00000000", unsigned);
        }
Пример #7
0
        public void Given_a_signed_timestamped_transaction_with_multipul_inputs_When_serialized_to_hex_Then_is_valid()
        {
            var param = new CoinParameters {
                CoinTag = "PPC", PublicKeyAddressVersion = 55, PrivateKeyVersion = 183
            };
            var builder = TransactionBuilder.Create(param);

            var key1 = new BitcoinPrivateKey(param, "79rzXNEtHfWJQxPUHJpMLnuuLKD9NnJAFeYVYtus2JjyXcKkCQ1");
            var key2 = new BitcoinPrivateKey(param, "7Ab1bFhaW5oC1LN7AgaHKr9ZZGumLSxThq8qMP3iP1oJYwAW2Kq");

            var create = new CreateRawTransaction()
                         .AddInput("c41e47d99557b2c25e72ee3c6bacf9796b09791cda5ea654225621701a2bc87d", 1)
                         .AddInput("32b137d72a26681fa4ac1de3cab1cdcf05e0fd592b0a1cd81a3bd35000dfddf4", 1)
                         .AddInput("69a3b97a4207eb7da766b9a29862acae00d3f3e00965d3b31f879abae1a58a50", 0)
                         .AddOutput("PXCfHLaR2RCMnHsYCAtSoyjwBkhaniC9Ty", 1.10000000M)
                         .AddOutput("PXDHGy2j11atyPoqyNZfccwS46gv6K4BkL", 20.82399100M)
                         .AddOutput("PEBAEAM6R7SZkhQmvHa7eBfCNfTCE5CGYT", 1.40000000M)
                         .AddOutput("PFj9YzkCRiihArX46KM9kZappnWa5svFhe", 2.53000000M);
            var trx = builder.CreatePubKeyHashTransaction(param, create);

            trx.Timestamp = 1461838729; // specific to this transaction
            var unsigned = builder.Serializer.ToHex(trx);

            var sign = builder.CreateSignature(unsigned)
                       .AddKey(key1.ToWifKey(param))
                       .AddKey(key2.ToWifKey(param))
                       .AddInput("c41e47d99557b2c25e72ee3c6bacf9796b09791cda5ea654225621701a2bc87d", 1,
                                 "76a914f826d9dfd3b0dfdacf09ea6cc7d48c9569ace1b288ac")
                       .AddInput("32b137d72a26681fa4ac1de3cab1cdcf05e0fd592b0a1cd81a3bd35000dfddf4", 1,
                                 "76a9144e4adeb9f14731d0370b10cff700e12c36571b7e88ac")
                       .AddInput("69a3b97a4207eb7da766b9a29862acae00d3f3e00965d3b31f879abae1a58a50", 0,
                                 "76a9144e4adeb9f14731d0370b10cff700e12c36571b7e88ac");

            trx = builder.Sign(param, sign);
            var signed = builder.Serializer.ToHex(trx);

            Assert.AreEqual("0100000089e32157037dc82b1a7021562254a65eda1c79096b79f9ac6b3cee725ec2b25795d9471ec4010000008a47304402200cf6263646697a3e90114ead2d461c56a26cb22c3758c1aa3bdd4d1e2d8461ba022048d1c17cc00ab21177a14bcac61fcc990969e1b855c1cdc9ede503af56d924410141042cfdbfaee53942b2c8d9c67631e099e604e6e4e01594394942f33fa237eca310ac0aa79189d96c79e9e764826243614ebdfd400680421dff54314d9eabb87daafffffffff4dddf0050d33b1ad81c0a2b59fde005cfcdb1cae31daca41f68262ad737b132010000008b483045022100c867962f5c584897e5231e45d06065e4bc9dbf26ea4bcbc6de3ceebe87791ade02205c8b016d84a38a25275d89da8f6435016313e1d108f15638609e791570fbd8a10141040c65817203cc55de4c2ab32413497fd9e917a5c1d4711e7772a7277f491d3dc50879852e697a2551547c5d8e28a0a97280e8e63d4590a9c722ce2a84c6d71f3affffffff508aa5e1ba9a871fb3d36509e0f3d300aeac6298a2b966a77deb07427ab9a369000000008b4830450221008d55d7eb528622f4d803c0756f11e49fd6b3206789d6603e9f3221a3473cda18022002663afafc52cc4c3a5bc9c16401d13a853f2e0b4b258c923ec3c18e85aeab100141040c65817203cc55de4c2ab32413497fd9e917a5c1d4711e7772a7277f491d3dc50879852e697a2551547c5d8e28a0a97280e8e63d4590a9c722ce2a84c6d71f3affffffff04e0c81000000000001976a914f808ce1d1a2c111581237f65931e8ae56d6cbfd088acb7bf3d01000000001976a914f826d9dfd3b0dfdacf09ea6cc7d48c9569ace1b288acc05c1500000000001976a9143d45ff4529a9326804aa1fe2800e55418c00604c88acd09a2600000000001976a9144e4adeb9f14731d0370b10cff700e12c36571b7e88ac00000000", signed);
        }
Пример #8
0
 /// <summary>
 /// Version 0.7: Creates a raw transaction spending given inputs.
 /// </summary>
 /// <param name="rawTransaction">The raw transaction details.</param>
 /// <returns>The raw transaction hex. The transaction is not signed yet.</returns>
 public string CreateRawTransaction(CreateRawTransaction rawTransaction)
 {
     return(MakeRequest <string>("createrawtransaction", rawTransaction.Inputs, rawTransaction.Outputs));
 }
Пример #9
0
        public override Transaction CreatePubKeyHashTransaction(CoinParameters parameters, CreateRawTransaction rawTransaction)
        {
            var transaction = base.CreatePubKeyHashTransaction(parameters, rawTransaction);

            var changePointer = transaction.Inputs.SingleOrDefault(p => p.Outpoint.Index == -1);

            if (changePointer == null)
            {
                return(transaction);
            }

            var rawChangeOutput         = rawTransaction.Outputs.Single(p => p.Key == changePointer.Outpoint.Hash);
            var changeOutputScriptBytes = ScriptBuilder
                                          .CreateOutputScript(Address.Create(parameters, rawChangeOutput.Key)).GetProgram();

            changePointer.Outpoint.Index =
                transaction.Outputs.Single(p => p.ScriptBytes == changeOutputScriptBytes).Index;
            changePointer.Outpoint.Hash = "0";

            return(transaction);
        }
Пример #10
0
 /// <inheritdoc />
 public async Task <string> CreateRawTransactionAsync(CreateRawTransaction rawTransaction)
 {
     return(await this.CallAsync <string>("createrawtransaction", rawTransaction.Inputs, rawTransaction.Outputs));
 }