比特幣錢包開發【C#】

在這個教程中,咱們將使用C#來開發一個比特幣錢包,咱們使用NBitcoin這個庫。教程中的代碼實現了比特幣的存儲、接收和支付功能,能夠很容易地移植到其餘應用中。rest

若是要快速掌握在C#程序中NBitcoin的使用方法,推薦訪問匯智網的課程:code

一、開發目標

咱們要開發的比特幣錢包要實現如下功能:blog

  • 可使用BIP39助記詞恢復密鑰
  • 能夠建立比特意址,能夠接收其餘地址轉來的比特幣
  • 能夠查看比特幣地址餘額
  • 能夠向其餘地址支付比特幣

二、引入NBitcoin開發包

首先須要引入NBitcoin開發包以及QBitNinja開發包:教程

using NBitcoin;
using QBitNinja.Client;
using QBitNinja.Client.Models;

三、生成BIP39助記詞

咱們須要保存下來生成的助記詞:ci

public void MssGenerateMnemo(out string ssMnemo) {

Mnemonic mnemonic = new Mnemonic(Wordlist.English, WordCount.Twelve);

ssMnemo = mnemonic.ToString();

}

四、生成比特幣地址

下面的代碼能夠利用NBitcoin生成比特幣HD地址:開發

public void MssGenerateAddress(
		string ssMnemo, 
		int ssKeynumber, 
		bool ssIsTestNet, 
		out string ssAddress, 
		out string ssPrivateKey) {

  Network net;
  if (ssIsTestNet)
      net = Network.TestNet;
  else
      net = Network.Main;

  Mnemonic restoreNnemo = new Mnemonic(ssMnemo);

  ExtKey masterKey = restoreNnemo.DeriveExtKey();

  KeyPath keypth = new KeyPath("m/44'/0'/0'/0/" + ssKeynumber);
  ExtKey key = masterKey.Derive(keypth);

  ssAddress = key.PrivateKey.PubKey.GetAddress(net).ToString();
  ssPrivateKey = key.PrivateKey.GetBitcoinSecret(net).ToString();

}

五、獲取比特幣地址餘額

下面的代碼能夠獲取指定地址的比特幣餘額:get

public void MssGetBalance(
		string ssAddress, 
		bool ssIsUnspentOnly, 
		bool ssIsTestNet, 
		out decimal ssBalance, 
		out decimal ssConfirmedBalance) {

  Network net;
  if (ssIsTestNet)
    net = Network.TestNet;
  else
    net = Network.Main;

  QBitNinjaClient client = new QBitNinjaClient(net);
  var balance = client.GetBalance(new BitcoinPubKeyAddress(ssAddress), ssIsUnspentOnly).Result;

  ssBalance = 0.0M;
  ssConfirmedBalance = 0.0M;

  if (balance.Operations.Count > 0)
  {
    var unspentCoins = new List<Coin>();
    var unspentCoinsConfirmed = new List<Coin>();    
    foreach (var operation in balance.Operations)
    {
        unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
        if(operation.Confirmations > 0)
            unspentCoinsConfirmed.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));

    }

    ssBalance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
    ssConfirmedBalance = unspentCoinsConfirmed.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  }

}

六、向其餘比特幣地址轉帳

下面的代碼能夠利用NBitcoin實現向指定的地址轉帳比特幣:string

public void MssGetBalance(
		string ssAddress, bool ssIsUnspentOnly, 
		bool ssIsTestNet, 
		out decimal ssBalance, out decimal ssConfirmedBalance) {

  Network net;
  if (ssIsTestNet)
      net = Network.TestNet;
  else
      net = Network.Main;

  QBitNinjaClient client = new QBitNinjaClient(net);
  var balance = client.GetBalance(new BitcoinPubKeyAddress(ssAddress), ssIsUnspentOnly).Result;

  ssBalance = 0.0M;
  ssConfirmedBalance = 0.0M;

  if (balance.Operations.Count > 0)
  {
    var unspentCoins = new List<Coin>();
    var unspentCoinsConfirmed = new List<Coin>();    
    foreach (var operation in balance.Operations)
    {
      unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
      if(operation.Confirmations > 0)
          unspentCoinsConfirmed.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));

    }

    ssBalance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
    ssConfirmedBalance = unspentCoinsConfirmed.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
  }
}

原文連接:用C#開發本身的比特幣錢包 — 匯智網it

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息