cover

0x协议Go开发包

汇智网 / hubwiz.com

为Go应用快速增加对0x协议的支持能力,支持0x Mesh网络。

1、开发包概述

ZrxTool开发包适用于为Go应用快速增加对0x协议的支持能力, 实现ERC20兑换订单的链下生成、流通与链上结算

ZrxTool开发包主要包含以下特性:

  • 离线生成合规的0x订单并进行离线签名
  • 内置0x Mesh网络支持,可向Mesh网络提交0x订单,或查询Mesh网络中已有的0x订单
  • 以太坊链上结算0x订单,支持主链、Ropsten/Rinkeby/Kovan测试链
  • 支持本地Ganache私链,便于高效开发与测试

ZrxTool开发包支持Go 1.13,当前版本1.0.0,主要类型及关系如下图所示:

zrxtool uml

ZrxTool的主要代码文件清单如下:

代码文件说明
zrxtool/order/0x订单包目录
zrxtool/order/factory.go0x订单封装对象实例化代码
zrxtool/order/erc20.goERC20代币相关操作代码
zrxtool/order/validity.go0x订单签名相关代码
zrxtool/order/liquidity.go0x订单Mesh网络支持代码
zrxtool/order/fill.go0x订单以太坊链上结算代码
zrxtool/order/query.go0x Mesh网络订单查询代码
zrxtool/zrx/以太坊链上协议包目录
zrxtool/zrx/DevUtils/0x DevTuils协议对接包
zrxtool/zrx/ERC20Token/以太坊ERC20协议对接包
zrxtool/zrx/Exchange0x Exchange协议对接包
zrxtool/zrx/WETH9/WETH9协议对接包
zrxtool/demo/演示代码目录
zrxtool/demo/wraporder.go0x订单创建演示代码
zrxtool/demo/prepare.go0x订单提交前可选的准备操作演示代码
zrxtool/demo/addorder.go向Mesh网络提交0x订单的演示代码
zrxtool/demo/getorders.goMesh网络0x订单查询演示代码
zrxtool/demo/fillorder.go链上执行订单演示代码
go.modGo模块管理文件
go.sumGo模块管理文件

2、运行演示程序

在运行开发包预置的演示程序前,请确保已经正确部署0x Mesh节点 和以太坊节点。

0x订单封装:执行如下命令运行0x订单封装演示:

go run demo/wraporder.go

输出结果如下:

wrap order

ERC20授权:执行如下命令运行WETH兑换与ERC20授权演示:

go run demo/prepare.go

输出结果如下:

prepare

提交0x订单:执行如下命令向Mesh网络提交0x订单:

go run demo/addorder.go

输出结果如下:

add order

查询0x订单:执行如下命令查询Mesh网络中的0x订单:

go run demo/getorders.go

输出结果如下:

get orders

执行0x订单:执行如下命令链上结算订单:

go run demo/fillorder.go

输出结果如下:

fill order

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订单对象的 MakerAssetDataTakerAssetData字段值。

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

声 明

本站所提供软件包仅用于学习和研究,请依法合规使用。

本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。

¥4000.00
查看授权信息
  • 付费成功自动开通下载
  • 三个月内代码免费升级
  • 专业人员在线技术支持
  • 支持按需定制(另付费)
下载代码包
版本发布日期地址
1.0.0 2020-7-23
下载最新版
QQ咨询
2860991437
9+