用ZrxTool開發包對接0x協議【Golang】

ZrxTool開發包適用於爲Go應用快速增長對0x協議的支持能力,實現ERC20兌換訂單的鏈下生成、流通與鏈上結算。ZrxTool開發包官方下載地址:0x協議對接Golang開發包json

一、開發包概述

ZrxTool開發包主要包含如下特性:網絡

  • 離線生成合規的0x訂單並進行離線簽名
  • 內置0x Mesh網絡支持,可向Mesh網絡提交0x訂單,或查詢Mesh網絡中已有的0x訂單
  • 以太坊鏈上結算0x訂單,支持主鏈、Ropsten/Rinkeby/Kovan測試鏈
  • 支持本地Ganache私鏈,便於高效開發與測試

ZrxTool開發包支持Go 1.13,當前版本1.0.0,主要類型及關係以下圖所示:app

在這裏插入圖片描述

ZrxTool的主要代碼文件清單見官網說明:http://sc.hubwiz.com/codebag/zrxtool/測試

二、運行演示程序

在運行開發包預置的演示程序前,請確保已經正確部署0x Mesh節點和以太坊節點。編碼

0x訂單封裝:執行以下命令運行0x訂單封裝演示:3d

go run demo/wraporder.go

輸出結果以下:code

在這裏插入圖片描述

ERC20受權:執行以下命令運行WETH兌換與ERC20受權演示:對象

go run demo/prepare.go

輸出結果以下:blog

在這裏插入圖片描述

提交0x訂單:執行以下命令向Mesh網絡提交0x訂單:圖片

go run demo/addorder.go

輸出結果以下:

在這裏插入圖片描述

查詢0x訂單:執行以下命令查詢Mesh網絡中的0x訂單:

go run demo/getorders.go

輸出結果以下:

在這裏插入圖片描述

執行0x訂單:執行以下命令鏈上結算訂單:

go run demo/fillorder.go

輸出結果以下:

在這裏插入圖片描述

三、建立0x訂單

ZrxTool開發包的入口類爲OrderWrapper,能夠認爲它是加強版的0x訂單,能夠直接與mesh節點、0x鏈上協議進行交互。

能夠直接建立OrderWrapper實例,或者使用order包的WrapJson()方法建立,而後利用這個封裝後的0x訂單對象,就能夠進行提交、執行等操做了。

例如,下面的代碼利用JSON描述建立0x訂單:

// import zrxtool/order

jsonOrder := `{           
"chainId": 1337,
  "exchangeAddress": "0x48bacb9266a570d521063ef5dd96e61686dbe788",
  "makerAddress": "0x5409ED021D9299bf6814279A6A1411A7e866A631",
  "makerAssetAmount": 5000000000000000000,
  "makerAssetAddress": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
  "takerAssetAddress": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082",
  "takerAssetAmount": 100000000000000000,
  "makerFee": 0,
  "takerFee": 0,
  "expirationTimeSeconds": 1598025600,
  "salt": 7898123
}`     // JSON訂單

orderWrapper,_ := order.WrapJson([]byte(jsonOrder))

四、綁定以太坊和Mesh網絡

使用ObjectWrapper的Bind()方法將訂單封裝對象綁定到特定的以太坊網絡和Mesh網絡,以便進行後續訂單操做。例如:

orderWrapper.Bind(
"http://localhost:8545",                  // 以太坊節點RPC API  
"ws://localhost:60557"                    // Mesh節點 WS RPC API
)

五、編碼資產數據

0x協議要求將資產合約信息編碼爲指定的資產數據格式,可使用OrderWrapper的EncodeAssetData()方法完成這一操做。

例如編碼Ganache鏈上的ZRX代幣:

zrxAddress := "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
data,_ := orderWrapper.EncodeAssetData(zrxAddress)

OrderWrapper提供了兩個語法糖,分別用於編碼Maker和Taker指定的數字資產。例如:

data1, _ := orderWrapper.EncodeMakerAssetData() //編碼訂單中Maker的資產
data2, _ := orderWrapper.EncodeTakerAssetData() //編碼訂單中Taker的資產

注意:這兩個語法糖除了返回編碼後資產數據,同時會更新被封裝的0x訂單對象的MakerAssetDataTakerAssetData字段值。

六、Maker簽名

