天天看點

0x協定對接Golang開發包

ZrxTool開發包适用于為Go應用快速增加對0x協定的支援能力,實作ERC20兌換訂單的鍊下生成、流通與鍊上結算。ZrxTool開發包官方下載下傳位址: 0x協定對接Golang開發包

1、開發包概述

ZrxTool開發包主要包含以下特性:

  • 離線生成合規的0x訂單并進行離線簽名
  • 内置0x Mesh網絡支援,可向Mesh網絡送出0x訂單,或查詢Mesh網絡中已有的0x訂單
  • 以太坊鍊上結算0x訂單,支援主鍊、Ropsten/Rinkeby/Kovan測試鍊
  • 支援本地Ganache私鍊,便于高效開發與測試

ZrxTool開發包支援Go 1.13,目前版本1.0.0,主要類型及關系如下圖所示:

0x協定對接Golang開發包

ZrxTool的主要代碼檔案清單如下:

代碼檔案 說明
zrxtool/order/ 0x訂單包目錄
zrxtool/order/factory.go 0x訂單封裝對象執行個體化代碼
zrxtool/order/erc20.go ERC20代币相關操作代碼
zrxtool/order/validity.go 0x訂單簽名相關代碼
zrxtool/order/liquidity.go 0x訂單Mesh網絡支援代碼
zrxtool/order/fill.go 0x訂單以太坊鍊上結算代碼
zrxtool/order/query.go 0x Mesh網絡訂單查詢代碼
zrxtool/zrx/ 以太坊鍊上協定包目錄
zrxtool/zrx/DevUtils/ 0x DevTuils協定對接包
zrxtool/zrx/ERC20Token/ 以太坊ERC20協定對接包
zrxtool/zrx/Exchange 0x Exchange協定對接包
zrxtool/zrx/WETH9/ WETH9協定對接包
zrxtool/demo/ 示範代碼目錄
zrxtool/demo/wraporder.go 0x訂單建立示範代碼
zrxtool/demo/prepare.go 0x訂單送出前可選的準備操作示範代碼
zrxtool/demo/addorder.go 向Mesh網絡送出0x訂單的示範代碼
zrxtool/demo/getorders.go Mesh網絡0x訂單查詢示範代碼
zrxtool/demo/fillorder.go 鍊上執行訂單示範代碼
go.mod Go子產品管理檔案
go.sum

2、運作示範程式

在運作開發包預置的示範程式前,請確定已經正确部署0x Mesh節點和以太坊節點。

__0x訂單封裝__:執行如下指令運作0x訂單封裝示範:

go run demo/wraporder.go           

輸出結果如下:

0x協定對接Golang開發包

__ERC20授權__:執行如下指令運作WETH兌換與ERC20授權示範:

go run demo/prepare.go           
0x協定對接Golang開發包

__送出0x訂單__:執行如下指令向Mesh網絡送出0x訂單:

go run demo/addorder.go           
0x協定對接Golang開發包

__查詢0x訂單__:執行如下指令查詢Mesh網絡中的0x訂單:

go run demo/getorders.go           
0x協定對接Golang開發包

__執行0x訂單__:執行如下指令鍊上結算訂單:

go run demo/fillorder.go           
0x協定對接Golang開發包

3、建立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))            

4、綁定以太坊和Mesh網絡

使用ObjectWrapper的

Bind()

方法将訂單封裝對象綁定到特定的以太坊網絡和Mesh網絡,以便進行後續訂單操作。例如:

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

5、編碼資産資料

0x協定要求将資産合約資訊編碼為指定的資産資料格式,可以使用OrderWrapper的

EncodeAssetData()

方法完成這一操作。

例如編碼Ganache鍊上的ZRX代币:

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

OrderWrapper提供了兩個文法糖,分别用于編碼Maker和Taker指定的數字資産。例如:

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

__注意__:這兩個文法糖除了傳回編碼後資産資料,同時會更新被封裝的0x訂單對象的

MakerAssetData

TakerAssetData

字段值。

6、Maker簽名

按照0x協定要求,Maker在送出訂單前需要簽名。可以使用OrderWrapper的

SignWithMakerKey()

方法完成此操作。例如:

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

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

Signature

字段。

7、向Mesh網絡送出0x訂單

利用OrderWrapper的

SubmitToMesh()

方法将0x訂單送出到Mesh網絡。例如:

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

當訂單被Mesh節點接收後,上述調用将傳回訂單ID。如果訂單被Mesh節點拒收或發生其他錯誤,都會傳回非空的錯誤對象。

簽名正确的訂單被Mesh節點拒收的一個主要原因,是Maker或Taker沒有授權0x協定操作自己待交易的代币資産。

8、查詢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)
}           

9、Taker執行訂單

Taker利用OrderWrapper的

FillOrder()

方法來執行訂單。例如:

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

10、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授權           

11、以太币/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/

繼續閱讀