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
經過ExinCore API, 能夠進行BTC, USDT, EOS, ETH 等等交易, 此處演示用 USDT購買BTC 或者 用BTC購買USDT。交易前,先檢查一下錢包地址。
完整的步驟以下:async
比特幣與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市場的價格信息呢?你要先了解你交易的基礎幣是什麼,若是你想買比特幣,賣出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; }
在第二章裏,基於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裏,記錄成交價格,交易費用等信息!你只須要按下面的方式解開便可!
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);
編譯執行,便可開始交易了.
本代碼執行時的命令列表:
Make your choose: