Dispositivo de puesta a tierra para niños II de Ethereum IOT: contrato inteligente

Esta es la parte 2 de mi proyecto de dispositivo de puesta a tierra Ethereum IOT Kid. En esta parte, discutiremos la lógica de negocios detrás de Grounder.sol, el contrato inteligente que hace el trabajo real detrás de conectar a tierra a mi hijo. Puede leer la parte 1 aquí.

Me gusta equiparar el contrato inteligente con la capa de lógica empresarial de las aplicaciones convencionales que los desarrolladores habrían desarrollado como servicios web JSON en herramientas como node.js (si te gusta JavaScript) o django (si te gusta Python).

Este es un artículo útil para leer si está interesado en uno o más de los siguientes conceptos en los contratos inteligentes de Solidity:

Así que aquí va.

Los códigos

Comenzamos con la línea 5.

padre, ese soy yo. Esta variable es una dirección porque almacena la dirección de la cuenta Ethereum que ejecutará el contrato Kid Grounding.

Aquí están las líneas 6 y 7. A diferencia de los códigos de los programas convencionales, el contrato inteligente tiene la capacidad de mantener un estado. El contrato de Kid Grounder tiene 2 estados: puede iniciar la conexión a tierra (startGround) y finalizar la conexión a tierra (endGround). He declarado el estado como una variable pública para que cualquiera que conozca la dirección de mi contrato pueda ver si he terminado de castigar a mi hijo.

Aquí están las líneas 8 a 11. Mantengo una marca de tiempo donde comienza la conexión a tierra y otra marca de tiempo donde termina la conexión a tierra. Los declaré como uint, que son enteros sin signo que almacenan hasta 256 bits de números. ¿Por qué no preguntar la fecha y la hora? Desafortunadamente, no hay un tipo de datos de tiempo en Solidity, lo que tiene sentido porque la noción de fecha y hora (es decir, 12 de agosto de 2018 a las 9 p.m.) no existe en Ethereum Blockchain. Por lo tanto, la fecha y la hora se almacenarán como números enteros sin firmar en mi contrato inteligente.

moveTimeStamp y callTimeStamp se declaran como matrices de uint porque mi hijo pedirá ayuda o se moverá muchas veces durante el proceso de conexión a tierra.

Las líneas 13 a 16 declaran los eventos que podrían desencadenarse cuando comienza y termina la conexión a tierra o cuando el niño se mueve o pide ayuda.

Las líneas 18 a 26 declaran 2 modificador: onlyParent () e inState (). onlyParent () dice que solo el remitente puede hacer ESTO (averiguaremos qué es ESTO más adelante). inState () establece que el contrato debe estar en ESTE estado para hacer esto (nuevamente, averiguaremos qué es ESTO más adelante).

El constructor del Smart Contract se declara entre las líneas 28 y 35. El constructor se ejecuta cuando se crea el Smart Contract por primera vez. Para crearlo, debe proporcionar la fecha y hora de inicio de esta conexión a tierra. Actualiza startGroundTimeStamp con esta fecha y hora, establece el estado en startGround. También establece la variable principal en la dirección de la cuenta que acaba de ejecutar este contrato. Emite groundStarted (), que activa el evento groundStarted (). No hice nada en el evento groundStarted () pero con esta función de emisión de Solidity, puede escribir un detector de eventos basado en JavaScript en una interfaz de usuario web para que se active cuando escuche este evento y luego muestre algunos mensajes en la web para decir una sesión de puesta a tierra acaba de comenzar.

Las líneas 37 a 54 declaran move () y callforhelp (). move () se activará con mi sensor IOT PIR y callforhelp () se activará cuando mi hijo presione el botón de ayuda de Sigfox durante su conexión a tierra.

move () acepta una uint que será proporcionada por la persona que llama a esta función para decirle al contrato que el niño acaba de mudarse. Tenga en cuenta que el modificador de la función dice onlyParent e inState (State.startGround) que ha sido declarado ealier para verificar si (1) esta función la llama la misma persona que lanzó este contrato inteligente y (2) si el estado de este contrato es startGround. Esto tiene sentido porque no quieres que otra persona, además de la persona que inició este contrato, inicie un movimiento (¡este no es su hijo!) O rastree su movimiento si el niño ya no está castigado. Empuja una nueva marca de tiempo que el niño ha movido a la matriz moveTimeStamp. También activa el evento moved () (con el que no he hecho nada). callforhelp () funciona de la misma manera que move () pero se activa cuando el niño pide ayuda.

endGround () y reGround () se declaran desde las líneas 55 a 76.

endGround () finaliza la conexión a tierra estableciendo una marca de tiempo final para la conexión a tierra y cambiando el estado a State.endGround.

reGround () reinicia una nueva conexión a tierra. Para ejecutar reGround (), el contrato verifica si el contrato está en State.endGround. No puedes volver a triturar a un niño que está castigado actualmente (¡termina un castigo primero!). Actualiza el Smart Contract con un nuevo tiempo de conexión a tierra, cambia endGroundTimeStamp a 0 y borra las matrices moveTimeStamp y callTimeStamp. También restablece el estado a State.startGround.

Las últimas 2 funciones (líneas 78 a 92) devuelven la cantidad de veces que el niño se mudó o pidió ayuda. Esto es útil porque determina la calidad de este castigo. En mi perspectiva, los mejores tipos de conexión a tierra son aquellos en los que el niño se queda realmente quieto y no me molesta llamándome cada 10 a 20 segundos.

Grounder en acción

Para probar el contrato de grounder, copie y pegue los códigos en Remix y ejecútelo en el entorno de VM JavaScript.

Implemente el contrato de conexión a tierra proporcionando una marca de tiempo donde comienza la conexión a tierra. Aquí, he proporcionado un equivalente numérico de fecha y hora. Para convertir su propia fecha y hora a su valor numérico, visite esta página en w3schools para ejecutar el ejemplo.

Una vez que se implemente el contrato, la lista de funciones estará disponible.

Suponiendo que su hijo se mudó, ingrese la marca de tiempo y haga clic en [mover]. Como se muestra en la parte 1, esto habría sido activado por el sensor IOT PIR.

Ahora supongamos que el niño se mudó de nuevo.

Y suponga que pidió ayuda. Esta función se habría activado cuando el niño presionó su botón Unabell.

Puede presionar [getCallCount] y [getMoveCount] para ver cuántas veces el niño pidió ayuda o se mudó.

También puede ver la marca de tiempo donde comenzó esta conexión a tierra haciendo clic en [startGroundTimeStamp]

Para ver la marca de tiempo de una de las muchas veces que se movió, ingrese la posición de este movimiento en la matriz moveTimeStamp. En este caso, estoy viendo la marca de tiempo de la 0ª (1ª) vez que se movió. Si desea ver la marca de tiempo por segunda vez que se mudó, ingrese 1.

Para finalizar la conexión a tierra, ingrese endGroundTimeStamp.

¿Qué pasa si ha terminado el terreno y luego intenta ejecutar un callForHelp ()? No funcionaría porque ha tenido un modificador que dice que un callForHelp () solo se puede activar mientras el niño está siendo castigado y no después de que lo hayan liberado.

Qué sigue

En la parte 3 que sigue, analizaré los códigos de servicio web de node.js que activan la creación de este contrato inteligente, así como su función.