La programación es una habilidad fundamental para el próximo siglo,
además de ser una de las profesiones mejor pagadas de la historia.
Y en segundos vas a tomar las clases que quizás cambien tu vida profesional para siempre.
Este es el curso de programación básica de Platzi, la escuela de tecnología más grande
del mundo hispano. Y empieza ya. Toma hoy el nuevo curso gratis de programación básica.
Dale clic y aprende en Platzi.
Muy buenas tardes, noches o días desde donde te encuentres viendo esta transmisión en vivo y me
da mucho mucho gusto estar nuevamente por acá compartiendo con todas y todos este espacio de
aprendizaje donde vamos a entender las particularidades de lo que es Solidity en
ETH. Program Ethereum de Program. Estamos por acá y te estarás preguntando ¿pero qué es esto?
Bueno, es un programa que de alguna manera puedes acceder y seguir. ¿Qué está pasando?
Lo único que tienes que hacer es, aparte de venir a estas transmisiones,
es entrar a platzi.com slash ETH. Ahí vas a poder encontrar toda la información y poder
seguir al día de hoy lo que está dentro de este programa. Así que también déjame recordarte que
nos vemos aquí los martes 4 de la tarde, hora Colombia, para diferentes aprendizajes. Y en
esta ocasión tenemos a un invitadaso. Una persona célebre en la comunidad Blockchain en Colombia y
que nos va a contar un poco más acerca de Solidity. ¿Qué es? ¿Cómo funciona? ¿Qué implica? Y bueno,
pues vamos a empezar lo que debe de ser el inicio de esta base fundamental para convertirte en un
desarrollador Blockchain. Así que si estás llegando por acá y te has perdido algunas sesiones,
no te preocupes. Platzi.com ETH. Ahí vas a poder encontrar todo acerca de este programa. Y bueno,
si estás dentro ya del programa, tanto en Discord o siguiéndolo aquí con estas transmisiones,
sabes que hemos estado aprendiendo cosas maravillosas. En lo personal me pone muy
contento porque hasta yo he aprendido de grandes expertos del ecosistema que han venido a contarnos
su experiencia. Desde el stack, desde las tecnologías, a resolvernos dudas particulares
de cómo funciona el tema de la criptografía, el tema del Blockchain y cómo con ello se alinean
para tener en este caso un gran aprendizaje unificado en todo lo que tiene que ver este
gran ecosistema del Blockchain y todo lo que está a su alrededor. Y bueno, estar trabajando con
Ethereum sin duda nos va a seguir ayudando a sacar nuestras habilidades como profesionales. Así que
bueno, dejemos de esta introducción. Cuéntenme en el chat desde dónde están, qué país, qué ciudad,
qué región. Si se están tomando un cafecito o alguna bebida y vamos a ir arrancando como se debe.
Y para eso, y como les había mencionado, les tengo un invitado. Un invitado que nos ha acompañado
en algunos eventos también presenciales en la ciudad de Bogotá. Líder de comunidades Blockchain
en Colombia y Community Advocate en Shelling. Estoy hablando de Camilo Molano. ¿Cómo estás el día de hoy Camilo?
Hola Oscar, muy buenas tardes. Excelente, muy contento de acompañarlos en este espacio que
tenemos el día de hoy y con la expectativa de que los participantes del Ethereum Developer Program
sigan adquiriendo conocimiento que les sea útil. Y tú bien lo sabes, ¿no? Solidity es la base de
esta gran revolución también. Por eso hace mucho sentido que lo manejemos. Ya después cuando
desarrollen con RIAD y con HardHat se darán cuenta que la base de la interacción y el registro en
Blockchain se va a gestionar desde Solidity.
Tú lo has dicho. Yo estaba buscando el botón de desmutearme. No quise hablar ni decir nada porque dije yo sé que estoy muteado. Déjame desmuteo.
Pero todo bien, todo bien. Para que vean que esto es en vivo, que se siente la emoción de que estamos por acá.
Y bueno, por ahí paso a saludar rápidamente a nuestros estudiantes Camilo, que están desde México, Nicaragua, Cuenca,
Dice tomando un cafecito desde Chile. Por ahí vi a alguien que dijo que un vinito, un tinto, en Colombia el tinto es un café.
Sé que en otras regiones el tinto es otro tipo de bebida que no voy a decir más, pero qué bien que te estás hidratando con la bebida que estés en este momento disfrutando esa transmisión.
Y bueno, Camilo, antes de arrancar, porque yo sé que nos tienes toda una introducción, que nos tienes mucho conocimiento por transmitir.
Me gustaría que nos cuentes quién es Camilo, qué hace y que claramente le des entrada a lo que vendría siendo el aprendizaje para todos nuestros miembros del Ethereum Dev Program.
Perfecto, pues yo me considero una apasionado de la tecnología Blockchain desde que en 2017 me encaminé en este mundo.
He encontrado una pasión indescriptible. Vivo mi día a día en torno a crear comunidades, crear escenarios para que más personas se involucren en el mundo de desarrollo.
También nos interesa que personas desde el perfil de negocios entiendan el potencial de la tecnología Blockchain.
Como tú bien lo mencionaste, soy miembro cofundador de Hyperledger Latinoamérica. Hyperledger es una soluciones de Blockchain enfocada en negocios.
Y de un tiempo para acá me involucré activamente, más o menos hace un año y medio, con la comunidad de Chainlink.
Hacemos Bootcamp, hacemos cursos, queremos traducir contenido. Y bueno, eso es como un pequeño resumen.
Más que todo entusiasta y apasionado por este mundo y espero que todas las personas que nos estén acompañando en la tarde, noche o madrugada,
porque si hay gente desde España nos estará viendo ya en su madrugada, se involucre y siga aprendiendo. Esto es de nunca parar de aprender.
Tú lo has dicho, tú lo has dicho. Así que bueno, pues Camilo, ¿qué te parece si vamos arrancando con todo lo que nos tienes de contenido para el aprendizaje del día de hoy?
Claro que sí. Vamos a pasar a la aprender haciendo. Creo que es una filosofía fundamental que debemos replicar.
Y nuestro punto de partida para la sesión del día de hoy, y ya empezamos en forma, es en la página remits.ethereum.org.
Es un entorno de desarrollo online bastante poderoso que nos va a permitir interactuar con los contratos inteligentes.
¿Qué es lo interesante de Remits? Que nos va a permitir de una forma muy rápida desplegar en una red local,
a medida que ustedes se vayan interactuando e involucrando con este mundo de contratos inteligentes,
se van a dar cuenta que esas redes locales son ese espacio que en este caso Remits nos provee,
donde podemos probar nuestros contratos inteligentes. Entonces Remits nos ayuda con la compilación.
Acordémonos que Solidity es un lenguaje compilado y una vez que se compila ese lenguaje,
vamos a poder interactuar con las diferentes funciones que creemos. Entonces Remits es nuestro punto de partida.
Si es las primeras veces que te involucras en el trabajo con Remits, te va a aparecer una interfaz como esta que estamos viendo.
Venimos a la carpeta Contracts, podemos crear una nueva carpeta, pero para el ejercicio de hoy simplemente vamos a elegir el primer ícono,
que es crear un nuevo archivo. Cuando vayamos en la opción de crear un nuevo archivo, es el nombre que le asignaremos a nuestro archivo
y ustedes dirán ¿qué vamos a construir el día de hoy? La sesión anterior ustedes crearon una plataforma,
un contrato inteligente para registrar Pokémon, para agregarles características, fue un ejemplo bastante interesante
que les dio los fundamentos técnicos y hoy lo vamos a complementar con una lotería.
Entonces vamos a llamar nuestro archivo lotery.sol y ¿por qué una lotería?
Porque una lotería es el ejemplo claro de cómo la descentralización y la seguridad es fundamental en este mundo.
Permítanme yo corro esto por acá y vamos a empezar. Acuérdense que estamos trabajando con código y código abierto,
por eso cuando estén trabajando en Solidity la primera línea que vamos a agregar es la licencia.
Acuérdense que nuestros contratos inteligentes se van a ejecutar en una blockchain pública
y lo interesante de lo que trabajamos en Solidity es que puede ser compatible en todas aquellas redes blockchain
que utilicen la máquina virtual de Ethereum o que sean compatibles con la máquina virtual de Ethereum.
En este programa lo estamos enfocando a desplegar en Ethereum, pero tú también podrías desplegar tus contratos
en Binance Smart Chain, Polygon, Arbitrum, entre muchas otras redes que son compatibles con este estándar.
Esta primera línea los invito a que la consulten, es el licenciamiento de uso en nuestro contrato inteligente,
pero vamos a entrar a lo divertido porque aquí lo más interesante es aprender construyendo nuestro contrato inteligente.
Para ello vamos a utilizar una versión del compilador de Solidity mayor a la versión 0.8.7.
Si ustedes se dan cuenta es un lenguaje que apenas está iniciando, su compilador aún no llega a la versión 1.
Siéntanse afortunados, somos parte de esta revolución de la descentralización.
Listo, utilizamos la palabra reservada Pragma, elegimos la versión del compilador y vamos a arrancar a construir nuestro contrato.
Para ello utilizamos la palabra reservada Contract y el nombre que queremos darle a nuestro contrato.
Es una muy buena práctica de desarrollo de contratos inteligentes notar los contratos con letra mayúscula
como se utilizan otros lenguajes de programación como Java con las clases.
Y cuando antes de que empecemos a construir código siempre tenemos que pensar en cuáles son las funcionalidades que va a tener nuestro contrato inteligente.
Si nos ponemos a pensar cuál es el modelo de una lotería, hasta cierto punto es un, tú compras una boleta,
esa boleta va a tener un costo, en el mundo de las loterías esa boleta tiene un número y de forma aleatoria se va a elegir por medio de ese número un ganador.
Siempre es importante antes de empezar a hacer código entender cuál es el problema que tenemos que resolver
y hasta cierto punto identificar cuáles podrían ser las entradas y cuáles podrían ser las salidas de este ejercicio.
En nuestro caso vamos a decir que voy a declarar una variable un entero sin signo de 256 bits y vamos a agregar la palabra reservada public.
Cuando ustedes se enfrenten al desarrollo de contratos inteligentes se van a dar cuenta que hay diferentes modificadores de visibilidad.
Vamos a encontrar public, external, internal y private, son los cuatro, public, private, internal y external.
Los invito a que vean la documentación de Solidity en la cual nos va a poder explicar y vamos a entender en qué casos utilizar cada uno de ellos.
Pero un ejemplo muy simple es que estas variables públicas las van a poder utilizar y van a ser visibles para cualquier función que quiera interactuar con mi contrato inteligente.
Estas variables públicas son accesibles por toda la red y vamos a llamar nuestra variable la mínima tarifa que yo debo pagar para participar de la lotería.
Adicionalmente en nuestra lotería descentralizada que estamos construyendo el día de hoy vamos a agregar un arreglo de tipo direcciones.
¿Y qué significa esto? Allí vamos a guardar las direcciones de todos los participantes de nuestro contrato inteligente.
Si ustedes se dan cuenta aquí todas las identificaciones vienen dados por nuestras billeteras.
Nuestra billetera tiene un identificador único que es esa dirección que compartimos a la cual nos pueden enviar diferentes criptomonedas y que en nuestro caso lo utilizaremos como el identificador.
Listo, vamos a ir construyendo y a medida que vayamos avanzando en el desarrollo del ejercicio le empezaremos a agregar diferentes funcionalidades.
Por el momento tenemos una tarifa mínima para ser parte del contrato y dos vamos a tener una lista de los participantes que se están sumando a la lotería.
¿Listo? Adicionalmente Solidity tiene una palabra reservada que se llama el constructor.
En el constructor se inicializan las condiciones, valga la redundancia, se definen las condiciones iniciales que yo quiero que tenga mi contrato inteligente.
Entonces cuando se despliegue dicho contrato yo voy a definir, entonces pongo la palabra reservada constructor, abro paréntesis y le vamos a pasar cuál es ese valor mínimo.
Yo como creador del contrato inteligente quiero que si tú pagas 10 ETH puedas participar de mi lotería.
Entonces en esta lotería van a haber varios participantes que van a apostar por hacer parte de esta lotería un valor mayor, digamos a un ETH, no vamos a decir 10, un ETH, un ETH perdón,
y depende de lo que tú pagues vas a poder participar o no.
Tenemos que empezar a hacer todas estas validaciones.
Paso número 1. En la línea 5 y 6 agregamos lo que se definen como variables de estado.
Es aquella información que va a persistir dentro del contrato inteligente.
Cada escritura en la cadena de bloques de Ethereum nos va a costar, pero la lectura no.
Entonces tenemos que contemplar cuáles variables queremos estar escribiendo de forma constante.
Como estamos en etapa temprana no estamos pensando tanto en optimización del tamaño en memoria que quiero que tenga cada una de mis variables, por ahora estamos aprendiendo.
Y acuérdense que mejor forma de aprender que haciendo.
Y con este que es un parámetro de la función le podemos agregar y muchas veces lo van a ver ustedes en diferentes contratos inteligentes con los que interactúen,
que se agrega antes del nombre de la variable una raya al piso que indica que es un parámetro de la función.
Y dentro de nuestra variable de minfib vamos a asignar este valor que nos envían al momento de desplegar el contrato inteligente.
Y ustedes van a decir Camilo, ¿qué estás haciendo? Pues lo vamos a ver y vamos a ver otras características que nos ofrece Solidity.
Acuérdense pueden utilizar el comando control S para compilar su contrato inteligente.
A medida que sigan avanzando se van a dar cuenta de la importancia de la interfaz de aplicación binaria o AVI y del By Code,
que es el código que se va a enviar a la máquina virtual, el código en máquina y ese es el que se despliega en la cadena de bloques.
Ethereum en este caso y la interfaz de aplicación binaria es ese archivo en el que me define los métodos y las características de dichas funciones
para poder interactuar con mi contrato inteligente desplegado.
Los invito a que lean con mucho más detalle sobre el AVI y el By Code y su importancia dentro de la máquina virtual de Ethereum.
Si ustedes le dan al comando control S o comand S dependiendo de su sistema operativo, que es la opción de compilar y vamos al cuarto ícono de desplegar,
automáticamente nos vamos a dar cuenta como Remix nos ofrece diferentes opciones.
Primero vamos a interactuar con la que dice máquina virtual de London, vamos a ejecutar una emulación de la máquina virtual de Ethereum.
El nos provee nuestro sueño dorado, tener 10 billeteras cada una con 100 Ethereums para aprender a desarrollar contratos inteligentes y en Ethers,
un límite de gas que es el límite que puede consumir al desplegar el contrato inteligente y un valor, que este valor lo utilizaremos ahorita que interactuemos con nuestras funciones.
Como yo aquí en el método constructor agregué que necesitaba una variable entera sin signo que definí como la mínima tarifa que tu debes pagar por ejecutar el contrato inteligente
si ven que aquí el Deployed me está pidiendo dicho parámetro, si yo comentareo esta porción de código, ejecuto y compilo nuevamente mi contrato inteligente,
si ven como el botón de Deployed ya no me pide información, por eso es tan importante el constructor,
que condiciones iniciales o que variables quieren ustedes inicializar que tal vez provengan desde su frontend,
siempre piensen que el contrato inteligente va a interactuar con una aplicación, con un frontend, con esa interfaz gráfica,
entonces con que información me gustaría a mi inicializar este contrato inteligente.
Listo, descomentaríamos, volvemos a compilar nuestro contrato y vamos a decir que el valor mínimo que debemos pagar para participar de nuestra lotería es un Ether,
una lotería bastante cara ¿no? en estos momentos, pero como estamos en una red de prueba no tendríamos mayor inconveniente.
Pregunta, que espero que me respondan por el chat, ¿Cómo se denota la unidad mínima del Ether? ¿Cómo se llama? ¿Cuál es la unidad mínima?
Les vamos a dar 20 segunditos, esta es pregunta de quiz, así super express, ¿Cuál es la unidad mínima divisible del Ether?
Entonces, aspiro y espero que en el chat ya nos hayan dejado sus respuestas, si no se la saben, perdieron y nos tenemos que poner muy tristes porque eso ya lo deberían estar manejando,
no mentiras, no se preocupen, es algo que uno muchas veces no domina y que más adelante le genera como ciertos retos, esa unidad mínima se llama el Way
y un Ether equivale a uno por diez a la dieciocho Ways, es decir uno cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, cero, hayan de cuenta que conté dieciocho ceros Ways.
Entonces yo aquí le voy a... tengo que escribir ese valor en Way.
Entonces pongo 1,
1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18.
Este es el ejemplo más difícil.
Cuando ustedes ya trabajen con librerías como Web3 o EtherJS,
él nos ayuda con esta conversión.
Por ahora, como estamos interactuando con Solidity desde Remix,
tenemos que ingresar este valor en Way.
Yo despliego mi contrato inteligente
y automáticamente, si ustedes vienen en la misma ventana,
a la parte inferior donde dice Contratos inteligentes desplegados,
tenemos la dirección del contrato.
¿Qué significa ello?
Es como aquella instancia de los contratos inteligentes
y ustedes dirán ¿qué es eso?
Cuando uno despliega el contrato,
la máquina virtual de Ethereum y la red generan un espacio
en el que tú vas a interactuar con tu contrato inteligente
y el identificador es esta dirección.
Vamos a desplegarlo
y sin yo haber creado nada más,
Solidity automáticamente,
cuando yo declaro una variable de tipo public
me va a crear algo que se llama un getter
o es aquella función que me va a permitir consultar
la información que está almacenada en esta variable de estado.
Entonces, si ustedes se dan cuenta,
yo desplegué mi contrato inteligente
y él acá me va a decir
que el valor mínimo para participar de este contrato
fue el que yo definí.
Vamos a hacer una pausa en este caso y vamos a retomar acá eliminando,
voy a minimizar esto acá un segundo,
la palabra reservada public.
Si ustedes no declaran
o no definen un tipo de visibilidad,
él por defecto lo va a dejar como private.
Son aquellas variables que solo son visibles
dentro del contrato inteligente.
¿Vale?
Si vuelvo y lo compilo y lo despliego,
es 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
prometo que voy a guardar este número
si no tengo que desgastarme escribiendo muchos ceros,
se van a dar cuenta que ya no tengo de forma
directa y visible una función.
Entonces eso es lo interesante
de los modificadores de visibilidad.
De los contratos inteligentes. Esto es algo bonito,
algo curioso que como al agregarle la palabra public,
él automáticamente pues me va a permitir a mí tener esa función
para saber el valor que queda almacenado en dicha variable.
Déjenos saber en los comentarios si ya conocían ese trucaso
que nos ofrece Solidity.
Y bueno, eso es todo por hoy.
Un trucaso que nos ofrece Solidity.
No voy a compilar porque pues no hemos hecho
cambios significativos
y vamos a agregar nuestra primera función.
Utilizamos la palabra Function
y vamos a agregar la palabra
o el nombre de nuestra función,
que en este caso se va a llamar Play.
Va a ser una función pública.
¿Qué significa ello?
Que cualquier
contrato inteligente o cualquier persona, llamémoslo,
va a poder interactuar con esta función.
Abrimos llaves
y vamos a decir
que por favor a nuestro arreglo de jugadores
le vamos a agregar
y aquí viene algo bien interesante.
En Solidity tenemos algo que se llaman
las variables globales.
Son variables como el message.sender.
¿Qué significa?
Es el identificador de la dirección
de la persona que ejecutó la función Play.
Entonces estas variables, si ustedes las analizan,
yo no las definí dentro de mi contrato inteligente,
pero sí en la definición global del lenguaje
vamos a encontrar estas variables.
Y ustedes me dirán,
Camilo, ¿y en qué momento vamos a validar
que la persona esté enviando
más del valor mínimo que definimos?
Acuérdense, ese era el objetivo de nuestra lotería.
Para ello podemos utilizar
la palabra reservada
require,
abrimos paréntesis
y ¿qué estamos esperando?
Que el valor, entonces utilizamos
otra variable global,
message.value
sea mayor o igual
¿a qué?
A nuestra tarifa mínima por participar.
El require revisa que se cumpla esta condición
o de lo contrario nos va a decir
por favor
paga más.
Ustedes me dirán, Camilo, ¿más tiene tilde en la A?
Sí, pero si le agrego la tilde
a la hora de compilar solito y me va a generar un error
por el string y las caracteres especiales.
Voy a compilar mi contrato inteligente,
me dice aquí que tengo un error
y me dice, perfecto,
me gusta aprender de los errores.
Si tú estás esperando
obtener un valor,
tal vez esta función debería ser de tipo
payable.
Entonces nos vamos a dar cuenta
cómo la palabra reservada payable
nos va a permitir a nuestras funciones
recibir ethers.
Eso es poderosísimo
porque ustedes cuando estén construyendo
sus diferentes proyectos
van a poder solicitar que les paguen
por ejecutar algunas funciones.
Para que tengan un ejemplo más claro,
cuando yo voy a mintear un NFT,
más adelante lo aprenderán en este programa, supongo,
y si no le colocamos la tarea a Oscar y Ángela
que nos enseñen en un workshop adicional,
yo tengo que pagar un fee
por mintear ese NFT.
Entonces es probable que dicha función mint
sea de tipo payable.
Yo tengo que pagar por ejecutarla.
Vamos a compilar,
acuérdense, esto es una clase en vivo
y en todas las clases en vivo
la probabilidad de que ocurran errores
es muy alta,
pero yo he aprendido mucho más de los errores
que de los aciertos.
Cuando me equivoco y duro tres horas buscando
y me doy cuenta que era una bobada,
aprendí mucho más.
¡Listo!
Tenemos nuestro contrato,
queremos decir que vamos a desplegarlo,
que la mínima comisión
o el mínimo valor a pagar
para participar o ejecutar esta función Play
es de un Ether.
Venimos a nuestra función
y ¡qué bonito!
Las funciones de tipo payable en Remix
se caracterizan porque el botón
va a ser de color rojo.
Acuérdense que Remix es una muy bonita herramienta
para empezar a interactuar
con nuestros contratos inteligentes.
Más adelante, cuando ustedes trabajen con Hardhat,
pues ya no van a tener esta interfaz gráfica,
sino que necesitan ustedes
construir sus propios métodos
para interactuar con sus funciones.
¡Listo!
Tengo la función Play
y como les comentaba,
aquí en la parte superior,
Remix nos ofrece 10 direcciones de prueba.
Entonces vamos a elegir la primera
como si fuera un jugador de nuestra lotería.
Aquí en la sección de valores
podemos cambiar, entonces tenemos
Way, GWay, Fini y Ether.
Vamos a elegir Ether.
¿Y cuál era el valor mínimo que definimos?
Un Ether.
Entonces yo digo, esta persona
y ya no vamos a oprimir el botón de Deploy,
sino que automáticamente, acuérdense,
uno Ether, como ustedes lo hayan configurado
y en la parte inferior
vamos a ejecutar la función Play.
¡Éxito! Funcionó.
Automáticamente,
él me permitió enviar un Ether a la función.
Pero ustedes se preguntarán,
¿y qué pasó?
Entonces, lo que hicimos fue
1. Validar que el valor que se envió,
si ven aquí en la parte superior, en Value,
sea mayor o igual a lo que definimos
y que almacenamos en nuestra variable
de tarifa mínima de participar de nuestra lotería
y a esa persona que realmente la identificamos
con una billetera en nuestra red,
la vamos a agregar a un arreglo de jugadores.
Acuérdense que es un ejemplo muy básico.
Yo aquí también podría agregar
la palabra reservada public,
así podría consultar
cómo va siendo nuestro arreglo de jugadores.
¿Listo? ¡Perfecto!
Pero ustedes dirán,
¿será que es importante saber
cuánto balance o cuál es el saldo
de cada uno de los jugadores de la lotería?
Yo podría decir, sí.
Entonces, para ello vamos a crear,
vamos a utilizar un mapping.
Acuérdense que un mapping es una estructura
en la que utilizamos una clave,
que en este caso una llave,
que es de tipo adres,
que es un identificador único dentro de esa estructura
y le vamos a asignar un valor,
en este caso un entero sin signo.
Nuestro mapping también va a ser público
y lo vamos a llamar el balance
de cada jugador, player balance.
¿Listo?
Ahora, en nuestra función de play
vamos a agregar
que el balance
de esta persona
que envió cierto valor, acuérdense,
con esto tengo la dirección
de la persona que llamó nuestra función play,
le vamos a sumar
lo que había en ese espacio,
como es la primera vez que se ejecuta,
el valor previo de esa ubicación dentro del mapping
era cero
y vamos a decirle
que nos guarde
el valor de lo que la persona apostó.
¿Para qué nos sirve ese mapping?
Tal vez nosotros, desde nuestro frontend
queremos
que nuestro
poder listar
los valores de cuál ha sido la máxima apuesta,
cuál ha sido la mínima apuesta,
cuál es la identificación de esa persona que hizo la apuesta,
acuérdense, nosotros vamos parametrizando
el contrato inteligente
de acuerdo a lo que queramos hacer.
¿Listo?
¿Qué sigue?
Probemos nuestro contrato.
Probemos nuestro contrato hasta este punto,
entonces borro el que tenía desplegado anteriormente,
compilo con el comando control-s o comand-s,
agrego nuestro valor de unether,
que es la tarifa mínima que yo quiero
que se ejecute o con la que se participe de nuestra lotería,
despliego
y si ustedes se dan cuenta,
al agregar la palabra reservada public
a nuestros jugadores,
yo voy a poder saber,
dependiendo de las posiciones de nuestro arreglo,
qué jugador hay en cada posición.
¿Listo?
Desplegamos nuestro contrato,
vamos a
jugar,
acuérdense, el mínimo valor,
en este caso queremos que este jugador envíe
dos ethers al contrato,
ejecutamos la función play,
aquí en la parte central remits nos muestra el estado,
aquí nos dice mira, esta transacción se pudo hacer correctamente,
ahorita vemos qué pasa si yo envío un valor menor
y yo aquí podría consultar,
entonces vengo a la parte superior,
copio la cuenta,
cuánto dinero ha colocado en la lotería este participante,
entonces él me va a decir
dos ethers,
hagan acto de fe, no vamos a contar los ceros,
pero aquí estaría el valor equivalente
a dos por diez a la dieciocho,
¿Listo?
Ahora vamos a
revisar
en nuestro arreglo de jugadores,
como le hice un push,
agregué un valor a nuestro arreglo,
nos vamos a dar cuenta que este es el valor
que está en dicha posición,
¿Listo?
Acuérdense que en estas sesiones de Solidity desde cero
estamos abarcando diferentes conceptos,
este es un ejemplo que nos permite ver
diferentes funcionalidades
y ahora vamos a construir
una función
que nos permita saber
cuál es el saldo que tiene nuestro contrato inteligente,
para ello utilizamos la palabra reservada balance,
va a ser una función de visibilidad pública
y vamos a agregar una palabra reservada que es view,
¿Por qué view?
Porque esta función
simplemente va a consultar
información
de las variables de estado
de nuestro contrato inteligente,
por ejemplo,
de las variables de estado de nuestro contrato inteligente,
por eso va a ser view,
no va a escribir dentro de la cadena de bloques
y utilizamos la palabra reservada free terms
que esperamos que nos retorne
un saldo de tipo entero sin signo
y le vamos a decir que nos retorne
lo que tiene esta dirección
retórneme.balance
¿Qué significa?
¿Se acuerdan que cuando desplegamos un contrato inteligente
él nos asignó una dirección?
Lo que estamos diciendo con esta función
es que retórneme el balance,
o sea, cuánto saldo tiene en Ethers
la dirección de este contrato,
entonces podríamos saber
cuánto es el acumulado de nuestra lotería.
Si ustedes se dan cuenta
partimos de un problema
que era cómo construir una lotería descentralizada
y vamos a ir avanzando
a agregarle diferentes funciones.
¿Qué más deberíamos construir?
Si ustedes lo piensan
yo ya tengo una función
que permite que diferentes participantes
se sumen a la lotería.
Ya tengo cómo validar
que el valor que ellos están aportando a esta lotería
es mayor al que yo definí
como creador de contrato inteligente
y ahora necesito elegir un ganador.
Entonces yo podría venir acá
y escribir
function
elige
un ganador.
Va a ser una función
por ahora dejémoslo public
ya ahorita vamos a ver
qué significa
y la pregunta es
¿qué deberíamos hacer?
¿Cómo elegimos un ganador de esta lotería?
Acuérdense que es un ejemplo bastante sencillo
pero espero que ustedes allá en sus casas
estén pensando
lo mismo que yo.
Si acá
tengo
un arreglo de jugadores
en la que se van llenando las posiciones
con diferentes direcciones
las personas que podrían ganar
debería elegir de forma aleatoria
alguna posición de este arreglo.
¿Cierto?
Estos son ejercicios que normalmente hacemos
en otros lenguajes de programación
de cómo elegir
un número aleatorio dentro de un arreglo
y esto lo vamos a construir en Solidity.
A día de hoy Solidity
o bueno hasta donde yo conozco
tal vez Oscar tú me corregirás
pero creo que sabemos lo mismo
no hay ninguna función para calcular de forma directa
números aleatorios en Solidity.
Nativa Solidity.
Entonces tenemos que crearla.
Entonces voy a comentariar un segundo
nuestra función de elegir ganador
y vamos a construir esa función
Función que se llame
GetRandomNumber
esta función va a generar
un número aleatorio.
También va a ser de tipo pública
es una función que yo dispongo dentro de mi contrato
podría ser privada, si,
solo quiero que la llamen dentro de mi contrato inteligente
por ahora la tarea que les queda
es consultar cómo sacarle el máximo provecho
a estos modificadores de visibilidad
y vamos a decirle
que me retorne un entero sin signo
y aquí viene algo bien interesante
vamos a simular
un número aleatorio
para ello vamos a utilizar
la palabra reservada
GetCa256
entonces vamos a generar
el hash de la siguiente información
y cuál es la información
ustedes dirán Camilo, ¿qué estás haciendo?
vamos a coger
tal vez
la información de la persona que desplegó el contrato inteligente
y la información del tiempo del bloque actual
y esos van a ser nuestras semillas
para generar el número aleatorio
antes de ello vamos a hacer por aquí
otro ajuste y vamos a decir que el dueño
o el administrador del contrato
va a ser la persona
que despliegue el mismo message.sender
listo
y acá adentro
necesitamos empaquetar
esa información que les compartí hace unos segundos
entonces para ello utilizamos el encode pack
de la información que es el owner
y el block.timeStamp
¿qué estamos haciendo?
vamos a
aquí para que lo vean mejor
vamos a rayar aquí la pantalla un segundo
voy a coger
la dirección del contrato
lo voy a convertir a bytes
para eso utilizo la función avi.encodePack
voy a utilizar
el timeStamp del bloque
la marca de tiempo del bloque actual
con esto hallo un hash
un identificador único
y eso lo convierto en un número
esto no me lo inventé yo
es una de las formas en las que se genera
pseudo aleatorio
números aleatorios
simulados, esa palabra es bastante difícil
pero realmente siempre piensen
que no vamos a confiar en esta información
los mineros podrían modificar estos datos
y favorecer la generación de algunos números
es por ello que existen soluciones
para generar números aleatorios
de forma descentralizada
a medida que sigan aprendiendo
aprenderán por ejemplo Chainlink ofrece ese servicio
pero esta es la forma en la que
normalmente utilizamos
aquí se me fue una sede más
la generación de números aleatorios
que otro error me está dando
return owner
a ver, revisemos
que error tengo
que él me dice que es owner
yo lo definí aquí en nuestro constructor
pero realmente
tenía que agregar
la variable
de estado
listo
a ver que otro error tenemos
encode pack
listo, revisemos los errores
se me fue una D
acuérdense
errores de tipografía
si es importante y si ven como el compilador
me ayuda a identificar cuáles son los errores de sintaxis
esto me lo ayuda a hacer remits
y vamos a ejecutar hasta este punto
para que se den cuenta
borremos nuestro contrato
aquí vamos a
copiar y pegar de nuestro portapapeles
el valor que teníamos
y miren esa función get random number
lo que va a hacer
va a generar un número aleatorio
muy grande, si vuelvo y la llamo
me trae otro número aleatorio
para eso estamos utilizando
piensenlo, esta analogía
de base para la semilla
la dirección del contrato
y
el estampado del tiempo del bloque actual
pero ese número tan grande
vamos a utilizarlo aquí en la función pit winner
como me va a generar un índice
que se encuentre
entre el tamaño máximo de mi arreglo
para ello vamos a utilizar
y declarar una variable que se llame índice
y que le vamos a decir
que va a generar el resultado
de llamar a la función get random number
y vamos a aplicar módulo
entre el tamaño
de los elementos
que tiene nuestro arreglo
pledgers.lent
listo
y de esta forma
truco de programación
que uno va aprendiendo a medida que
trabaja en diferentes ejercicios
va a generar un número aleatorio
que su rango va a estar entre 0
y el tamaño de elementos
que tiene mi arreglo
si me quedan errores
o mejoras de optimización del contrato
yo después les comparto el repositorio
y ustedes pueden seguirlo mejorando
acuérdense esta es una primera aproximación
a cómo construir nuestra lotería
descentralizada
ya tengo la posición
lo único que resta
es transferirle a esa cuenta
el dinero
que había dentro de mi contrato inteligente
los invito a que consulten
que existe la función transfer
la función sen
y la función call
pero en las últimas versiones de Solidity
y lo que se recomienda
es que utilicemos el método call
para transferir
los saldos
de nuestros contratos inteligentes
entonces
este método me va a retornar
dos parámetros
el primero
es un booleano
que yo puedo saber si realizo de forma exitosa
la transferencia de saldos
y vamos a decir
que a nuestros
alguno de nuestros jugadores
en la posición
de nuestro número
aleatorio
vamos a llamar el método call
y le vamos a pasar
los siguientes parámetros
cuál es el valor que quiero
transferirle a ese personaje
y ese valor lo tenemos
de nuestra función
get
balance
en la documentación
podrán entender
por qué estoy agregando
la información de este tipo
listo
y por último
yo debería validar
que el pago
se pudo hacer de forma correcta
o de lo contrario
yo podría aquí generar
pago falló
por favor reintente
tal vez el mensaje que yo considere
y lo último
si ya se acabó la ejecución
de la lotería
deberíamos
reinicializar
el arreglo
de
jugadores
para ello
utilizo la línea 35
aquí el ejemplo
donde dice mira
por favor inicializa en cero
este arreglo
de tipo adres
que se llame players
va a estar en cero
listo
compilemos nuestro contrato
vamos a desplegarlo
y vamos a ver
cómo va nuestra lotería
descentralizada
espero que no tengamos miles
de preguntas en el chat
porque si no al final no alcanzaremos
a responderlas
no mentiras
vamos a hacer todo lo posible
por responderlas todas
despliego mi contrato
voy a elegir otra cuenta
entonces vamos a ir aquí a las cuentas
del final
vamos a hacer que esta persona
participe
con 5 ethers
entonces tenemos
un jugador
entonces si yo consulto el jugador cero
me dice esta es la dirección
podría saber
cuánto apostó
o cuánto incluyo esta persona
en nuestra lotería
vamos a ver quién fue la dirección
que desplegó el contrato inteligente
vamos a conocer
la tarifa
vamos a saber cuál es el saldo
que tiene nuestro contrato
y para hacerlo más eficiente
vamos aquí también
a las últimas direcciones
vamos a hacer que esta persona
apueste
10
ethers
ya
si ven se ejecutó la transacción
si yo pregunto
en el arreglo jugadores
tengo un nuevo jugador
y cuando ejecute la función
elegir ganador
él automáticamente
a alguna de las dos cuentas
le debió haber transferido
un saldo mayor
si ustedes se dan cuenta
la última cuenta
ganó la lotería
obtuvo
los 10 ethers
más o menos que apostó
los 9 que apostó la primera
más los 5 que apostó la segunda persona
si yo consulto
el saldo de mi contrato
definitivamente
va a ser 0
ya estamos finalizando nuestra lotería
pero
si ustedes se dan cuenta
tenemos un problema de seguridad
y cuál es el problema de seguridad
que cualquier persona
cualquier dirección
cualquier cuenta
va a poder llamar
la función
elegir ganador
en este primer ejemplo
lo estamos nosotros gestionando
como en los sorteos
listo, inicia el sorteo
oprime un botón
y el buy genera
el ganador
pero eso debería restringirse
para ello
vamos a utilizar algo
que se llaman
los modifiers
y lo vamos a llamar uno
solo el dueño del contrato
va a poder ejecutar
ciertas interacciones
entonces yo voy a agregar
este require
que solamente
se puede ejecutar la función
si el dueño del contrato
perdón
si la persona que está llamando la función
es la misma que tengo almacenada
en mi variable owner
a medida que ustedes sigan trabajando con Solidity
aprenderán mucho más de los modificadores
entonces que significa en este caso
cojo el nombre de mi modificador
se lo agrego a la función
elegir ganador
y el antes de ingresar a la función
va a validar
que la persona que esté llamando
el contrato inteligente
bueno en este caso la función
sea la misma
que desplegó el contrato
entonces
voy a compilar
que desplegó el contrato
una vez más
el valida que la persona que esté llamando
la cuenta que esté llamando
esta función
sea la misma que desplegó
el contrato
voy a compilar
y simplemente con este modificador
yo podría
asegurar el acceso
a que simplemente el owner
que si ven que lo definimos aquí
sea aquella persona
que puede llamar a las funciones del contrato
¿listo?
hasta aquí era nuestro ejemplo
tal vez podría yo
agregar un modificador
para que este require
venga a un modificador
hagamos ese último cambio
modifier
llamémoslo
minfee2pay
y que queremos validar
que el valor
que envíen
a la hora de ejecutar la función
sea mayor
o igual
al que yo espero
o al que definí al momento
desplegar mi contrato
vengo acá
elijo el nombre de mi modificador
aquí me falta una i
modifier
y automáticamente se lo voy a agregar
aquí a mi función
no copie el nombre
a mi función
de play
compilo
gracias a los dioses del código
no nos quedó ningún error
y nos dimos cuenta
como en esta hora que estuvimos
creamos una lotería descentralizada
donde yo elijo
el monto que espero que los participantes
aporten para participar
de la lotería
y también tengo una función
para que cualquier usuario
pueda sumarse a mi lotería
construí una función
para obtener el balance
y más adelante
todas estas funciones
las voy a comunicar con mi
interfaz de usuario
para construir mi primera lotería
descentralizada
espero que hayan aprendido
después les comparto
el enlace al repositorio
para que construyan su primera lotería descentralizada
y les saquen el máximo provecho
a Solidity
Excelente Camilo
la verdad es que
yo estoy aquí aprendiendo
siempre aprendo algo nuevo
y la verdad es que aquí
la comunidad está encantada
con como nos
describías cada particularidad
y bueno menos mal
que esos dioses
del código
nos permitieron en un like
poder trabajar sin ningún
issue porque les cuento que
no es nada más el nervio
de estar aquí frente a ustedes
hablando sino también
que el código funcione
que no se vayan typos
y bueno que muchas cosas
se puedan llegar a romper
y claramente las cosas que queremos presentarles
no funcionen pero bueno
hoy en día tenemos esto funcionando
y eso es bueno así que bueno
por ahí Camilo nos estará compartiendo
el recurso recuerden que pueden ir
siguiendo todo
todo lo que nosotros hacemos
en platzi.com
slash eth
ahí vamos a ir recopilando todo el contenido
lo que va pasando
lo que pueden ir ustedes poniéndose al día
así que no se preocupen por eso
ahora
por acá voy a tratar de filtrar
preguntas así que es momento de que
manden manden preguntas en este momento
para hacer un par ya que el tiempo
nos puede limitar
pero recordemos que también podemos
aprovechar el espacio en discord
para aquellos que están dentro
del programa y puedan
hacer sus preguntas
así que vamos a ver por acá
los smart contract que programaremos
pueden traer funciones de contratos externos
se recomienda investigar los smart contract
de Open Zeppelin
usarlos
yo rápido te voy a decir
recuerden que aquí tuvimos a Ernesto
quien es parte del equipo de Open Zeppelin
así que sí, sí recomendamos
trabajar con Open Zeppelin
pero que nos puedes decir
de algún contrato externo que me pueda encontrar
por ahí Camilo
pues definitivamente Oscar
Open Zeppelin va a ser nuestro
mayor aliados
diría yo de
librerías auditadas
para la ejecución de diferentes funciones
la construcción de tokens
fungibles, no fungibles, coleccionables
y pues ellos
siempre trabajan
por construir contenido de calidad
hay muy buenas librerías también
muy buenos contratos que podrías heredar
funciones
pero siempre ten presente de hacer un análisis
de quién está detrás de esas funciones
aquí siempre tenemos que ser
un poquito prevenidos
porque lo que parece código gratis
y abierto y una función disponible
por detrás podría estar sacándole balance
o delegándole permisos
que después me afectaría
la ejecución de mi contrato inteligente
y para ser certero
Open Zeppelin sí o sí
agréguenlo a su lista de aprendizaje
y de herramientas a utilizar
excelente, excelente por ahí
así que para que lo tengan presente
hay que tener también mucho cuidado
y también una de las ventajas que yo les doy
o les tip más de ventaja
leer código de contratos inteligentes
de implementación te va a dar mucha perspectiva
de cómo solucionar algunas situaciones
que se puedan presentar
cómo mejorar el tema de costes
a nivel de gas, entre otras cosas
yo me he puesto a analizar
los smart contracts
de las implementaciones más populares
no sé, CryptoKitties, por decir
NS, para ver cómo está construido
qué tiene, qué hay por ahí
porque esa función
googlear un poco, analizar
y con eso tener perspectiva
de cómo poderlo llegar a aplicar
a mis propios contratos
así que esa sería una ventaja también
de no nada más agregar y traer el código
sino ser un poco curioso y decir
¿por qué? ¿por qué Oscar hizo esto?
¿qué está tratándome de decir
aquí a la hora de hacer esto?
entonces puede que me esté equivocando
y tú encuentres una solución
a algo que yo no pensé
y eso también es trabajar en equipo
por acá Camilo, ahora nos hace una pregunta
que me gustaría que nos dieras un overview
porque esto yo sé que viene
o sea, es algo que gradualmente vamos a hacer
pero yo sé que ya están preguntando
nos comentan, ¿cómo vamos a hacer
o cómo se hace la integración
de un smart contract con FrontEnds?
Perfecto
listo, hay diferentes herramientas
digamos que la más popular
y la que vamos a estar trabajando
en el programa es HardHat
HardHat es aquella herramienta
que nos permite crear las funciones
pero es el paquete HardHat-Riat
desde HardHat creo los métodos
que van a leer los estados
de nuestro FrontEnd
y va a ser el combo perfecto
HardHat-Riat-Solidity
si ustedes tienen un stack de Python
tal vez podrían intentar con
Django, Brownie y Solidity
pero seamos sinceros Oscar
y es lo que tú también has visto
que el 80% de la web 3
utiliza Riat-HardHat-Solidity
si, tú lo has dicho
la misma comunidad ha elegido su stack
y esto pasa en diferentes ecosistemas
normalmente hay un stack más por defecto
que empieza a utilizar mal la comunidad
y a esto también vas a encontrar más soluciones
más ejemplos, más soporte
y eso es una ventaja
esto no significa que no podamos utilizar
como mencionas Python, ROS
o algún otro lenguaje de programación
o herramientas
lo único que pasa que es muy probablemente
que la comunidad que está usándolo sea menor
que puedas encontrar algunos detalles
con tal vez mínimo soporte
pero no significa que tú puedas
también crear esta comunidad
y también hacer ver que podemos utilizar
estas herramientas
Angular, yo me enteré
que OpenCP no utiliza Riat-HardHat
utiliza Svelte
y yo soy fan de Svelte
imagínate como el amor que me dio saber
que una gran herramienta
también utiliza otra herramienta
y está bien que te pueda salir un poquito
del común
pero no significa que aprenderlo no sea malo
así que para que lo tengan presente
y vayan leyendo, si a este punto todavía
no has aprendido
todavía no tienes claro que es React
y todos estos puntos
recuerda que ya lo hemos visto acá
hay retos que les hemos dejado
así que vayan poniéndose el día
y van siempre a dejar un estándar alto
para que podamos claramente
conectarnos en este gran ecosistema
y pronto acá estaremos viendo
estas integraciones, estas herramientas
y cómo crear un producto
con todas las facetas
así que para que lo tengan presente
pues Camilo, no me queda más
que agradecerte
que decirte qué gran explicación
qué gran ejemplo
y todo lo que nos contaste
por acá en el chat vi algunos
como cuándo y dónde están los cursos de Camilo
así que por ahí Ángela
vamos a tener que hacerle ping
para que Camilo venga también a grabar
por acá con nosotros
algún contenido de todo esto
dentro de la escuela de Blockchain
y también viendo el programa en
platzi.com
ahí van a encontrar todo
me gustaría despedirme
con nunca paren de aprender
sigan mejorando
sigan practicando
y si eres parte del programa
dentro de Discord
aprovecha este espacio
recuerda que tienes que cumplir con los retos
y estar al día también con todo lo que estamos sucediendo
acá en este Ethereum Developer Program
Camilo, unas palabras finales
para la transmisión
uno, agradecerte a ti
a Ángela, a Platzi
por crear este maravilloso espacio
y motivar a aquellas personas
que hacen parte del programa
a que si realmente encontraron
creo que como tú y como yo
una pasión complementaria
porque tú venías del mundo del frontend
yo soy ingeniero electrónico
y me gustaba el hardware
pero siempre me gustó como ese back
y me fascinó
y creo que hay oportunidades infinitas
todos podemos en algún momento
sumarnos a algún protocolo
todos los protocolos tienen millones de roles abiertos
no estoy exagerando
están buscando mucho talento técnico
y qué mejor espacio para formarse
que el Ethereum Developer Program
creen su portafolio
de contratos inteligentes
de aplicaciones descentralizadas
participen de diferentes escenarios
y siempre crezcamos
como comunidad
siempre ayudamos a que otras personas aprendan
la mejor forma de aprender es enseñando
creo que por eso tanto a ti
como a mí nos gusta enseñar
y que sigan acompañándonos
en todos los eventos que realizamos
eso es todo
y agradecerles a los que se sumaron al live
¡Excelente!
me pone muy contento
y bueno a seguir aprendiendo
a ser curiosos
y bueno nos seguimos viendo
próximo martes
aquí ya saben 4 de la tarde
hora Colombia
para las transmisiones del Ethereum Dev Program
y bueno hasta la próxima
¡Nos vemos!