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