經過 C# 買賣Bitcoin

cover

方案一: 經過ExinCore API進行幣幣交易

Exincore 提供了基於Mixin Network的幣幣交易API.git

你能夠支付USDT給ExinCore, ExinCore會以最低的價格,最優惠的交易費將你購買的比特幣轉給你, 每一幣交易都是匿名的,而且能夠在區塊鏈上進行驗證,交易的細節只有你與ExinCore知道!github

ExinCore 也不知道你是誰,它只知道你的UUID.json

預備知識:

你先須要建立一個機器人, 方法在 教程一.bash

安裝依賴包

正如教程一里咱們介紹過的, 咱們須要依賴 mixin-csharp-sdk, 你應該先安裝過它了, 這兒咱們再安裝 MsgPack.Cli 軟件包.app

dotnet add package MixinCSharpSdk
  dotnet add package MsgPack.Cli --version 1.0.1

充幣到 Mixin Network, 並讀出它的餘額.

經過ExinCore API, 能夠進行BTC, USDT, EOS, ETH 等等交易, 此處演示用 USDT購買BTC 或者 用BTC購買USDT。交易前,先檢查一下錢包地址。
完整的步驟以下:async

  • 檢查比特幣或USDT的餘額,錢包地址。並記下錢包地址。
  • 從第三方交易所或者你的冷錢包中,將幣充到上述錢包地址。
  • 再檢查一下幣的餘額,看到賬與否。(比特幣的到賬時間是5個區塊的高度,約100分鐘)。

比特幣與USDT的充值地址是同樣的。ide

MixinApi mixinApiNewUser = new MixinApi();
  mixinApiNewUser.Init(UserIDNewUser, "", SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser);
  Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC);
  Console.WriteLine("New User " + UserIDNewUser + " 's BTC balance is " + AssetBTC.balance);
  Console.WriteLine("New User " + UserIDNewUser + " 's BTC address is " + AssetBTC.public_key);

查詢ExinCore市場的價格信息

如何來查詢ExinCore市場的價格信息呢?你要先了解你交易的基礎幣是什麼,若是你想買比特幣,賣出USDT,那麼基礎貨幣就是USDT;若是你想買USDT,賣出比特幣,那麼基礎貨幣就是比特幣.學習

string jsonData = FetchMarketPrice("815b0b1a-2764-3736-8faa-42d694fa620a");
var marketObj = JsonConvert.DeserializeObject<MarketInfo>(jsonData);
foreach (AssetInfo value in marketObj.data)
{
    Console.WriteLine(value);
}

public class MarketInfo
{
    public string code { get; set; }
    public string message { get; set; }
    public List<AssetInfo> data { get; set; }
    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}
