Tiempo estimado: 6 minutos de lectura

La verificación de smart contracts es esencial para garantizar la seguridad y transparencia en proyectos blockchain. Se analizan herramientas como Etherscan y Sourcify y se detalla su forma de uso a través de Hardhat.

¿Qué es la verificación de un smart contract?

La verificación de un smart contract consiste en certificar que un determinado código fuente se corresponde con el «bytecode» de un smart contract desplegado en una blockchain.

Es un proceso clave para garantizar a todos los participantes de la comunidad web3 que una determinada DApp, proyecto o protocolo se comporta de manera fiable y que las interacciones con la blockchain son confiables.

Los fundamentos del proceso consisten en poder compilar el código fuente del smart contract con la misma configuración particular usada en el momento del despliegue en la blockchain para corroborar la identidad del «bytecode» generado.

Existen sin embargo herramientas consolidadas dentro del mundo web3 que dan soporte a la tarea de verificar un smart contract. Las veremos más adelante.

¿Qué tipos de verificaciones se pueden efectuar?

Cuando se genera el «bytecode» de ejecución de un contrato hay partes que no quedan reflejadas como los nombres de las variables o los comentarios del código. Si tan sólo se coteja la igualdad de ese «bytecode» con el resultado de compilar un determinado código fuente, quedarían resquicios para determinadas acciones maliciosas como falsear los comentarios para inducir a los usuarios a interacciones no deseadas con los contratos.

Para solventar este inconveniente existen los metadatos de un contrato compilado. En esa estructura se almacena en un hash la huella correspondiente a todo el código fuente, incluyendo también los nombres de las variables y los comentarios.  

En el siguiente ejemplo vemos la sección de metadatos generada al compilar un contrato con Hardhat:

"contracts/TestingContract.sol":{	
	"keccak256":"0xd7da3905f69366deae6758106c08f6efbb26432e673a94ea912bbaa2e26a435a",
	"license":"MIT",
	"urls":[
		"bzz-raw://55746fe8790603e6379513044771b17a81818979ad3edd9dcbae86c2d32a9f4b",
		"dweb:/ipfs/QmWhJK38DLNG16GP6GUrSX82YyPHexaah8r5MXE1nnFdJs"
	]
}

El elemento «keccak256» representa la huella digital de todo el código fuente del contrato, incluyendo como se ha dicho los nombres de variables y los comentarios.

Finalmente en el «bytecode» del contrato compilado se añade el hash de la huella digital de todos los metadatos. Este es el punto clave que permite la verificación completa del código fuente de un smart contract. Si en el código fuente se altera por ejemplo un comentario, la huella digital de los metadatos no coincidirá con la del bytecode desplegado en la blockchain.

Se habla por tanto de verificación parcial cuando hay diferencia en el hash de los metadatos y verificación total cuando hay concordancia total en el bytecode.

¿Qué herramientas permiten la verificación de un smart contract?

En este artículo se analizan dos de las alternativas disponibles: Etherscan y Sourcify.

Etherscan

Es una de las más populares al tratarse de uno de los exploradores de bloques más utilizados.

Existen varias formas de verificar smart contracts con Etherscan, por ejemplo desde su página web de verificación o a través de alguna herramienta de programación como veremos para Hardhat.

Una vez verificado el contrato, quedará resaltado visualmente en la interfaz de Etherscan, dentro de la pestaña «contract», como se muestra en la imagen:

Verificacion de smart contract en Etherscan

Además el contrato se añadirá a la sección de contratos verificados, un repositorio propio de la herramienta. 

El principal inconveniente de la verificación de smart contracts con Etherscan es que no se cotejan los metadatos del contrato, por tanto se trata de una verificación parcial.

Bajo el paraguas de Etherscan existen otros exploradores de bloques para otras redes compatibles con la EVM. Por ejemplo para verificar smart contracts desplegados en Polygon se usaría de igual forma el servicio de Polygonscan.

Sourcify

Se trata de una herramienta dedicada en exclusiva a la verificación de smart contracts.

Existen igualmente varias formas de verificar smart contracts con Sourcify, por ejemplo a través de su verificador en linea o de forma programática mediante plugins para los principales entornos de desarrollo de smart contracts como Hardhat o Foundry. 

La principal ventaja respecto de Etherscan es que permite efectuar verificaciones completas cotejando también la igualdad de los metadatos del smart contract.

Los contratos verificados son almacenados en el repositorio público de Sourcify, accesible a través de https o ipfs. De esa forma se permite acceder al código fuente y los metadatos de los contratos verificados.

Otra característica interesante de Sourcify es que monitoriza la creación de contratos en nuevos bloques y los verifica automáticamente si está disponible en IPFS el código fuente y los metadatos. 

