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.
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.
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.
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.
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.
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.
12 me gusta
Recompensa
12
3
Compartir
Comentar
0/400
gas_fee_trauma
· hace12h
El contrato es difícil de morder, hermano.
Ver originalesResponder0
SchrodingerAirdrop
· hace12h
Renacimiento, renazco en el comercio anómalo.
Ver originalesResponder0
degenwhisperer
· hace12h
v3, en última instancia, sigue siendo poco flexible.
Desarrollo de contratos inteligentes avanzado: 7 consejos prácticos para impulsar proyectos DeFi
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.
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.
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.
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.
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.