Consejos de desarrollo de contratos: lecciones aprendidas del código de Uniswap
Recientemente, al participar en un proyecto de tutorial sobre el desarrollo de un intercambio descentralizado, consulté la implementación del código de un conocido DEX y aprendí muchos puntos de conocimiento interesantes. Como un principiante que solo había desarrollado contratos NFT simples anteriormente, este intento de desarrollar contratos DeFi me ha sido muy enriquecedor. A continuación, compartiré algunos trucos prácticos que, estoy seguro, serán de gran ayuda para los nuevos que deseen aprender sobre el desarrollo de contratos.
Dirección de contrato predecible
La dirección que se obtiene al desplegar un contrato parece aleatoria, ya que está relacionada con el nonce. Sin embargo, en ciertos casos, necesitamos inferir la dirección del contrato a través de la información de las transacciones, como determinar los permisos de transacción o obtener la dirección del pool.
Un método de implementación es usar CREATE2 para crear un contrato. Al agregar un parámetro de salt, se puede hacer que la dirección del contrato generado sea predecible. La lógica para generar la nueva dirección es: hash("0xFF", dirección del creador, salt, initcode).
Uso inteligente de funciones de retorno
En Solidity, los contratos pueden llamarse entre sí. Un escenario común es que A llama a un método de B, y B realiza una llamada de vuelta a A en el método que se invoca. Esto es muy útil en ciertos casos.
Por ejemplo, en un DEX, cuando llamas al método swap del contrato del pool para realizar una transacción, se llamará a swapCallback, pasando la cantidad de tokens necesaria calculada para esta transacción. El llamador debe transferir los tokens requeridos al contrato del pool en la devolución de llamada, en lugar de descomponer el método swap. Esto asegura la seguridad del método swap y la ejecución completa, sin necesidad de registros de variables complicados.
Utilizar excepciones para transmitir información, implementar la estimación de transacciones con try-catch
En algunos casos, necesitamos simular el método swap para estimar la cantidad de tokens necesarios para la transacción, pero al estimar no se intercambiarán realmente los tokens, por lo que se producirá un error. Una forma ingeniosa de manejarlo es lanzar un error especial en la función de devolución de llamada de la transacción y luego capturar ese error, extrayendo la información necesaria del mensaje de error.
Este método parece un poco ingenioso, pero es muy práctico. Evita la modificación del método swap para estimar la demanda de transacciones, lo que hace que la lógica sea más sencilla.
Resolver problemas de precisión con grandes números
En escenarios que involucran el cálculo de precios y liquidez, necesitamos evitar la pérdida de precisión causada por las operaciones de división. Una técnica común es desplazar a la izquierda 96 bits durante el proceso de cálculo (equivalente a multiplicar por 2^96) y luego realizar la operación de división. Esto puede garantizar la precisión sin desbordamientos en transacciones normales.
Aunque teóricamente aún habrá una pequeña pérdida de precisión, generalmente se trata solo de la pérdida de la unidad mínima, lo cual es aceptable.
Cálculo de beneficios mediante Share
Para los escenarios que requieren registrar los ingresos por tarifas de transacción de los proveedores de liquidez (LP), no podemos registrar las tarifas para cada LP en cada transacción, ya que eso consumirá una gran cantidad de gas. Un método eficiente es registrar la tarifa total y la tarifa que debe asignarse por cada unidad de liquidez.
Al retirar tarifas de LP, solo se necesita calcular las tarifas extraíbles según la liquidez poseída. Esto es similar a cómo los accionistas calculan los ingresos extraíbles actuales basándose en las ganancias por acción históricas de la empresa y los ingresos del último retiro.
Uso razonable de datos fuera de la cadena
Almacenamiento en la cadena es relativamente caro, y no toda la información necesita estar en la cadena o ser obtenida de la cadena. Por ejemplo, la lista de la piscina de transacciones, la información de la piscina, etc., se pueden almacenar en bases de datos tradicionales y sincronizarse periódicamente desde la cadena.
Muchos proveedores de RPC de blockchain también ofrecen interfaces avanzadas que permiten obtener ciertos datos de manera más rápida y económica. Estas interfaces suelen utilizar cachés para mejorar el rendimiento y la eficiencia.
Aprender a dividir contratos y utilizar contratos estándar
Un proyecto puede contener múltiples contratos desplegados en la práctica. Incluso si solo se despliega un contrato, también podemos dividir el código en múltiples contratos para mantenerlo a través de la herencia.
Además, utilizar contratos estándar existentes (como ERC721) puede aumentar la eficiencia del desarrollo. Por ejemplo, se puede usar el contrato ERC721 para gestionar posiciones de liquidez, lo que es conveniente y mejora la eficiencia del desarrollo.
Resumen
La práctica es el mejor método de aprendizaje. Intentar implementar una versión simplificada de un intercambio descentralizado puede ayudarte a comprender más a fondo la implementación del código DEX, además de aprender más sobre los puntos de conocimiento en proyectos reales. Ya sea que estés interesado en el desarrollo de proyectos Web3 o DeFi, involucrarte personalmente será una valiosa experiencia de aprendizaje.
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.
16 me gusta
Recompensa
16
5
Republicar
Compartir
Comentar
0/400
StablecoinEnjoyer
· 08-09 08:07
No es de extrañar que DEX sea fácil de entender, create2 es increíble~
Ver originalesResponder0
OnchainArchaeologist
· 08-09 07:19
DIRECCIÓN predicción en este aspecto todavía depende de create2
Ver originalesResponder0
Layer2Observer
· 08-09 07:17
Técnicamente, CREATE2 es elegante, pero tiene riesgos de seguridad.
Ver originalesResponder0
WenMoon42
· 08-09 07:08
Hay muchas cosas que entender en Create2.
Ver originalesResponder0
DegenMcsleepless
· 08-09 06:58
¡Grrr! He estado cuidando el BTC durante dos años ya~
7 grandes consejos de desarrollo de contratos: aprende prácticas de Finanzas descentralizadas del código DEX
Consejos de desarrollo de contratos: lecciones aprendidas del código de Uniswap
Recientemente, al participar en un proyecto de tutorial sobre el desarrollo de un intercambio descentralizado, consulté la implementación del código de un conocido DEX y aprendí muchos puntos de conocimiento interesantes. Como un principiante que solo había desarrollado contratos NFT simples anteriormente, este intento de desarrollar contratos DeFi me ha sido muy enriquecedor. A continuación, compartiré algunos trucos prácticos que, estoy seguro, serán de gran ayuda para los nuevos que deseen aprender sobre el desarrollo de contratos.
Dirección de contrato predecible
La dirección que se obtiene al desplegar un contrato parece aleatoria, ya que está relacionada con el nonce. Sin embargo, en ciertos casos, necesitamos inferir la dirección del contrato a través de la información de las transacciones, como determinar los permisos de transacción o obtener la dirección del pool.
Un método de implementación es usar CREATE2 para crear un contrato. Al agregar un parámetro de salt, se puede hacer que la dirección del contrato generado sea predecible. La lógica para generar la nueva dirección es: hash("0xFF", dirección del creador, salt, initcode).
Uso inteligente de funciones de retorno
En Solidity, los contratos pueden llamarse entre sí. Un escenario común es que A llama a un método de B, y B realiza una llamada de vuelta a A en el método que se invoca. Esto es muy útil en ciertos casos.
Por ejemplo, en un DEX, cuando llamas al método swap del contrato del pool para realizar una transacción, se llamará a swapCallback, pasando la cantidad de tokens necesaria calculada para esta transacción. El llamador debe transferir los tokens requeridos al contrato del pool en la devolución de llamada, en lugar de descomponer el método swap. Esto asegura la seguridad del método swap y la ejecución completa, sin necesidad de registros de variables complicados.
Utilizar excepciones para transmitir información, implementar la estimación de transacciones con try-catch
En algunos casos, necesitamos simular el método swap para estimar la cantidad de tokens necesarios para la transacción, pero al estimar no se intercambiarán realmente los tokens, por lo que se producirá un error. Una forma ingeniosa de manejarlo es lanzar un error especial en la función de devolución de llamada de la transacción y luego capturar ese error, extrayendo la información necesaria del mensaje de error.
Este método parece un poco ingenioso, pero es muy práctico. Evita la modificación del método swap para estimar la demanda de transacciones, lo que hace que la lógica sea más sencilla.
Resolver problemas de precisión con grandes números
En escenarios que involucran el cálculo de precios y liquidez, necesitamos evitar la pérdida de precisión causada por las operaciones de división. Una técnica común es desplazar a la izquierda 96 bits durante el proceso de cálculo (equivalente a multiplicar por 2^96) y luego realizar la operación de división. Esto puede garantizar la precisión sin desbordamientos en transacciones normales.
Aunque teóricamente aún habrá una pequeña pérdida de precisión, generalmente se trata solo de la pérdida de la unidad mínima, lo cual es aceptable.
Cálculo de beneficios mediante Share
Para los escenarios que requieren registrar los ingresos por tarifas de transacción de los proveedores de liquidez (LP), no podemos registrar las tarifas para cada LP en cada transacción, ya que eso consumirá una gran cantidad de gas. Un método eficiente es registrar la tarifa total y la tarifa que debe asignarse por cada unidad de liquidez.
Al retirar tarifas de LP, solo se necesita calcular las tarifas extraíbles según la liquidez poseída. Esto es similar a cómo los accionistas calculan los ingresos extraíbles actuales basándose en las ganancias por acción históricas de la empresa y los ingresos del último retiro.
Uso razonable de datos fuera de la cadena
Almacenamiento en la cadena es relativamente caro, y no toda la información necesita estar en la cadena o ser obtenida de la cadena. Por ejemplo, la lista de la piscina de transacciones, la información de la piscina, etc., se pueden almacenar en bases de datos tradicionales y sincronizarse periódicamente desde la cadena.
Muchos proveedores de RPC de blockchain también ofrecen interfaces avanzadas que permiten obtener ciertos datos de manera más rápida y económica. Estas interfaces suelen utilizar cachés para mejorar el rendimiento y la eficiencia.
Aprender a dividir contratos y utilizar contratos estándar
Un proyecto puede contener múltiples contratos desplegados en la práctica. Incluso si solo se despliega un contrato, también podemos dividir el código en múltiples contratos para mantenerlo a través de la herencia.
Además, utilizar contratos estándar existentes (como ERC721) puede aumentar la eficiencia del desarrollo. Por ejemplo, se puede usar el contrato ERC721 para gestionar posiciones de liquidez, lo que es conveniente y mejora la eficiencia del desarrollo.
Resumen
La práctica es el mejor método de aprendizaje. Intentar implementar una versión simplificada de un intercambio descentralizado puede ayudarte a comprender más a fondo la implementación del código DEX, además de aprender más sobre los puntos de conocimiento en proyectos reales. Ya sea que estés interesado en el desarrollo de proyectos Web3 o DeFi, involucrarte personalmente será una valiosa experiencia de aprendizaje.
Según tu personalidad, comenta:
No te hagas el tonto, imitador de Uni.