Стоит задача : управлять биткоин кошельком программно, средствами c#. Долго гуглив, наткнулся на библиотеку NBitcoin, на сколько я понял, мы передаем private key в результате можем узнать адрес для принятия денег.
var bitcoinPrivateKey = new BitcoinSecret("xxxxxx");
var network = bitcoinPrivateKey.Network;
var address = bitcoinPrivateKey.GetAddress();
У меня 2 вопроса :
Console.WriteLine( new Key().GetWif(network));
взял отсюда
Transaction aliceFunding = new Transaction()
{
Outputs =
{
new TxOut("0.45", bitcoinPrivateKey.GetAddress()),
new TxOut("0.8", bitcoinPrivateKey.PubKey)
}
};
Coin[] aliceCoins = aliceFunding
.Outputs
.Select((o, i) => new Coin(new OutPoint(aliceFunding.GetHash(), i), o))
.ToArray();
var txBuilder = new TransactionBuilder();
var tx = txBuilder
.AddCoins(aliceCoins)
.AddKeys(bitcoinPrivateKey.PrivateKey)
.Send(new BitcoinPubKeyAddress("12.....G"), "0.00090")
.SendFees("0.0000113")
.SetChange(bitcoinPrivateKey.GetAddress())
.BuildTransaction(true);
Никакой ошибки нет, но бтц не отправились
Дополнение : узнал, что нужно "зарегистрировать" транзакцию в системе, попытался так :
using (var node = Node.Connect(Network.Main, "89.85.201.236:8333"))
{
node.VersionHandshake();
node.SendMessage(new InvPayload(InventoryType.MSG_TX, tx.GetHash()));
node.SendMessage(new TxPayload(tx));
Thread.Sleep(500);
}
Сам адрес 89.85.201.236:8333 взял отсюда bitnodes.earn.com , но никаких изменений нет (( адрес проверил на том же сайте, вродь валидный
Правка для ответа 1 :
Transaction aliceFunding = new Transaction();
var input = new TxIn();
input.PrevOut = new OutPoint(aliceFunding.GetHash(), 0);
input.ScriptSig = bitcoinPrivateKey.ScriptPubKey;
aliceFunding.AddInput(input);
var output = new TxOut();
var dest = BitcoinAddress.Create("12....G");
Money free = Money.Satoshis(10);
output.Value = Money.Coins(0.0009388m) - free; //у меня всего на счету 0.0009388 btc
output.ScriptPubKey = dest.ScriptPubKey;
aliceFunding.AddOutput(output);
aliceFunding.Sign(bitcoinPrivateKey,false);
//пытался и так
//var txBuilder = new TransactionBuilder();
//var tx = txBuilder
// .AddCoins(aliceFunding)
// .AddKeys(bitcoinPrivateKey.PrivateKey)
// .Send(new BitcoinPubKeyAddress("12G", Network.Main), "0.00070")
// .SendFees(free)
// .SetChange(bitcoinPrivateKey.GetAddress())
// .BuildTransaction(true);
using (var node = Node.Connect(Network.Main, "13.58.209.229:8333"))
{
node.VersionHandshake();
node.SendMessage(new InvPayload(aliceFunding));
node.SendMessage(new TxPayload(aliceFunding));
Thread.Sleep(500);
}
Это будет приватный ключ в формате WIF (Wallet Import Format).
Я в самой библиотеке nbitcoin не разбирался, но вижу в коде несколько проблем.
Transaction aliceFunding =
Здесь должна быть реальная транзакция. А вы генерируете что-то в памяти, что не имеет отношения к реальному блокчейну. Для того, что бы потратить средства, одного приватного ключа недостаточно, вам нужны еще и айди реальных транзакций, выходы которых вы собираетесь использовать.
.Send(new BitcoinPubKeyAddress("12.....G"), "0.00090")
.SendFees("0.0000113")
Выше в вас 0.45 + 0.8 биткоина, вы отправляете 0.00090 с комиссией 0.0000113. Сеть биткоин устроена так, что все монеты с выходов транзакций должны быть потрачены, нельзя потратить только часть.
Вашу транзакцию не зарегистрируют, потому что она невалидная.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей