Librerías de contratos inteligentes
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 o a través de herencia en Solidity.
Como ejemplo, a continuación se muestra una versión simplificada del contrato de propietario
de la biblioteca de contractos OpenZeppelin, 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;34 constructor() internal {5 owner = msg.sender;6 }78 modifier onlyOwner() {9 require(owner == msg.sender, "Ownable: caller is not the owner");10 _;11 }12}13Mostrar todoCopiar
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 library23contract MyContract is Ownable {4 // La siguiente función solo puede solicitarla el propietario5 function secured() onlyOwner public {6 msg.sender.transfer(1 ether);7 }8}9Copiar
Otro ejemplo popular es SafeMath o DsMath. 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 ubicuo ERC20 fungible token estándar puede encontrarse en HQ20, DappSys y OpenZeppelin. 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 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_modules2import "@openzeppelin/contracts/token/ERC721/ERC721.sol";34contract MyNFT is ERC721 {5 constructor() ERC721("MyNFT", "MNFT") public { }6}7Copiar
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 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.
Herramientas relacionadas
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.**
Tutoriales relacionados
- Consideraciones de seguridad para desarrolladores de Ethereum: Un tutorial sobre consideraciones de seguridad que deben tenerse en cuenta al construir contratos inteligentes, incluyendo el uso de bibliotecas.
- Entender el contrato inteligente de token ERC-20 : Tutorial en el estándar ERC-20, proporcionado por múltiples bibliotecas.
Más lectura
¿Conoces algún recurso en la comunidad que te haya servido de ayuda? Edita esta página y añádelo.