
Introducción
Cuando comencé a desarrollar con Solidity, pronto dejé los IDE en línea y adopté Hardhat como mi nuevo marco principal. Tras meses construyendo proyectos y creando un flujo de trabajo en torno a él, me sentí cómodo con su diseño de red, su estrategia de pruebas y la organización de los proyectos.
Sin embargo, cuando alguien dijo que las ventajas de rendimiento de Foundry eran impresionantes, me interesé lo suficiente como para hacer una comparación adecuada entre ambos marcos populares de desarrollo de contratos inteligentes.
Para llegar a una valoración justa, creé los mismos proyectos con la ayuda de ambos y apliqué el mismo contrato MiniBank y otros ajustes de prueba. Esta experiencia práctica demostró que el rendimiento, la experiencia de los desarrolladores y el flujo de trabajo difieren drásticamente entre estas dos herramientas, lo que merece la pena examinar por parte de cualquiera que tenga que decidir entre ambas.
Arquitectura y configuraciones del proyecto
La experiencia inicial al configurarlos es bastante diferente en los dos marcos. Foundry crea un archivo de configuración foundry.toml basado en pares clave-valor, que es análogo al archivo hardhat.config.js de Hardhat. Ambos también admiten la personalización de carpetas de origen, directorios de salida de compilación, etc.
La estructura predeterminada de carpetas es bastante diferente en Foundry, aunque no se pueden configurar directamente varias redes en el archivo de configuración, ya que Hardhat hace un trabajo fantástico manteniendo varias redes. El resto de los parámetros en foundry.toml están relacionados con opciones de prueba, incluyendo la verbosidad o la configuración de la cuenta y las opciones de precio del gas.
La función de reasignación de Foundry es especialmente interesante porque ofrece un enfoque sólido para la importación de dependencias. Puedes facilitar considerablemente la importación de contratos creando accesos directos en la configuración.
Por ejemplo, como alternativa a escribir rutas de importación largas, puedes escribir asignaciones abreviadas que ayuden a que tu código sea más legible y fácil de mantener.
Enfoques de gestión de dependencias
Los marcos difieren radicalmente en la forma en que gestionan las dependencias:
- Hardhat utiliza el ecosistema npm establecido, que está abierto al instante a los desarrolladores de JavaScript.
- La instalación de los contratos de OpenZeppelin es tan sencilla como ejecutar el comando npm install
- Foundry se basa en la gestión de dependencias mediante el submódulo Git a través de la herramienta CLI forge.
- Las dependencias se almacenan en una carpeta lib/ y se incluyen en un archivo .gitmodules, a diferencia de package.json.
Este método tomará cualquier repositorio de GitHub que incluya contratos inteligentes como dependencia y te permitirá ser más flexible en la elección de bibliotecas.
Puedes especificar la organización y el nombre del repositorio de GitHub y, opcionalmente, especificar la rama o la etiqueta que deseas instalar. Una vez instalado Forge, puedes utilizar el comando de reasignación de Forge para ver las rutas de importación predeterminadas que utilizará Foundry, las cuales se pueden personalizar aún más con archivos de configuración.
Herramientas de desarrollo y depuración
Una de las áreas en las que Hardhat destaca es en su experiencia de depuración. El marco también ofrece el uso de console.log de forma predeterminada, que se asemeja al estilo de depuración esperado en el desarrollo de JavaScript. Esta funcionalidad se promociona mucho como punto fuerte y los desarrolladores pueden seguirla fácilmente para comprender cómo se ha llevado a cabo la ejecución y qué es lo que falla.
Foundry necesita un método alternativo para registrar contratos. Aunque es posible instalar e importar Hardhat manualmente e instalar un contrato de consola, la mejor manera de hacerlo sería copiar un contrato de consola especializado en tu proyecto.
En el caso concreto de los archivos de prueba, el contrato DSTest incluido contiene eventos de registro como logstring, logint y logaddress, que pueden emitirse sin dependencias adicionales.
Metodologías de prueba
La experiencia de prueba es quizás el punto más notable de diferencia entre los dos marcos.
Enfoque de pruebas con casco de seguridad
Hardhat se basa en patrones de prueba estándar de JavaScript:
- Utiliza bloques describe y it junto con Mocha como biblioteca de aserciones predeterminada
- Los archivos de prueba pueden parecerse a este estilo más natural de los desarrolladores que están familiarizados con el desarrollo web.
- Ofrece nombres de pruebas descriptivos que expresen claramente su finalidad
- Patrones asíncronos familiares.
- La curva de aprendizaje es mínima para quienes ya están familiarizados con el desarrollo web moderno
Enfoque de pruebas de Foundry
Foundry funciona de una manera completamente diferente:
- Las pruebas se desarrollan como contratos inteligentes Solidity, que heredan DSTest.
- Todas las pruebas tienen como prefijo la palabra test o testFail.
- Todas las afirmaciones se realizan a través del contrato DSTest heredado
- Los archivos de prueba son contratos inteligentes reales que se utilizan en las pruebas.
Dominar las pruebas de contratos inteligentes
Compara los marcos de trabajo y elige el mejor enfoque de pruebas para tu proyecto.
El método Foundry tiene varias implicaciones:
- Los contratos de prueba deben instanciarse en un procedimiento setUp() análogo a beforeEach en clientes JavaScript
- El método de despacho de contratos de ETH implica una sintaxis determinada con parámetros de valor entre llaves
- La curva de aprendizaje inicial, que puede resultar pronunciada, se ve compensada por el hecho de que no requiere manejar operaciones asíncronas.
Funciones de prueba de Learning Foundry
Foundry introduce el concepto conocido como códigos de trucos, que ofrecen potentes utilidades de prueba. Se trata de funciones especiales en una dirección de contrato designada que te permiten acceder al estado de la cadena de bloques durante las pruebas.
Puedes:
- Modifica el número de bloque actual.
- Suplantar otras cuentas.
- Reclamar cierto comportamiento contractual
Para usar códigos de trucos, debes definir una interfaz e instanciarla como una variable de estado en la dirección especial del truco. Después de la configuración, es posible hacer trampas con funciones como:
- vm.prank() para establecer la siguiente llamada de contrato a un receptor diferente.
- vm.roll() para avanzar la cadena de bloques hasta un punto determinado
Uno de los códigos de trucos más interesantes es vm.expectRevert(), que debe llamarse antes de la transacción que deseas que falle. Esta inversión de los patrones estándar de afirmación puede ser contraria a la intuición, pero proporciona un control claro de las posibles condiciones de fallo.
Resultados de la comparación de rendimiento
La variación de rendimiento entre los marcos es significativa y se aprecia al instante. Con los mismos contratos y escenarios de prueba, obtuve resultados reveladores en cuanto al tiempo de compilación y ejecución de las pruebas:
Resultados de la comparación de rendimiento
| Escenario | Fundición | Casco de seguridad |
|---|---|---|
| Proyectos limpios (sin caché) | 1.44 segundos | 5.17 segundos |
| Con el almacenamiento en caché habilitado. | 0.45 segundos | 3,98 segundos |
| proyecto de 26 contratos inteligentes | 8.53 segundos | 14,56 segundos |
Estas diferencias de rendimiento son más pronunciadas cuando aumenta la complejidad del proyecto.
Pruebas de fundición: ventajas y desventajas
Ventajas y desventajas de las pruebas de fundición
| Ventajas | Contras |
|---|---|
| Sin complejidad async/await | Los nombres de las pruebas no son tan descriptivos como en las pruebas de JavaScript |
| Las pruebas se ejecutan muy rápido | La afirmación expectRevert es contraria a la intuición. |
| Informe de gas generado automáticamente | Curva de aprendizaje para los códigos de trucos. |
| Todo lo escrito en Solidity | Las herramientas de implementación aún están en desarrollo |
Las ventajas en cuanto al rendimiento son indiscutibles, y los nombres de las pruebas de Solidity no pueden ser tan descriptivos como los de JavaScript, lo que puede dificultar la comprensión del objetivo de la prueba. El sistema de códigos de trucos, aunque potente, requiere un esfuerzo inicial de aprendizaje.
Estrategias de implementación de contratos
La implementación es un aspecto en el que Hardhat ofrece una mejor experiencia para los desarrolladores en este momento. El marco acepta:
- Scripts de implementación basados en JavaScript
- Conexión con una variedad de redes
- Carga la configuración a través de variables de entorno
- Maneja con elegancia las situaciones de implementación complicadas
Actualmente, Foundry requiere scripts de implementación basados en JavaScript, pero pueden resultar engorrosos cuando los constructores tienen que proporcionar sus argumentos. La solución sugerida es crear scripts bash de implementación para gestionar la complejidad de las implementaciones, pero el equipo de desarrollo está trabajando en soluciones de implementación más avanzadas.
Este es uno de los puntos débiles más graves de Foundry en relación con Hardhat, que cuenta con un ecosistema de implementación desarrollado.
Herramientas de interfaz de línea de comandos
Foundry cuenta con la herramienta CLI cast para interactuar con la cadena de bloques y consultar contratos inteligentes. Se trata de una potente utilidad que te permite:
- Llama a las funciones del contrato.
- Consultar el estado de la cadena de bloques.
- Realiza una serie de acciones de cadena de bloques en la línea de comandos
Aunque cast ofrece todas las funciones necesarias para interactuar con la cadena de bloques, requiere una compleja construcción de la línea de comandos para realizar operaciones complejas. Al igual que en la implementación, esto puede requerir scripts bash para evitar tener que escribir comandos largos repetidamente.
Resumen comparativo de marcos
Comparación de características del marco
| Característica | Fundición | Casco de seguridad |
|---|---|---|
| Instalación | A través del comando curl de la CLI. | No es necesario con npx ni a través de npm. |
| Herramientas CLI | forge para gestionar el proyecto, cast para interactuar con los contratos. | Hardhat gestiona el proyecto (crea/compila/ejecuta scripts). |
| Crea y prueba el rendimiento. | Velocidad excepcional. | Rendimiento moderado. |
| Dependencias | Submódulos Git | paquetes npm |
| Configuración | foundry.toml | hardhat.config.js |
| Aislamiento de pruebas | Sí, mediante -match-test -match-contract | Sí, solo a través de o omitir en los archivos de prueba. |
| Implementaciones de contratos | A través de la herramienta CLI de Cast. | Scripts basados en JavaScript. |
Tomar la decisión correcta
Foundry demuestra un enorme potencial gracias a su excelente rendimiento, su comunidad comprometida y su método creativo de prueba de contratos inteligentes. La estructura es excelente en ciclos de desarrollo rápidos y cuenta con excelentes utilidades de prueba que podrían acelerar enormemente el desarrollo una vez que se comprende cómo utilizarlas.
No obstante, Foundry sigue desarrollándose, especialmente en lo que respecta a las herramientas de implementación y las mejoras en la experiencia de los desarrolladores. Foundry tiene algunas ventajas interesantes para aquellos desarrolladores que prefieren un modelo híbrido con:
- Fundición para el desarrollo y las pruebas de contratos.
- Casco de seguridad para la implementación y los scripts.
Los usuarios que estén más acostumbrados a las herramientas estándar de JavaScript y a las prácticas de implementación establecidas pueden ser más prolíficos con Hardhat ahora, aunque la decisión depende nuevamente de tu experiencia y de tu capacidad para adoptar herramientas más nuevas.
Ambas arquitecturas siguen cambiando rápidamente, y el ecosistema de desarrollo de contratos inteligentes cuenta con una variedad de alternativas viables que satisfacen las necesidades de diversos desarrolladores y casos de aplicación.


