通過 Golang 買賣 Bitcoin

mixin發表於2019-03-24

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

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

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

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

預備知識:

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

安裝依賴包

正如教程一里我們介紹過的, 我們需要依賴 mixin-sdk-go, 你應該先安裝過它了, 這兒我們再安裝 uuid, msgpack 兩個軟體包.

  go get -u github.com/vmihailenco/msgpack
  go get -u github.com/satori/go.uuid
複製程式碼

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

ExinCore可以進行BTC, USDT, EOS, ETH 等等交易, 這兒演示如果用 USDT購買BTC 或者 用BTC購買USDT, 交易前,先檢查一下錢包地址! 完整的步驟如下:

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

請注意,比特幣與USDT的地址是一樣的。

if cmd == "2" {
  userInfo, userID := ReadAssetInfo("BTC")
  fmt.Println("User ID ",userID, "'s BTC Address is: ",
             userInfo["data"].(map[string]interface{})["public_key"])
  fmt.Println("Balance is: ",
             userInfo["data"].(map[string]interface{})["balance"])
}
if cmd == "3" {
  userInfo, userID := ReadAssetInfo("USDT")
  fmt.Println("User ID ",userID, "'s USDT Address is: ",
             userInfo["data"].(map[string]interface{})["public_key"])
  fmt.Println("Balance is: ",
             userInfo["data"].(map[string]interface{})["balance"])
}
複製程式碼

查詢ExinCore市場的價格資訊

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

if cmd == "6" {
  priceInfo, err := GetMarketPrice(mixin.GetAssetId("USDT"))
  if err != nil {
    log.Fatal(err)
  }

  var marketInfo map[string]interface{}
  err = json.Unmarshal([]byte(priceInfo), &marketInfo)
  fmt.Println("Asset | price | min | max | exchanges")
  for _, v := range (marketInfo["data"].(map[string]interface{})) {
    fmt.Println(v.(map[string]interface{})["exchange_asset_symbol"],"/",
                v.(map[string]interface{})["base_asset_symbol"],
                v.(map[string]interface{})["price"],
                v.(map[string]interface{})["minimum_amount"],
                v.(map[string]interface{})["maximum_amount"],
                v.(map[string]interface{})["exchanges"],
               )
  }
}

func GetMarketPrice(asset_id string) ([]byte, error)  {
	var body []byte
	req, err := http.NewRequest("GET", "https://exinone.com/exincore/markets?base_asset="+asset_id, bytes.NewReader(body))
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")

	resp, err := httpClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
  // fmt.Println(resp.Body)
	bt, err := ioutil.ReadAll(resp.Body)
	if resp.StatusCode != http.StatusOK {
		var resp struct {
			Error Error `json:"error"`
		}
		err = json.Unmarshal(bt, &resp)
		if err == nil {
			err = resp.Error
		}
	}
	return bt, err
}
複製程式碼

交易前,建立一個Memo!

在第二章裡,基於Mixin Network的PHP比特幣開發教程: 機器人接受比特幣並立即退還使用者, 我們學習過退還使用者比特幣,在這裡,我們除了給ExinCore支付幣外,還要告訴他我們想購買的幣是什麼,即將想購買的幣存到memo裡。

packUuid, _ := uuid.FromString(mixin.GetAssetId("BTC"))
pack, _ := msgpack.Marshal(OrderAction{A: packUuid})
memo := base64.StdEncoding.EncodeToString(pack)
// fmt.Println(memo)
複製程式碼

幣幣交易的完整流程

轉幣給ExinCore時,將memo寫入你希望購買的幣,否則,ExinCore會直接退幣給你! 如果你想賣出比特幣買入USDT,呼叫方式如下:

EXIN_BOT        = "61103d28-3ac2-44a2-ae34-bd956070dab1";

packUuid, _ := uuid.FromString(mixin.GetAssetId("USDT"))
pack, _ := msgpack.Marshal(OrderAction{A: packUuid})
memo := base64.StdEncoding.EncodeToString(pack)
// fmt.Println(memo)
priKey, pToken, sID, userID, uPIN := GetWalletInfo()
bt, err := mixin.Transfer(EXIN_BOT,"0.0001",mixin.GetAssetId("BTC"),memo,
                         messenger.UuidNewV4().String(),
                         uPIN,pToken,userID,sID,priKey)
if err != nil {
        log.Fatal(err)
}
fmt.Println(string(bt))
複製程式碼

如果你想賣出USDT買入比特幣,呼叫方式如下:

packUuid, _ := uuid.FromString(mixin.GetAssetId("BTC"))
pack, _ := msgpack.Marshal(OrderAction{A: packUuid})
memo := base64.StdEncoding.EncodeToString(pack)
// fmt.Println(memo)
priKey, pToken, sID, userID, uPIN := GetWalletInfo()
bt, err := mixin.Transfer(EXIN_BOT,"0.0001",mixin.GetAssetId("USDT"),memo,
                         messenger.UuidNewV4().String(),
                         uPIN,pToken,userID,sID,priKey)
if err != nil {
        log.Fatal(err)
}
fmt.Println(string(bt))
複製程式碼

交易完成後,Exincore會將你需要的幣轉到你的帳上,同樣,會在memo裡,記錄成交價格,交易費用等資訊!你只需要按下面的方式解開即可!

  • readUserSnapshots 讀取錢包的交易記錄。

複製程式碼

一次成功的交易如下:

------------MEMO:-coin--exchange--------------
memo: hqFDzQPooVCnMzg3Mi45N6FGqTAuMDAwNzc0NqJGQcQQgVsLGidkNzaPqkLWlPpiCqFUoUahT8QQIbfeL6p5RVOcEP0mLb+t+g==
You Get Coins: 815b0b1a-2764-3736-8faa-42d694fa620a 0.3857508
Successful Exchange:
Fee asset ID: 815b0b1a-2764-3736-8faa-42d694fa620a fee is :0.0007746
Order ID: 21b7de2f-aa79-4553-9c10-fd262dbfadfa Price is :3872.97
--------------memo-record end---------------
複製程式碼

讀取幣的餘額

通過讀取幣的餘額,來確認交易情況!

if cmd == "2" {
  userInfo, userID := ReadAssetInfo("BTC")
  fmt.Println("User ID ",userID, "'s BTC Address is: ",
             userInfo["data"].(map[string]interface{})["public_key"])
  fmt.Println("Balance is: ",
             userInfo["data"].(map[string]interface{})["balance"])
}
if cmd == "3" {
  userInfo, userID := ReadAssetInfo("USDT")
  fmt.Println("User ID ",userID, "'s USDT Address is: ",
             userInfo["data"].(map[string]interface{})["public_key"])
  fmt.Println("Balance is: ",
             userInfo["data"].(map[string]interface{})["balance"])
}
複製程式碼

原始碼執行

執行 go run coin_exchange.go 即可開始交易了.

  • 1: Create Wallet
  • 2: Read Bitcoin balance & Address
  • 3: Read USDT balance & Address
  • 4: Read EOS balance & address
  • 5: pay 0.0001 BTC buy USDT
  • 6: Read ExinCore Price(USDT)
  • 7: Read ExinCore Price(BTC)
  • 8: pay 1 USDT buy BTC
  • q: Exit Make your choose:

完整程式碼

相關文章