Compartiendo pequeños consejos para el desarrollo de contratos: experiencias aprendidas de Uniswap
Recientemente, al desarrollar un proyecto de intercambio descentralizado, hice referencia a la implementación de código de un conocido DEX y aprendí muchos puntos útiles. Como un principiante que acaba de entrar en el desarrollo de contratos Defi, estas técnicas me han inspirado mucho, y creo 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 suelen parecer aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertos escenarios, necesitamos inferir la dirección del contrato a través de la información de la transacción, como para determinar los permisos de la transacción o para obtener la dirección del grupo de liquidez.
Esto se puede lograr utilizando el método CREATE2 para crear contratos. La forma específica es agregar el parámetro salt al crear el contrato:
solidez
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
La dirección del contrato generada de esta manera es predecible y sigue la siguiente lógica:
Nueva dirección = hash("0xFF", dirección del creador, sal, initcode)
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Uso de grandes números para resolver problemas de precisión
En el código relacionado con cálculos, se debe evitar la pérdida de precisión en las operaciones de división. Un DEX a menudo utiliza la operación "<< FixedPoint96.RESOLUTION", que equivale a multiplicar por 2^96. Al desplazar a la izquierda y luego realizar la división, se puede garantizar la precisión sin desbordamiento.
Aunque teóricamente todavía puede haber pérdida de precisión, generalmente solo se trata de una pérdida de la unidad mínima, que es aceptable.
Cálculo de beneficios mediante el método de participación
Para el cálculo de los ingresos por comisiones de los proveedores de liquidez )LP(, no se puede registrar cada transacción, ya que esto consumiría una gran cantidad de Gas. Un DEX adopta un método que registra la comisión total y la forma en que se deben asignar las comisiones a cada liquidez.
Al extraer tarifas de LP, el monto que se puede extraer se calcula en función de la liquidez que se posee. Es similar a tener acciones de una empresa; al retirar ganancias, solo se necesita conocer el rendimiento histórico por acción y las ganancias de la última extracción.
![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(
Elección razonable del método de obtención de información
El almacenamiento en la cadena es relativamente costoso, no toda la información necesita estar en la cadena o recuperarse de la cadena. Por ejemplo, listas de piscinas de transacciones e información pueden almacenarse en bases de datos normales y sincronizarse periódicamente desde la cadena.
Algunos proveedores de RPC de blockchain ofrecen interfaces avanzadas, lo que permite obtener datos de manera más rápida. Pero las transacciones clave aún deben realizarse en la cadena.
División de contratos y reutilización de contratos estándar
Un proyecto puede contener múltiples contratos, incluso si se despliega un solo contrato, se puede dividir en múltiples contratos a través de la herencia para su mantenimiento.
El contrato de gestión de posiciones de NFT de un DEX hereda de varios contratos:
solidez
el contrato NonfungiblePositionManager es
INonfungiblePositionManager,
Multicall,
PeripheryImmutableState,
PoolInitializer,
GestiónDeLiquidez,
ValidaciónPeriférica,
SelfPermit,
ERC721Permit
{...}
Al mismo tiempo, también utiliza el contrato estándar ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones y mejora la eficiencia del desarrollo.
Resumen
Desarrollar un intercambio descentralizado básico por tu cuenta te permitirá entender más a fondo la implementación del código de proyectos maduros y aprender más puntos de conocimiento práctico. Espero que estos pequeños consejos te inspiren, ¡te deseo éxito en el desarrollo!
![Serie de principiantes de Web3: 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.
9 me gusta
Recompensa
9
6
Compartir
Comentar
0/400
NFTArchaeologis
· hace9h
El aprendizaje a ciegas también es una forma de estudiar.
7 consejos prácticos para aprender el desarrollo de contratos DEX en tendencia
Compartiendo pequeños consejos para el desarrollo de contratos: experiencias aprendidas de Uniswap
Recientemente, al desarrollar un proyecto de intercambio descentralizado, hice referencia a la implementación de código de un conocido DEX y aprendí muchos puntos útiles. Como un principiante que acaba de entrar en el desarrollo de contratos Defi, estas técnicas me han inspirado mucho, y creo 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 suelen parecer aleatorias, ya que están relacionadas con el nonce. Sin embargo, en ciertos escenarios, necesitamos inferir la dirección del contrato a través de la información de la transacción, como para determinar los permisos de la transacción o para obtener la dirección del grupo de liquidez.
Esto se puede lograr utilizando el método CREATE2 para crear contratos. La forma específica es agregar el parámetro salt al crear el contrato:
solidez pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
La dirección del contrato generada de esta manera es predecible y sigue la siguiente lógica:
Nueva dirección = hash("0xFF", dirección del creador, sal, initcode)
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Uso de grandes números para resolver problemas de precisión
En el código relacionado con cálculos, se debe evitar la pérdida de precisión en las operaciones de división. Un DEX a menudo utiliza la operación "<< FixedPoint96.RESOLUTION", que equivale a multiplicar por 2^96. Al desplazar a la izquierda y luego realizar la división, se puede garantizar la precisión sin desbordamiento.
solidez uint256 numerator1 = uint256)liquidity( << FixedPoint96.RESOLUTION; uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96; amount0 = numerator1 * numerator2 / )sqrtRatioBX96 * sqrtRatioAX96(;
Aunque teóricamente todavía puede haber pérdida de precisión, generalmente solo se trata de una pérdida de la unidad mínima, que es aceptable.
Cálculo de beneficios mediante el método de participación
Para el cálculo de los ingresos por comisiones de los proveedores de liquidez )LP(, no se puede registrar cada transacción, ya que esto consumiría una gran cantidad de Gas. Un DEX adopta un método que registra la comisión total y la forma en que se deben asignar las comisiones a cada liquidez.
Al extraer tarifas de LP, el monto que se puede extraer se calcula en función de la liquidez que se posee. Es similar a tener acciones de una empresa; al retirar ganancias, solo se necesita conocer el rendimiento histórico por acción y las ganancias de la última extracción.
![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(
Elección razonable del método de obtención de información
El almacenamiento en la cadena es relativamente costoso, no toda la información necesita estar en la cadena o recuperarse de la cadena. Por ejemplo, listas de piscinas de transacciones e información pueden almacenarse en bases de datos normales y sincronizarse periódicamente desde la cadena.
Algunos proveedores de RPC de blockchain ofrecen interfaces avanzadas, lo que permite obtener datos de manera más rápida. Pero las transacciones clave aún deben realizarse en la cadena.
División de contratos y reutilización de contratos estándar
Un proyecto puede contener múltiples contratos, incluso si se despliega un solo contrato, se puede dividir en múltiples contratos a través de la herencia para su mantenimiento.
El contrato de gestión de posiciones de NFT de un DEX hereda de varios contratos:
solidez el contrato NonfungiblePositionManager es INonfungiblePositionManager, Multicall, PeripheryImmutableState, PoolInitializer, GestiónDeLiquidez, ValidaciónPeriférica, SelfPermit, ERC721Permit {...}
Al mismo tiempo, también utiliza el contrato estándar ERC721 de OpenZeppelin, lo que facilita la gestión de posiciones y mejora la eficiencia del desarrollo.
Resumen
Desarrollar un intercambio descentralizado básico por tu cuenta te permitirá entender más a fondo la implementación del código de proyectos maduros y aprender más puntos de conocimiento práctico. Espero que estos pequeños consejos te inspiren, ¡te deseo éxito en el desarrollo!
![Serie de principiantes de Web3: Consejos de desarrollo de contratos que aprendí del código de Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(