Las técnicas de desarrollo de contratos que aprendí leyendo el código de Uniswap son mucho más interesantes que los libros de texto



Recientemente, al hacer una guía de desarrollo de intercambios descentralizados, profundicé en la implementación de Uniswap V3 y descubrí que algunas formas de escribir el código son realmente ingeniosas. Antes solo había escrito contratos simples de NFT, esta vez fue la primera vez que me puse a entender en serio el código de contratos DeFi, y encontré muchas cosas que vale la pena compartir con quienes quieren aprender sobre Uniswap.

Primero, una cosa que me sorprendió mucho: ¿se puede predecir la dirección del contrato?

Generalmente, la dirección de un contrato desplegado parece aleatoria, pero Uniswap usó un método inteligente. Utiliza el parámetro salt al crear el contrato, junto con la operación CREATE2, para que la dirección generada sea predecible. La forma concreta es «pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());» en ese código. La ventaja de esto es que, solo con conocer los tokens y la tarifa, se puede calcular la dirección del contrato del pool sin tener que desplegarlo realmente. Esto es muy útil para verificar permisos de transacción o localizar rápidamente el pool.

El diseño de las funciones de callback también es bastante ingenioso.

En Uniswap, cuando llamas al método swap para hacer un intercambio, se llama a la función swapCallback, que pasa la cantidad de tokens necesaria calculada, y en la devolución de llamada tú transfieres los tokens. La ventaja es que toda la lógica de la transacción se ejecuta de forma completa, sin necesidad de dividir en múltiples pasos o usar variables complejas para garantizar la seguridad. En resumen, A llama a B, y B en su callback vuelve a llamar a A, formando un ciclo cerrado.

El método para estimar transacciones también es bastante hacky: usa excepciones para transmitir información.

Porque al estimar una transacción, en realidad no se realiza un intercambio de tokens, solo se simula. La forma de Uniswap es lanzar errores especiales en el callback, y usar try-catch para capturarlos y analizar la información del error. Parece un poco salvaje, pero es muy práctico, ya que permite implementar la estimación sin modificar mucho el método swap.

La solución para el problema de precisión también es digna de aprender.

Al calcular el intercambio de tokens, si simplemente haces una división, puedes perder precisión. La estrategia de Uniswap es primero desplazar a la izquierda 96 bits (equivalente a multiplicar por 2^96), luego hacer la división, y finalmente eliminar el factor 2^96 en el proceso. Así, dentro del rango de uint256, se puede garantizar precisión sin desbordamiento. Los valores sqrtRatioAX96 y sqrtRatioBX96 en el código reflejan esta lógica, aunque parecen complejos, la idea es clara.

La forma inteligente de calcular las ganancias por tarifas también es muy buena.

En lugar de registrar las tarifas en cada transacción para cada LP (lo cual consumiría mucho gas), se registra la tarifa total y la proporción que corresponde a cada liquidez. Cuando un LP retira, solo necesita multiplicar su liquidez por la tarifa acumulada por acción para calcular sus ganancias, como un accionista que recibe dividendos según sus acciones. Este método de cálculo de participaciones (Share) se aplica en muchos proyectos.

También es muy importante que no toda la información tenga que estar en la cadena.

La lista de pools, información básica, etc., se puede mantener en bases de datos tradicionales, sincronizándose periódicamente desde la cadena, sin necesidad de llamadas RPC en tiempo real. Muchos proveedores de servicios blockchain ahora ofrecen interfaces avanzadas para obtener datos más rápido y barato, siguiendo esta misma lógica.

Por último, la organización del código.

Un proyecto complejo suele dividir los contratos en varias partes para facilitar el mantenimiento, y Uniswap hereda muchos contratos. Además, hay que aprovechar los contratos estándar existentes, como usar directamente OpenZeppelin ERC721 para gestionar las posiciones, lo que mejora la eficiencia y la calidad del código.

Honestamente, leer muchos artículos no reemplaza la experiencia práctica. Al implementar una versión sencilla de un intercambio descentralizado, realmente entiendes por qué Uniswap diseña las cosas así. El curso WTF-DApp está basado en esta idea, guiándote paso a paso en la realización de un proyecto práctico de Uniswap, y seguramente te será de gran ayuda para tu desarrollo de contratos.
Ver original
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
  • Comentar
  • Republicar
  • Compartir
Comentar
Añadir un comentario
Añadir un comentario
Sin comentarios
  • Anclado