Ver más

Entendiendo los smart contracts: Desarrollo, uso y auditoría

20 mins
Por Ananda Banerjee
Traducido por Francisco Herrera
Únete a Nuestra Comunidad de Trading en Telegram

Los smart contracts (contratos inteligentes, en español) no son nuevos. Existen desde comienzos de los 90 del siglo pasado, cuando Nick Szabo acuñó el término. El experto en criptografía expuso y desarrolló su innovadora idea a lo largo de esa década, pero no fue hasta la llegada de Ethereum que irrumpieron en el sector tecnológico.

Unos 30 años después de la propuesta original de Szabo, los contratos inteligentes se encuentran en el centro de prácticamente cualquier actividad en el mercado cripto (especialmente en el espacio DeFi).

Entender su funcionamiento es imperativo, no solo para los desarrolladores de soluciones blockchain, sino para cualquier miembro de la comunidad.

¿Quieres estar al día de todo lo que ocurre en el espacio cripto? Únete a la comunidad de trading de BeInCrypto en Telegram: lee las últimas noticias sobre el espacio cripto y accede a guías, reviews de proyectos y análisis realizados por expertos y traders profesionales.

La cuestión es que los smart contracts son elementos complejos desde el punto de vista del usuario medio, al menos en lo referente a su desarrollo y auditoría. Hablamos de estructura de código, lenguajes de programación (siendo Solidity el más popular y utilizado), herramientas de desarrollo, etc.

Son cuestiones poco amigables para los iniciados en el mundo de las criptomonedas, quizá porque para disfrutar de las ventajas de los contratos inteligentes, apenas hace falta saber qué son o cómo funcionan.

En cualquier caso, es aconsejable comprender el mecanismo de los smart contracts, así como sus debilidades y riesgos potenciales (y cómo combatirlas a través de las auditorías).


¿Qué son los smart contracts?

Los contratos inteligentes son bloques de código que se ejecutan cuando se dan las condiciones necesarias. Se los compara con los contratos legales del mundo real, aunque, en el caso de los smart contracts, el código sería la legislación.

Su inmutabilidad es otra de sus características principales. Los contratos inteligentes no se pueden manipular. Una vez se ha desarrollador el código y se han integrado en una plataforma, protocolo o red, solo responde a la programación.

Objetivo de los contratos inteligentes

Para entender la importancia de los contratos inteligentes, primero debemos valorar qué objetivos persigue su implementación.

Por supuesto, el principal es la automatización de las operaciones en las blockchains. Son herramientas que solo funcionan en determinadas condiciones, sin necesidad de la intervención de terceras partes.

Los contratos inteligentes eliminan a los intermediarios en multitud de procesos financieros, que no son pocos. Por supuesto, la multitud de casos de uso relacionados con servicios como el lending o el trading obliga a los desarrolladores a seguir estrategias de seguridad mucho más sofisticadas a la hora de generar el código.

Smart contracts y tecnología blockchain
Smart contracts y tecnología blockchain: BeInCrypto

El mismo Szabo se ha pronunciado en diferentes ocasiones sobre la seguridad en el desarrollo de smart contracts, asegurando que programarlos como si fueran páginas web sería el final del espacio cripto. En este sentido, destaca que los proyectos exitosos se basan en métodos más lentos, cuidadosos y seguros. 

Importancia de los contratos inteligentes

La importancia de los smart contracts reside en la eliminación de terceras partes, la seguridad de la operativa, la multiplicidad de servicios financieros que abarca, etc.

Puede que la automatización englobe a todas esas ventajas, permitiendo que cualquier usuario envíe fondos a otro con la única supervisión de un contrato inteligente.

¿Cómo sucede esto exactamente? En pocas palabras, los contratos inteligentes se implementan en las redes como bloques de código, a modo de una estructura de validación multi-path que ofrece un alto grado de seguridad.

Suena simple, pero hay que tener en cuenta que hay diferentes tipos de contratos inteligentes según su función. Dependiendo del objetivo perseguido por los desarrolladores, su programación, procesamiento y auditoría pueden variar.