public class AssetInfo
{
    public string base_asset { get; set; }
    public string base_asset_symbol { get; set; }
    public string exchange_asset_symbol { get; set; }
    public string price  { get; set; }
    public string minimum_amount { get; set; }
    public string maximum_amount  { get; set; }
    public List<string> exchanges  { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}


public static string FetchMarketPrice(string asset_id)
{
    return FetchMarketPriceAsync(asset_id).Result;
}
public static async Task<string> FetchMarketPriceAsync(string asset_id)
{
  HttpClient client = new HttpClient();
  // Call asynchronous network methods in a try/catch block to handle exceptions
  try
  {
     HttpResponseMessage response = await client.GetAsync("https://exinone.com/exincore/markets?base_asset=" + asset_id);
     response.EnsureSuccessStatusCode();
     string responseBody = await response.Content.ReadAsStringAsync();
     // Above three lines can be replaced with new helper method below
     // string responseBody = await client.GetStringAsync(uri);
     Console.WriteLine(responseBody);
     return responseBody;
  }
  catch(HttpRequestException e)
  {
     Console.WriteLine("\nException Caught!");
     Console.WriteLine("Message :{0} ",e.Message);
  }
  return null;
}

交易前,建立一個Memo!

在第二章裏,基於Mixin Network的 C# 比特幣開發教程: 機器人接受比特幣並當即退還用戶, 咱們學習過退還用戶比特幣,在這裏,咱們除了給ExinCore支付幣外,還要告訴他咱們想購買的幣是什麼,即將想購買的幣存到memo裏。區塊鏈

private static string TargetAssetID(string asset_id) {
  Guid guid = new Guid(asset_id);
  var gbytes = guid.ToByteArray();
  Array.Reverse(gbytes,0,4);
  Array.Reverse(gbytes,4,2);
  Array.Reverse(gbytes,6,2);
  var serializer = MessagePackSerializer.Get(gbytes.GetType());

  var stream = new MemoryStream();
  serializer.Pack(stream, gbytes);
  return Convert.ToBase64String(stream.ToArray());
}

幣幣交易的完整流程

轉幣給ExinCore時,將memo寫入你但願購買的幣,不然,ExinCore會直接退幣給你!
若是你想賣出比特幣買入USDT,調用方式以下:ui

//config.cs
public static string EXIN_BOT     = "61103d28-3ac2-44a2-ae34-bd956070dab1";
// public static string EXIN_BOT     = "0b1a2027-4fd6-3aa0-b3a3-814778bb7a2e";
public static string MASTER_UUID  = "0b4f49dc-8fb4-4539-9a89-fb3afc613747";
public static string ASSET_ID_BTC = "c6d0c728-2624-429b-8e0d-d9d19b6592fa";
public static string ASSET_ID_EOS = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d";
public static string ASSET_ID_USDT= "815b0b1a-2764-3736-8faa-42d694fa620a";

//Program.cs
if (cmd == "5" ) {
    var memo = TargetAssetID(USRCONFIG.ASSET_ID_USDT);
    Console.WriteLine(memo);
    using (TextReader fileReader = File.OpenText(@"mybitcoin_wallet.csv"))
    {
        var csv = new CsvReader(fileReader);
        csv.Configuration.HasHeaderRecord = false;
        while (csv.Read())
        {
          string PrivateKeyNewUser;
          csv.TryGetField<string>(0, out PrivateKeyNewUser);
          string PinTokenNewUser;
          csv.TryGetField<string>(1, out PinTokenNewUser);
          string SessionIDNewUser;
          csv.TryGetField<string>(2, out SessionIDNewUser);
          string UserIDNewUser;
          csv.TryGetField<string>(3, out UserIDNewUser);
          string PinNewUser;
          csv.TryGetField<string>(4, out PinNewUser);
          MixinApi mixinApiNewUser = new MixinApi();
          mixinApiNewUser.Init(UserIDNewUser, "", SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser);
          // Console.WriteLine(mixinApiNewUser.CreatePIN("", "123456").ToString());
          Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_BTC,
                                  USRCONFIG.EXIN_BOT,
                                  "0.0001",
                                  PinNewUser.ToString(),
                                  System.Guid.NewGuid().ToString(),
                                  memo);
          Console.WriteLine(reqInfo);
        }
    }
}

若是你想賣出USDT買入比特幣,調用方式以下:

if (cmd == "6" ) {
    var memo = TargetAssetID(USRCONFIG.ASSET_ID_BTC);
    Console.WriteLine(memo);
    using (TextReader fileReader = File.OpenText(@"mybitcoin_wallet.csv"))
    {
        var csv = new CsvReader(fileReader);
        csv.Configuration.HasHeaderRecord = false;
        while (csv.Read())
        {
          string PrivateKeyNewUser;
          csv.TryGetField<string>(0, out PrivateKeyNewUser);
          string PinTokenNewUser;
          csv.TryGetField<string>(1, out PinTokenNewUser);
          string SessionIDNewUser;
          csv.TryGetField<string>(2, out SessionIDNewUser);
          string UserIDNewUser;
          csv.TryGetField<string>(3, out UserIDNewUser);
          string PinNewUser;
          csv.TryGetField<string>(4, out PinNewUser);
          MixinApi mixinApiNewUser = new MixinApi();
          mixinApiNewUser.Init(UserIDNewUser, "", SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser);
          // Console.WriteLine(mixinApiNewUser.CreatePIN("", "123456").ToString());
          Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_USDT,
                                  USRCONFIG.EXIN_BOT,
                                  "1",
                                  PinNewUser.ToString(),
                                  System.Guid.NewGuid().ToString(),
                                  memo);
          Console.WriteLine(reqInfo);
        }
    }
}

