Con cada transacción que un contrato inteligente procesa correctamente, puede haber partes involucradas e interesadas en ser notificadas de estos cambios de estado de un proyecto.
Envío de notificaciones al exterior de la Blockchain
Los Eventos en Solidity se utilizan para notificar los cambios realizados en un contrato. Cuando un usuario envía ETH y se quiere notificar a otro de su recepción, puedes emplear este mecanismo para que una aplicación externa reciba el mensaje e informe a dicho usuario.
Los eventos deben ser recibidos por medio de aplicaciones Web3 que se encuentren observando el contrato y respondiendo a los eventos. Librerías de Javascript como Web3.js permiten desarrollar este tipo de aplicaciones front end y notificar al usuario de eventos en un contrato.
La declaración de un evento y la emisión de una notificación del mismo se realiza de forma simple:
// SPDX-License-Identifier: MITpragma solidity >=0.7.0<0.9.0;contract Event { event Log(address sender, string message); function sendMessage() public { emit Log(msg.sender,""Este es el mensaje"");}}
Utilizando la palabra reservada event, declara el evento que puede recibir por parámetro todos los datos que el mismo necesite. Para emitir un evento, utiliza la palabra reservada emit seguido de la declaración del evento y el pasaje de datos que necesita.
Si emiten un evento, la consola de Remix te permitirá observa los datos de este.
También puedes emplear este mecanismo para generar un registro de actividad en un contrato, además de notificar usuarios.
Conclusión
Estos conceptos son algo avanzado de Solidity debido a que, sin un front-end, puede no tener tanto sentido su implementación. Es importante para ti en este punto de tu aprendizaje conocer su existencia para usarlos en el futuro.
Contribución creada por:Luis Enrique Herrera y Kevin Fiorentino (Platzi Contributors).
Permite conectar lo que pasa dentro de la Blockchain con el exterior porque a tráves de un protocolo otras aplicaciones se pueden suscribir a ellos y escuchar todo lo que está pasando en el Smart Contract.
Se usan para
Registrar cambios que se hicieron
Feedback (Retroalimentación)
Gracias bro
Gracias por el resumen
Después de la clase anterior esto se puso genial.
asi mismo es bro, yo estoy muy entusiamado
Exacto, además el profesor explica bastante bien! Me entusiasma
Los modifiers son parecidos a los middlewares de node.js ! :D
Tal cual hahahaha, pensé lo mismo hahah
Fue lo primero que pense jajajaj
No se si estará del todo correcto, pero se compilo y pude hacer el deploy después de rezarle al dios de los Smart contracts 😂. Acepto criticas
Se que Remix me ayuda a probar el contracto, pero todavía no estoy seguro de como debe funcionar en la vida real. Hay un vacío que todavía no entiendo ...
Remix es una. buena forma de probar esto al inicio, conforme vas avanzando iras pasándote a VS code y conectando las wallet a una red de prueba como si fuera la red principal. Para facilitarlo se usa librerías. como Hardhat o brownie
yo creo que en estos 3 meses ya resolvió la duda, pero para los que están leyendo, si lo quieren correr en "la vida real", pueden agregar a metamask una red de prueba de ethereum y obtener ether gratis, o usar redes como ribenky y hay paginas para obtener ether de prueba.
Al darle deploy, en la parte de arriba dice: ENVIRONMENT, debe seleccionar "injected web 3", ahí se abrirá metamask y te cobrará el gas para ejecutar el contrato en esta red de prueba de ej: rinkeby. Después entras a la pagina de rinkeby y ahí puedes ver el contrato creado.
Por lo tanto, si quieres ejecutar este contrato en la red real de ethereum, simplemente debes seleccionar en metamask la red de ethereum, dejarla predeterminada y luego haces los pasos anteriores, y ahí estarías desplegando un contrato en la red de ethereum, lo mismo para la red de binance smart chain, que también hay una red de prueba. Al realizar la transacción, en metamask te va salir el hash de la transacción y puedes con ese, consultarlo en la blockchain seleccionada.
Wow esto se ve tan sencillo que parece mentira. Muchas gracias al profesor por todas las clases. Están geniales.
que funcion tiene
emit ProjectFunded(id, msg.value);
el emit nos permite lanzar un evento, en este caso lanzamos el evento de ProjectFunded que definimos con los parámetros de id del proyecto y valor de ether aportado
En este caso yo use los require dentro de las funciones y de igual manera el código corre correctamente. Qué diferencia habría entre usarlos así o dentro de un modifier? me imagino que el modifier es práctico cuando se quiere usar validaciones en distintas funciones?
functionfundProject()public payable {require(author != msg.sender,"Authors can't fund their own projects"); author.transfer(msg.value); funds += msg.value;}functionchangeProjectState(string calldata newState)public{require(author == msg.sender,"Only author can change Project State"); state = newState;}
Así es el modifier te permitirá hacer la misma validación en diferentes funciones sin necesidad de repetir código
El codigo quedo, esta reportando en la parte de logs el evento y compilo bien, pero no se si estoy del todo correcto, sobre todo porque puse los dos eventos por separado y abajo del constructor.
Posteo mi codigo
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0<0.9.0;contract crowdfounding { string public id; string public name; string public description; address payable public author; string public state ="Opened"; uint public founds; uint public foundsGoal;constructor(string memory _id, string memory _name, string memory _description, uint _foundsGoal){ id = _id; name = _name; description = _description; foundsGoal = _foundsGoal; author =payable(msg.sender);} event foudProject( address sender, uint value
); event changeProjectState( address author, string state
); modifier onlyAuthor(){require( msg.sender== author,"Only author can change the state");//Modificacion por author _;} modifier noAuthorPay(){require( author != msg.sender,"Autofinance is not avaible"); _;}functionfundProject()public payable noAuthorPay { author.transfer(msg.value); founds += msg.value; emit foudProject(msg.sender, msg.value);}functionchangeProgectState(string calldata newState)public onlyAuthor { state = newState; emit changeProjectState(msg.sender, state);}}
Lo veo perfecto Jesus 🥳
Se podía usar el mismo modifier para ambos casos cierto?
Si se podría, la mejor forma sería pasar un parámetro al modifier que identifique si lo que queremos validar es si quien llama la función es el autor o no, así solo tendríamos un modifier para ambos casos.
Excelente pregunta!
Enentendiento que el autor podria aportar desde cualquier otra wallet verdad? osea en realidad no se puede evitar que el autor aporte a su propio proyecto
El autor está asociado a la address en nuestro ejemplo, lo que quiere decir que cada vez que esa address intente aportar a un proyecto que tiene la misma address como author no va a poder.
Una pregunta:
la palabra clave emit he visto los comentarios y lanza un evento que en el código es indicado por el evento "projectfunded" con dichos parámetros ya mencionados. Ese evento es para guardar los parámetros (Id y value)?
Esos dos datos no son guardados ya en las variables indicadas al inicio?
Acabo de testear mi código sin el emit y funciona exactamente igual. Sólo quisiera saber la diferencia y en específico la función de esos dos eventos que no he encontrado en el código.
Muchas gracias
Ahora vi la explicacón de los event.
Disculpa por no avanzar en el video primero.
Solamente para confirmar.
El event son datos que se pueden ver/usar fuera de la blockchain y se pueden consultar en ese espacio?
Y qué tan importante y frecuente son necesarios los event?
Gracias
Hola, se pueden agregar varios modificadores a una función?
Si se puede Gustavo
cómo me puedo subscribir a un evento:
fuera de la blockchain?
dentro de la misma blockchain pero por otro smart contract?
Hola 👋🏼
¿Te refieres a como saber desde un smart contract qué sucede fuera de la blockchain? Eso se puede hacer con los oráculos. Chainlink es un ejemplo de oráculo.
Los smart contract tienen interfaces para que otros smart contracts pueden comunicarse con ellos.
"emit" vendria siendo lo mismo que los parentesis de un function ???
emit es una palabra reservada que permite lanzar el evento que le pases
Que significa y para que sirve "emit" ???
emit es una palabra reservada que permite lanzar el evento que le pases
buenas tardes profesor, que diferencia hay entre usar la variable "author" y la variable "owner"?
En el contexto del proyecto un author es quién registra un nuevo proyecto usando el smart contract, el owner no lo utilizamos dentro del proyecto del curso, sin embargo, cuando lo menciono hago referencia a la address que despliega el contrato.
si pongo un evento, luego una funcion que da error....puede ser que el evento no se muestre por mas que este antes?
Si una transacción falla, el evento no se emitirá y todos los cambios que se hayan hecho se revertirán, en este caso lo mejor es capturar los errores para tener feedback de que pudo salir mal.
Los eventos en Solidity son herramientas utilizadas por los contratos inteligentes para comunicar que algo ha sucedido en la blockchain. Cuando un contrato inteligente emite un evento, este se registra en un log de transacciones asociado con esa transacción en particular.
Estos logs son esencialmente registros de datos que se almacenan en la blockchain de manera inmutable. No ocupan espacio en el almacenamiento del estado del contrato, lo que los hace más eficientes en términos de costos de gas que almacenar datos directamente en el estado del contrato.
Los desarrolladores de aplicaciones externas, como las interfaces de usuario, pueden programar sus aplicaciones para que "escuchen" estos eventos. Cuando un evento es emitido y registrado en el log de la blockchain, las aplicaciones que están escuchando estos eventos pueden detectarlos y reaccionar a ellos, por ejemplo, actualizando la interfaz de usuario o ejecutando alguna lógica de aplicación en respuesta al evento.
Lo entiendo como algo asi:
Bloque #123456Transacciones:-TransacciónADe:0x123...abc
Para:Contrato:RegistroDeTransaccionesValor:1ETHDatos:realizarTransaccion(0x456...def,0.5ETH,"Pago por servicios")GasUsado:21000Resultado: Éxito
Logs:-Evento:TransaccionRealizadaEmisor:0x123...abc
Cantidad:0.5ETHMensaje:"Pago por servicios"-Evento:SaldoActualizadoUsuario:0x456...def
NuevoSaldo:1.5ETH-TransacciónB...Logs:-Evento:AccesoContratoUsuario:0x789...ghi
ContratoAccedido:0xabc...def
-Evento:CambioDeEstadoEstadoAnterior:"Pendiente"EstadoNuevo:"Completado"-TransacciónC...Logs:-Evento:CreacionDeTokenCreador:0x987...stu
Cantidad:100TokensTokenID:12345Hash del Bloque:0x789...xyz
Hash del BloqueAnterior:0x456...uvw
Timestamp:1234567890