WEB3DEV Español

Hector
Hector

Posted on

Conceptos básicos de Solidity: tu primer contrato inteligente

Este es un preludio a una serie de múltiples partes en Solidity

Este artículo es una traducción de Daniel Yamagata, hecha por Héctor Botero. Puedes encontrar el artículo original aquí.
Sería genial escucharte en nuestro Discord, puedes contarnos tus ideas, comentarios, sugerencias y dejarnos saber lo que necesitas.
Si prefieres puedes escribirnos a @web3dev_eshttps://twitter.com/web3dev_es en Twitter.

Parece que todos tienen un proyecto de Web3 pero, nadie tiene un desarrollador Web3. Solo 18.500 desarrolladores están activos en Web3, ¡0,07% de todos los desarrolladores en el mundo! Esta escasez extrema no es por falta de demanda: los desarrolladores de contratos inteligentes ganan, en promedio, un salario base 50% más alto que el de un desarrollador típico de software.

Solidity se ha vuelto el programa de lenguaje de la Web3 por defecto y es usada entre los ecosistemas de las cripto. Desde afuera, parece imposible de aprender pero, no es tan complejo como piensas que es. Esta serie apunta a desmitificar Solidity y llevar al lector de un nivel principiante a un nivel intermedio de comprensión.

Descripción General

Inspirado por JavaScript y C++, Solidity es un lenguaje de alto nivel, usado para crear contratos inteligentes, compatibles con el Ethereum Virtual Machine (EVM). El código de Solidity está desglosado por un compilador el cual, subsecuentemente, muestra un archivo binario que contiene bytecode y una interfaz de aplicación binaria (Application Binary Interface, ABI). Un ABI es un archivo de interfaz que le dice a otras aplicaciones, bibliotecas y contratos inteligentes cómo interactuar con tu código.

Para una comprensión más profunda y de bajo nivel sobre el EVM, te sugiero este video de Ethereum Engineering Group

Gas y Computación

Los blockchains de capa 1 tienen un límite a su tasa de transferencia en relación con el poder de la computación. Para disuadir a los malos actores de sobrecargar la red, la computación en una blockchain es costosa. Gas se refiere a la unidad usada para medir el costo de computar en un blockchain. Cualquier acción que cambia el estado de la red, requiere gas.

Para más información, lee Ethereum Docs

No hay números flotantes en Solidity. En cambio, todos los valores son denominados en Wei, la subdenominación más pequeña de ETH, la criptomoneda de Ethereum. Un ETH es igual a 10¹⁸wei.

La razón detrás de esto es muy simple: no deberías usar números flotantes para representar dinero. Por lo tanto, la base de la unidad del lenguaje necesita ser lo suficientemente pequeña para acomodar para transferencias precisas de valor.

Gas en Ethereum es denominado en gwei, el cual es 10⁹ wei o 0.000000001 ETH

Frameworks y Bibliotecas

Hay un número existente de frameworks y bibliotecas para interactuar con el EVM.

Los frameworks de Javascript, Hardhat y Truffle son los más usados para el desarrollo y testeo de Solidity mientras que Brownie es una alternativa basada en Python. Recientemente fue lanzada Paradigm, desarrollada y lanzada por Foundry, el cual te permite testear tu código con Solidity.

Si planeas construir una aplicación descentralizada, necesitarás implementar tu frontend usando Ether.js o Web3.js para interactuar con EVM.

Para este tutorial, estaremos usando Remix, una IDE basada en el navegador.

Tipos de Variables de Solidity

Solidity es de tipo estático. Esto quiere decir que cada variable necesita ser especificada cuando se inicializa.

Tipos de Valor

  • bool
  • int/uint
  • dirección // mantiene un valor de 20 bytes de una dirección de Ethereum
  • bytes
  • string

Existen palabras claves desde int8 a int256 y uint8 a uint256 que especifican el número de bits usados.

Como C++ o Javascript, el espacio en blanco no importa en Solidity. Sin embargo, necesitas terminar cada línea usando un punto y coma (;).

Visibilidad

Similar a los accesos específicos en otros lenguajes de programación, las funciones y los estados variables en Solidity requieren un modificador de visibilidad. Hay cuatro:

  • pública: la función o variable puede ser invocada de forma externa o interna por cualquier otro contrato, cuenta o función. El compilador de Solidity automáticamente genera funciones mejores para publicar variables en el momento de la compilación.
  • interna: la función o variable sólo puede ser accesada dentro del contrato en sí o por otros contratos hijos.
  • privado: las variables y funciones de estado privadas son similares a las internas pero no pueden ser accedidas a través de los contratos derivados.
  • externa: sólo las funciones pueden ser colocadas como externas. Las funciones marcadas como externas, no pueden ser llamadas internamente por otras funciones.

