Análisis del código fuente de Uniswap: 7 consejos de desarrollo de contratos para ayudar a principiantes en DEX

robot
Generación de resúmenes en curso

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.

Serie para principiantes de Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap

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).

Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap

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.

Serie para principiantes de Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap

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.

Serie para principiantes de Web3: Consejos pequeños de desarrollo de contratos que aprendí del código de Uniswap

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.

Serie para principiantes de Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap

Ver originales
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.
  • Recompensa
  • 5
  • Compartir
Comentar
0/400
SelfSovereignStevevip
· hace15h
Novato, no te fuerces con el código fuente.
Ver originalesResponder0
TooScaredToSellvip
· hace15h
¿De qué sirve aprender esto? Seguiré perdiendo dinero.
Ver originalesResponder0
ChainMaskedRidervip
· hace15h
La buena noticia para los novatos de DEX ha llegado
Ver originalesResponder0
OnchainUndercovervip
· hace16h
Aprender U es tan fácil como copiar tareas.
Ver originalesResponder0
PretendingSeriousvip
· hace16h
Mm-hmm, perspectivas valiosas.
Ver originalesResponder0
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)