Una división básica podría ser la que diferencia entre contratos secuenciales y asíncronos. Más allá de los tipos de contratos inteligentes existentes, lo importante (según Szabo) es su naturaleza descentralizada: una nueva forma de establecer relaciones comerciales y financieras sin la intervención de políticos y burócratas.

Veamos un ejemplo. Pensemos en un pool de liquidez gestionado por contratos inteligentes. En este hipotético pool, los tokens pueden usarse para hacer trading.

Supongamos que el 0.3% del valor de las operaciones exitosas se envía al proveedor de liquidez. Todas las condiciones que afectan a la operativa están contempladas en el código de un contrato inteligente, el cual se encuentra integrado a lo largo de la blockchain. 


Smart contracts: Características

Antes de profundizar en el tema, veamos cuáles son las características principales de los contratos inteligentes, tales como la programabilidad, la seguridad y la automatización. 

Contratos inteligentes - Características
Contratos inteligentes – Características: BeInCrypto

Contratos programables

Los contratos inteligentes son simples bloques de código generados para ejecutar contratos dadas unas condiciones específicas en circunstancias concretas.

La destreza de los programadores es determinante para que esta premisa se transforme en una realidad útil, eficiente y segura. De hecho, es una de las razones por las que los programadores y desarrolladores de código están tan demandados en el espacio DeFi.

Sin intervención humana

Las TradFi se basan en la confianza que depositamos en entidades, organismos y personas. El factor humano condiciona los servicios financieros tradicionales. Cuando hablamos de finanzas descentralizadas, blockchain y contratos inteligentes, la intervención humana desaparece. 

Las DeFi están gobernadas por smart contracts: no es necesario confiar en la intervención humana, sino comprobar que el código funciona correctamente. Así que la próxima vez que quieras revisar un contrato inteligente, asegúrate de que la documentación incluye todas las características mencionadas en esta guía. 

Versión simplificada de un contrato inteligente
Versión simplificada de un contrato inteligente: Reddit

Autonomía

Ya hemos comentado que los contratos inteligentes se ejecutan de forma automática, sin necesidad de la intervención de terceras partes. A través de iteraciones y loops, es el código el que indica cuándo y cómo se produce la operación: pagos, depósitos, retiradas, imposición de penalizaciones, entrega de recompensas, etc.

Verificación

La automatización de los contratos inteligentes se extiende incluso hasta su verificación. La autoverificación implica que la ejecución exitosa de un contrato inteligente es prueba suficiente de que se ha producido la operación.

Es esta característica la que posiciona a los smart contracts por encima de los contratos tradicionales, dependientes de las reglas aplicadas por entidades y organismos.

Seguridad

La seguridad de los contratos inteligentes depende directamente del método criptográfico utilizado. En general, es extremadamente complicado hackear un smart contract si no hay ninguna vulnerabilidad relacionada con la programación. En caso contrario, cualquier intento de intervenir un contrato inteligente quedaría expuesto ante todos los usuarios de la red. 

Entendiendo los smart contracts según sus características

Con las características básicas de los contratos inteligentes sobre la mesa, podemos profundizar en su estructura interna para comprenderlos mejor. A continuación, veremos un contrato inteligente sencillo que gestiona los depósitos realizados por los usuarios en fideicomiso, moviéndose los fondos pasado un periodo de tiempo específico.

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// Basic Smart Contract Boilerplate

