Я использую библиотеку NBitcoin для программирования простой программы передачи биткойнов на C#.
Программа возьмет монеты из идентификатора транзакции, а затем переведет их на адрес целевого кошелька.
Код этой программы можно найти в книге «Программирование блокчейна на C# — (Community Edition)» на страницах с 37 по 43.
Я включил код С# в эту тему, как показано ниже.
Я создал тестовый кошелек TestNet и использую адрес кошелька для получения биткойнов программы.
Тестовый кошелек TestNet можно создать по адресу -
http://testnetwallet.com/кошелек
Чтобы получить адрес тестового кошелька TestNet, я вхожу в свой кошелек TestNet и нажимаю кнопку «Получить». Появится окно, и в нем будет адрес получения кошелька TestNet.
Я пытаюсь отправить свои биткойны на этот адрес получателя, и почему-то биткойны просто не попадают в кошелек.
Программа сообщает, что Транзакция прошла успешно, и даже возвращает идентификатор Транзакции.
Но при проверке кошелька TestNet я вообще не нахожу ни транзакций, ни новых биткойнов?
Может ли какая-нибудь добрая душа просмотреть приведенный ниже код C#, чтобы увидеть, что не так?
Я использую библиотеку C# NBitCoin с Visual Studio 2015.
Приведенный ниже код включен в «Консольную программу Visual C#» в Visual Studio 2015.
// ReSharper disable All
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NBitcoin;
using NBitcoin.Protocol;
using QBitNinja.Client;
using QBitNinja.Client.Models;
namespace SpendYourCoins
{
class Program
{
static void Main()
{
/*
#region CREATE NEW PRIVKEY
//var network = Network.TestNet;
//Key privateKey = new Key();
//var bitcoinPrivateKey = privateKey.GetWif(network);
#endregion
*/
#region IMPORT PRIVKEY
var bitcoinPrivateKey = new BitcoinSecret("cTNoQtcdj9ZRV9XRNDFVisbif2XMSbxEbtP5WZTGJ2sGW9gSRr7Q");
var network = bitcoinPrivateKey.Network;
#endregion
var address = bitcoinPrivateKey.GetAddress();
Console.WriteLine(bitcoinPrivateKey); // cSZjE4aJNPpBtU6xvJ6J4iBzDgTmzTjbq8w2kqnYvAprBCyTsG4x
Console.WriteLine(address); // mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv
Console.WriteLine();
var client = new QBitNinjaClient(Network.TestNet);
var transactionId = uint256.Parse("12e548ababf06160486f91bfa2a406f131631258b2db025eb36bcd5230a70524");
var transactionResponse = client.GetTransaction(transactionId).Result;
Console.WriteLine(transactionResponse.TransactionId); // e44587cf08b4f03b0e8b4ae7562217796ec47b8c91666681d71329b764add2e3
Console.WriteLine(transactionResponse.Block.Confirmations);
Console.WriteLine();
var receivedCoins = transactionResponse.ReceivedCoins;
OutPoint outPointToSpend = null;
foreach (var coin in receivedCoins)
{
if (coin.TxOut.ScriptPubKey == bitcoinPrivateKey.ScriptPubKey)
{
outPointToSpend = coin.Outpoint;
}
}
if(outPointToSpend == null)
throw new Exception("TxOut doesn't contain our ScriptPubKey");
Console.WriteLine("We want to spend {0}. outpoint:", outPointToSpend.N + 1);
var transaction = new Transaction();
transaction.Inputs.Add(new TxIn()
{
PrevOut = outPointToSpend
});
// var hallOfTheMakersAddress = new BitcoinPubKeyAddress("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
//var hallOfTheMakersAddress = new BitcoinPubKeyAddress("2MsNF9f3nsdkEMV6un9u3pMVKcTNJPauqaU");
var hallOfTheMakersAddress = new BitcoinScriptAddress("2MtBDuoyhPa8athzErp8nj4NXMKgUQ2qGq8", Network.TestNet);
// How much you want to TO
var hallOfTheMakersAmount = new Money((decimal)0.5, MoneyUnit.BTC);
/* At the time of writing the mining fee is 0.05usd
* Depending on the market price and
* On the currently advised mining fee,
* You may consider to increase or decrease it
*/
var minerFee = new Money((decimal)0.0001, MoneyUnit.BTC);
// How much you want to spend FROM
var txInAmount = (Money)receivedCoins[(int) outPointToSpend.N].Amount;
Money changeBackAmount = txInAmount - hallOfTheMakersAmount - minerFee;
TxOut hallOfTheMakersTxOut = new TxOut()
{
Value = hallOfTheMakersAmount,
ScriptPubKey = hallOfTheMakersAddress.ScriptPubKey
};
TxOut changeBackTxOut = new TxOut()
{
Value = changeBackAmount,
ScriptPubKey = bitcoinPrivateKey.ScriptPubKey
};
transaction.Outputs.Add(hallOfTheMakersTxOut);
transaction.Outputs.Add(changeBackTxOut);
var message = "nopara73 loves NBitcoin!";
var bytes = Encoding.UTF8.GetBytes(message);
transaction.Outputs.Add(new TxOut()
{
Value = Money.Zero,
ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes)
});
//Console.WriteLine(transaction);
//var address = new BitcoinPubKeyAddress("mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv");
//transaction.Inputs[0].ScriptSig = address.ScriptPubKey;
// It is also OK:
transaction.Inputs[0].ScriptSig = bitcoinPrivateKey.ScriptPubKey;
transaction.Sign(bitcoinPrivateKey, false);
BroadcastResponse broadcastResponse = client.Broadcast(transaction).Result;
if (!broadcastResponse.Success)
{
Console.WriteLine(string.Format("ErrorCode: {0}", broadcastResponse.Error.ErrorCode));
Console.WriteLine("Error message: " + broadcastResponse.Error.Reason);
}
else
{
Console.WriteLine("Success! You can check out the hash of the transaciton in any block explorer:");
Console.WriteLine(transaction.GetHash());
}
//using (var node = Node.ConnectToLocal(network)) //Connect to the node
//{
// node.VersionHandshake(); //Say hello
// //Advertize your transaction (send just the hash)
// node.SendMessage(new InvPayload(InventoryType.MSG_TX, transaction.GetHash()));
// //Send it
// node.SendMessage(new TxPayload(transaction));
// Thread.Sleep(500); //Wait a bit
//}
Console.ReadLine();
}
}
}
Я нашел вашу транзакцию здесь: 12e548ababf06160486f91bfa2a406f131631258b2db025eb36bcd5230a70524
Он был успешно создан, подписан и отправлен. Я также вижу добавленное вами сообщение.
Я обнаружил несколько вещей, которые отличаются, когда я смотрю на транзакцию и на то, как вы ее построили.
Адрес, полученный из этого закрытого ключа: mj36bqZz5DcQFhKysoanLirq9f6MNfT1oJ.
или
mweqjRVBWVTmiV8fqLYqWfWAmqzxCWYwJd (сжатый)
тогда как вы отмечаете это как «mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv». Вы можете проверить, что здесь битадрес - testnet
Есть ли причина, по которой вы используете BitcoinScriptAddress?
Нравиться:
var hallOfTheMakersAddress = new BitcoinScriptAddress("2MtBDuoyhPa8athzErp8nj4NXMKgUQ2qGq8", Network.TestNet);
Вместо чего-то вроде:
var hallOfTheMakersAddress = new BitcoinAddress("mweqjRVBWVTmiV8fqLYqWfWAmqzxCWYwJd", Network.TestNet);
Доктор Дэвид Боуман
Error CS0144 Cannot create an instance of the abstract class or interface 'BitcoinAddress'
Не могли бы вы еще раз взглянуть и помочь мне с этим?Кайлюк МакДугалл
BitcoinAddress hallOfTheMakersAddress = BitcoinAddress.Create("mweqjRVBWVTmiV8fqLYqWfWAmqzxCWYwJd", Network.TestNet);
Доктор Дэвид Боуман
var hallOfTheMakersAddress = BitcoinAddress.Create("2NBzSQBwACBnMNbTR8QjZQKYwW61RZMd777", Network.TestNet);
Кайлюк МакДугалл