NBitcoin: подписание транзакции в TestNet

Я использую библиотеку 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();
        }
    }
}

Ответы (1)

Я нашел вашу транзакцию здесь: 12e548ababf06160486f91bfa2a406f131631258b2db025eb36bcd5230a70524

Он был успешно создан, подписан и отправлен. Я также вижу добавленное вами сообщение.

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

  1. Адрес, полученный из этого закрытого ключа: mj36bqZz5DcQFhKysoanLirq9f6MNfT1oJ.

    или

    mweqjRVBWVTmiV8fqLYqWfWAmqzxCWYwJd (сжатый)

    тогда как вы отмечаете это как «mzK6Jy5mer3ABBxfHdcxXEChsn3mkv8qJv». Вы можете проверить, что здесь битадрес - testnet

  2. Есть ли причина, по которой вы используете 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);
Я изменил программу, как вы просили. Программа работает успешно и даже возвращает идентификатор транзакции. Тем не менее, я не вижу никаких биткойнов, поступающих в кошелек Testnet... Может ли какая-нибудь добрая душа еще раз взглянуть на код и помочь? я используюvar hallOfTheMakersAddress = BitcoinAddress.Create("2NBzSQBwACBnMNbTR8QjZQKYwW61RZMd777", Network.TestNet);
Я не очень хорошо знаком с этим кошельком и почему он продолжает выдавать адреса скриптов вместо обычных биткойн-адресов. Если вы начинаете работать с биткойнами, я бы порекомендовал вам установить Copay ( copay.io ) и создать там тестовый кошелек. Ваши результаты будут гораздо более предсказуемыми и за ними будет легче следить. Это то, что я сейчас использую для целей тестирования.