Técnicas de desarrollo de contratos inteligentes aprendidas del código de Uniswap
Recientemente, al redactar un tutorial de desarrollo de intercambios descentralizados, consulté la implementación del código de Uniswap V3 y aprendí muchas técnicas interesantes de desarrollo de contratos inteligentes. Como desarrollador que intenta desarrollar contratos DeFi por primera vez, estas técnicas serán de gran ayuda para los principiantes que quieran aprender sobre el desarrollo de contratos.
Dirección de contrato predecible
Normalmente, la dirección obtenida al desplegar un contrato parece aleatoria, ya que está relacionada con el nonce. Pero en ciertos escenarios, necesitamos deducir la dirección del contrato a través de la información de la transacción, como determinar los permisos de la transacción o obtener la dirección del pool.
Uniswap utiliza el método CREATE2 para crear contratos, añadiendo el parámetro salt para que la dirección 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 permite que la dirección del contrato se calcule de antemano.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
La aritmética de grandes números resuelve problemas de precisión
En Uniswap se involucran muchos cálculos, como la cantidad de Token a intercambiar según el precio y la liquidez. Para evitar la pérdida de precisión en las operaciones de división, en el proceso de cálculo se utiliza comúnmente la operación << FixedPoint96.RESOLUTION, que equivale a un desplazamiento a la izquierda de 96 bits, es decir, multiplicar por 2^96.
Desplazando a la izquierda y luego realizando la división, se puede garantizar la precisión bajo la premisa de que no hay desbordamiento en las transacciones normales. Aunque teóricamente todavía hay una pequeña pérdida de precisión, ya es aceptable.
Cálculo de ganancias mediante Share
Uniswap necesita registrar los ingresos por comisiones de los proveedores de liquidez LP). Evidentemente, no se puede registrar la comisión para cada LP en cada transacción, ya que esto consumiría una gran cantidad de Gas.
La solución es registrar la tarifa total y la tarifa que debe asignarse por cada unidad de liquidez. Al retirar, las tarifas que se pueden retirar se calculan en función de la liquidez mantenida, similar a los dividendos de acciones.
Diferenciar la información en cadena y fuera de cadena
Almacenamiento en la cadena es relativamente caro, no toda la información necesita estar en la cadena o ser obtenida de la cadena. Por ejemplo, muchas de las interfaces llamadas por el frontend de Uniswap son interfaces tradicionales de Web2.
La lista de pools de transacciones, información, etc. se puede almacenar en una base de datos normal, sincronizándose periódicamente desde la cadena. No es necesario llamar en tiempo real a la interfaz RPC para obtener datos relacionados. Por supuesto, las transacciones clave aún se realizan en la cadena.
División de contratos y reutilización de contratos estándar
Un proyecto puede contener múltiples contratos desplegados en la práctica. Incluso si se despliega solo un contrato, el código se puede dividir en múltiples contratos para su mantenimiento mediante la herencia.
Como el contrato NonfungiblePositionManager de Uniswap hereda varios contratos. El ERC721Permit utiliza directamente el contrato ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones a través de NFTs y mejora la eficiencia del desarrollo.
Resumen
Desarrollar por uno mismo es más efectivo que simplemente leer artículos. Intentar implementar una versión simplificada de un intercambio descentralizado puede profundizar la comprensión de la implementación del código de Uniswap y aprender puntos de conocimiento de proyectos reales.
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.
21 me gusta
Recompensa
21
7
Compartir
Comentar
0/400
PoolJumper
· 07-28 02:11
Cero infraestructura, ¿qué tal?
Ver originalesResponder0
OldLeekConfession
· 07-27 04:18
Si puedes hacer que lo entienda, ya será impresionante...
Ver originalesResponder0
OnchainGossiper
· 07-27 03:51
Se recomienda practicar con operaciones reales~
Ver originalesResponder0
BagHolderTillRetire
· 07-25 17:02
Finalmente encontré una salida a mi situación de atrapado.
Análisis de 7 técnicas de desarrollo de contratos Uniswap para mejorar la eficiencia de los proyectos de Finanzas descentralizadas.
Técnicas de desarrollo de contratos inteligentes aprendidas del código de Uniswap
Recientemente, al redactar un tutorial de desarrollo de intercambios descentralizados, consulté la implementación del código de Uniswap V3 y aprendí muchas técnicas interesantes de desarrollo de contratos inteligentes. Como desarrollador que intenta desarrollar contratos DeFi por primera vez, estas técnicas serán de gran ayuda para los principiantes que quieran aprender sobre el desarrollo de contratos.
Dirección de contrato predecible
Normalmente, la dirección obtenida al desplegar un contrato parece aleatoria, ya que está relacionada con el nonce. Pero en ciertos escenarios, necesitamos deducir la dirección del contrato a través de la información de la transacción, como determinar los permisos de la transacción o obtener la dirección del pool.
Uniswap utiliza el método CREATE2 para crear contratos, añadiendo el parámetro salt para que la dirección 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 permite que la dirección del contrato se calcule de antemano.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
La aritmética de grandes números resuelve problemas de precisión
En Uniswap se involucran muchos cálculos, como la cantidad de Token a intercambiar según el precio y la liquidez. Para evitar la pérdida de precisión en las operaciones de división, en el proceso de cálculo se utiliza comúnmente la operación << FixedPoint96.RESOLUTION, que equivale a un desplazamiento a la izquierda de 96 bits, es decir, multiplicar por 2^96.
Desplazando a la izquierda y luego realizando la división, se puede garantizar la precisión bajo la premisa de que no hay desbordamiento en las transacciones normales. Aunque teóricamente todavía hay una pequeña pérdida de precisión, ya es aceptable.
Cálculo de ganancias mediante Share
Uniswap necesita registrar los ingresos por comisiones de los proveedores de liquidez LP). Evidentemente, no se puede registrar la comisión para cada LP en cada transacción, ya que esto consumiría una gran cantidad de Gas.
La solución es registrar la tarifa total y la tarifa que debe asignarse por cada unidad de liquidez. Al retirar, las tarifas que se pueden retirar se calculan en función de la liquidez mantenida, similar a los dividendos de acciones.
Diferenciar la información en cadena y fuera de cadena
Almacenamiento en la cadena es relativamente caro, no toda la información necesita estar en la cadena o ser obtenida de la cadena. Por ejemplo, muchas de las interfaces llamadas por el frontend de Uniswap son interfaces tradicionales de Web2.
La lista de pools de transacciones, información, etc. se puede almacenar en una base de datos normal, sincronizándose periódicamente desde la cadena. No es necesario llamar en tiempo real a la interfaz RPC para obtener datos relacionados. Por supuesto, las transacciones clave aún se realizan en la cadena.
División de contratos y reutilización de contratos estándar
Un proyecto puede contener múltiples contratos desplegados en la práctica. Incluso si se despliega solo un contrato, el código se puede dividir en múltiples contratos para su mantenimiento mediante la herencia.
Como el contrato NonfungiblePositionManager de Uniswap hereda varios contratos. El ERC721Permit utiliza directamente el contrato ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones a través de NFTs y mejora la eficiencia del desarrollo.
Resumen
Desarrollar por uno mismo es más efectivo que simplemente leer artículos. Intentar implementar una versión simplificada de un intercambio descentralizado puede profundizar la comprensión de la implementación del código de Uniswap y aprender puntos de conocimiento de proyectos reales.