Consejos prácticos para el desarrollo de contratos: valiosas experiencias aprendidas del código de Uniswap
Recientemente, al desarrollar un tutorial para un intercambio descentralizado, hice referencia a la implementación del código de un conocido DEX y aprendí varios puntos interesantes. Como un principiante que solo ha desarrollado contratos NFT simples anteriormente, esta es mi primera vez intentando el desarrollo de contratos DeFi, y estas técnicas deberían ser de gran ayuda para los desarrolladores que quieren iniciarse.
A continuación, echemos un vistazo a estos útiles pequeños trucos, algunos de los cuales incluso podrían considerarse como habilidades ingeniosas.
Dirección de despliegue de contrato predecible
Las direcciones de los contratos desplegados suelen parecer aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertos escenarios, necesitamos inferir la dirección del contrato a través de información equivalente de la transacción, lo cual es útil para determinar los permisos de transacción o para obtener la dirección del pool.
Se puede crear un contrato usando el método CREATE2 añadiendo el parámetro salt, de esta manera la dirección generada es predecible. La lógica para generar la dirección es: nueva dirección = hash("0xFF", dirección del creador, salt, initcode).
Uso inteligente de funciones de devolución de llamada
En Solidity, los contratos pueden llamarse entre sí. A veces, el método A llama a B, y B, en el método llamado, devuelve la llamada a A, lo cual es muy útil en ciertos escenarios.
Por ejemplo, al realizar una transacción, el método swap del contrato pool llamará a swapCallback, pasando la cantidad real de tokens necesarios. El llamador debe transferir los tokens en la devolución de llamada, en lugar de dividir el swap en dos llamadas. Esto garantiza la ejecución completa y la seguridad del método swap.
Usar excepciones para transmitir información, implementar la estimación de transacciones con try-catch
Al estimar una transacción, necesitamos simular un swap pero no intercambiar realmente los Token. Se puede lanzar un error especial en la devolución de llamada, y luego capturarlo y analizar los datos necesarios a partir del mensaje de error. De esta manera, no es necesario modificar el método de swap para satisfacer la demanda de estimación, y la lógica es más simple.
Resolver problemas de precisión con grandes números
En cálculos complejos, para evitar la pérdida de precisión en la división, se puede desplazar a la izquierda 96 bits (, lo que equivale a multiplicar por 2^96), y luego desplazar a la derecha después de calcular. De esta manera, se puede garantizar la precisión sin desbordamiento. La pérdida de precisión en la unidad mínima suele ser aceptable.
Cálculo de beneficios usando Share
Para el cálculo de los ingresos de LP, no se puede registrar en cada transacción. Se pueden registrar las tarifas totales y la parte que le corresponde a cada liquidez, y al retirar LP se calculará según la liquidez mantenida. Es similar a los dividendos de acciones, solo es necesario conocer la historia de ingresos por acción y el último tiempo de retiro.
Almacenamiento fuera de la cadena de parte de la información
El almacenamiento en la cadena es relativamente costoso, no toda la información debe estar en la cadena. Por ejemplo, listas de transacciones, información, etc. pueden existir en bases de datos normales, sincronizándose periódicamente desde la cadena. Algunas interfaces RPC avanzadas también ofrecen formas más rápidas y económicas de obtener datos.
División razonable del contrato, aprovechando los estándares existentes
Un proyecto puede contener múltiples contratos implementados en la práctica. Incluso si solo se implementa uno, se puede dividir en múltiples contratos a través de la herencia para su mantenimiento. Al mismo tiempo, se pueden utilizar contratos estándar existentes como ERC721 para mejorar la eficiencia del desarrollo.
Resumen
Realizar una versión simplificada de un DEX por uno mismo permite entender mejor la implementación del código y aprender más sobre puntos de conocimiento en proyectos reales. Se sugiere a los amigos interesados que intenten seguir los tutoriales relacionados paso a paso, estoy seguro de que habrá grandes recompensas.
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
Análisis del código fuente de Uniswap: 7 consejos de desarrollo de contratos para ayudar a principiantes en DEX
Consejos prácticos para el desarrollo de contratos: valiosas experiencias aprendidas del código de Uniswap
Recientemente, al desarrollar un tutorial para un intercambio descentralizado, hice referencia a la implementación del código de un conocido DEX y aprendí varios puntos interesantes. Como un principiante que solo ha desarrollado contratos NFT simples anteriormente, esta es mi primera vez intentando el desarrollo de contratos DeFi, y estas técnicas deberían ser de gran ayuda para los desarrolladores que quieren iniciarse.
A continuación, echemos un vistazo a estos útiles pequeños trucos, algunos de los cuales incluso podrían considerarse como habilidades ingeniosas.
Dirección de despliegue de contrato predecible
Las direcciones de los contratos desplegados suelen parecer aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertos escenarios, necesitamos inferir la dirección del contrato a través de información equivalente de la transacción, lo cual es útil para determinar los permisos de transacción o para obtener la dirección del pool.
Se puede crear un contrato usando el método CREATE2 añadiendo el parámetro salt, de esta manera la dirección generada es predecible. La lógica para generar la dirección es: nueva dirección = hash("0xFF", dirección del creador, salt, initcode).
Uso inteligente de funciones de devolución de llamada
En Solidity, los contratos pueden llamarse entre sí. A veces, el método A llama a B, y B, en el método llamado, devuelve la llamada a A, lo cual es muy útil en ciertos escenarios.
Por ejemplo, al realizar una transacción, el método swap del contrato pool llamará a swapCallback, pasando la cantidad real de tokens necesarios. El llamador debe transferir los tokens en la devolución de llamada, en lugar de dividir el swap en dos llamadas. Esto garantiza la ejecución completa y la seguridad del método swap.
Usar excepciones para transmitir información, implementar la estimación de transacciones con try-catch
Al estimar una transacción, necesitamos simular un swap pero no intercambiar realmente los Token. Se puede lanzar un error especial en la devolución de llamada, y luego capturarlo y analizar los datos necesarios a partir del mensaje de error. De esta manera, no es necesario modificar el método de swap para satisfacer la demanda de estimación, y la lógica es más simple.
Resolver problemas de precisión con grandes números
En cálculos complejos, para evitar la pérdida de precisión en la división, se puede desplazar a la izquierda 96 bits (, lo que equivale a multiplicar por 2^96), y luego desplazar a la derecha después de calcular. De esta manera, se puede garantizar la precisión sin desbordamiento. La pérdida de precisión en la unidad mínima suele ser aceptable.
Cálculo de beneficios usando Share
Para el cálculo de los ingresos de LP, no se puede registrar en cada transacción. Se pueden registrar las tarifas totales y la parte que le corresponde a cada liquidez, y al retirar LP se calculará según la liquidez mantenida. Es similar a los dividendos de acciones, solo es necesario conocer la historia de ingresos por acción y el último tiempo de retiro.
Almacenamiento fuera de la cadena de parte de la información
El almacenamiento en la cadena es relativamente costoso, no toda la información debe estar en la cadena. Por ejemplo, listas de transacciones, información, etc. pueden existir en bases de datos normales, sincronizándose periódicamente desde la cadena. Algunas interfaces RPC avanzadas también ofrecen formas más rápidas y económicas de obtener datos.
División razonable del contrato, aprovechando los estándares existentes
Un proyecto puede contener múltiples contratos implementados en la práctica. Incluso si solo se implementa uno, se puede dividir en múltiples contratos a través de la herencia para su mantenimiento. Al mismo tiempo, se pueden utilizar contratos estándar existentes como ERC721 para mejorar la eficiencia del desarrollo.
Resumen
Realizar una versión simplificada de un DEX por uno mismo permite entender mejor la implementación del código y aprender más sobre puntos de conocimiento en proyectos reales. Se sugiere a los amigos interesados que intenten seguir los tutoriales relacionados paso a paso, estoy seguro de que habrá grandes recompensas.