ZrxTool開發包適用於爲Go應用快速增長對0x協議的支持能力,實現ERC20兌換訂單的鏈下生成、流通與鏈上結算。ZrxTool開發包官方下載地址:0x協議對接Golang開發包。json
ZrxTool開發包主要包含如下特性:網絡
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
輸出結果以下:
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))
使用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訂單對象的MakerAssetData
和TakerAssetData
字段值。
按照0x協議要求,Maker在提交訂單前須要簽名。可使用OrderWrapper的SignWithMakerKey()
方法完成此操做。例如:
makerKey := "0xf2f48ee19680706196e2e3…030670656b0e0164837257d" signedOrder,_ := := orderWrapper.SignWithMakerKey(makerKey)
注意 :該方法除了返回簽名訂單對象,同時也會更新被封裝的0x訂單對象的Signature
字段。
利用OrderWrapper的SubmitToMesh()
方法將0x訂單提交到Mesh網絡。例如:
orderId,_ := orderWrapper.SubmitToMesh() // 返回訂單ID
當訂單被Mesh節點接收後,上述調用將返回訂單ID。若是訂單被Mesh節點拒收或發生其餘錯誤,都會返回非空的錯誤對象。
簽名正確的訂單被Mesh節點拒收的一個主要緣由,是Maker或Taker沒有受權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利用OrderWrapper的FillOrder()
方法來執行訂單。例如:
value := big.NewInt(100000000) // 執行數量 fee := big.NewInt(100000000000000000) // 手續費 key :="0x5d862464fe930345…d219789b3eb2128075a76f72" // taker私鑰 txid, _ := orderWrapper.FillOrder(value,fee,key) //返回交易ID
向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受權
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/