contract SimpleTrustlessEscrow {

    // State variables

    address public depositor; // Account depositing ether

    address payable public beneficiary; // Account receiving ether

    uint256 public releaseTime; // Timestamp to release ether

    // Events for verifying contract activity

    event Deposited(address indexed _from, uint256 _value);

    event Released(address indexed _to, uint256 _value);

    // The contract constructor initializes the smart contract

    constructor(address payable _beneficiary, uint256 _releaseTime) {

        require(_releaseTime > block.timestamp, “Release time must be in the future”);

        // Secure and Trustless: Contract binds depositor and beneficiary

        depositor = msg.sender;

        beneficiary = _beneficiary;

        releaseTime = _releaseTime;

    }

    // Deposit function – autonomous execution (fallback function)

    receive() external payable {

        emit Deposited(msg.sender, msg.value);

    }

    // Release the ether to the beneficiary

    function release() public {

        // Programmable: Can only be executed after releaseTime

        require(block.timestamp >= releaseTime, “Too early to release”);

        // Autonomous: Automatically executes based on condition

        uint256 amount = address(this).balance;

        beneficiary.transfer(amount);

        emit Released(beneficiary, amount);

    }

}

Programabilidad

Veamos si este contrato inteligente responde a las características mencionadas en el punto anterior, comenzando con la programabilidad. En las siguientes líneas de código, vemos que la liberación de los fondos depende de un lapso de tiempo concreto. La condición temporal es programable.

require(block.timestamp >= releaseTime, “Too early to release”);

uint256 amount = address(this).balance;

beneficiary.transfer(amount);

Sin intervención humana

El código indica que todas las partes intervinientes (el usuario que deposita los fondos y el que los recibe) están vinculadas a través del contrato inteligente. La confianza recíproca entre ambas partes no es necesaria, ya que el smart contract ejecutará la operación pasado el tiempo definido por el código.

depositor = msg.sender;

beneficiary = _beneficiary;

releaseTime = _releaseTime;

Autonomía

Tal y como se observa en las siguientes líneas del código, el envío de los fondos se permite de forma totalmente autónoma por parte del contrato inteligente.

function release() public {

    require(block.timestamp >= releaseTime, “Too early to release”);

    uint256 amount = address(this).balance;

    beneficiary.transfer(amount);

    emit Released(beneficiary, amount);

}

Otros elementos del código, como la función relacionada con el depósito, se pueden automatizar por completo según las características que se quieran implementar. Por ejemplo, se podría ejecutar un proceso de depósito recurrente cada vez que el monedero del usuario superara los 100 dólares, enviándose la cantidad sobrante.

Seguridad

constructor(address payable _beneficiary, uint256 _releaseTime) {

    require(_releaseTime > block.timestamp, “Release time must be in the future”);

    depositor = msg.sender;

    beneficiary = _beneficiary;

    releaseTime = _releaseTime;

}

En cuanto a la seguridad, las líneas de código que acabamos de revisar muestran que nada es aleatorio en el proceso. Las condiciones deben cumplirse para que los fondos se envíen. 

Verificación

Cada transacción asociada al contrato inteligente se registra a lo largo de la red, gracias a la separación del registro la actividad de cada elemento.

event Deposited(address indexed _from, uint256 _value);

event Released(address indexed _to, uint256 _value);

emit Deposited(msg.sender, msg.value);

emit Released(beneficiary, amount);

Otros elementos de un contrato inteligente

