Consejos para el desarrollo de contratos: experiencias aprendidas del código de Uniswap
Recientemente, al escribir un tutorial sobre un intercambio descentralizado, consulté la implementación de Uniswap V3 y aprendí muchos puntos interesantes. Como un principiante que acaba de entrar en el desarrollo de contratos Defi, estas técnicas me han inspirado mucho y estoy seguro de que también serán útiles para otros amigos que quieran aprender sobre el desarrollo de contratos inteligentes.
Dirección de contrato predecible
Las direcciones de los contratos desplegados normalmente parecen aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertas situaciones, necesitamos inferir 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 crea contratos utilizando CREATE2, añadiendo el parámetro salt. La dirección del contrato generada es predecible y sigue la lógica "nueva dirección = hash('0xFF', dirección del creador, salt, initcode)".
Uso inteligente de funciones de callback
En Solidity, los contratos pueden llamarse entre sí. A veces, el contrato A llama a un método del contrato B, y luego B vuelve a llamar a un método de A, lo cual es útil en ciertos escenarios.
Por ejemplo, en el proceso de transacción de Uniswap, cuando se invoca el método swap del contrato UniswapV3Pool, se llamará a swapCallback, pasando la cantidad de Token que realmente se necesita. El llamador debe transferir el Token requerido en la devolución de llamada, lo que garantiza la integridad y seguridad de toda la lógica de la transacción.
. Aunque teóricamente todavía puede haber una pérdida de precisión en la unidad mínima, ya es aceptable.
![Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Cálculo de ganancias mediante el método Share
En Uniswap, es necesario registrar los ingresos por tarifas de los proveedores de liquidez (LP). Para evitar registrar las tarifas de cada LP en cada transacción (lo que consume mucho Gas), Uniswap ha adoptado un método ingenioso.
En la estructura Position se definen feeGrowthInside0LastX128 y feeGrowthInside1LastX128, que registran la tarifa que cada posición debería recibir por unidad de liquidez en el último retiro de tarifas. De esta manera, solo es necesario registrar la tarifa total y la asignación por unidad de liquidez, y al retirar, el LP puede calcular la tarifa que puede retirar en función de la liquidez que posee.
![Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
El equilibrio entre la obtención de información en la cadena y fuera de la cadena
El almacenamiento en la cadena es relativamente caro, y no toda la información necesita estar en la cadena o ser obtenida de la cadena. Muchos de los interfaces llamados por el frontend de Uniswap son interfaces tradicionales de Web2.
La lista de grupos de negociación, la información del grupo de negociación, etc., se pueden almacenar en una base de datos común y sincronizarse periódicamente desde la cadena. No es necesario llamar en tiempo real a la interfaz RPC de la cadena o del servicio de nodos para obtener datos relevantes.
Algunos proveedores de RPC de blockchain ofrecen interfaces avanzadas que permiten obtener datos de manera más rápida y económica. Estas interfaces suelen mejorar el rendimiento y la eficiencia a través de la caché.
División de contratos y utilización de contratos estándar
Un proyecto puede incluir múltiples contratos realmente desplegados. Incluso si solo se despliega un contrato, el código puede mantenerse dividiéndose en múltiples contratos a través de la herencia.
Por ejemplo, el contrato NonfungiblePositionManager de Uniswap hereda de varios contratos. El contrato ERC721Permit utiliza directamente la implementación del contrato estándar ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones a través de NFT y mejora la eficiencia del desarrollo.
Conclusión
La práctica es el mejor método de aprendizaje. Al intentar implementar una versión simple de un intercambio descentralizado, se puede entender más profundamente la implementación del código de Uniswap y también aprender más sobre los puntos de conocimiento en proyectos reales. Espero que estas experiencias sean útiles para aquellos amigos interesados en el desarrollo de proyectos de Web3 y DeFi.
![Web3 Novato Serie: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(
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.
7 me gusta
Recompensa
7
6
Compartir
Comentar
0/400
StableNomad
· hace16h
estadísticamente hablando, uniswap todavía tiene la base de código más limpia... solo digo
Ver originalesResponder0
StablecoinAnxiety
· hace16h
DIRECCIÓN可预测这个太关键了!
Ver originalesResponder0
PumpStrategist
· hace17h
Tsk tsk, DEX también juega con las habilidades de la Máquina de oráculo, lo que aumenta la jugabilidad para grandes capitales.
7 consejos para el desarrollo de contratos de Uniswap: desde direcciones predecibles hasta el equilibrio on-chain y off-chain
Consejos para el desarrollo de contratos: experiencias aprendidas del código de Uniswap
Recientemente, al escribir un tutorial sobre un intercambio descentralizado, consulté la implementación de Uniswap V3 y aprendí muchos puntos interesantes. Como un principiante que acaba de entrar en el desarrollo de contratos Defi, estas técnicas me han inspirado mucho y estoy seguro de que también serán útiles para otros amigos que quieran aprender sobre el desarrollo de contratos inteligentes.
Dirección de contrato predecible
Las direcciones de los contratos desplegados normalmente parecen aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertas situaciones, necesitamos inferir 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 crea contratos utilizando CREATE2, añadiendo el parámetro salt. La dirección del contrato generada es predecible y sigue la lógica "nueva dirección = hash('0xFF', dirección del creador, salt, initcode)".
Uso inteligente de funciones de callback
En Solidity, los contratos pueden llamarse entre sí. A veces, el contrato A llama a un método del contrato B, y luego B vuelve a llamar a un método de A, lo cual es útil en ciertos escenarios.
Por ejemplo, en el proceso de transacción de Uniswap, cuando se invoca el método swap del contrato UniswapV3Pool, se llamará a swapCallback, pasando la cantidad de Token que realmente se necesita. El llamador debe transferir el Token requerido en la devolución de llamada, lo que garantiza la integridad y seguridad de toda la lógica de la transacción.
. Aunque teóricamente todavía puede haber una pérdida de precisión en la unidad mínima, ya es aceptable.
![Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Cálculo de ganancias mediante el método Share
En Uniswap, es necesario registrar los ingresos por tarifas de los proveedores de liquidez (LP). Para evitar registrar las tarifas de cada LP en cada transacción (lo que consume mucho Gas), Uniswap ha adoptado un método ingenioso.
En la estructura Position se definen feeGrowthInside0LastX128 y feeGrowthInside1LastX128, que registran la tarifa que cada posición debería recibir por unidad de liquidez en el último retiro de tarifas. De esta manera, solo es necesario registrar la tarifa total y la asignación por unidad de liquidez, y al retirar, el LP puede calcular la tarifa que puede retirar en función de la liquidez que posee.
![Serie para principiantes en Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
El equilibrio entre la obtención de información en la cadena y fuera de la cadena
El almacenamiento en la cadena es relativamente caro, y no toda la información necesita estar en la cadena o ser obtenida de la cadena. Muchos de los interfaces llamados por el frontend de Uniswap son interfaces tradicionales de Web2.
La lista de grupos de negociación, la información del grupo de negociación, etc., se pueden almacenar en una base de datos común y sincronizarse periódicamente desde la cadena. No es necesario llamar en tiempo real a la interfaz RPC de la cadena o del servicio de nodos para obtener datos relevantes.
Algunos proveedores de RPC de blockchain ofrecen interfaces avanzadas que permiten obtener datos de manera más rápida y económica. Estas interfaces suelen mejorar el rendimiento y la eficiencia a través de la caché.
División de contratos y utilización de contratos estándar
Un proyecto puede incluir múltiples contratos realmente desplegados. Incluso si solo se despliega un contrato, el código puede mantenerse dividiéndose en múltiples contratos a través de la herencia.
Por ejemplo, el contrato NonfungiblePositionManager de Uniswap hereda de varios contratos. El contrato ERC721Permit utiliza directamente la implementación del contrato estándar ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones a través de NFT y mejora la eficiencia del desarrollo.
Conclusión
La práctica es el mejor método de aprendizaje. Al intentar implementar una versión simple de un intercambio descentralizado, se puede entender más profundamente la implementación del código de Uniswap y también aprender más sobre los puntos de conocimiento en proyectos reales. Espero que estas experiencias sean útiles para aquellos amigos interesados en el desarrollo de proyectos de Web3 y DeFi.
![Web3 Novato Serie: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(