Bitcoin Forum
May 11, 2024, 01:09:44 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
  Home Help Search Login Register More  
  Show Posts
Pages: [1]
1  Bitcoin / Development & Technical Discussion / Re: How to create transaction using NBitcoin in C#. on: September 04, 2017, 05:06:36 PM
Hi,
My units are same.
I think the transaction which I created is not correct, there is very limited help in this topic specifically in C#.
Do you have such kind of precooked code that will be more helpful.

Thanks Smiley
2  Bitcoin / Development & Technical Discussion / How to create transaction using NBitcoin in C#. on: September 04, 2017, 02:36:27 PM
Hi,
I am creating an online wallet & I am using C# (WebAPI) as my backed scripting language.
I am also using NBitcoin & QBitninja NuGet packages developed by NicolasDorier.
Some how I created a verified transaction but network is not able to broadcast that transaction.

Command:- bitcoin-cli signrawtransaction 010000000001012be
973e52a7f8efbc91ef9c397a81df05c047e8138c76920fd9225df19aaea360000000000ffffffff 0
2a4c0e400000000001976a9140ecd86fcda32df67e7cbd989eddd38d00bb2504f88ac40420f0000 0
000001976a9145da61fbc2b8de68bbe1b666b4e84bec9d2e3edae88ac02473044022061199488e5 a
5fe9c3db4678eadc08b92de1d0881dd13ac3af5b39b15543ae4c202205ff7aeead9ba8c3f4bc89a c
0614802ae19f781be8bfa8c74fb01bd50b96c7cf4012103e970de664249bb560ec1501ea8a98571 d
a983c899ee02888d6e41aaab2ff56b300000000



 Err. :-  
{
  "hex": "010000000001012be973e52a7f8efbc91ef9c397a81df05c047e8138c76920fd9225df
19aaea360000000000ffffffff02a4c0e400000000001976a9140ecd86fcda32df67e7cbd989edd d
38d00bb2504f88ac40420f00000000001976a9145da61fbc2b8de68bbe1b666b4e84bec9d2e3eda e
88ac02473044022061199488e5a5fe9c3db4678eadc08b92de1d0881dd13ac3af5b39b15543ae4c 2
02205ff7aeead9ba8c3f4bc89ac0614802ae19f781be8bfa8c74fb01bd50b96c7cf4012103e970d e
664249bb560ec1501ea8a98571da983c899ee02888d6e41aaab2ff56b300000000",
  "complete": false,
  "errors": [
    {
      "txid": "36eaaa19df2592fd2069c738817e045cf01da897c3f91ec9fb8e7f2ae573e92b"
,
      "vout": 0,
      "scriptSig": "",
      "sequence": 4294967295,
      "error": "Input not found or already spent"
    }
  ]
}


Demo Code :-

public string SendBitCoins(int userId, int walletID, string destinationAddress, decimal amount)
        {
            try
            {
                var masterKey = new GetMasterWallet(userId);
                var privateKey = masterKey.PrivateKey;
                Money fee = Money.Satoshis(8476);
                Money transactionAmount = Money.Satoshis(Convert.ToInt64(amount * 100000000));
                var transaction = CreateTransaction(userId, walletID, privateKey.PubKey,transactionAmount,fee, masterKey);
                var transactionhex = BuildTransaction(transaction,privateKey, destinationAddress, amount, fee);
                return transactionhex;
            }
            catch (Exception)
            {

                throw;
            }
        }


public Transaction CreateTransaction(int userID,int userWalletID, PubKey sourcePublicKey, Money amount, Money fee, ExtKey masterwallet)
        {
            try
            {
                var init = new Transaction();
                if (userWalletID != 0)
                {
                    var client = new QBitNinjaClient(Network.TestNet);
                    var totalAmount = amount + fee;
                    long transactionAmount = 0;
                    var userRequestAddress = _unitOfWork.UserRequestAddressRepository
                        .GetManyQueryable(x => x.UserID == userID &&
                        x.UserWalletID == userWalletID && x.Amount > 0 && !x.IsActive);
                    var userPrivateWalletKey = new UserWalletChainService(_unitOfWork).GetUserWalletKey(userWalletID, masterwallet);
                    var userPublicWalletKey = userPrivateWalletKey.Neuter();
                    

                    userRequestAddress.ToList().ForEach(x => {
                        var extPubKey = userPublicWalletKey.Derive(
                                        new KeyPath(Convert.ToString(x.ChainDerivationKey)));
                        //var extPrivateKey = userPrivateWalletKey.Derive(
                        //                new KeyPath(Convert.ToString(x.ChainDerivationKey)));
                        client.GetBalance(extPubKey.PubKey.Hash.GetAddress(Network.TestNet), true)
                        .Result.Operations.ToList().ForEach(z => {
                            z.ReceivedCoins.ForEach(l => {
                                if (totalAmount.Satoshi > transactionAmount)
                                    //init.Outputs.Add(new TxOut(Money.Coins(1m), GetP2WPKH(sourcePublicKey)));
                                    init.Outputs.Add(new TxOut(Money.Coins(Convert.ToDecimal((l.Amount as Money).Satoshi) / 100000000), GetP2WPKH(sourcePublicKey)));
                                //init.Outputs.Add(new TxOut(Money.Coins(Convert.ToDecimal((l.Amount as Money).Satoshi) / 100000000), GetP2WPKH(userPrivateWalletKey.PrivateKey.PubKey)));

                                transactionAmount += (l.Amount as Money).Satoshi;
                            });
                        });
                    });
                }
                //init.Outputs.Add(new TxOut(Money.Coins(1m), GetP2WPKH(sourcePublicKey)));
                return init;
            }
            catch (Exception)
            {

                throw;
            }
        }


public string BuildTransaction(Transaction transaction, Key sourcePriveatKey, string destinationAddress,decimal amount,Money fee)
        {
            TransactionBuilder builder = null;
            try
            {
                var destination = BitcoinAddress.Create(destinationAddress).ScriptPubKey;
                

                Coin[] coins = transaction.Outputs.AsCoins().ToArray();
                
                builder = new TransactionBuilder();
                Transaction tx = builder
                    .AddCoins(coins[0])
                    .AddKeys(sourcePriveatKey)
                    .Send(destination, Money.Coins(amount))
                    .SetChange(sourcePriveatKey)
                    .SendFees(fee)
                    .BuildTransaction(sign: true);
                if (builder.Verify(tx))
                    return tx.ToHex();
                else
                    return "";
            }
            catch (Exception)
            {

                throw;
            }
        }


please give me some suggestion is anybody knows what I am doing wrong.
Pages: [1]
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!