Proveedores de Ethereum simples con NodeMCU
Recientemente, discutimos cómo usar la API de Etherscan para consultar datos (saldo de billetera) de la cadena de bloques Ethereum con NodeMCU. Es un método muy útil para recuperar información de blockchain en sistemas integrados donde el almacenamiento y la memoria son un problema.
Sin embargo, tiene algunas limitaciones. En particular, sondea la API en algún intervalo para recuperar información, ya sea que haya cambiado o no. Desearía poder obtener datos de manera más eficiente y lo suficientemente rápida como para permitir a los proveedores simples. Si bien anteriormente habíamos visto videos de fabricantes de automóviles Bitcoin basados en Bitcoin Bull, requerían una tarjeta NFC para usar.
Si pudiéramos obtener información sobre las transacciones de Ethereum de manera rápida y confiable, podríamos construir un autómata similar sin requerir una tarjeta NFC como intermediario. ¡Simplemente envíe a una dirección por algún método y obtenga los productos!
Resulta que podemos hacer exactamente eso con NodeMCU a través de WebSocket. Al igual que HTTP, WebSocket es un protocolo de comunicación que utiliza conexiones TCP (normalmente a través del puerto 80), pero permite la comunicación full-duplex. En otras palabras, puede establecer una conexión a un servidor y enviar / recibir mensajes sin tener que investigar el servidor.
Como en el ejemplo anterior, usaremos NodeMCU ejecutando Lua. Es posible que desee compilarlo con opciones e información en pantalla que será la misma en este caso. A diferencia del artículo anterior, no necesitará una clave API de Etherscan para utilizar este servicio (todavía no, de todos modos). Como es habitual, comenzaremos con una conexión WiFi:
wifi.setmode(wifi.STATION) wifi.setphymode(wifi.PHYMODE_B) station_cfg={} station_cfg.ssid="Your SSID" station_cfg.pwd="Your Password" station_cfg.save=true wifi.sta.config(station_cfg)
Conectarse a un servidor a través de WebSockets es fácil, pero como no usamos HTTP, tendremos que eliminar el https://
y reemplaza eso con ws://
. (Nota: no wss://
porque aún no hemos habilitado el cifrado).
ws: connect ('ws: //socket.etherscan.io/wshandler')
A continuación, debemos informar cuándo se establece la conexión como disparador para lanzar código adicional. Devolverá un código de error si no se puede establecer la comunicación. Manejar estos códigos de error con prudencia es una gran característica, pero nos ocuparemos de eso más adelante:
ws:on("connection", function(ws) print('got ws connection') end)
Ahora necesitamos extender lo anterior para suscribirnos a una dirección Eth y agregar un nuevo código para hacer algo cuando se realiza una transacción. Tenga en cuenta que la API requiere que se suscriba a una dirección dentro de los 60 segundos posteriores a la conexión. También dice que debe enviar un evento de ping al servidor cada 20 segundos para mantener la conexión activa, por lo que tendremos que configurar un temporizador de repetición para eso.
Si usa ESPlorer, puede enviar la solicitud de ping manualmente ingresando =ws:send('{"event": "ping"}')
y presionando Enviar. Esta es una forma útil de probar el estado del enlace.
La dirección que utilicé tiene transacciones frecuentes, por lo que es razonable para la prueba. Sin embargo, tenga en cuenta que sentarse y esperar una transacción para probar el código crea un ciclo de desarrollo lento, por lo que se requiere algo de paciencia aquí.
ws = websocket.createClient() ws:on("connection", function(ws) print('got ws connection') ws:send('{"event": "txlist", "address": "0x2a65aca4d5fc5b5c859090a6c34d164135398226"}') end) ws:on("receive", function(_, msg, opcode) print('got message:', msg, opcode) end)
Verá algo similar a lo que sigue a continuación. El primer mensaje es una simple confirmación de conexión, el segundo confirma su suscripción a una dirección y el tercero es lo que envía cuando se produce una transacción. ¡Puede suscribirse a hasta 30 direcciones con un solo dispositivo conectado! Tenga en cuenta que todos los datos están en formato JSON, que aprovecharemos más adelante.
got message: {"event":"welcome"} 1 got message: {"event":"subscribe-txlist", "status":"1", "message":"OK, 0x2a65aca4d5fc5b5c859090a6c34d164135398226"} 1 got message: {"event":"txlist","address":"0x2a65aca4d5fc5b5c859090a6c34d164135398226","result":[{"blockNumber":"5532531","timeStamp":"1525098009","hash":"0xe5ec497cb5b38811e8bf5db67a056a2bdd4aa9b68df5c8e8225cb300cbcfa413","nonce":"3363391","blockHash":"0xf446f77d92ed29c221e8451b8048113969ed305a7dd49177e10b422e8e2c4bda","transactionIndex":"172","from":"0x2a65aca4d5fc5b5c859090a6c34d164135398226","to":"0xec5fdfba35c01c6ad7a00085e70e8f30cd121597","value":"24418350000000000","gas":"50000","gasPrice":"4000000000","input":"0x","contractAddress":"","cumulativeGasUsed":"7896403","gasUsed":"21000","confirmations":"1"}]} 1
Son datos de transacciones bastante desordenados y, desafortunadamente, los datos interesantes están en el campo "resultado", que es JSON anidado. En el último artículo, convertimos una matriz JSON a Lua simple usando la excelente sjson
módulo. Haremos lo mismo aquí después de verificar que el tipo de mensaje es una transacción (txlist
).
ws:on("receive", function(_, msg, opcode) print('got message:', msg, opcode) ok, ethdata = pcall(sjson.decode, msg) if ok then msgtype = (ethdata["event"]) if msgtype == "txlist" then ...
La documentación de NodeMCU señala específicamente que JSON anidado puede causar errores de memoria. Por eso usamos pcall
(llamada protegida) para contener dichos errores al decodificar nuestro mensaje JSON. Luego extraemos el contenido del campo 'valor', anidado en el campo 'resultado':
if msgtype == "txlist" then wei = ethdata.result[1].value print (wei) eth = wei/1000000000000000000 print (eth) end
Me tomó unas horas descubrir cómo lidiar con las tablas anidadas, pero al final fue bastante limpio y fácil, simplemente estaba denso. Ahora necesitamos agregar una provisión básica para lidiar con los errores cuando el sitio se cierra:
ws:on("close", function(_, status) print('connection closed', status) print('Reconnecting...') ws = nil -- required to Lua gc the websocket client tmr.alarm(0,4000,tmr.ALARM_SINGLE,transact) -- This reconnects after 4 seconds end)
Para terminar todo, encapsulamos el código en una serie de funciones: primero, una para establecer una conexión, suscribirse a la dirección correcta y notificar cuando hay una transacción. Entonces necesitamos uno para mostrar la cantidad de Eth entregada. Finalmente, necesitamos una función de "ping" para llamar cada 20 segundos o menos para mantener viva la conexión. En general, esto fue más sólido de lo esperado y aún no se ha encontrado ningún error. Vea la lista completa de códigos aquí. Tenga en cuenta que también agregué un código anterior a una interfaz con una pantalla OLED de 128 × 32, la misma que usamos antes.
Ahora que funciona, consideremos aplicaciones im / prácticas. Es una buena manera de mostrar las transacciones de Ethereum en tiempo real, dime si estás transmitiendo en vivo y aceptas donaciones de Eth y quieres que inicien algo fantástico. O podría ser un proveedor algo inseguro. Claramente, lo siguiente es lanzar un WebSocket seguro.
También puede configurar un temporizador en el que la duración dependa de la cantidad de Eth recibido. Esto permitiría cosas como anuncios públicos que desaparecen un poco si alguien paga una tarifa. (¡Por favor, no haga esto!) ¿Quizás una sala de conferencias rentable con el poder tan controlado? ¿Cuota de membresía de Hackerspace? ¿Una bicicleta eléctrica que te carga por la potencia que consume?
En cualquier caso, no es legal usar criptomonedas como método de pago en mi país, por lo que no puedo implementar ninguno de los ejemplos anteriores en este momento. Si tienes una aplicación mejor, ¡compártela en los comentarios!
Cuerpo digital dice:
Salto de página por favor
torio dice:
> no utiliza legalmente criptomonedas como método de pago en mi país
En tu país, ¿puedes darle una naranja a alguien y volver al aguacate? Si es así, no acepta Ether como pago, cambia algo por otra cosa ...
Puede implementar un marco en torno a "Puntos de cliente", por ejemplo. Los clientes pueden ganar Ether a través de cualquier cosa que hagan, o pueden comprar Ether a través de cualquier intercambio, como millas de tarjetas de crédito.
Tu idea es muy interesante y realmente integrar el mundo real con las criptomonedas brinda muchas oportunidades.
Matt Cramer dice:
El autor es corresponsal de La-Tecnologia en Vietnam; no me sorprende que haya un país que no acepte las criptomonedas.
Sean Boyce dice:
El ambiente en torno al tema es un poco confuso aquí, pero puedo dar algunos antecedentes si está interesado.
No soy abogado, pero me parece menos una cuestión de criptomonedas y más sobre criptomonedas en las leyes anteriores.
Entonces, por ejemplo, todas las operaciones solo deben listar los precios en la moneda nacional, y todas las transacciones valoradas por encima del equivalente de alrededor de USD 800 deben pagarse mediante transferencia bancaria. Todas las facturas son impresas por una impresora autorizada por el gobierno y se numeran sucesivamente (solo compra una pila de facturas en blanco registradas para completarlas).
Como probablemente habrá adivinado, todo el sistema tiene como objetivo mejorar el cumplimiento tributario, lo que creo que es problemático. Estas leyes no se ajustan muy bien a las criptomonedas. La posesión, el comercio y la minería de criptomonedas están actualmente permitidos (siempre que no me engañes a la compañía eléctrica, lo que desafortunadamente mucha gente hace).
Al mismo tiempo, las estafas en torno a las criptomonedas / ICO aquí se han vuelto realmente terribles y muy públicas. Hubo protestas (pacíficas) en las calles.
Algunas personas probablemente todavía usan Ether para el "intercambio"; después de todo, si algo es legal o no, generalmente no afecta si es posible. Sin embargo, si hace esto, puede tener problemas con la emisión de contratos, facturas, precios de cotización y todas las demás cosas que son importantes para administrar una empresa. Simplemente no creo que valga la pena el problema hasta que sea legal.
Aunque me frustra un poco las oportunidades perdidas, estoy de acuerdo con la política actual. Esa es la única forma en que deberían ser las cosas ahora.
huls dice:
aún no hemos habilitado el cifrado
y
Manejar estos códigos de error con prudencia es una gran función, pero nos ocuparemos de eso más adelante.Después de eso dejé de leer. Estos son errores enormes y, en última instancia, fracasarán en su proyecto.
Ahí es donde terminan las cicatrices.L dice:
¿Por qué todos estos artículos tratan de no necesitar DEMCU?
Vasiliy Cosiv dice:
No parece haber una causa específica para las recientes disminuciones de las criptomonedas. Más bien, los precios en constante descenso parecen reflejar una disminución general en el entusiasmo por la criptomoneda. Eche un vistazo a la lista completa de criptomonedas