Ir al contenido principal
Change page

Librerías de contratos inteligentes

Última edición: @JuanB.Mont(opens in a new tab), 25 de septiembre de 2023

No es necesario que escribas cada contrato inteligente de tu proyecto desde cero. Hay muchas bibliotecas de contratos inteligentes de código abierto disponibles, que proporcionan bloques de construcción reutilizables para tu proyecto que pueden salvarte de tener que reinventar la rueda.

Requisitos previos

Antes de adentrarte en las bibliotecas de contratos inteligentes, te recomendamos que comprendas bien la estructura de estos documentos. Dirígete a Anatomía del contrato inteligente, si aún no lo has hecho.

¿Qué hay en una biblioteca?

Normalmente puedes encontrar dos tipos de bloques de construcción en las bibliotecas de contratos inteligentes: comportamientos reutilizables que puedes añadir a tus contratos, e implementaciones de varios estándares.

Comportamientos

Cuando escribas contratos inteligentes, hay una gran posibilidad de que te encuentres escribiendo patrones similares una y otra vez, como asignar una dirección de administrador para realizar operaciones protegidas en un contrato, o añadir un botón de paro de emergencia en caso de producirse un problema inesperado.

Las bibliotecas de contratos inteligentes suelen proporcionar implementaciones reutilizables de estos comportamientos como bibliotecas(opens in a new tab) o a través de herencia(opens in a new tab) en Solidity.

Como ejemplo, a continuación se muestra una versión simplificada del >contrato de Ownable(opens in a new tab) de la biblioteca de contratos OpenZeppelin(opens in a new tab), que diseña una dirección como el propietario de un contrato y proporciona un modificador para restringir el acceso a un método únicamente a dicho propietario.

1contract Ownable {
2 address public owner;
3
4 constructor() internal {
5 owner = msg.sender;
6 }
7
8 modifier onlyOwner() {
9 require(owner == msg.sender, "Ownable: caller is not the owner");
10 _;
11 }
12}
Mostrar todo
Copiar

Para utilizar un bloque de construcción como este en tu contrato, primero tendrás que importarlo y, a continuación, ampliarlo en tus propios contratos. Esto te permitirá utilizar el modificador proporcionado por el contrato base "poseíble" para asegurar sus propias funciones.

1import ".../Ownable.sol"; // Path to the imported library
2
3contract MyContract is Ownable {
4 // La siguiente función solo puede solicitarla el propietario
5 function secured() onlyOwner public {
6 msg.sender.transfer(1 ether);
7 }
8}
Copiar

Otro ejemplo popular es SafeMath(opens in a new tab) o DsMath(opens in a new tab). Se trata de bibliotecas (en oposición a los contratos base) que proveen funciones aritméticas con controles de desbordamiento, que no proporciona el lenguaje. Recomendamos utilizar cualquiera de estas bibliotecas en lugar de operaciones aritméticas nativas para proteger tu contrato contra desbordamientos, que pueden tener consecuencias nefastas.

Estándares

Para facilitar la composibilidad e interoperabilidad, la comunidad Ethereum ha definido varios estándares en forma de ERC. Puedes leer más sobre ellos en la sección de estándares.

Al incluir un ERC como parte de sus contratos, recomendamos buscar implementaciones estándar, en lugar de intentar desplegar las tuyas. Muchas bibliotecas de contratos inteligentes incluyen implementaciones para los ERC más populares. Por ejemplo, el omnipresente estándar de tokens fungibles ERC20 puede encontrarse en HQ20(opens in a new tab), DappSys(opens in a new tab) y OpenZeppelin(opens in a new tab). Adicionalmente, algunos ERC también proveen implementaciones canónicas como parte del propio ERC.

Vale la pena mencionar que algunos ERC no son autónomos, sino adiciones a otros ERC. Por ejemplo, ERC2612(opens in a new tab) añade una extensión a ERC20 para mejorar su usabilidad.

Cómo agregar una biblioteca

Consulta siempre la documentación de la biblioteca que estás incluyendo para obtener instrucciones específicas sobre cómo incluirla en tu proyecto. Varias bibliotecas de contratos de Solidity están empaquetadas usando npm, así que puedes simplemente instalar npm de ellas. La mayoría de las herramientas para compilar contratos buscarán en tu node_modules las bibliotecas de contratos inteligentes, así que puedes hacer lo siguiente:

1// Esto cargará la biblioteca @openzeppelin/contracts desde tu node_modules
2import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
3
4contract MyNFT is ERC721 {
5 constructor() ERC721("MyNFT", "MNFT") public { }
6}
Copiar

Independientemente del método que utilices, al incluir una biblioteca, siempre vigila la versión del lenguaje. Por ejemplo, no puede utilizar una biblioteca para Solidity 0.6 si estás escribiendo tus contratos en Solidity 0.5.

Cuándo se debe utilizar

Usar una biblioteca de contratos inteligentes para tu proyecto tiene varias ventajas. En primer lugar y principalmente, te ahorra tiempo al proporcionarte los bloques de construcción listos para que los puedas incluir en tu sistema, en lugar de tener que codificarlos tú mismo.

La seguridad también es un beneficio importante. Las bibliotecas de contratos inteligentes de código abierto también suelen ser objeto de un severo escrutinio. Dado que muchos proyectos dependen de ellos, existe un fuerte incentivo por parte de la comunidad para mantenerlos bajo una constante revisión. Es mucho más común encontrar errores en el código de aplicación que en las bibliotecas de contratos reutilizables. Algunas bibliotecas también son sometidas a auditorías externas(opens in a new tab) por seguridad adicional.

Sin embargo, el uso de bibliotecas de contratos inteligentes conlleva el riesgo de incluir código con el que no estés familiarizado en tu proyecto. Es tentador importar un contrato e incluirlo directamente en tu proyecto, pero sin entender bien lo que hace ese contrato, puedes estar introduciendo inadvertidamente un problema en tu sistema debido a un comportamiento inesperado. Asegúrate siempre de leer la documentación del código que estás importando y, a continuación, revisa el código antes de incluirlo en tu proyecto.

Por último, al decidir si incluir o no una biblioteca, considera su uso general. Si seleccionas una que se suela adoptar con frecuencia la ventaja será que, como la utiliza una comunidad de personas mayor, hay más ojos controlando los posibles errores. La seguridad debe ser tu enfoque principal durante la redacción de contratos inteligentes.

Contratos de OpenZeppelin: **La biblioteca más popular para el desarrollo seguro de contratos inteligentes.**

DappSys: **Bloques de creación simples, flexibles y seguros para contratos inteligentes. **

HQ20: **Un proyecto de Solidity con contratos, bibliotecas y ejemplos para ayudarte a construir aplicaciones distribuidas con todas las características para el mundo real.**

Web3 Solidity SDK -**Proporciona las herramientas necesarias para construir contratos inteligentes personalizados de forma eficiente**

Más lectura

¿Conoces algún recurso en la comunidad que te haya servido de ayuda? Edita esta página y añádelo.

¿Le ha resultado útil este artículo?