|
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.
|