Hemos visto algunas de las características básicas de los contratos inteligentes, pero no son las únicas. A continuación, veremos otros elementos de los smart contracts que te ayudarán a entenderlos mejor (tomando como ejemplo el caso anterior):

  • Pragma Solidity ^0.8.0; – La versión del lenguaje de programación Solidity necesaria para crear contratos inteligentes.
  • SPDX-License-Identifier: MIT – Se aconseja incluir este paquete informático para indicar si la herramienta es de código abierto y se puede trabajar con ella libremente.
  • Contract TimeLock – Nombra el contrato inteligente, a modo de etiqueta.
  • Address public depositor; – Los contratos implican a dos partes, mayormente una que deposita fondos y otra que los recibe. Esta variable hace referencia al primero.
  • Address payable public beneficiary; – Esta es la dirección pública del beneficiario. También es visible y aporta cierto grado de transparencia.
  • Uint256 public releaseTime; – En el caso de contratos ejecutados pasado un periodo de tiempo, el elemento uint256 indica la temporalidad. En Solidity, el elemento uint (unsigned integer) asigna valores. Para saber más al respecto, puedes leer la documentación de Solidity.
  • Constructor(address payable _beneficiary, uint256 _releaseTime) { – La función “Constructor” está relacionada con la ejecución del contrato, activándolo.
  • Receive() external payable { – Esta función se procesa cuando los fondos se envían a la dirección, en forma de pago.
  • Function release() public { – Se trata de una función pública dependiente del elemento releaseTime que está vinculada al movimiento de tokens ERC-20 desde la dirección del contrato a la del beneficiario.
contrato inteligente

Elementos a tener en cuenta antes de crear un contrato inteligente: BeInCrypto

¿Por qué es importante entender los contratos inteligentes?

Formarse sobre cualquier aspecto cripto es importante, no solo para los profesionales del sector, sino para los usuarios. Conocer el funcionamiento de los contratos inteligentes y entenderlos ofrece muchas ventajas:

  • Adquirir conocimientos sobre automatización en el sector DeFi.
  • Capacidad para analizar los estándares relacionados con la tokenización.
  • Comprender cómo funcionan las entidades descentralizadas, especialmente en casos como los procesos de votación.

Relación entre blockchain y contratos inteligentes

Llegados a este punto, ya podemos hacernos una idea general de cómo funciona un contrato inteligente. Los ejemplos que hemos visto en esta guía representan a la mayoría de smart contracts que dan forma a las aplicaciones descentralizadas (DApp).

La próxima vez que uses una de estas aplicaciones, recuerda que funcionan gracias a las características de los contratos inteligentes que hemos comentado: seguridad, autonomía, programabilidad, etc.

Blockchains y contratos inteligentes

Más allá de las aplicaciones, los contratos inteligentes están relacionados con los ecosistemas blockchain, siendo Ethereum la red más popular en este sentido. No es la única que permite el desarrollo de smart contracts, pero es la más popular.

Ethereum

Los contratos inteligentes de Ethereum se escriben con el lenguaje de programación Solidity, siguiendo el estándar ERC-20. Retomando el ejemplo expuesto anteriormente, podemos explicar cómo se utiliza este estándar. Veamos cómo sería la estructura básica a seguir en el caso de querer lanzar un nuevo token (que llamaremos BIC):

pragma solidity ^0.8.0;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;

contract BICToken is ERC20 {

    constructor(uint256 initialSupply) ERC20(“BIC Token”, “BIC”) {

        _mint(msg.sender, initialSupply);

    }

}

Más adelante, explicaremos los elementos de este contrato inteligente. 

Otras blockchains

Además de Ethereum, tenemos otras redes populares compatibles con los contratos inteligentes, tales como Solana (que usan Rust), Cardano (basados en Plutus), Polkadot (Ink!), Algorand (TEAL), NEO (C#), etc. Así sería la estructura del código de un smart contract simple lanzado en Solana:

use anchor_lang::prelude::*;

declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);

#[program]

pub mod hello_world {

    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {

        let greeting_account = &mut ctx.accounts.greeting_account;

        greeting_account.counter = 0;

        Ok(())

    }

    pub fn increment(ctx: Context<Increment>) -> ProgramResult {

        let greeting_account = &mut ctx.accounts.greeting_account;

        greeting_account.counter += 1;

        Ok(())

    }

}

¿Sabías que?

 Rust es el lenguaje de programación usado para crear contratos inteligentes basados en Solana. Anchor es el framework del que se extraen los módulos: la primera línea del bloque de código (anchor_lang::prelude::*;). 

La documentación de Solana te será de ayuda para entender las especificidades de los contratos inteligentes desarrollados con Rust.


¿Cómo crear smart contracts?

El siguiente paso es aprender a crear contratos inteligentes. No hace falta que te conviertas en un desarrollador profesional. Bastará con que comprendas cómo se programan e implementan los smart contracts.

Para ello, es necesario conocer los estándares de las principales redes y los lenguajes de programación utilizados. En esta guía, nos centraremos en el ecosistema Ethereum, el estándar ERC-20 y el lenguaje Solidity.

Programando contratos inteligentes

La programación es quizá la parte más importantes de todo el proceso de creación de contratos inteligentes. Para superar este paso con éxito, las habilidades de programación son indispensables, así como la experiencia manejando lenguajes de programación no relacionados con la tecnología blockchain (como Javascript). 

Blockchains y lenguajes usados en la creación de smart contracts
Blockchains y lenguajes usados en la creación de smart contracts: BeInCrypto

Sobra decir que, a la hora de programar un contrato inteligente realmente útil, hay que tener en cuenta diferentes aspectos, tales como la seguridad, la optimización de las comisiones, la interoperabilidad.

Contratos inteligentes y EVM

Si quieres lanzar un contrato inteligente en Ethereum, tienes que familiarizarte con el entorno de desarrollo que ofrece Ethereum Virtual Machine (EVM). Puedes considerarlo como una estructura aloja el código de los smart contracts presentes en Ethereum, cuyo funcionamiento depende de los nodos de la red.

Cada nodo ve las transacciones realizadas por los usuarios cuando interactúan con los smart contracts, que se ejecutan una vez se aprueban las operaciones por parte de los validadores. La transparencia es total, dificultando la manipulación por parte de agentes maliciosos.

El código es el que gestiona la operativa. Como hemos comentado, estos contratos inteligentes se programan con Solidity, compilando los bloques de código en bytecode (un formato de bajo nivel que las máquinas pueden entender). 

¿Cualquiera puede crear un contrato inteligente?

Para desarrollar smart contracts hay que tener conocimientos técnicos, no solo sobre lenguajes de programación, sino también sobre el funcionamiento de la tecnología blockchain. Además, es conveniente tener en cuenta los riesgos asociados a la creación de este tipo de programas, principalmente para evitar errores de código.

Por suerte, hay un buen número de comunidades cripto y cuentas de Twitter que ofrecen consejos sobre cómo crear contratos inteligentes. Aunque cuentes con ayuda, el proceso puede ser abrumador, aunque puedes seguir algunos pasos para comenzar con buen pie:

  1. Elige la red o ecosistema.
  2. Aprende el lenguaje utilizado en esa red (por ejemplo, Solidity en Ethereum).
  3. Familiarízate con las herramientas de desarrollo del ecosistema.
  4. Usa testnets para evaluar el funcionamiento de tu contrato inteligente.
  5. Lanza el contrato, pagando el gas asociado.

Programar en Ethereum

Cuando hablamos de contratos inteligentes, Ethereum sigue superando en popularidad a sus competidores: Solana y Cardano, por ejemplo. Solo en 2022, se lanzaron más de 100 mil aplicaciones descentralizadas en la red de Buterin.

Los datos hablan por sí solos. Ethereum cuenta con una comunidad de desarrolladores enorme, de las más grandes del espacio cripto. Si programas algo para la red, seguro que habrá cientos de desarrolladores que le echarán un vistazo.

Otro punto a favor de crear contratos inteligentes en Ethereum es su lenguaje de programación: Solidity es relativamente fácil de aprender. Pero hay muchos otros aspectos a tener en cuenta antes de decidir si programar o no en el ecosistema: el etiquetado, el almacenamiento, la compilación, las funciones, la interoperabilidad, etc.

Tu primer contrato inteligente

Es el momento de crear nuestro primer contrato inteligente. Retomemos la hipotética criptomoneda BIC que hemos mencionado al comienzo de la guía. El siguiente ejemplo de lanzamiento de un contrato inteligente tendrá este token como base, cuya oferta será de 1 millón de unidades.

Lo básico

Para comenzar, vamos a instalar la última versión de Node.js y el NPM (Node Package Manager). De esta forma, tendremos acceso a las herramientas y el entorno de desarrollo necesarios. La instalación también nos permitirá configurar el front-end del contrato inteligente

Después, tendremos que configurar un IDE para generar el código. Para ello, instalaremos Visual Studio Code. También podemos recurrir a la plataforma de desarrollo Alchemy, que ofrece opciones de testeo para Ethereum: Goerli o Sepolia.

Nos quedaríamos con la primera, ya que, aunque el costo es ligeramente superior, cuenta con más aplicaciones lanzadas. En cualquier caso, el objetivo de esta guía no alcanza este nivel, por lo que lanzaremos el contrato inteligente de forma local (no en una tesnet), en un MacOS, para lo que necesitaremos estos tres componentes:

  1. Node.js y NPM. Funcionan como el motor del contrato.
  2. Truffle. Conjunto de herramientas para gestionar el código.
  3. Ganache. Emula una blockchain de forma local.

Creación y lanzamiento

Este el código de nuestro token:

pragma solidity ^0.8.0;

import “@openzeppelin/contracts/token/ERC20/ERC20.sol”;

contract BICToken is ERC20 {

    constructor() ERC20(“BIC Token”, “BIC”) {

        _mint(msg.sender, 1000000 * 10 ** decimals());

    }

}

Si te fijas en la sintaxis, entenderás qué significa cada componente. La parte de OpenZeppelin hacer referencia a la librería usada para importar contratos inteligentes basados en el estándar ERC-20. La función de minteo indica la oferta inicial.

Ejecución

Para desarrollar contratos inteligentes funcionales, es necesario saber cómo se ejecutan en una red y qué papel juegan los nodos en el proceso:

Paso 1

Los fragmentos de código que hemos escrito deben ejecutarse en algún lugar. Estos bloques de código conforman un smart contract, por lo que se ejecutará en una blockchain.

Paso 2

Los nodos son los responsables de la ejecución del código, validando las transacciones a cambio de recompensas.

Paso 3

Cada contrato cuenta con una dirección específica. Para ejecutarlos, las transacciones se dirigen a estas direcciones. Cabe destacar que la EVM está instalada en cada nodo, permitiendo que todos tengan una copia del código del contrato, lo que facilita la comprobación de la legitimidad de la operación. 

Paso 4

Los validadores seleccionan las transacciones y las incluyen en bloques concretos.

Paso 5

Las transacciones validadas pasan a formar parte de la blockchain, ejecutándose el contrato vinculado a la operación.

Paso 6

Todos los nodos que intervienen en la ejecución del contrato inteligente deben alcanzar un consenso: ofrecer el mismo output para el mismo conjunto de inputs. De esta forma, se alcanza un grado de transparencia óptimo.

Nota

Cualquier error relacionado con la ejecución del código o el gas tiene como consecuencia la anulación de la transacción.

Buenas prácticas en el desarrollo de contratos inteligentes

Llegados a este punto, ya hemos cubierto una buena parte del proceso de desarrollo de contratos inteligentes. Veamos algunos puntos a tener en cuenta para comenzar a programarlos:

  • Utiliza librerías confiables (como las de OpenZeppelin) para optimizar el código y cumplir con unos estándares mínimos de seguridad.
  • Genera una estructura de código simple para que sea más fácil testearla.
  • Implementa puntos de control para que entidades y personas concretas tengan acceso directo a los contratos a la hora de realizar cambios. 

Sostenibilidad del código

Las prácticas anteriores son de gran ayuda para optimizar el código y mejorar los niveles de seguridad. Podemos añadir otras, relacionadas con la sostenibilidad del código. El objetivo es crear un contrato sencillo, de poco peso, que permita una ejecución por parte de los nodos sin demasiado poder computacional.

  1. Gestiona de manera eficiente la capacidad de almacenamiento con bloques de datos pequeños. Puedes usar uint8 en lugar de uint256.
  2. Optimiza el código combinando múltiples operaciones.
  3. Desarrolla los contratos para que las funciones se ejecuten solo cuando sea necesario.
  4. Basa el desarrollo en la computación off-chain para reducir el gas y aumentar la velocidad de ejecución.

¿Cómo auditar contratos inteligentes?

Seguir una lista de buenas prácticas no es suficiente. Es necesario tener en cuenta los riesgos y vulnerabilidades asociados a los contratos inteligentes, especialmente a través de auditorías y testeos.

Revisar el código antes de lanzar los contratos inteligentes es fundamental, ya que estos son inmutables. Una vez ejecutados, las consecuencias de un error en el código pueden ser desastrosas y, peor aún, irreversibles.

Vulnerabilidades

Una auditoria implementada correctamente pondrá de manifiesto las vulnerabilidades del contrato inteligente ante ataques de todo tipo. Una vez se identifican, estas vulnerabilidades se pueden realizar cambios en el código.

Brechas de seguridad

The DAO sufrió un ataque en 2016 que pasó a la historia del espacio cripto con unas pérdidas de 3.6 millones de ETH. Al año siguiente, Parity fue objeto de otro hack en el que se esfumaron 500 mil ETH. Una revisión adecuada podría haber evitado ambos ataques.

DAO hack flow chart
Ataque a The DAO: BeInCrypto

¿Cómo auditar contratos inteligentes?

Herramientas de auditoría

Estas herramientas actúan como una primera barrera de defensa y suelen usarse para identificar las vulnerabilidades más comunes. Una de las herramientas de auditoría más populares es Mythril, utilizada para analizar código y detectar brechas de seguridad. 

Herramientas para revisar contratos inteligentes
Herramientas para revisar contratos inteligentes: BeInCrypto

Revisión del código

La revisión manual es habitual a la hora de identificar vulnerabilidades complejas, si es que existen. Hay algunos tipos de amenazas solo se descubren de esta forma.

Revisión automática

Herramientas como Snyk y GuardRails son de gran ayuda para implementar estrategias de revisión automática cada vez que el código del contrato inteligente se actualiza.

Verificación de la ejecución

Se trata de un proceso complejo que comprueba la organización del código, no su sintaxis. El objetivo es comprobar si el contrato se ejecuta correctamente.

Auditar smart contracts de manera sencilla
Auditar smart contracts de manera sencilla: BeInCrypto

Otros métodos de auditoría 

A las técnicas anteriores, podemos añadir otros métodos, tales como la revisión P2P y las pruebas de cobertura (como Solidity Coverage).

¿Cómo revisar el código correctamente?

Hay dos formas generales de auditar un contrato inteligente:

  • Análisis estático. Ayuda a identificar vulnerabilidades básicas, errores de código y problemas relacionados con los estándares. Un detalle interesante de este tipo de análisis es que no es necesario ejecutar el código para revisarlo.
  • Análisis dinámico. Se usa para auditar contratos basados en EVM, revisando su respuesta a un amplio rango de inputs. Entornos como Ganache funcionan como plataformas de análisis dinámico, permitiendo a los desarrolladores realizar transacciones y ejecutar comandos.

Testeo de código: Ejemplo

Este contrato inteligente funciona como almacenamiento de fondos y cuenta con una función de retirada:

pragma solidity ^0.6.1;

contract VulnerableContract {

    mapping(address => uint256) public balances;

    function deposit() public payable {

        balances[msg.sender] += msg.value;

    }

    function withdraw(uint256 _amount) public {

        require(balances[msg.sender] >= _amount, “Insufficient balance.”);

        (bool success, ) = msg.sender.call{value: _amount}(“”);

        require(success, “Transfer failed.”);

        balances[msg.sender] -= _amount;

    }

}

¿Ves la vulnerabilidad? La función “withdraw” puede volver a invocarse si el receptor es un contrato inteligente. Antes de la actualización del balance, un atacante podría retirar fondos adicionales. Veamos cómo solucionar este problema:

function withdraw(uint256 _amount) public {

    require(balances[msg.sender] >= _amount, “Insufficient balance.”);

    balances[msg.sender] -= _amount;

    (bool success, ) = msg.sender.call{value: _amount}(“”);

    require(success, “Transfer failed.”);

}

Ahora, el balance se actualiza antes de que se pueda invocar de nuevo la función de retirada de fondos.

Auditorías en otras redes

El espacio cripto y los contratos inteligentes van más allá del ecosistema de Buterin. Hay multitud de redes compatibles con smart contracts, tales como Solana o Cardano, cada una con sus estándares y lenguajes de programación (incluyendo su propia semántica, sintaxis y lógica).

Para realizar pruebas en otras blockchains, hay que tomar contacto con herramientas de auditoría específicas. Por ejemplo, en Cardano, tenemos Marlowe para revisiones y verificaciones. El testeo en Solana, cuyos contratos se basan en Rust, también cuenta con su propio conjunto de herramientas.

Tipos de auditorías de contratos inteligentes

Las auditorías pueden categorizarse en tres tipos: manuales, automáticas e híbridas. La mayoría de desarrolladores prefieren las auditorías híbridas para contratos inteligentes complejos con una lógica profunda.

Externalizar las auditorías

Independientemente del tipo de auditoría que quieras implementar, puedes delegarla en compañías especializadas o recurrir a herramientas de inteligencia artificial (como ChatGPT). Antes de elegir cualquier opción, conviene tener en cuenta algunos detalles:

  • Delega la revisión en una empresa confiable. Investiga la compañía y busca cuál es su reputación a la hora de testear con éxito contratos inteligentes.
  • Valora el costo. Los servicios de testeo y auditoría pueden ser caros. Asegúrate de que contratas el servicio adecuado y si el precio incluye la subsanación de errores en el código y un seguimiento posterior.

Prácticas a seguir en las auditorías

Si decides testear personalmente tu contrato inteligente, sigue los siguientes consejos:

  • Revisa todos los aspectos del código, incluyendo aspectos como la sintaxis y la lógica.
  • Comienza buscando vulnerabilidades comunes usando herramientas como Slither y MythX.
  • Comprueba si el código cuenta con vulnerabilidades presentes en el SWC.
  • Realiza un testeo completo y riguroso para comprobar cómo respondería el contrato en múltiples escenarios.
  • Comprueba la probabilidad de sufrir un ataque de reentrada. 
  • Céntrate en la revisión de funciones que permitan llamadas externas.
  • Revisa cualquier aspecto del código que pueda tener un impacto negativo en el gas

Inteligencia Artificial y smart contracts: el futuro

La inteligencia artificial está revolucionando la forma en la que desarrollamos contratos inteligentes. Herramientas como ChatGPT han demostrado tener una capacidad elevada, no solo para generar código, sino también para revisarlo y proponer mejoras.

A pesar de los avances en IA, lo cierto es que la intervención humana sigue siendo necesaria para el buen funcionamiento de los contratos inteligentes, así como para su correcta revisión.

De todas formas, seguramente las innovaciones en el campo de la inteligencia artificial mejoren significativamente los niveles de seguridad de los smart contracts.


Preguntas frecuentes

¿Cómo se crea un smart contract?

¿Qué lenguajes de programación se usan para crear smart contracts?

¿Cuáles smart contracts están basados en Solidity?

¿Cómo se auditan los smart contracts?

¿Qué tipo de pruebas se realizan en etapas iniciales de desarrollo de smart contracts?

¿Cómo se lee un smart contract?

Trusted

Descargo de responsabilidad

Descargo de responsabilidad: De acuerdo con las pautas de Trust Project, el contenido educativo de este sitio web se ofrece de buena fe y solo con fines de información general. BeInCrypto prioriza proporcionar información de alta calidad, tomándose el tiempo para investigar y crear contenido informativo para los lectores. Si bien los socios pueden recompensar a la empresa con comisiones por las ubicaciones en los artículos, estas comisiones no influyen en el proceso de creación de contenido imparcial, honesto y útil. Cualquier acción tomada por el lector en base a esta información es estrictamente bajo su propio riesgo.

francisco-herrera.png
Francisco Herrera
Fran es administrativo, docente, músico, artista digital y escritor. Desde 2017, se dedica a generar y compartir contenido relacionado con el empoderamiento personal, económico y social a través de tecnologías disruptivas.
READ FULL BIO
Patrocinado
Patrocinado