Tiempo estimado: 4 minutos de lectura
¿En qué consiste el formateado y linting de código Solidity?
El formateado del código fuente Solidity consiste en aplicar de forma efectiva un conjunto de reglas de estilo consideradas útiles dentro de una comunidad de desarrolladores. Es uno de los pilares que incluyo en mi artículo sobre las buenas prácticas en Solidity.
El «linting» comprende el análisis estático del código fuente para identificar errores, malas prácticas o desviaciones de los estándares de programación establecidos, ayudando a mejorar la calidad, seguridad y consistencia del código.
Cumplimentar ambas funciones es de especial importancia en la programación de Smart Contracts, dado su caracter inmutable y los inherentes riesgos de seguridad derivados del manejo de activos digitales.
Formatear código Solidity con Prettier
Prettier es uno de los formateadores de código más extendidos dada su compatibilidad con numerosos lenguajes de programación.
Es una herramienta que de forma automática reescribe el código fuente aplicando un conjunto de reglas predefinidas.
El soporte para el lenguaje Solidity se logra mediante el plugin prettier-plugin-solidity. Se trata de una extensión que aplica reglas específicas acordes con la guía de estilo de Solidity.
La instalación requiere además el paquete Prettier genérico:
yarn add --dev prettier prettier-plugin-solidity
Para utilizarlo adecuadamente conviene crear un fichero de configuración «.prettierrc.js» en el que habilitar el uso del plugin y ajustar algunas de las reglas por defecto de Prettier a las convenciones de estilo de Solidity:
module.exports = {
// Adding the plugin to ensure Solidity files are handled
plugins: ['prettier-plugin-solidity'],
// File-specific configuration using "overrides"
overrides: [
// Solidity-specific formatting rules
{
files: '*.sol',
options: {
printWidth: 120, // Line width for Solidity files
singleQuote: false,
tabWidth: 4, // Indentation size for Solidity files
useTabs: false,
parser: 'solidity-parse', // Ensuring the Solidity parser is used
bracketSpacing: false,
},
},
],
};
En esta referencia se detalla el conjunto de reglas aplicadas automáticamente por el plugin de Solidity.
El uso básico es muy sencillo:
yarn prettier --write --plugin=prettier-plugin-solidity 'contracts/**/*.sol'
Con este comando los contratos del proyecto serán automáticamente sobrescritos de acuerdo a las reglas configuradas en la herramienta. Es importante mantener algún tipo de control de versiones para recuperar el código anterior si fuese necesario.
Linting de código Solidity con Solhint
Solhint es un «linter» de Solidity de código abierto que permite configurar un conjunto de reglas para validar su grado de cumplimiento en los Smart Contracts de nuestro interés.
Las reglas se clasifican en cinco apartados y han sido programadas a partir de los criterios y demandas de la comunidad de desarrolladores de Solidity: mejores prácticas, guía de estilos, consumo de gas, miscelánea y seguridad.
Si bien existe una configuración por defecto con las reglas recomendadas, siempre es posible personalizarla según las necesidades de cada caso. Valga como ejemplo el siguiente fichero de configuración «.solhint.json» para modificar el juego de reglas recomendadas con algunos cambios y extenderlo con algunas adicionales:
{
"extends": "solhint:recommended",
"rules": {
"func-visibility": ["warn",{"ignoreConstructors":true}],
"max-states-count": ["off"],
"func-param-name-mixedcase": "warn",
"private-vars-leading-underscore": ["warn", { "strict": false }],
"ordering": "warn",
"modifier-name-mixedcase": "warn",
"named-parameters-mapping": "warn",
"gas-calldata-parameters": "warn",
"gas-increment-by-one": "warn",
"gas-indexed-events": "warn",
"gas-length-in-loops": "warn",
"gas-named-return-values": "warn",
"gas-small-strings": "warn",
"gas-struct-packing": "warn"
}
}
Para comprobar las reglas se puede invocar el comando de esta forma:
yarn solhint 'contracts/**/*.sol'
Otra alternativa es integrar Solhint directamente en Hardhat. Para ello hay que instalar el plugin ‘@nomiclabs/hardhat-solhint‘, importarlo en el archivo «hardhat.config.js» y ejecutar el siguiente comando:
yarn hardhat check
Por defecto la herramienta tan sólo avisa por consola de las líneas de código que incumplan alguna de las reglas, con el grado de severidad configurado.
Es posible sin embargo para ciertas reglas aplicar una autocorrección automática del código, usando el modificador «- -fix».
Por otra parte es posible deshabilitar la comprobación de las reglas en determinados fragmentos del código fuente o incluso en ficheros completos. Para ello se usan directivas en forma de comentarios sobre el código.
Conclusión: automatizando el cumplimiento de las buenas prácticas
La programación de Smart Contracts en Solidity es una disciplina que reviste una complejidad especial debido al contexto de ejecución del código dentro de la EVM y al tipo de lógica «inmutable» que se pone en juego.
Por este motivo es particularmente importante adherirse a un conjunto de buenas prácticas y reglas que se han ido estableciendo con el tiempo a partir de la experiencia de la comunidad de desarrolladores.
Dos de los primeros requisitos que conviene cumplir son el correcto formateado del código fuente y el cumplimiento de las reglas básicas de seguridad, estilo y optimización de consumo en los Smart Contracts desarrollados.
Para facilitar esta labor se ha presentado un par de herramientas, Prettier y Solhint, con amplia difusión dentro de la comunidad y actualizaciones frecuentes.
¿Utilizas alguna otra herramienta de apoyo para formatear y cumplir con las buenas prácticas de programación en Solidity? Coméntame tus propias experiencias.
Si necesitas asesoría sobre cómo abordar un proyecto Blockchain, puedo ayudarte. Contáctame y hablamos.