首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NBitcoin事务签名(secret,bool)出现错误。它说的是传递硬币,而不是布尔

NBitcoin事务签名(secret,bool)出现错误。它说的是传递硬币,而不是布尔
EN

Stack Overflow用户
提问于 2020-10-19 01:47:44
回答 1查看 137关注 0票数 0

我正在使用NBitcoin签署一项交易。这里,事务签名(secret,bool)方法给出了错误。(我已经在网上搜索过了,但是没有帮助。)不是bool,而是传递Coin对象,我该怎么做呢?下面是我的代码:

代码语言:javascript
复制
var fee = Money.Coins(0.0001m);

        Transaction payment=Transaction.Create(bitcoinNetwork);
        payment.Inputs.Add(new TxIn()
        {
            PrevOut = new OutPoint(fundingTransaction.GetHash(), 1)
        });

        payment.Outputs.Add(new TxOut()
        {
            Value = amount-fee,
            ScriptPubKey = toAddress.ScriptPubKey
        });

        var output = fundingTransaction.Outputs[0];
       

        payment.Outputs.Add(new TxOut()
        {
            Value = output.Value - amount - fee,
            ScriptPubKey = output.ScriptPubKey
        });

        var message = "Thanks :)";
        var bytes = Encoding.UTF8.GetBytes(message);
        payment.Outputs.Add(new TxOut()
        {
            Value = Money.Zero,
            ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes)
        });

        Console.WriteLine(payment);

        payment.Inputs[0].ScriptSig = fundingTransaction.Outputs[1].ScriptPubKey;

        payment.Sign(secret, false); // the problem arises here

        using (var node = Node.Connect(Network.Main))
        {
            Console.WriteLine("Doing version handshake");
            node.VersionHandshake();
            Console.WriteLine("Sending message");
            node.SendMessage(new InvPayload(InventoryType.MSG_TX, payment.GetHash()));
            node.SendMessage(new TxPayload(payment));
            Thread.Sleep(500);
        }
EN

回答 1

Stack Overflow用户

发布于 2020-10-20 01:17:46

我按如下方式修改了代码(以防将来有人需要):

代码语言:javascript
复制
   public static bool SendBTC(string secret, string toAddress, decimal amount, string fundingTransactionHash)
    {
        Network bitcoinNetwork = Network.TestNet;
        var bitcoinPrivateKey = new BitcoinSecret(secret, bitcoinNetwork);
        var address = bitcoinPrivateKey.GetAddress(ScriptPubKeyType.Legacy);

        var client = new QBitNinjaClient(bitcoinNetwork);
        var transactionId = uint256.Parse(fundingTransactionHash);
        var transactionResponse = client.GetTransaction(transactionId).Result;

        var receivedCoins = transactionResponse.ReceivedCoins;

        OutPoint outPointToSpend = null;
        foreach (var coin in receivedCoins)
        {
            if (coin.TxOut.ScriptPubKey == bitcoinPrivateKey.GetAddress(ScriptPubKeyType.Legacy).ScriptPubKey)
            {
                outPointToSpend = coin.Outpoint;
            }
        }

        var transaction = Transaction.Create(bitcoinNetwork);
        transaction.Inputs.Add(new TxIn()
        {
            PrevOut = outPointToSpend
        });

        var receiverAddress = BitcoinAddress.Create(toAddress, bitcoinNetwork);


        var txOutAmount = new Money(amount, MoneyUnit.BTC);

        // Tx fee
        var minerFee = new Money(0.0005m, MoneyUnit.BTC);

        // Change
        var txInAmount = (Money)receivedCoins[(int)outPointToSpend.N].Amount;
        var changeAmount = txInAmount - txOutAmount - minerFee;

        transaction.Outputs.Add(txOutAmount, receiverAddress.ScriptPubKey);
        transaction.Outputs.Add(changeAmount, bitcoinPrivateKey.GetAddress(ScriptPubKeyType.Legacy).ScriptPubKey);


        transaction.Inputs[0].ScriptSig = address.ScriptPubKey;

        //Sign Tx
        transaction.Sign(bitcoinPrivateKey, receivedCoins.ToArray());

        //Broadcast Tx
        BroadcastResponse broadcastResponse = client.Broadcast(transaction).Result;

        return broadcastResponse.Success;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64416464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档