7 grandes consejos para analizar los contratos inteligentes de Uniswap: lectura obligada para desarrolladores de Web3

Lo que todo desarrollador de Web3 debe saber: valiosas lecciones extraídas del contrato de Uniswap

Recientemente, mientras escribía un tutorial de desarrollo para un intercambio descentralizado, investigué a fondo la implementación del código de Uniswap V3 y he aprendido mucho. Como un principiante que acaba de entrar en el desarrollo de contratos DeFi, estas técnicas han sido sin duda una revelación para mí. Estoy seguro de que esta experiencia también será de gran ayuda para otros amigos que deseen iniciarse en el desarrollo de contratos inteligentes.

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

Trucos para predecir la dirección del contrato

En general, la dirección obtenida después de desplegar un contrato parece aleatoria y es difícil de predecir. Sin embargo, en Uniswap, podemos deducir la dirección del contrato a través de los pares de comercio y la información relacionada. Esto es muy útil en escenarios como determinar los permisos de transacción o obtener la dirección de un fondo.

Uniswap utiliza el método CREATE2 para crear contratos, añadiendo el parámetro "salt" para que la dirección generada sea predecible. La lógica específica de generación de direcciones es: nueva dirección = hash("0xFF", dirección del creador, salt, initcode).

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

Uso inteligente de funciones de devolución de llamada

En ciertos escenarios, la llamada mutua entre contratos es muy útil. Por ejemplo, el método A llama a B, y B hace una llamada de retorno a A en el método llamado.

En Uniswap, al llamar al método swap del contrato UniswapV3Pool para realizar una transacción, se llamará a swapCallback, pasando la cantidad real de tokens necesarios calculada. El llamador debe transferir los tokens necesarios al UniswapV3Pool en la devolución de llamada. Este diseño garantiza la seguridad y la integridad lógica del método swap, sin necesidad de un registro complicado de variables.

Excepción de información de transmisión, implementación de estimación de transacciones con try-catch

En el contrato Quoter de Uniswap, se utiliza un bloque try-catch para ejecutar el método swap de UniswapV3Pool. Esto es para simular el swap y estimar los tokens necesarios para la transacción. Dado que no se intercambian tokens realmente durante la estimación, se generará un error. Uniswap lanza un error especial en la función de callback de la transacción, y luego captura ese error y extrae la información necesaria de él.

Este método parece ser un atajo, pero es muy práctico. No es necesario modificar el método swap específicamente para estimar la demanda de transacciones, la lógica es más sencilla.

La operación de grandes números resuelve problemas de precisión

El código de Uniswap involucra una gran cantidad de lógica de cálculo, como el cálculo de la cantidad de tokens a intercambiar según el precio actual y la liquidez. Para evitar la pérdida de precisión debido a las operaciones de división, el proceso de cálculo utiliza frecuentemente la operación "<< FixedPoint96.RESOLUTION", que equivale a desplazar 96 bits a la izquierda, lo que corresponde a multiplicar por 2^96. Bajo la premisa de que no hay desbordamientos en transacciones normales, ( se calcula generalmente con uint256 ), este método puede garantizar efectivamente la precisión.

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

Cálculo de beneficios del mecanismo de Share

Uniswap necesita registrar los ingresos por tarifas de los proveedores de liquidez LP(. Evidentemente, no se puede registrar individualmente las tarifas para cada LP en cada transacción, ya que esto consumiría una gran cantidad de Gas.

La solución de Uniswap es definir feeGrowthInside0LastX128 y feeGrowthInside1LastX128 en la estructura Position, que registra la tarifa que debe recibir cada unidad de liquidez en cada posición cuando se retira la tarifa por última vez.

Este método solo requiere registrar la tarifa total y la tarifa que debe asignarse a cada unidad de liquidez. Al retirar LP, se puede calcular la tarifa extraíble según la liquidez poseída. Esto es similar a cómo los accionistas calculan las ganancias extraíbles actuales basándose en las ganancias por acción históricas de la empresa y las ganancias del último retiro.

![Serie para principiantes de Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(

Compromisos en la obtención de información en la cadena

El almacenamiento en cadena es relativamente caro y no toda la información necesita estar en la cadena o ser recuperada de la cadena. Por ejemplo, muchas de las interfaces llamadas por el sitio web frontal de Uniswap son interfaces tradicionales de Web2.

Las listas de pools de negociación, la información de los pools de negociación, etc., se pueden almacenar en una base de datos común, y algunos pueden necesitar sincronización periódica desde la cadena. No es necesario llamar en tiempo real a la cadena o a la interfaz RPC del servicio de nodos para obtener datos relacionados.

Por supuesto, las transacciones clave deben realizarse en la cadena. Ahora muchos proveedores de RPC de blockchain ofrecen interfaces avanzadas que permiten obtener ciertos datos de manera más rápida y económica.

Dividir contratos y reutilizar contratos estándar

Un proyecto puede contener múltiples contratos realmente desplegados. Incluso si solo hay un contrato desplegado, también podemos dividir el código en múltiples contratos para su mantenimiento a través de la herencia.

Por ejemplo, el contrato NonfungiblePositionManager de Uniswap hereda múltiples contratos. Además, el contrato ERC721Permit utiliza directamente el contrato estándar ERC721 de OpenZeppelin. Esto no solo facilita la gestión de posiciones a través de NFT, sino que también aprovecha los contratos estándar existentes para mejorar la eficiencia del desarrollo.

Conclusión

La práctica trae el verdadero conocimiento. Participar personalmente en el desarrollo de un intercambio descentralizado de versión simplificada te permitirá comprender más a fondo la implementación del código de Uniswap, al mismo tiempo que aprendes más sobre puntos de conocimiento en proyectos reales. Si estás interesado en el desarrollo de proyectos Web3 y DeFi, considera consultar cursos prácticos relacionados y completar un intercambio simplificado paso a paso. Estoy seguro de que esto será de gran beneficio para tu aprendizaje.

![Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(

UNI-3.57%
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
  • 4
  • Compartir
Comentar
0/400
AirdropHunter9000vip
· 08-04 14:09
Defi no es más que un juego de caida a cero... los que entienden, entienden.
Ver originalesResponder0
TokenAlchemistvip
· 08-04 14:09
lmao imagina no saber sobre CREATE2 para direcciones determinísticas... ngmi tbh
Ver originalesResponder0
RugpullAlertOfficervip
· 08-04 14:08
Este es un tutorial totalmente básico para novatos.
Ver originalesResponder0
AllTalkLongTradervip
· 08-04 14:02
No mirar el código, mirar la DIRECCIÓN. ¿Es pereza o es alto?
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)