7 grandes consejos para el desarrollo de contratos: aprende las mejores prácticas de Finanzas descentralizadas a partir del código de DEX

Técnicas sorprendentes para el desarrollo de contratos: lecciones aprendidas del código de Uniswap

Recientemente, al escribir un tutorial sobre el desarrollo de intercambios descentralizados, consulté la implementación de código de un conocido DEX y aprendí bastante. Como un desarrollador que ha creado contratos NFT simples, esta es mi primera vez intentando desarrollar contratos DeFi, y creo que estos pequeños consejos serán muy útiles para los novatos que quieran aprender sobre el desarrollo de contratos.

A continuación, echemos un vistazo a estos trucos interesantes, algunos de los cuales incluso pueden considerarse habilidades ingeniosas.

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

Dirección de despliegue de contrato predecible

Normalmente, al desplegar un contrato se obtiene una dirección que parece aleatoria, ya que está relacionada con el nonce, por lo que la dirección del contrato no es fácil de predecir. Pero en ciertos escenarios, necesitamos inferir la dirección del contrato a través de pares de transacciones e información relacionada. Esto es muy útil en muchos casos, como determinar los permisos de transacción o obtener la dirección de un pool de liquidez, entre otros.

Se puede crear un contrato utilizando el método CREATE2 añadiendo el parámetro salt, de esta manera la dirección del contrato creado es predecible. La lógica de generación de dirección 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

Utilizar adecuadamente las funciones de callback

En Solidity, los contratos pueden invocarse entre sí. Hay un escenario en el que A llama a B en un método, y B hace un callback a A en el método llamado, lo cual es muy útil en ciertos casos.

Por ejemplo, cuando llamas al método swap de un contrato DEX para realizar una transacción, este llamará a swapCallback, pasando el Token necesario para la transacción calculado. El llamador necesita transferir el Token requerido para la transacción al contrato DEX en la llamada de retorno, en lugar de dividir el método swap en dos partes para que el llamador lo llame. Esto asegura la seguridad del método swap, garantizando que toda la lógica se ejecute de manera completa, sin la necesidad de registros de variables complicados para asegurar la seguridad.

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

En el código de algunos DEX, encontramos que el método swap está envuelto en un bloque try catch. ¿Por qué es esto? Porque necesitamos simular el método swap para estimar los tokens necesarios para la transacción, pero durante la estimación no se produce un intercambio real de tokens, por lo que se genera un error. Este método lanza un error especial en la función de devolución de llamada de la transacción y luego captura este error, extrayendo la información necesaria del mensaje de error.

Esto parece un poco astuto, pero es muy práctico. De esta manera, no es necesario modificar el método de intercambio para estimar la demanda de transacciones, 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 el código del DEX, hay mucha lógica de cálculo, como calcular los tokens intercambiados según el precio actual y la liquidez. En este proceso, debemos evitar la pérdida de precisión al realizar operaciones de división. En algunas implementaciones, el proceso de cálculo a menudo utiliza la operación "<< FixedPoint96.RESOLUTION", que representa un desplazamiento de 96 bits a la izquierda, equivalente a multiplicar por 2^96. Después de desplazar a la izquierda, se realiza la operación de división, lo que puede garantizar la precisión en condiciones normales de comercio sin desbordarse (, que generalmente se calcula con uint256, suficiente para ).

Cálculo de ganancias utilizando el método Share

En DEX, necesitamos registrar los ingresos por tarifas de los proveedores de liquidez LP(. Es evidente que no se puede registrar la tarifa de cada LP en cada transacción, ya que eso consumiría una gran cantidad de Gas. ¿Cómo deberíamos manejarlo?

Se puede definir una estructura que contenga feeGrowthInside0LastX128 y feeGrowthInside1LastX128 en Position, que registran las tarifas que cada liquidez debería recibir la última vez que se retiraron las tarifas de cada posición.

En pocas palabras, solo necesitas registrar la tarifa total y la tarifa que se debe asignar a cada liquidez. Cuando un LP retira la tarifa, se puede calcular la tarifa extraíble según la liquidez que posee. Esto es similar a poseer acciones de una empresa; al retirar las ganancias de las acciones, solo necesitas saber las ganancias por acción históricas de la empresa y las ganancias de tu ú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(

No toda la información necesita ser obtenida de la cadena.

El almacenamiento en la cadena es relativamente costoso, por lo tanto, no toda la información debe estar en la cadena o recuperarse de la cadena. Por ejemplo, muchas de las interfaces que utilizan ciertos sitios web de front-end de DEX son interfaces tradicionales de Web2.

La lista de pools de negociación, la información del pool de negociación, etc., se pueden almacenar en una base de datos normal, algunos pueden necesitar sincronización periódica desde la cadena, pero no es necesario llamar en tiempo real a la interfaz RPC proporcionada por la cadena o el servicio de nodo para obtener los datos relevantes.

Por supuesto, las transacciones clave se realizan en la cadena.

Aprende a descomponer contratos, utilizando contratos estándar existentes

Un proyecto puede contener múltiples contratos implementados en la práctica. Incluso si solo hay un contrato implementado, también podemos dividir el contrato en varios contratos mediante la herencia para su mantenimiento.

Además, se pueden utilizar contratos estándar como @openzeppelin/contracts/token/ERC721/ERC721.sol directamente. De esta manera, por un lado se puede gestionar la posición a través de NFT, y por otro lado, también se puede mejorar la eficiencia de desarrollo utilizando contratos estándar existentes.

Resumen

La práctica personal de desarrollar una versión simplificada de un intercambio descentralizado (DEX) te permitirá comprender más a fondo la implementación del código de un DEX y también aprenderás más sobre los puntos de conocimiento en proyectos reales. Ya sea que te interese el desarrollo de proyectos de Web3 o DeFi, la experiencia práctica será de gran ayuda para ti.

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

DEFI3.33%
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
  • 6
  • Compartir
Comentar
0/400
rekt_but_resilientvip
· 07-31 11:05
La dirección del contrato es realmente asombrosa.
Ver originalesResponder0
AltcoinMarathonervip
· 07-31 06:49
Profundizando en contratos inteligentes
Ver originalesResponder0
ZkSnarkervip
· 07-31 03:30
Vale la pena investigar un poco.
Ver originalesResponder0
LiquidityNinjavip
· 07-28 11:40
He aprendido algo nuevo.
Ver originalesResponder0
OldLeekNewSicklevip
· 07-28 11:40
El código es dinero.
Ver originalesResponder0
WhaleWatchervip
· 07-28 11:38
Los detalles están muy bien explicados.
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)