Getting your Trinity Audio player ready...
|
Vamos a cubrir el uso de transacciones agregadas de NEM Catapult para controlar varios dispositivos IoT, tan simples como dos dispositivos y un archivo JavaScript.
Transacción agregada
Las transacciones agregadas fusionan múltiples transacciones en una, permitiendo permutas de confianza, y otra lógica avanzada. NEM hace esto generando un contrato inteligente desechable de una sola vez. Cuando todas las cuentas involucradas han firmado la transacción agregada, todas las transacciones internas se ejecutan al mismo tiempo. Esto es extremadamente crucial si usted está emitiendo una serie de acciones a muchos dispositivos a la vez, una posible aplicación futura de esto es robótica enjambre (drones, autos autoconducidos, etc). Para el resto de los ejemplos, puedes echarle un echado un echado un ver aquí.
Controlar múltiples dispositivos
Así que el concepto es muy simple, utilizando la transacción agregada para enviar mensajes a múltiples dispositivos a la vez, anunciando una transacción agregada a un nodo, los dispositivos pueden leer la última transacción de acuerdo con la dirección de una cuenta, y hacer la acción apropiada basada en el mensaje en el nodo.
Para una demostración simple, decidí utilizar dispositivos ESP8266 para controlar un LED mediante el uso de GET a través de REST API, se pueden añadir nuevas mejoras mediante relés para controlar ventiladores u otros aparatos eléctricos, etc.
Instalación y Configuración:
1.- Descargar e instalar llave público del repositorio
root@catapult:/opt/catapult-server/_build/bin# wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
2.- Crear archivo de configuración con el repositorio
root@catapult:/opt/catapult-server/_build/bin# echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
3.- Descargar e instalar llave público del repositorio
root@catapult:/opt# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
4.- Generar archivo configuración repositorio
root@catapult:/opt# echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
5.- Actualizar repositorio:
root@catapult:/opt/catapult-server/_build/bin# aptitude update
6.- Instalar mongodb-org
root@catapult:/opt/catapult-server/_build/bin# aptitude install -y mongodb-org
7.- Iniciar servicio
root@catapult:/usr/share/doc/mongodb-org# service mongod start
8.- Comprobar inicio del servicio
root@catapult:/usr/share/doc/mongodb-org# netstat -putan
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1722/sshd tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 11092/mongod
9.- Instalar YARN
root@catapult:/opt/catapult-server/_build# aptitude install -y yarn
10.- Comprobar versión instalada
root@catapult:/opt/catapult-server/_build# yarn --version
1.19.0
11.- Instalar paquete NodeJs
root@catapult:/opt/catapult-server/_build# aptitude install -y nodejs
12.- Comprobar versión instalada
root@catapult:/opt/catapult-server/_build# nodejs --version
v8.10.0
13.- Mostrar el contenido del archivo «catapult.address.txt»
root@catapult:/opt/catapult-server/_build/# cat /opt/catapult-server/_build/catapult.address.txt
--- generating 10 keys --- Cuenta: 1 private key: A1A11A805D7BA84B8E32DBC45A1600C4BD1797666D0BFA6F1FB52EE5380CECC7 public key: 9E02BF613B9FB9024D2D2EC937FEE4661B2C3CCF7E94383D30C9D368D598CC05 address (mijin-test): SDXUNVIIXWDVRRQZBYAOPLTZV5N7BO3N5W4M7EMD Cuenta: 2 private key: EB15E39C761AA8D3793C5DC1681972CAA1997FB5F8712B62A5A329525193D2A9 public key: 566AA340077460B6A486D9914A948DF7CFB9DFF731844232E33F6608CA6DC734 address (mijin-test): SCPZ2IJFIBBJX5SQIOXVPSPA4Z3EH3RQRQLAUJ52 Cuenta: 3 private key: 36B46E3FFBC9EF29C0F5C744A9CD41EEB35B18C14CF30ED6AAD0AFE2FC7911F8 public key: address (mijin-test): SDFUE4C3KJQJBUNEXJNDDCSMLFCQQHPOL5IBIHXY cuenta: 4 private key: E9A45B28545E4DE720443CFD71E43F706C6ACFF539AA9234AFFE8117ED597A5E public key: CFB9E33C6BF5A11D7430641CD78A5CB7F17C48D47C2432428774D7209E2940D7 address (mijin-test): SBEUAR3RPE5GYQTUBJW3BQ6YV3ZLFSWAJIVAMLRF ........
14.- Editar archivo de configuración Harvesting
root@catapult:/opt/catapult-server/_build# vim /opt/catapult-server/_build/resources/config-harvesting.properties
14.1.- Colocar en «harvesterPrivateKey» el contenido de «private key» de lo generado en el archivo «root@catapult:/opt/catapult-server/_build# catapult.address.txt» en éste caso se colocó la 3era cuenta (ver punto 13)
[harvesting] harvesterPrivateKey = 36B46E3FFBC9EF29C0F5C744A9CD41EEB35B18C14CF30ED6AAD0AFE2FC7911F8
Activar el «AutoHarvesting»
enableAutoHarvesting = true
15.- Editar el archivo de configuración del nodo
root@catapult:/opt/catapult-server/_build# vim /opt/catapult-server/_build/resources/config-user.properties
15.1.- Colocar en «bootPrivateKey» el contenido de «private key» de lo generado en el archivo «root@catapult:/opt/catapult-server/_build# catapult.address.txt», pero que sea distinto al utilizado en la configuración del «harvesterPrivateKey», en éste caso se colocó la 2da cuenta (ver punto 13)
[account] bootPrivateKey = EB15E39C761AA8D3793C5DC1681972CAA1997FB5F8712B62A5A329525193D2A9 shouldAutoDetectDelegatedHarvesters = true [storage] dataDirectory = ../data pluginsDirectory = .
16.- Editar el archivo de configuración de las propiedades del nodo
root@catapult:/opt/catapult-server/_build# vim /opt/catapult-server/_build/resources/config-node.properties
Efectuar el siguiente cambio:
[localnode] .... roles = Api
17.- Editar el archivo de configuración de las extensiones del servidor
root@catapult:/opt/catapult-server/_build# vim /opt/catapult-server/_build/resources/config-extensions-server.properties
Efectuar los siguientes cambios:
# api extensions extension.partialtransaction = true # addressextraction must be first because mongo and zeromq depend on extracted addresses extension.addressextraction = true extension.mongo = true extension.zeromq = true
18.- Eliminar el contenido de del directorio data
root@catapult:/opt/catapult-server/_build# rm -rf /opt/catapult-server/_build/data/*
19.- Eliminar el contenido de directorio mijin-test
root@catapult:/opt/catapult-server/_build# rm -rf /opt/catapult-server/seed/mijin-test/*
20.- Crear directorio «00000»
root@catapult:/opt/catapult-server/_build# mkdir -p /opt/catapult-server/seed/mijin-test/00000
21.- Crear archivo de hash
root@catapult:/opt/catapult-server/_build# echo -n 6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43 > /opt/catapult-server/seed/mijin-test/00000/hashes.dat
22.- Generar bloques nemesis
root@catapult:/opt/catapult-server/_build# ./catapult.tools.nemgen --nemesisProperties ../resources/mijin-test.properties
Nota: Acá generará un error:
2019-10-02 14:25:01.125902 0x00007f2d765ff740: (io::FileBasedStorage.cpp@108) Throwing exception: hashes.dat has invalid size (0)
23.- Copiar el contenido del directorio «mijin-test» a la carpeta «data»
root@catapult:/opt/catapult-server/_build# cp /opt/catapult-server/seed/mijin-test/00000/00001.dat /opt/catapult-server/_build/data/00000
root@catapult:/opt/catapult-server/_build# cp /opt/catapult-server/seed/mijin-test/00000/00001.dat /opt/catapult-server/_build/data/00000/00000.dat
24.- Ejecutar catapult-server
root@catapult:/opt/catapult-server/_build/bin# ./catapult.server
Instalar Catapult-Rest
25.- Descargar las fuentes
root@catapult:/opt# git clone https://github.com/nemtech/catapult-rest.git
26.- Entrar al directorio de las fuentes descargadas
root@catapult:/opt# cd catapult-rest/
27.- Ejecutar el script yarn_setup.sh
root@catapult:/opt/catapult-rest# ./yarn_setup.sh
........... yarn install v1.19.0 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... warning " > eslint-config-airbnb@17.1.1" has incorrect peer dependency "eslint@^4.19.1 || ^5.3.0". warning "eslint-config-airbnb > eslint-config-airbnb-base@13.2.0" has incorrect peer dependency "eslint@^4.19.1 || ^5.3.0". [4/4] Building fresh packages... Done in 5.17s. yarn install v1.19.0 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... warning " > eslint-config-airbnb@17.1.1" has incorrect peer dependency "eslint@^4.19.1 || ^5.3.0". warning "eslint-config-airbnb > eslint-config-airbnb-base@13.2.0" has incorrect peer dependency "eslint@^4.19.1 || ^5.3.0". [4/4] Building fresh packages... Done in 2.63s.
28.- Acceder a la carpeta «rest»
root@catapult:/opt/catapult-rest# cd rest/
29.- Efectuar la instalación de yarn
root@catapult:/opt/catapult-rest/rest# yarn build
yarn run v1.19.0 $ ncp src/ _build Done in 0.53s.
30.- Editar el archivo de configuración
root@catapult:/opt/catapult-rest/rest# vim resources/rest.json
30.1.- En la variable «clientPrivateKey» colocar el contenido de «private key» de lo generado en el archivo «root@catapult:/opt/catapult-server/_build# catapult.address.txt», en éste caso se colocó la 4ta cuenta (ver punto 13)
Antes:
"clientPrivateKey": "0000000000000000000000000000000000000000000000000000000000000000",
Después:
"clientPrivateKey": "E9A45B28545E4DE720443CFD71E43F706C6ACFF539AA9234AFFE8117ED597A5E",
30.2.- En la variable «publicKey»colocar el contenido de «public key» de la cuenta utilizada en el archivo de configuración: /opt/catapult-server/_build/resources/config-user.properties variable «bootPrivateKey», en éste se colocó la 2da cuenta (Ver punto 13)
Antes:
"publicKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
Después:
"publicKey": "566AA340077460B6A486D9914A948DF7CFB9DFF731844232E33F6608CA6DC734",
31.- Ejecutar catapult-rest
root@catapult:/opt/catapult-rest/rest/_build# node index.js
[winston] Attempt to write logs with no transports {"message":"loading config from ../resources/rest.json","level":"info"} info: loading config from ../resources/rest.json verbose: finished loading rest server config {"network":{"name":"mijinTest","description":"catapult development network"},"port":3000,"crossDomain":{"allowedHosts":["*"],"allowedMethods":["GET","POST","PUT","OPTIONS"]},"clientPrivateKey":"E9A45B28545E4DE720443CFD71E43F706C6ACFF539AA9234AFFE8117ED597A5E","extensions":["accountLink","accountRestrictions","aggregate","lockHash","lockSecret","mosaic","mosaicRestrictions","metadata","multisig","namespace","receipts","transfer"],"db":{"url":"mongodb://localhost:27017/","name":"catapult","pageSizeMin":10,"pageSizeMax":100,"pageSizeStep":25,"maxConnectionAttempts":5,"baseRetryDelay":500},"apiNode":{"host":"127.0.0.1","port":7900,"publicKey":"566AA340077460B6A486D9914A948DF7CFB9DFF731844232E33F6608CA6DC734","timeout":1000},"websocket":{"mq":{"host":"127.0.0.1","port":7902,"monitorInterval":500,"connectTimeout":10000,"monitorLoggingThrottle":60000},"allowOptionalAddress":true},"throttling":{"burst":20,"rate":5},"logging":{"console":{"formats":["colorize","simple"],"level":"verbose","handleExceptions":true},"file":{"formats":["prettyPrint"],"level":"verbose","handleExceptions":true,"filename":"catapult-rest.log","maxsize":20971520,"maxFiles":100}},"timestamp":"2019-10-03T01:56:39.635Z"} info: connecting to mongodb://localhost:27017/ (database:catapult) {"timestamp":"2019-10-03T01:56:39.635Z"} verbose: connected to mongo at mongodb://localhost:27017/catapult {"timestamp":"2019-10-03T01:56:39.687Z"} info: registering routes {"timestamp":"2019-10-03T01:56:39.689Z"} info: listening on port 3000 {"timestamp":"2019-10-03T01:56:39.731Z"}
32.- Efectuar pruebas de conexión
root@catapult:/home/operador# curl http://localhost:3000/block/1
{"meta":{"hash":"DFC5BA2DCF1F3D174C389BF0E87B432D69B4B6D6080CDEE4D05C69C68DC668C9", "generationHash":"57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6", "totalFee":"0","stateHashSubCacheMerkleRoots":[],"numTransactions":31}, "block":{"signature":"5F17EFD6E7533F02492779A07FF57DAD914E97B9DB2FE49AE61E3D7225A2E7E652A5E8A80B494359D97D3BEA12B891689FCCB4EFC7CA088DF295400DE8A39C0A", "signerPublicKey":"B4F12E7C9F6946091E2CB8B6D3A12B50D17CCBBF646386EA27CE2946A7423DCF","version":36867, "type":32835,"height":"1","timestamp":"0","difficulty":"100000000000000","feeMultiplier":0, "previousBlockHash":"0000000000000000000000000000000000000000000000000000000000000000", "transactionsHash":"220528A0204E98ACFCC864F24AFC4FBB4AC1D2EDBFB73682E792411F2A93C566", "receiptsHash":"6CD06139619DFC894215706DBCE94F020E99F6A970087103B8E04101215CD1ED", "stateHash":"61353F97CD7C6B3FC1799E6530A5C1B0BA92E469D30D79856BF0FB2A43BD42BB", "beneficiaryPublicKey":"B4F12E7C9F6946091E2CB8B6D3A12B50D17CCBBF646386EA27CE2946A7423DCF"}}