Existen características generales que todos los lenguajes de programación implementan y otras tantas propias de cada lenguaje. Solidity tiene las suyas, sintaxis que verás en muchos otros lenguajes de programación y otra serie de características únicas de Solidity.
Tipos de variable y operadores en Solidity
Solidity, como todo lenguaje de programación, posee una serie de operadores y tipos de variables que puedes utilizar para programar la lógica de tu aplicación.
Tipado de variables
Solidity es un lenguaje fuertemente tipado, lo que significa que debes especificar el tipo de variable cuando la declaras y este no puede cambiar. Esto ayuda enormemente a reducir los errores en el código fuente.
En Solidity puedes encontrar los tipos de variables:
Boolean: Variables binarias que solo pueden contener dos valores, true o false.
String: Permite guardar cadenas de texto.
Números enteros: Pueden ser de dos tipos, uint (enteros que no permiten números negativos) e int (enteros que si pueden ser negativos). Contar con variables sin signo nos permite aprovechar al máximo la capacidad de memoria de una variable para guardar números positivos aún más grandes.
Address: El tipo de dato ""dirección"" es propio de Solidity y te servirá para almacenar direcciones de una cuenta de una wallet de un usuario, o bien, la de otro smart contract dentro del contrato. Para que una dirección pueda recibir Ether, se debe indicar con la palabra reservada payable.
Variables globales
Muchos lenguajes de programación implementan variables globales que puede invocar y utilizar en todo momento. En Solidity, podemos encontrar las siguientes variables globales:
block: Información del bloque actual de la transacción.
msg: Información de la llamada.
tx: Información de la transacción.
Cada una de ellas es un objeto con varias propiedades que nos aportan información sobre el contexto de ejecución de la transacción o el estado del contrato. Estas son algunas de las variables más comunes:
block.gaslimit: Límite de gas en el bloque actual
msg.data: Información de la llamada
msg.sender: Dirección de la llamada
msg.value: Número de wei enviado
tx.gasprice: Costo de gas de la transacción
El gas es concepto transcendental que debes conocer. Sus distintos valores y unidades de medida parten de un ETH fragmentado en pequeñas partes.
Denominaciones de Ether:
Nombre de unidad
Valor en Wei
Número de Wei
Wei (Wei)
1 wei
1
Kwei (Baggage)
1e3 wei
1.000
Mwei (Lovelace)
1e6 wei
1.000.000
Gwei (Shannon)
1e9 wei
1.000.000.000
Twei (Szabo)
1e12 wei
1.000.000.000.000
Pwei (Finney)
1e15 wei
1.000.000.000.000.000
Ether (Buterin)
1e18 wei
1.000.000.000.000.000.000
Observa la particularidad de que cada unidad de medida tiene un nombre especial. Por ejemplo Szabo es el creador del concepto de contratos inteligentes en los años '90 y es un pequeño homenaje a su persona. ¿Te animas a investigar quién es cada uno de estos autores?
Operadores lógicos
Para realizar comparaciones o validaciones de variables, puedes implementar operadores lógicos como:
[!]: Comprueba si el valor es falso, convierte un valor booleano a su valor opuesto.
[&&]: Operador AND. Comprueba si dos o más valores son verdaderos.
[||]: Operador OR. Compueba si al menos uno de dos o más valores es verdadero.
[==]: Comprueba si dos valores son iguales o equivalentes.
[!=]: Comprueba que dos valores no sean iguales o equivalentes.
Visibilidad de las variables
Las variables en Solidity puede tener uno de cuatro tipos de visibilidades. Cada uno permite un alcance o acceso a la variable de diferente manera que podemos utilizar dependiendo la necesidad.
public: Las variables del tipo públicas, a lo igual que en POO, pueden ser accedidas tanto por fuera como por dentro del contrato.
private: Las variables del tipo privadas solo podrán ser accedidas desde adentro del propio contrato.
internal: Las variables internas solo pueden ser accedidas por el mismo contrato o un contrato que deriva del mismo, o sea, contratos heredados.
external: Las variables externas solo puede ser accedidas desde llamadas de otros contratos. No puede leerse dentro del mismo contrato.
Por defecto, las variables son del tipo internal.
Constructor de un contrato
A lo igual que en la programación orientada a objetos, los contratos posee un constructor que es la primera función que se ejecuta por única vez al desplegar el mismo. En él, puede inicializar variables y también capturar variables que el usuario haya enviado para desplegarlo.
En el ejemplo anterior, el constructor recibe una variable del tipo uint256 que es guardada dentro de una propiedad del contrato. Además, estamos guardando la dirección de la wallet del usuario que desplegó el contrato en otra propiedad del contrato.
Entorno de desarrollo de Solidity
Ethereum posee su propio entorno de desarrollo denominado Remix. Por supuesto que también puedes utilizar VS Code, pero Remix, además de funcionar en la nube, implementa características para probar nuestros contratos inteligentes en cuestión de segundos.
Así luce la interfaz de Remix, el IDE en el navegador para desarrollar smart contracts en Solidity:
A la izquierda, se encuentra el principal menú de opciones. De arriba hacia abajo encontramos:
(1) Este es el explorador de archivos, el primero en visualizarse al entrar en Remix. Aquí se encuentran los contratos.
(2): Buscador dentro del entorno para acceso rápido a tus contratos.
(3) Configuraciones del compilador de Solidity.
(4) deployer o desplegador de tus contratos donde puedes elegir la red donde se va a desplegar. También se pueden visualizar y probar las funciones del contrato e interactuar con el mismo una vez hecho el despliegue.
Despliegue de tu primer contrato
El entorno puede parecer algo confuso al principio, veamos cómo utilizarlo para desplegar tu primer contrato inteligente.
Paso 1. Programa el contrato inteligente
En el centro se encuentra el área de la escritura del contrato, donde se escribe todo el código. Justo debajo se observa la terminal que Remix incluye para lanzar comandos. Puedes utilizar algunos contratos de prueba que Remix trae por defecto.
Paso 2. Compilación del contrato
Cuando hayas finalizado el desarrollo de tu contrato, el entorno suele compilar el mismo automáticamente para verificar que todo está correcto. También puede compilarlo tu mismo haciendo clic en el botón ""Compile"" en la opción número 3 del menú.
Paso 3. Despliegue del contrato
Antes del despliegue, puedes configurar en la opción 4 del menú en el entorno donde se lanzará el contrato, la dirección de prueba que quieres usar para el despliegue con ETH sin valor real. También puedes configurar el límite de gas para la transacción o puedes dejar el valor por defecto.
Por ahora, estos ajustes son suficientes para este contrato de prueba. Has clic en el botón naranja ""Deploy"" para lanzar tu primer contrato.
Si no hubo ningún problema con la compilación, el despliegue debe arrojar en la pantalla (y también verás el registro en la terminal) la ""palomita verde"" de transacción exitosa.
En la parte izquierda, en el menú de despliegue, puedes observar los botones que se habilitan con el contrato que representan a cada una de las funciones del mismo.
Ya puedes comenzar a interactuar con tu contrato haciendo uso de estos botones.
Conclusión
Esto es tan solo un vistazo rápido de lo que implica crear un contrato y trabajar con el entorno de Remix que será tu mejor aliado para desarrollar y probar contratos. Aún hay mucho por aprender tanto sobre desarrollo de software con Solidity como en el uso de este entorno de desarrollo.
Contribución creada por:Luis Enrique Herrera y Kevin Fiorentino (Platzi Contributors).
se saltaron la parte del video donde le dan deploy al contrato, para que no se enreden deben agregar la información debajo de Deploy y ejecutar la transacción.
Aquí el resultado en la parte de abajo
lo hice directamente conexión local con Ganache
Genial Jhon gracias por el aporte!
Muchas Gracias!!!
Para que no estén rasgandose las vestiduras en vano (?), les paso a hacer el gentil recordatorio de declarar la licencia
// SPDX-License-Identifier: GPL-3.0
A mi me mostraba error en eso y estuve aquí 35 minutos hasta que me dí cuenta que no lo puse 🤡
thank you bro!!!
Tipos de variables
Booleanos
(true o false)
Enteros
Hay dos tipos
Uint (Todos los enteros positivos)
Int (Todos los enteros positivos y negativos)
Address
String y bytes
Cadena de texto
Visibilidad
Las variables con el identificador private podrán ser usadas dentro del contrato, las variables con el identificador public podrán ser usadas dentro y fuera del contrato, por defecto son private.
Variables Globales
block: Información del bloque
**msg: ** Información de la llamada
**tx: ** Información sobre la transacción actual.
Muchas gracias por el aporte.
Super!
En Solidity "uint" es en realidad un alias para "uint256" que es un número entero de 256 bits, se pueden declarar uints con menos bits.
uint8
-uint16
-uint32
-uint64
-uint128
-uint256
Por lo general usarás uint solo (256) salvo en casos especiales se usaría un entero menor.
Gracias.
Gracias por el aporte.
Remix es un entorno de desarrollo de Ethereum que nos ofrece la posibilidad de compilar y desplegar contratos.
Remis
Gracias.
Al desplegar el contracto, recuerden menter el string del name entre comillas dobles: "MyContract"
Remix se encarga de ponerlas
Buen aporte.
State variables
Are stored inside the contract
Structure = type varName
State variables types
boolean(true || false)
uint(only positive numbers)
int(positive and negative numbers)
string(text)
address(wallet address)
🙈 Visibility
private ➡️📜
public ⬅️➡️📜
default = private
🌎 Global variables
block = block information
msg = call information
tx = actual transaction information
Yo realize el ejercicio, pero use las dos variables globales adicional: msg.value y tx.gasprice. Y bueno me di cuenta que para que msg.value funcione hay que colocar en el constructor la instrucción de "payable" para que pueda recibir dinero, si no me equivoco... Este es mi codigo:
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.7<0.9.0;contract variables { uint public age; int public number; string public firstName; bool public isDeveloper; address public wallet; uint public valueWei; uint public valueGas;constructor(uint _age, int _number, string memory _firstName, bool _isDeveloper) payable{ age = _age; number = _number; firstName = _firstName; isDeveloper = _isDeveloper; wallet = msg.sender; valueWei = msg.value; valueGas = tx.gasprice;}}
Buen aporte.
tal vez intentaste con el msg.data ? quise ver lo que arrojaba sin embargo no supe que tipo de dato asignarle a la variable que usaria para el msg.data. Intente con uint y con string; y me arrojo error con ambos.
¿Por qué se les pone el _ (Guión bajo a las variables)?
Buena pregunta, te refieres en el constructor, ¿cierto?
Es solo una buena practica para denotar su alcance, es decir privadas, en este caso esas variable por defecto por ser solo parámetros son privadas porqué solo se pueden usar dentro de ese bloque
Variables de estado
Definen el estado en todo momento del contrato y se guardan dentro de la blockchain
me genera el siguiente error al desplegar el contrato:
Cuando haces el deploy debes agregarle los datos que aparecen en el video. Por lo visto en el video se saltean esta parte pero si pausas el mismo en 6:28 podrás ver lo que te digo en donde dice "DEPLOY".
Que significa memory en string memory _name ?
Hey ! Mas adelante se explica en una clase especifica pero en resumen , solidity require que le indiques donde deberia guardar la informacion , en el caso de los parametros de una funcion, te lo requiere cuando son estructuras de datos como un array , struct o strings , los strings debido a que la forma en que se guardan en memoria es como un array
Memory indica que la informacion se va a guardar en la memoria , lo que quiere decir que va existir solo mientras ocurra la llamada a la funcion pero tambien si quieres puedes re asignar el valor de ese parametro dentro la ejecucion,
Mientras que calldata es un lugar en la memoria similar a memory pero este es dedicado para parametros de las funciones, lo cual lo hace mas barato en terminos de gas y no puedes volver a reasignar ese parametro osea no puedes cambiarle el valor durante la ejecucion.
Aqui puedes leer mas :3
Gracias por el aporte
RESUMEN CLASE 8:
VARIABLES DE ESTADO Y
VARIABLES GLOBALES
I.- VARIABLES DE ESTADO
Están guardadas en el storage del contrato.
Tipo nombre (tipo nombreDeLavariable;)
II.- TIPOS DE VARIABLES
Booleanos
Enteros
Address
Strings y bytes
III.- BOOLEANOS
bool keyword
True - false
False por defecto
Operadores lógicos:
! (negación)
&& (and)
| | (or)
== (igualdad)
!= (desigualdad)
IV.- ENTEROS
uint. Enteros sin signo (solo positivos).
int. Enteros con signo (negativos y positivos).
0 por defecto.
V.- ADDRESS
Keyword: address.
20 bytes (tamaño de una dirección en Ethereum).
address payable.
Enviar Ether.
balance y transfer.
VI.- STRING Y BYTES
Cadena de texto: string.
Arreglo de bytes: bytes.
String: no permite usar length ni acceder por índice.
VII.- VISIBLILIDAD
Public (Dentro y fuera del contrato)
Internal (Solo dentro del contrato)
Private (Dentro del contrato)
VIII.- UNIDADES DE ETHER
Wei, gwei y ether.
IX.- UNIDADES DE TIEMPO
Seconds (base)
Minutes
Hours
Days
Weeks
X.- PROPIEDADES DE LA BLOCKCHAIN
Block. Información del bloque.
Msg. Información de la llamada.
Tx. Información de la transacción.
Dejo el codifo
// SPDX-License-Identifier: MITpragma solidity >=0.8.7<0.9.0;contract Identity{ uint public idNumber; bool public isWorking; string public name; address public wallet;constructor(uint _idNumber, bool _isWorking, string memory _name){ idNumber = _idNumber; isWorking = _isWorking; name = _name; wallet = msg.sender;}}
Me perdí cuando hizo el deploy del contrato pero viendo los comentarios lo pude resolver.
Se salto una parte!
Deberían actualizar este video para observar como crea o sube los archivos.
Variables de estado
Tipo que son + nombreDeLaVariable
Tipos de variables
Booleans
bool
true - false
!(negación): !🌧
&& (and): !🌧️ && 🔆
|| (or): 🔆 || ☂️
== (igualdad): 1 == 1
≠ (desigualdad): 2 ≠ 1
Integers
uint: 2 (Enteros sin signos o positivos)
int: -2 (Pueden ser enteros con signo, enteros negativos y positivos)
Address
0x5B38…dC4
0x617F…7f2
address payable
Strings
Cadena de texto
string message = “Hola mudo”;
Visibilidad
private
Prodrán ser usadas dentro del contrato
int private bigNumber = 1000000;
public
Podrán ser usadas dentro y fuera del contrato
int public bigNumber = 1000000;
default
Solo se pueden acceder dentro del contrato
int bigNumber = 1000000;
Variables globales
block
Información sobre el bloque
msg
Información sobre la llamada
tx
Información de la transacción actual
Propiedades
block.gaslimit
Límite de GAS que nos permite ejecutar el bloque actual
msg.data
Toda la información enviada en la llamada del contrato
msg.sender
Nos da la dirección de quien realiza la llamada del contrato