Desarrollo de contratos inteligentes avanzado: 7 consejos prácticos para impulsar proyectos DeFi

robot
Generación de resúmenes en curso

Compartir técnicas y experiencias de desarrollo de contratos

Recientemente, durante el desarrollo de un intercambio descentralizado, consulté la implementación del código de Uniswap V3 y aprendí varias técnicas prácticas para el desarrollo de contratos. Como desarrollador que anteriormente había creado contratos NFT simples, esta vez mi intento de desarrollar contratos DeFi me ha brindado grandes beneficios. Estas técnicas deberían ser muy útiles para los principiantes que desean aprender sobre el desarrollo de contratos.

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

Dirección de contrato predecible

Normalmente, al desplegar un contrato se obtiene una dirección que parece aleatoria, ya que está relacionada con el nonce. Pero en ciertos escenarios, necesitamos inferir la dirección del contrato a través de la información correspondiente a la transacción, como evaluar los permisos de la transacción o obtener la dirección de un pool.

Un método práctico es usar CREATE2 para crear contratos. Al agregar el parámetro salt, se puede hacer que la dirección del contrato creado sea predecible. La lógica de generación de la nueva dirección es: hash("0xFF", dirección del creador, salt, initcode). Este método nos permite conocer la dirección del contrato antes de crearlo.

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

Uso eficaz de las funciones de callback

En Solidity, los contratos pueden llamarse entre sí. En ciertos escenarios, A llama al método de B, y B realiza una llamada de vuelta a A en el método que fue llamado, este patrón es muy útil.

Por ejemplo, durante una transacción, el contrato del pool llamará a swapCallback, pasando la cantidad de Token que realmente se necesita para esta transacción. El llamador debe transferir los Tokens al contrato del pool en la callback. Este método garantiza la seguridad y la integridad del método swap, sin la necesidad de registros de variables complicados.

Usar excepciones para transmitir información, estimar transacciones con try-catch

Al estimar una transacción, necesitamos simular el método swap pero sin intercambiar realmente los Tokens. Una forma ingeniosa de hacerlo es lanzar un error especial en la devolución de llamada de la transacción y luego capturar ese error para extraer la información necesaria. Este enfoque evita tener que modificar el método swap específicamente para la estimación de transacciones, lo que hace que la lógica sea más sencilla.

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

Solución de problemas de precisión de grandes números

Al tratar con el cálculo de precios y liquidez, para evitar la pérdida de precisión en las operaciones de división, se puede utilizar la operación de desplazamiento a la izquierda ( que equivale a multiplicar por 2^96). De esta manera, se puede garantizar la precisión en condiciones normales de transacción sin desbordamientos. Aunque teóricamente aún habrá una pequeña pérdida de precisión, ya es aceptable.

Cálculo de beneficios mediante el método de participación

Para el cálculo de los ingresos por tarifas de LP, no se puede registrar cada transacción para cada LP, ya que esto consumiría una gran cantidad de Gas. Una buena manera es registrar la tarifa total y la tarifa que se debe asignar por unidad de liquidez. Al retirar LP, se calcula la tarifa que se puede retirar en función de la liquidez mantenida, similar al principio de los dividendos de acciones.

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

Combinación de datos en cadena y fuera de cadena

No toda la información necesita ser almacenada en la cadena o recuperada de ella. Información como la lista de grupos de transacciones, información de grupos, etc., puede almacenarse en bases de datos comunes y sincronizarse periódicamente desde la cadena. Esto puede mejorar el rendimiento y la eficiencia, y reducir costos. Por supuesto, las transacciones clave aún deben realizarse en la cadena.

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

Un proyecto puede incluir múltiples contratos implementados en la práctica. Incluso si solo se implementa un contrato, el código puede dividirse en múltiples contratos mediante la herencia para su mantenimiento.

Al mismo tiempo, utilizar contratos estándar existentes como ( o ERC721) puede mejorar la eficiencia del desarrollo. Por ejemplo, usar ERC721 para gestionar posiciones es conveniente y permite reutilizar código maduro.

Resumen

La mejor manera de aprender es mediante el desarrollo práctico. Intentar implementar una versión simplificada de un intercambio descentralizado te permitirá comprender más a fondo la implementación del código de Uniswap y aprender más sobre los puntos de conocimiento en proyectos reales. Espero que estas experiencias compartidas te sean de ayuda.

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

Ver originales
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Recompensa
  • 3
  • Compartir
Comentar
0/400
gas_fee_traumavip
· hace12h
El contrato es difícil de morder, hermano.
Ver originalesResponder0
SchrodingerAirdropvip
· hace12h
Renacimiento, renazco en el comercio anómalo.
Ver originalesResponder0
degenwhisperervip
· hace12h
v3, en última instancia, sigue siendo poco flexible.
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)