交易完成後,Exincore會將你須要的幣轉到你的賬上,一樣,會在memo裏,記錄成交價格,交易費用等信息!你只須要按下面的方式解開便可!

  • NetworkSnapshots 讀取錢包的交易記錄。
using (TextReader fileReader = File.OpenText(@"mybitcoin_wallet.csv"))
{
    var csv = new CsvReader(fileReader);
    csv.Configuration.HasHeaderRecord = false;
    while (csv.Read())
    {
      string PrivateKeyNewUser;
      csv.TryGetField<string>(0, out PrivateKeyNewUser);
      string PinTokenNewUser;
      csv.TryGetField<string>(1, out PinTokenNewUser);
      string SessionIDNewUser;
      csv.TryGetField<string>(2, out SessionIDNewUser);
      string UserIDNewUser;
      csv.TryGetField<string>(3, out UserIDNewUser);
      string PinNewUser;
      csv.TryGetField<string>(4, out PinNewUser);
      MixinApi mixinApiNewUser = new MixinApi();
      mixinApiNewUser.Init(UserIDNewUser, "", SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser);
      // Console.WriteLine(mixinApiNewUser.CreatePIN("", "123456").ToString());
      var snaps = mixinApiNewUser.NetworkSnapshots(10,"2019-03-26T01:49:52.462741863Z", "815b0b1a-2764-3736-8faa-42d694fa620a", "ASC",true);
      // Console.WriteLine(snaps);
      foreach (var sn in snaps)
      {
        if ( Convert.ToDouble(sn.amount) > 0 ) {
          if ( sn.data != null ) {
            var memoBytes = Convert.FromBase64String(sn.data);
            var memoObj = MessagePackSerializer.UnpackMessagePackObject(memoBytes);
            Console.WriteLine(memoObj.ToString());

            var xR = JsonConvert.DeserializeObject<ExchangeResult>(memoObj.ToString());
            Console.WriteLine(xR.C);
            if (xR.C == "1000") {
              Console.WriteLine("-----------Successfully--Exchange-------------");
              Console.WriteLine("You got " + sn.amount.ToString() + " back!");
              Console.WriteLine("Price is  " + xR.P + " Fee is " + xR.F +
                                " Percent of fee: " +
                                Convert.ToDouble(xR.F)/Convert.ToDouble(sn.amount)*100 + " %");
              Console.WriteLine("Fee Asset uuid: " + HexStringToUUID(xR.FA));
              Console.WriteLine("trace  uuid: " + HexStringToUUID(xR.O));
              Console.WriteLine("----------end of snapshots query--------------");
            }
          }
        }
      }
    }
}

一次成功的交易以下:

-----------Successfully--Exchange-------------
You got 0.3923244 back!
Price is  3938.62 Fee is 0.0007878 Percent of fee: 0.200803212851406 %
Fee Asset uuid: 815b0b1a-2764-3736-8faa-42d694fa620a
trace  uuid: 1a3d8561-26e7-49bb-8ae3-ed85ce2bb957
----------end of snapshots query--------------

讀取幣的餘額

經過讀取幣的餘額,來確認交易狀況!

MixinApi mixinApiNewUser = new MixinApi();
  mixinApiNewUser.Init(UserIDNewUser, "", SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser);
  Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC);
  Console.WriteLine("New User " + UserIDNewUser + " 's BTC balance is " + AssetBTC.balance);
  Console.WriteLine("New User " + UserIDNewUser + " 's BTC address is " + AssetBTC.public_key);

源代碼執行

編譯執行,便可開始交易了.

  • [x] dotnet build 編譯項目.
  • [x] dotnet bin/Debug/netcoreapp2.2/bitcoin_wallet.dll 運行它.

本代碼執行時的命令列表:

  • 1: Create Bitcoin Wallet and update PIN
  • 2: Read Bitcoin balance & address
  • 3: Read USDT balance & address
  • 4: Read EOS balance & address
  • 5: pay 0.0001 BTC buy USDT
  • 6: pay $1 USDT buy BTC
  • 7: Read Snapshots
  • 8: Fetch market price(USDT)
  • 9: Fetch market price(BTC)
  • v: Verify Wallet Pin
  • q: Exit

Make your choose:

完整代碼

Solution Two: List your order on Ocean.One exchange

相關文章
相關標籤/搜索