Kit de desarrollo de Golang de acoplamiento de protocolo 0x [DEX]

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:

Inserte la descripción de la imagen aquí

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:
Inserte la descripción de la imagen aquí

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:

Inserte la descripción de la imagen aquí

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:

Inserte la descripción de la imagen aquí

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:

Inserte la descripción de la imagen aquí

Ejecutar orden 0x : ejecute la siguiente orden para liquidar la orden en la cadena:

go run demo/fillorder.go

El resultado es el siguiente:

Inserte la descripción de la imagen aquí

3. Cree un pedido 0x

La clase de entrada del kit de desarrollo ZrxTool OrderWrapperse 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 MakerAssetDatasuma TakerAssetDatadel 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 Signaturecampos 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/

Supongo que te gusta

Origin blog.csdn.net/shebao3333/article/details/107551410
Recomendado
Clasificación