按照0x協議要求,Maker在提交訂單前須要簽名。可使用OrderWrapper的SignWithMakerKey()方法完成此操做。例如:

makerKey := "0xf2f48ee19680706196e2e3…030670656b0e0164837257d"
signedOrder,_ := := orderWrapper.SignWithMakerKey(makerKey)

注意 :該方法除了返回簽名訂單對象,同時也會更新被封裝的0x訂單對象的Signature字段。

七、向Mesh網絡提交0x訂單

利用OrderWrapper的SubmitToMesh()方法將0x訂單提交到Mesh網絡。例如:

orderId,_ := orderWrapper.SubmitToMesh()       // 返回訂單ID

當訂單被Mesh節點接收後,上述調用將返回訂單ID。若是訂單被Mesh節點拒收或發生其餘錯誤,都會返回非空的錯誤對象。

簽名正確的訂單被Mesh節點拒收的一個主要緣由,是Maker或Taker沒有受權0x協議操做本身待交易的代幣資產。

八、查詢Mesh網絡中的0x訂單

使用order包的GetMeshOrder()方法查詢Mesh網絡中的0x訂單,該方法支持分頁結果。例如:

rsp, _ := order.GetMeshOrders(
"ws://localhost:60557",             // Mesh節點WS RPC API
0,                                    // 查詢頁號
100                                   // 每頁結果數量
)
for _, oi := range rsp.OrdersInfos {
  Fmt.Printf("signed order => %+v\n", oi.SignedOrder)
}

九、Taker執行訂單

Taker利用OrderWrapper的FillOrder()方法來執行訂單。例如:

value := big.NewInt(100000000)                        // 執行數量
fee := big.NewInt(100000000000000000)                 // 手續費
key :="0x5d862464fe930345…d219789b3eb2128075a76f72"   // taker私鑰
txid,  _ := orderWrapper.FillOrder(value,fee,key)     //返回交易ID

十、ERC20資產受權

向Mesh節點提交0x訂單被拒的一個主要緣由是沒有向0x協議進行正確的ERC20資產受權。OrderWrapper提供了ApproveAsset()方法方便進行 這一操做。

例如Maker受權0x鏈上協議操做本身持有的ZRX代幣,受權數量1E18:

zrxAddress := "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
value := big.NewInt(1000000000000000000)
makerKey := "0xf2f48ee19680706196e2e3…030670656b0e0164837257d"
txid,_ := orderWrapper.ApproveAsset(zrxAddress,value, makerKey) //返回受權交易ID

不須要每次都進行受權操做,例如能夠進行一次近乎無限量的受權:

txid,_ := orderWrapper.ApproveAssetUnlimited(zrxAddress, makerKey)

該方法實際是將受權數量設置爲2^256。

OrderWrapper同時提供了四個語法糖,分別用於進行Maker和Taker的受權操做:

makerKey := "0x…"                                  // Maker私鑰
takerKey := "0x…"                                  // Taker私鑰
orderWrapper.ApproveMakerAsset(makerKey)           // 按訂單信息Maker受權
orderWrapper.ApproveMakerAssetUnlimited(makerKey)  // 無限量Maker受權
orderWrapper.ApproveTakerAsset(takerKey)           // 按訂單信息Taker受權 
orderWrapper.ApproveTakerAssetUnlimit(takerKey)    // 無限量Taker受權

十一、以太幣/WETH轉換

0x協議不能直接處理ETH/ERC20兌換,所以須要先將ETH一比一兌換爲WETH。可使用OrderWrapper的WrapEther()方法將ETH封裝爲WETH,或者使用UnwrapEther() 方法將WETH轉換ETH。例如:

key := "0x.."                                             //兌換人私鑰
txid, _ := orderWrapper.WrapEther(big.NewInt(1000), key)  //返回交易ID

OrderWrapper也提供了兩個語法糖用於Maker和Taker將ETH轉換爲WETH,例如:

txid1, _ := orderWrapper.WrapMakerEther(makerKey)  // 按訂單信息兌換WETH
txid2, _ := orderWrapper.WrapTakerEther(takerKey)  // 按訂單信息兌換WETH

ZrxTool官方下載地址:http://sc.hubwiz.com/codebag/zrxtool/

相關文章
相關標籤/搜索