Para más información, lee este artículo o los Solidity Docs

Las funciones pueden ser marcadas también como vistas o puras.

  • vistas: la función no puede alterar las variables de estado. Estas funciones son similares a las funciones de miembros const en C++.
  • puras: la función no puede ser accesada o modificada por variables de estado.

Todas las funciones de captación deberían ser marcadas como vista mientras que aquellas que son usadas internamente por la matemática, deberían ser marcadas como pura.

Tu primer Contrato Inteligente

Abajo está el “Hola Mundo” de Solidity.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract MyContract {
uint256 myVar;
function setMyVar(uint256 newVal) public {
myVar = newVal;
}
function getMyVar() public view returns (uint256) {
return myVar;
}
} // end of myContract
Enter fullscreen mode Exit fullscreen mode

Para crear un archivo .sol, haz click en el botón que está en la esquina superior izquierda, debajo de workspaces_ (mira abajo). Nombra tu archivo como _MyContract.sol_

Image description

Tu primera línea de un archivo .sol debe especificar el identificador de licencia SPDX. El compilador de Solidity te alienta para evadir cualquier problema legal que viene, naturalmente, al usar contratos inteligentes de código abierto. Usaremos el MIT SPDX License-Identifier.

// SPDX-License-Identifier: MIT
Enter fullscreen mode Exit fullscreen mode

Luego, vamos a necesitar especificar cuál versión de Solidity estaremos usando. Esto se logra usando la palabra clave pragma.

pragma solidity ^0.8.7;
Enter fullscreen mode Exit fullscreen mode

Puedes especificar explícitamente cuál versión del compilador de Solidity quieres usar. Usando ^, estaremos diciendo que el archivo de origen no se compila con cualquier versión anterior al 0.8.7

En Solidity, los contratos actúan como una clase,un estado encapsulado y con implementaciones de comportamiento. Para definir un contrato inteligente, usaremos la palabra clave contract.

contract MyContract { … }
Enter fullscreen mode Exit fullscreen mode

Luego, inicializamos un uint256 y lo llamaremos myVar.

uint256 myVar;
Enter fullscreen mode Exit fullscreen mode

Solidity es un lenguaje extraño: a menos que estés optimizando el espacio, es mucho más efectivo usar un uint256 en vez de un uiint8, uint16, etc.

Si quieres aprender por qué, lee este artículo por Coinmonks

Las funciones son definidas usando la palabra clave function. Abajo, definiremos una función pública para establecer un valor a myVar.

function setMyVar(uint256 newVal) public {
myVar = newVal;
}
Enter fullscreen mode Exit fullscreen mode

Ya que setMyVar cambia los estados, un usuario debe gastar gas para ejecutar la función. No te preocupes por esto, estaremos usando el VM de Remix, el cual emula un blockchain en tu navegador.

Para obtener el valor de myVar, simplemente llamaremos getMyvar():

function getMyVar() public view returns (uint256) {
return myVar;
}
Enter fullscreen mode Exit fullscreen mode

Al devolver un valor, debes especificar el tipo de datos en la declaración de la función, así como el tipo de datos del valor devuelto.

También es importante recordar que ejecutar una función solo cuesta gas si la función cambia de estado. La consulta de datos a través de una función getter, no cuesta gas.

Compilar, Desplegar e Interactuar con MyContract en Remix

Para compilar el contrato en Remix, pulsa ⌘S o Ctrl+S.

Para implementar el contrato, ve hasta a la pestaña Deploy and Run Transactions y haz click en Deploy. Asegúrate que Enviroments sea uno de los VM de Remix.

Image description

Luego, navega a la esquina inferior izquierda con el contrato desplegado. Llama setMyVar() con cualquier número entero y luego, subsecuentemente, invoca getMyVar ():

Image description

¡Felicidades! Acabas de escribir e interactuar con tu primer contrato inteligente.

Está pendiente para la siguiente parte de esta serie donde te enseñaré sobre los tipos de referencias, cómo desplegar contratos desde el mismo contrato y cómo interactuar con contratos existentes.

Por favor, contáctame y a mi equipo en Bloccelerate VC si estás construyendo en Web3. Siempre estamos buscando apoyar a grandes fundadores.

Siéntete cómodo de dejarme una nota si tienes cualquier sugerencia para las herramientas o tópicos que debería cubrir a futuro. _

Discussion (0)