Revelando el código de Uniswap: 7 consejos de desarrollo de contratos para ayudar a los Novatos de Defi

Técnicas de desarrollo de contratos aprendidas del código de Uniswap

Recientemente, al redactar un tutorial sobre el desarrollo de intercambios descentralizados, hice referencia a la implementación del código de Uniswap V3 y aprendí muchos puntos valiosos. Como desarrollador que intenta por primera vez crear contratos DeFi, estas técnicas serán de gran ayuda para los principiantes que desean aprender sobre el desarrollo de contratos.

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

Dirección de despliegue de contrato predecible

Normalmente, las direcciones obtenidas al desplegar un contrato parecen aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertos casos, necesitamos inferir la dirección del contrato a través de pares de transacciones e información relacionada, como determinar los permisos de transacción o obtener la dirección del pool.

Uniswap utiliza el método CREATE2 para crear contratos, haciendo que la dirección generada sea predecible al añadir el parámetro salt. La lógica de cálculo de la nueva dirección es: hash("0xFF", dirección del creador, salt, initcode).

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

Uso inteligente de funciones de retorno

Los contratos en Solidity pueden llamarse entre sí. En ciertos escenarios, es útil que A llame al método de B y que B haga una llamada de vuelta a A en el método que se invoca.

En Uniswap, al llamar al método swap del contrato UniswapV3Pool para realizar una transacción, se hará una llamada de retorno a swapCallback, pasando el Token que realmente se necesita para esta transacción. El llamador debe transferir el Token requerido al UniswapV3Pool en la llamada de retorno, en lugar de dividir el método swap en dos partes. Esto asegura la seguridad del método swap y la ejecución completa, sin necesidad de llevar un registro complicado de variables.

Utilizar excepciones para transmitir información, implementar la estimación de transacciones con try catch

En el contrato Quoter de Uniswap, el método swap del UniswapV3Pool se ejecuta envuelto en un bloque try catch. Esto es para simular la estimación de tokens necesarios para la transacción de swap, pero durante la estimación no se producirá un intercambio real de tokens, por lo que se generará un error.

Uniswap logra esto lanzando un error especial en la función de callback de la transacción y luego capturando ese error para extraer la información necesaria del mensaje de error. Este método parece un atajo, pero es muy práctico, ya que no requiere modificar el método de intercambio para estimar la demanda de transacciones, y la lógica es más simple.

![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-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(

Uso de números grandes para resolver problemas de precisión

En el código de Uniswap hay mucha lógica de cálculo, como calcular el Token intercambiado según el precio actual y la liquidez. Para evitar la pérdida de precisión en las operaciones de división, el proceso de cálculo a menudo utiliza la operación "<< FixedPoint96.RESOLUTION", es decir, un desplazamiento a la izquierda de 96 bits, equivalente a multiplicar por 2^96.

Después de un desplazamiento a la izquierda, se puede realizar la operación de división, garantizando la precisión en condiciones normales de transacción sin desbordamiento. Aunque teóricamente aún habrá una pérdida mínima de precisión, esto es aceptable.

Calcular ingresos utilizando el método de Share

Uniswap necesita registrar las ganancias por comisiones de los proveedores de liquidez LP). Para evitar consumir una gran cantidad de Gas registrando las comisiones de cada LP en cada transacción, Uniswap ha adoptado un método ingenioso.

La estructura Position contiene feeGrowthInside0LastX128 y feeGrowthInside1LastX128, que registran las tarifas de cada posición en el último retiro de tarifas, así como las tarifas que cada liquidez debe recibir. Solo es necesario registrar la tarifa total y la tarifa que debe asignarse a cada liquidez; al retirar, la tarifa que se puede extraer se calcula según la liquidez mantenida.

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

Estrategias para obtener información en la cadena

No toda la información necesita ser obtenida de la cadena. Almacenar en la cadena es relativamente costoso, y mucha información se puede almacenar en bases de datos comunes, sincronizándose periódicamente desde la cadena.

La lista de grupos de negociación, la información del grupo de negociación, etc., se pueden almacenar en una base de datos normal, sin necesidad de llamar en tiempo real a la interfaz RPC de la cadena o del servicio de nodos. Por supuesto, las transacciones clave aún se realizan en la cadena.

División de contratos y utilización de contratos estándar

Un proyecto puede incluir múltiples contratos realmente desplegados. Incluso si solo hay un contrato realmente desplegado, el código también se puede dividir en múltiples contratos mediante la herencia.

Por ejemplo, el contrato NonfungiblePositionManager de Uniswap hereda de varios contratos. Al utilizar el contrato ERC721 de OpenZeppelin, es conveniente gestionar posiciones a través de NFT y también mejora la eficiencia del desarrollo.

Conclusión

La práctica es el mejor método de aprendizaje. Intentar implementar una versión simplificada de un intercambio descentralizado puede llevar a una comprensión más profunda de la implementación del código de Uniswap y a aprender más puntos de conocimiento en proyectos prácticos. Si estás interesado en el desarrollo de proyectos Web3 y DeFi, puedes consultar cursos prácticos relacionados y completar gradualmente una versión simplificada del intercambio.

Serie de 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
  • 3
  • Compartir
Comentar
0/400
BlockchainBouncervip
· 07-06 09:29
La esencia del análisis de código
Ver originalesResponder0
RektButSmilingvip
· 07-03 10:38
¡Exactamente, Novato, enseñanza!
Ver originalesResponder0
SchrodingerGasvip
· 07-03 10:38
Vale la pena estudiar y aprender.
Ver originalesResponder0
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)