El kit de desarrollo ZrxTool es adecuado para agregar rápidamente soporte para el protocolo 0x para aplicaciones Go y realizar la generación fuera de cadena, la circulación y la liquidación en cadena de las órdenes de intercambio ERC20. La dirección de descarga oficial del kit de desarrollo ZrxTool: kit de desarrollo Golang de acoplamiento de protocolo 0x .
1. Descripción general del kit de desarrollo
El kit de desarrollo ZrxTool incluye principalmente las siguientes características:
- Genere pedidos 0x compatibles sin conexión y firme sin conexión
- Soporte de red 0x Mesh incorporado, puede enviar pedidos 0x a la red Mesh o consultar los pedidos 0x existentes en la red Mesh
- Liquidar pedidos 0x en la cadena Ethereum, apoyar la cadena principal, cadena de prueba Ropsten / Rinkeby / Kovan
- Apoyar la cadena privada local de Ganache para un desarrollo y pruebas eficientes
El kit de desarrollo ZrxTool es compatible con Go 1.13 y la versión actual es 1.0.0. Los principales tipos y relaciones se muestran en la siguiente figura:
La lista de archivos de código principal de ZrxTool es la siguiente:
Archivo de código | Descripción |
---|---|
zrxtool / order / | 0x directorio de paquetes de pedidos |
zrxtool / order / factory.go | Código de instanciación de objeto de paquete de pedido 0x |
zrxtool / order / erc20.go | Código de operación relacionado con el token ERC20 |
zrxtool / order / validity.go | 0x código relacionado con la firma del pedido |
zrxtool / order / liquidity.go | Código de soporte de red de malla de pedido 0x |
zrxtool / order / fill.go | 0x código de liquidación de pedidos en la cadena Ethereum |
zrxtool / order / query.go | Código de consulta de pedido de red de malla 0x |
zrxtool / zrx / | Directorio de paquetes de protocolo en la cadena Ethereum |
zrxtool / zrx / DevUtils / | Paquete de acoplamiento del protocolo 0x DevTuils |
zrxtool / zrx / ERC20Token / | Paquete de acoplamiento de protocolo Ethereum ERC20 |
zrxtool / zrx / Exchange | 0x paquete de acoplamiento de protocolo Exchange |
zrxtool / zrx / WETH9 / | Paquete de acoplamiento de protocolo WETH9 |
zrxtool / demo / | Directorio de códigos de demostración |
zrxtool / demo / wraporder.go | 0x código de demostración de creación de pedidos |
zrxtool / demo / prepare.go | 0x Código de demostración de operación de preparación opcional antes de enviar el pedido |
zrxtool / demo / addorder.go | Código de demostración para enviar un pedido 0x a la red Mesh |
zrxtool / demo / getorders.go | Código de demostración de consulta de pedido de red de malla 0x |
zrxtool / demo / fillorder.go | Código de demostración de orden de ejecución en cadena |
go.mod | Ir a los archivos de gestión del módulo |
go.sum | Ir a los archivos de gestión del módulo |
2. Ejecute el programa de demostración
Antes de ejecutar el programa de demostración preestablecido en el kit de desarrollo, asegúrese de que el nodo 0x Mesh y el nodo Ethereum se hayan implementado correctamente.
Empaquetado de pedidos 0x : ejecute el siguiente comando para ejecutar la demostración de empaquetado de pedidos 0x:
go run demo/wraporder.go
El resultado es el siguiente:
Autorización ERC20 : Ejecute los siguientes comandos para ejecutar el intercambio WETH y la demostración de autorización ERC20:
go run demo/prepare.go
El resultado es el siguiente:
Enviar pedido 0x : Ejecute el siguiente comando para enviar el pedido 0x a la red Mesh:
go run demo/addorder.go
El resultado es el siguiente:
Consultar órdenes 0x : ejecute el siguiente comando para consultar órdenes 0x en la red Mesh:
go run demo/getorders.go
El resultado es el siguiente:
Ejecutar orden 0x : ejecute la siguiente orden para liquidar la orden en la cadena:
go run demo/fillorder.go
El resultado es el siguiente:
3. Cree un pedido 0x
La clase de entrada del kit de desarrollo ZrxTool OrderWrapper
se puede considerar como una versión mejorada de la orden 0x, que puede interactuar directamente con los nodos de malla y los protocolos de la cadena 0x.
Puede crear una instancia de OrderWrapper directamente, o usar el WrapJson()
método del paquete de pedidos , y luego usar este objeto de pedido 0x encapsulado para enviar, ejecutar y otras operaciones.
Por ejemplo, el siguiente código usa una descripción JSON para crear un pedido 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. Vincular la red Ethereum y Mesh
Utilice el Bind()
método ObjectWrapper para vincular el objeto de empaquetado del pedido a una red Ethereum específica y una red Mesh para operaciones de pedido posteriores. P.ej:
orderWrapper.Bind(
"http://localhost:8545", // 以太坊节点RPC API
"ws://localhost:60557" // Mesh节点 WS RPC API
)
5. Codificar datos de activos
El protocolo 0x requiere que la información del contrato de activos se codifique en un formato de datos de activos específico, lo que se puede hacer utilizando el EncodeAssetData()
método de OrderWrapper .
Por ejemplo, para codificar tokens ZRX en la cadena Ganache:
zrxAddress := "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
data,_ := orderWrapper.EncodeAssetData(zrxAddress)
OrderWrapper proporciona dos azúcares sintácticos para codificar activos digitales especificados por Maker y Taker. P.ej:
data1, _ := orderWrapper.EncodeMakerAssetData() //编码订单中Maker的资产
data2, _ := orderWrapper.EncodeTakerAssetData() //编码订单中Taker的资产
Nota : Estos dos azúcares sintácticos no solo devuelven los datos de activos codificados, sino que también actualizan el valor del campo de MakerAssetData
suma TakerAssetData
del objeto de orden 0x encapsulado .
6. Firma del fabricante
De acuerdo con los requisitos del acuerdo 0x, Maker debe firmar antes de enviar un pedido. Esto se puede hacer usando el SignWithMakerKey()
método de OrderWrapper . P.ej:
makerKey := "0xf2f48ee19680706196e2e3…030670656b0e0164837257d"
signedOrder,_ := := orderWrapper.SignWithMakerKey(makerKey)
Nota : Además de devolver el objeto de orden firmado, este método también actualiza los Signature
campos del objeto de orden 0x encapsulado .
7. Envíe el pedido 0x a la red Mesh
Utilice el SubmitToMesh()
método de OrderWrapper para enviar pedidos 0x a la red Mesh. P.ej:
orderId,_ := orderWrapper.SubmitToMesh() // 返回订单ID
Cuando el nodo Mesh recibe el pedido, la llamada anterior devolverá el ID del pedido. Si la orden es rechazada por el nodo Mesh o se producen otros errores, se devolverá un objeto de error no vacío.
Una de las principales razones por las que los nodos Mesh rechazan las órdenes con las firmas correctas es que Maker o Taker no autorizaron al protocolo 0x a operar sus activos de token para su intercambio.
8. Consultar pedidos 0x en la red Mesh
Utilice el GetMeshOrder()
método del paquete de pedidos para consultar el pedido 0x en la red Mesh. Este método admite resultados de paginación. P.ej:
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 ejecuta la orden
Taker utiliza el FillOrder()
método de OrderWrapper para ejecutar órdenes. P.ej:
value := big.NewInt(100000000) // 执行数量
fee := big.NewInt(100000000000000000) // 手续费
key :="0x5d862464fe930345…d219789b3eb2128075a76f72" // taker私钥
txid, _ := orderWrapper.FillOrder(value,fee,key) //返回交易ID
10. Autorización de activos ERC20
Una de las principales razones por las que se rechaza la orden 0x enviada al nodo Mesh es que el protocolo 0x no está debidamente autorizado para los activos ERC20. OrderWrapper proporciona ApproveAsset()
métodos para facilitar
esta operación.
Por ejemplo, Maker autoriza al protocolo de cadena 0x para operar los tokens ZRX que tiene, y el número autorizado es 1E18:
zrxAddress := "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
value := big.NewInt(1000000000000000000)
makerKey := "0xf2f48ee19680706196e2e3…030670656b0e0164837257d"
txid,_ := orderWrapper.ApproveAsset(zrxAddress,value, makerKey) //返回授权交易ID
No es necesario realizar operaciones de autorización cada vez, por ejemplo, puede realizar una autorización casi ilimitada:
txid,_ := orderWrapper.ApproveAssetUnlimited(zrxAddress, makerKey)
Este método en realidad establece el número de autorizaciones en 2 ^ 256.
OrderWrapper también proporciona cuatro azúcares sintácticos para las operaciones de autorización de Maker y Taker:
makerKey := "0x…" // Maker私钥
takerKey := "0x…" // Taker私钥
orderWrapper.ApproveMakerAsset(makerKey) // 按订单信息Maker授权
orderWrapper.ApproveMakerAssetUnlimited(makerKey) // 无限量Maker授权
orderWrapper.ApproveTakerAsset(takerKey) // 按订单信息Taker授权
orderWrapper.ApproveTakerAssetUnlimit(takerKey) // 无限量Taker授权
11. Conversión Ether / WETH
El protocolo 0x no puede procesar directamente el intercambio ETH / ERC20, por lo que primero debe convertir ETH a WETH uno a uno. Puede usar el WrapEther()
método OrderWrapper para encapsular ETH en WETH, o usar el UnwrapEther()
método para convertir WETH a ETH. P.ej:
key := "0x.." //兑换人私钥
txid, _ := orderWrapper.WrapEther(big.NewInt(1000), key) //返回交易ID
OrderWrapper también proporciona dos azúcares sintácticos para Maker y Taker para convertir ETH a WETH, por ejemplo:
txid1, _ := orderWrapper.WrapMakerEther(makerKey) // 按订单信息兑换WETH
txid2, _ := orderWrapper.WrapTakerEther(takerKey) // 按订单信息兑换WETH
Dirección de descarga oficial de ZrxTool: http://sc.hubwiz.com/codebag/zrxtool/