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,主要類型及關系如下圖所示:

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
輸出結果如下:
__ERC20授權__:執行如下指令運作WETH兌換與ERC20授權示範:
go run demo/prepare.go
__送出0x訂單__:執行如下指令向Mesh網絡送出0x訂單:
go run demo/addorder.go
__查詢0x訂單__:執行如下指令查詢Mesh網絡中的0x訂單:
go run demo/getorders.go
__執行0x訂單__:執行如下指令鍊上結算訂單:
go run demo/fillorder.go
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/