Una vez verificado el contrato se puede comprobar mediante el servicio de búsqueda en línea

Verificacion de smart contract con Sourcify

¿Cómo verificar contratos con Hardhat?

Etherscan

La forma más sencilla es a través de Ignition, el sistema declarativo de Hardhat para desplegar smart contracts en redes compatibles con Ethereum. 

Recomiendo revisar mi artículo sobre el despliegue de smart contracts en Hardhat para conocer los detalles de uso de esa herramienta.

Como prerrequisito hay que contar con un API KEY de Etherscan y añadirlo al fichero «hardhat.config.js» (se define aparte en un fichero «.env» de propiedades):

etherscan: {
    apiKey: `${ETHERSCAN_API_KEY}`,
}

La verificación se puede solicitar en el momento del despliegue añadiendo el modificador «- -verify». De ese modo se verificarán todos los contratos desplegados de una vez.

Para el ejemplo del artículo referenciado, el comando se invocaría de esta manera:

yarn hardhat ignition deploy .\ignition\modules\CryptoTask.js --network sepolia --verify

Otra posibilidad es solicitar la verificación después del despliegue de los contratos.

Si por ejemplo los contratos se desplegaron en Sepolia:

yarn hardhat ignition verify chain-11155111

En caso de tener que verificar un despliegue en otro explorador de bloques, como por ejemplo Polygonscan, además de conseguir el correspondiente API KEY hay que añadir la definición de la blockchain en el archivo «hardhat.config.js».

Por ejemplo para verificar un despliegue en la «testnet» Amoy:

etherscan: {
    apiKey: {        
        polygonAmoy: `${POLYGONSCAN_API_KEY}`,
    },
    customChains: [
        {
          network: "polygonAmoy",
          chainId: 80002,
          urls: {
            apiURL: "https://api-amoy.polygonscan.com/api",
            browserURL: "https://amoy.polygonscan.com",
          },
        },
    ],    
},
Sourcify

Hay que instalar el plugin hardhat-verify 

yarn add --dev @nomicfoundation/hardhat-verify

Añadir su definición y habilitarlo en el fichero «hardhat.config.js»: 

require("@nomicfoundation/hardhat-verify");

module.exports = {
    sourcify: {      
          enabled: true
    }
}

Finalmente invocar el comando para verificar el contrato a partir de su dirección de despliegue:

yarn hardhat verify --network sepolia $DEPLOYED_CONTRACT_ADDRESS

Para que el proceso tenga éxito, es preciso que previamente se haya verificado el contrato en Etherscan.  

Mediante scripts

La tarea «run» de Hardhat permite la ejecución de manera programática de comandos invocados habitualmente mediante la shell. 

La siguiente script invoca el comando «hardhat verify» visto anteriormente para verificar un contrato. Por defecto se intentará verificar en primer lugar a través de Etherscan si aún está pendiente. En ese caso habría que proporcionar los argumentos usados en el constructor en el momento del despliegue. Queda ilustrado en el ejemplo:

import { run } from 'hardhat';

const args = [10, "name"]

await run('verify:verify', {
        address: contractAddress,
        constructorArguments: args,
        contract: 'contracts/TestingContract.sol:TestingContract',
});

Conclusión: aportando confianza al ecosistema web3

La verificación de smart contracts es un aspecto fundamental para dotar de confianza y transparencia las transacciones efectuadas en la blockchain.

Existen distintas herramientas que facilitan la labor de verificación a los desarrolladores y constructores de proyectos web3 entre las que se destacan las analizadas Etherscan y Sourcify y otras como Blockscout o Chainlens

Sin embargo, tomando como referencia la funcionalidad ofrecida por Sourcify (la más completa) hay determinadas limitaciones que dificultan el proceso y generan cierta fricción:

  • Se requiere verificar el mismo contrato en cada red desplegada de forma independiente.
  • Sólo se soportan smart contracs programados en Solidity.
  • No es posible recuperar de forma automática la información contenida en los metadatos de un contrato verificado.

Para superar esas barreras, posibilitar el acceso libre al código fuente de los smart contracts y crear un entorno colaborativo en que participen los actores involucrados en la verificación de contratos ha surgido The Verifier Alliance. Se trata de un grupo de trabajo que aún está dando sus primeros pasos y al que conviene seguir para estar al tanto de las últimas novedades relacionadas con la verificación de contratos.


¿Conoces otras herramientas para verificar smart contracts? ¿Qué otras iniciativas existen para dotar de transparencia y confiabilidad a las transacciones sobre la blockchain? Te animo a que compartas tu conocimiento.

Puedo ayudarte si necesitas un programador de smart contracts que sepa cómo desplegarlos con éxito en la blockchain. Contáctame y hablamos.