nbitcoin управление кошельком

273
08 марта 2018, 08:38

Стоит задача : управлять биткоин кошельком программно, средствами c#. Долго гуглив, наткнулся на библиотеку NBitcoin, на сколько я понял, мы передаем private key в результате можем узнать адрес для принятия денег.

var bitcoinPrivateKey = new BitcoinSecret("xxxxxx");
var network = bitcoinPrivateKey.Network;
var address = bitcoinPrivateKey.GetAddress();

У меня 2 вопроса :

  1. Правильно ли я генерирую новый приват ключ(что бы потом получить новый адрес) :

Console.WriteLine( new Key().GetWif(network));

  1. Что я не так делаю при отправке бтц ? пример отправки :

взял отсюда

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);
            }
Answer 1
  1. Это будет приватный ключ в формате WIF (Wallet Import Format).

  2. Я в самой библиотеке nbitcoin не разбирался, но вижу в коде несколько проблем.

Transaction aliceFunding =

Здесь должна быть реальная транзакция. А вы генерируете что-то в памяти, что не имеет отношения к реальному блокчейну. Для того, что бы потратить средства, одного приватного ключа недостаточно, вам нужны еще и айди реальных транзакций, выходы которых вы собираетесь использовать.

.Send(new BitcoinPubKeyAddress("12.....G"), "0.00090")
.SendFees("0.0000113")

Выше в вас 0.45 + 0.8 биткоина, вы отправляете 0.00090 с комиссией 0.0000113. Сеть биткоин устроена так, что все монеты с выходов транзакций должны быть потрачены, нельзя потратить только часть.

Вашу транзакцию не зарегистрируют, потому что она невалидная.

READ ALSO
waypointsне работает на Mac OS

waypointsне работает на Mac OS

Всем привет, использую плагин waypointsjsдля отслеживания скролла на странице

286
Проблема с условием в js

Проблема с условием в js

Сравниваю по одному и тому-же условию но разными способами и на выходе получаются совершенно разные результаты закомментированное условие...

301
Как получить JSON с помощью API key

Как получить JSON с помощью API key

Решил попрактиковаться в работе с JSON и решил в проекте использовать API OpenWeatherMapПри обращение к ссылке с JSON выбивает ошибку (из ошибки ясно,...

293
Работа с input и button

Работа с input и button

Я создал простенький калькулятор, когда ввожу два числа с клавиатуры в два разных , то при нажатии на деление, умножение, сложение и вычитание,...

306