比特币钱包开发【C#】

冷不防 2022-01-13 13:41 509阅读 0赞

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在这个教程中,我们将使用C#来开发一个比特币钱包,我们使用NBitcoin这个库。教程中的代码实现了比特币的存储、接收和支付功能,可以很容易地移植到其他应用中。

如果要快速掌握在C#程序中NBitcoin的使用方法,推荐访问汇智网的课程:

  • C#比特币开发详解

1、开发目标

我们要开发的比特币钱包要实现以下功能:

  • 可以使用BIP39助记词恢复密钥
  • 可以创建比特地址,可以接收其他地址转来的比特币
  • 可以查看比特币地址余额
  • 可以向其他地址支付比特币

2、引入NBitcoin开发包

首先需要引入NBitcoin开发包以及QBitNinja开发包:

  1. using NBitcoin;
  2. using QBitNinja.Client;
  3. using QBitNinja.Client.Models;

3、生成BIP39助记词

我们需要保存下来生成的助记词:

  1. public void MssGenerateMnemo(out string ssMnemo) {
  2. Mnemonic mnemonic = new Mnemonic(Wordlist.English, WordCount.Twelve);
  3. ssMnemo = mnemonic.ToString();
  4. }

4、生成比特币地址

下面的代码可以利用NBitcoin生成比特币HD地址:

  1. public void MssGenerateAddress(
  2. string ssMnemo,
  3. int ssKeynumber,
  4. bool ssIsTestNet,
  5. out string ssAddress,
  6. out string ssPrivateKey) {
  7. Network net;
  8. if (ssIsTestNet)
  9. net = Network.TestNet;
  10. else
  11. net = Network.Main;
  12. Mnemonic restoreNnemo = new Mnemonic(ssMnemo);
  13. ExtKey masterKey = restoreNnemo.DeriveExtKey();
  14. KeyPath keypth = new KeyPath("m/44'/0'/0'/0/" + ssKeynumber);
  15. ExtKey key = masterKey.Derive(keypth);
  16. ssAddress = key.PrivateKey.PubKey.GetAddress(net).ToString();
  17. ssPrivateKey = key.PrivateKey.GetBitcoinSecret(net).ToString();
  18. }

5、获取比特币地址余额

下面的代码可以获取指定地址的比特币余额:

  1. public void MssGetBalance(
  2. string ssAddress,
  3. bool ssIsUnspentOnly,
  4. bool ssIsTestNet,
  5. out decimal ssBalance,
  6. out decimal ssConfirmedBalance) {
  7. Network net;
  8. if (ssIsTestNet)
  9. net = Network.TestNet;
  10. else
  11. net = Network.Main;
  12. QBitNinjaClient client = new QBitNinjaClient(net);
  13. var balance = client.GetBalance(new BitcoinPubKeyAddress(ssAddress), ssIsUnspentOnly).Result;
  14. ssBalance = 0.0M;
  15. ssConfirmedBalance = 0.0M;
  16. if (balance.Operations.Count > 0)
  17. {
  18. var unspentCoins = new List<Coin>();
  19. var unspentCoinsConfirmed = new List<Coin>();
  20. foreach (var operation in balance.Operations)
  21. {
  22. unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
  23. if(operation.Confirmations > 0)
  24. unspentCoinsConfirmed.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
  25. }
  26. ssBalance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  27. ssConfirmedBalance = unspentCoinsConfirmed.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  28. }
  29. }

6、向其他比特币地址转账

下面的代码可以利用NBitcoin实现向指定的地址转账比特币:

  1. public void MssGetBalance(
  2. string ssAddress, bool ssIsUnspentOnly,
  3. bool ssIsTestNet,
  4. out decimal ssBalance, out decimal ssConfirmedBalance) {
  5. Network net;
  6. if (ssIsTestNet)
  7. net = Network.TestNet;
  8. else
  9. net = Network.Main;
  10. QBitNinjaClient client = new QBitNinjaClient(net);
  11. var balance = client.GetBalance(new BitcoinPubKeyAddress(ssAddress), ssIsUnspentOnly).Result;
  12. ssBalance = 0.0M;
  13. ssConfirmedBalance = 0.0M;
  14. if (balance.Operations.Count > 0)
  15. {
  16. var unspentCoins = new List<Coin>();
  17. var unspentCoinsConfirmed = new List<Coin>();
  18. foreach (var operation in balance.Operations)
  19. {
  20. unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
  21. if(operation.Confirmations > 0)
  22. unspentCoinsConfirmed.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
  23. }
  24. ssBalance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  25. ssConfirmedBalance = unspentCoinsConfirmed.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  26. }
  27. }

原文链接:用C#开发自己的比特币钱包 — 汇智网

转载于:https://my.oschina.net/u/3794778/blog/3041858

发表评论

表情:
评论列表 (有 0 条评论,509人围观)

还没有评论,来说两句吧...

相关阅读

    相关 2018最佳钱包汇总

          对于想入手或者挖取比特币的币圈新人来说,提前准备好一款比特币钱包必不可少,那到底哪款比特币钱包比较好用一点呢?下面千氪专栏作者“比特币小白”为大家整理了2018年最

    相关 btc 钱包简介

    bip39协议 那么支持bip39有何重大意义呢?举个例子:你所用的钱包商跑路了,怎么办?都说钱包商拿不到你的资产,且不说这个问题。最最重要的是你怎么拿到你的资产呢?你有

    相关 精通(第五章)【钱包

    “钱包”一词在比特币中有多重含义。 广义上,钱包是一个应用程序,为用户提供交互界面。 钱包控制用户访问权限,管理密钥和地址,跟踪余额以及创建和签名交易。 狭义上,即从程