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/