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.
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.
18 me gusta
Recompensa
18
4
Compartir
Comentar
0/400
New_Ser_Ngmi
· 07-13 10:26
¿Y eso es un novato?
Ver originalesResponder0
gas_fee_trauma
· 07-12 21:18
El contrato es difícil de morder, hermano.
Ver originalesResponder0
SchrodingerAirdrop
· 07-12 21:18
Renacimiento, renazco en el comercio anómalo.
Ver originalesResponder0
degenwhisperer
· 07-12 21:17
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.