Loading repository data…
Loading repository data…
alejandro99so / repository
Este repositorio está enfocado en la mayoría de conceptos básicos de Solidity, esta es una buena guía para estudiar si estás iniciando en este mundo, parte de los códgos vistos aquí están basados en https://github.com/solangegueiros/register-learn-solidity.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Este repositorio está enfocado en la mayoría de conceptos básicos de Solidity, esta es una buena guía para estudiar si estás iniciando en este mundo, parte de los códigos vistos aquí están basados en https://github.com/solangegueiros/register-learn-solidity.
Antes de iniciar con la programación de Contratos inteligentes es muy importante tener claro algunos conceptos clave, como lo son:
Licencia: Se suele usar este encabezado (// SPDX-License-Identifier: MIT) en todos los contratos inteligentes, esto es usado para declarar la licencia y recibir permiso de uso, edición, distribución, y todo lo que requerimos para crear código y ser los dueños de productos con esta base tecnológica.
Versión del compilador: Lo segundo que tiene un encabezado es la versión del compilador pragma solidity 0.8.20;, esta versión es muy importante ya que es la encargada de compilar nuestro código y enviarlo a lenguaje que la máquina virtual de Ethereum pueda entender, en estas versiones van corrigiendo problemas que han causado hackeos o problemas de memoria, a continuación un ejemplo de desbordamiento de memoria en una versión antigua del compilador:
Declaración del contrato: Para crear un contrato además de todo lo anterior mencionado es necesario usar la palabra reservada contract seguida del nombre del contrato con la primera letra en mayúscula como en el ejemplo de OverflowExample quedando algo así contract OverflowExample { ... } donde los ... representan nuestro código dentro del contrato.
Tipos de variable: En solidity existen tres tipos de variables, las cuales son:
Visibilidad: A lo largo del contrato veremos algunas palabras en las funciones, como external, public, internal o private, los cuales nos sirven para definir una visibilidad tanto para funciones como para variables de estado, a continuación, entenderemos para que sirve cada una:
external, si se tiene f(), no se puede llamar f() dentro de otra función, pero si se puede llamar this.f().public pueden ser consultadas también por otras funciones del contrato y pueden ser asignadas a variables de estado, para indicarle al compilador que cree de manera automática funciones de lectura que permitirán obtener el valor de dichas variables de estado.memory vs calldata vs storage: Cuando tengamos una función con parámetros de entrada de tipo string, array, struct o mapping, o queramos usar una variable local con estas características, debemos definir el alcande la memoria utilizada para almacenar estas variables, en estos casos solemos tener 3 opciones , o .
En el contrato ReadWrite tienes la variable de estado myText, puedes actualizar este valor con la función setText, o puedes retornar el valor de la variable con la función getText.
En el contrato ReadWrite puedes hacer lo mismo que en el ejemplo anterior, adicional puedes medir el número de cambios hechos a lo largo de la historia.
En el contrato ReadWriteConstructor puedes hacer lo mismo que en el ejemplo anterior, adicional puedes observar un nuevo concepto, un constructor es una "función" que es llamada por el contrato inteligente al momento de su creación, por lo que puedes guardar información como la billetera de quien lo desplegó, la estampa de tiempo y más.
En el contrato de ReadWriteOwner puedes ver un nuevo concepto, el "owner", este es asignado cuando se crea el contrato inteligente en la función del constructor, usando el valor msg.sender, la cual es una variable global con la dirección pública de quien desplegó el contrato inteligente. Este concepto es usado para restringir el acceso en algunas funciones, es muy común en contratos inteligentes más complejos.
En el contrato de ReadWriteRequire puedes ver un nuevo concepto, el "require", este es similar al "if", porque tienes una condición que debe ser cumplida, si esto no pasa, el código no continúa ejecutándose, pero comparado con el "if" nos da un nuevo concepto, el "callback", este retorna el estado de cada "variable de estado" al estado inicial antes de llamar la función, adicional este muestra un mensaje de error en caso de tener uno.
En el contrato global_info puedes encontrar seis funciones que retornan algunas variables globales.
Tienes que crear un contrato inteligente que reciba dinero de cualquier persona, este tiene que ser capaz de reconocer al usuario y bloquear los fondos recibidos por cada uno de ellos por un año después de la transacción. Ejemplo: Juan ahorra 1000 wei en un contrato, el día 06/08/2023, Juan puedes retirar el dinero solamente después de 06/08/2024, considerando la hora, minutos y segundos.
Te invito a crear un PR con tu solución y etiquetarme en las redes sociales: @alejandro99so en instagram y X (Twitter).
En el contrato MyModifier se introduce un nuevo concepto, el modifier, es una palabra reservada y la definición parece una función, pero con la particularidad de que esta "función" es usada en el encabezado de otras funciones, con el objetivo de modificar el comportamiento de esta función, el equivalente a un middleware, o interceptor, ya que se suele ejecutar antes del cuerpo de la función.
Para saber si se ejecuta antes o después se usa underscore placeholder que se ve así: _;, y este representa la ejecución del código de la función.
underscore placeholder este código del modifier se ejecutará antes del de la función.underscore placeholder este código del modifier se ejecutará después de ejecutada la función.Es más común el caso 1.
En el contrato MyEvent se introduce nuevamente un concepto nuevo, el event, este también usa una palabra reservada, esta seguida de algo similar al encabezado de una función, ya que recibe el nombre y los parámetros de entrada con su respectivo tipo.
Estos eventos son muy útiles para conocer el estado de un contrato, ya que podemos reportar eventos importantes que requiera monitoreo y hacer que estos eventos ejecuten un endpoint, muestren algo en un front en tiempo real, nos notifique a un canal y mucho más, solo se requiere emitirlo en la función que requiramos y pasarle los valores de las variables que requerimos.
En el contrato MyModifierEvent se combinan modificadores y eventos, se ve como el modificador onlyOwner, valida que quien llama la función sea quien creo el contrato y una vez lo valida emite un evento informando la modificación de la variable de tipo texto.
En el contrato MyArray se define por primera vez en esta guía los arreglos, en este se observa string[] private myTexts;, lo cual muestra una variable llamada myTexts, con una visibilidad privada, la definición de string[] nos dice que será un arreglo de string, con esto en mente ya podremos usar las operaciones de los arreglos. Algunas de ellas son:
[index]: permite asignar una variable a una posición particular del arreglo, debemos asegurar que dicha posición exista para no tener errores dentro del código, si tenemos un arreglo de diez posiciones, podremos asignar desde myTexts[0] hasta myTexts[9] ya que el último indice será 10 - 1 = 9.En el contrato MyArrayConditional se vuelve a observar un arreglo, y adicional se observa una implementa un condicional, un ciclo y un arreglo de strings definido de manera local, por lo que se usa memory para especificarle al compilador que guarde la variable en una memoria temporal, también se observa algo nuevo, la expresión new string[](totalNewArray), después de la definición conocida de string[] entre paréntesis se define el tamaño del arreglo, limitando el espacio de memoria que queremos reservar para el arreglo de string.
También se observa que el ciclo es muy similar a los que se observan en otros lenguajes como javascript, for (uint i = start; i <= end; i++){}, donde primero se especifica la variable que se incrementara (i), luego el límite de i, y por último la manera en la que incrementara la variable i, seguido por {} do
memorycalldatastoragememory, con la diferencia de que esta se suele usar para argumentos de funciones, ya que las variables definidas en este tipo de memoria son de solo lecturas, es decir inmutables, por lo que se usan para variables cuya existencia es temporal e inmutable.