{"id":37868,"date":"2019-10-31T22:20:16","date_gmt":"2019-10-31T19:20:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blokchejn-chto-nam-stoit-poc-postroit\/"},"modified":"2019-10-31T22:20:16","modified_gmt":"2019-10-31T19:20:16","slug":"blokchejn-chto-nam-stoit-poc-postroit","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>\u00a1Los ojos temen, pero las manos pican!<\/i><\/p>\n<p>En art\u00edculos anteriores, analizamos las tecnolog\u00edas sobre las que se construyen las cadenas de bloques (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">\u00bfQu\u00e9 nos cuesta construir un blockchain?<\/a><\/noindex>) y los casos que se pueden implementar con su ayuda (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">\u00bfQu\u00e9 nos cuesta construir un caso?<\/a><\/noindex>). \u00a1Ha llegado el momento de trabajar con las manos! Para implementar pilotos y PoC (Prueba de Concepto), prefiero usar nubes, ya que se puede acceder a ellas desde cualquier parte del mundo y, a menudo, no es necesario perder tiempo en la tediosa instalaci\u00f3n del entorno, ya que hay configuraciones preinstaladas. As\u00ed que hagamos algo simple, como una red para transferir monedas entre participantes y la llamaremos modestamente Citcoin. Para esto, utilizaremos la nube de IBM y la blockchain universal Hyperledger Fabric. Primero, entendamos por qu\u00e9 Hyperledger Fabric se llama blockchain universal.<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/c19278d99d5b7edb9f50ea6306c2fd46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hyperledger Fabric \u2014 blockchain universal<\/h2>\n<p>\nEn t\u00e9rminos generales, un sistema de informaci\u00f3n universal es:<\/p>\n<ul>\n<li>Un conjunto de servidores y un n\u00facleo de software que ejecuta la l\u00f3gica empresarial;<\/li>\n<li>Interfaces para interactuar con el sistema;<\/li>\n<li>Herramientas para registrar, autenticar y autorizar dispositivos \/ personas;<\/li>\n<li>Una base de datos que almacena datos operativos y archivados:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSe puede leer la versi\u00f3n oficial de qu\u00e9 es Hyperledger Fabric en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">el sitio web<\/a><\/noindex>, y en resumen, Hyperledger Fabric es una plataforma de c\u00f3digo abierto que permite construir blockchains privados y ejecutar contratos inteligentes arbitrarios escritos en los lenguajes de programaci\u00f3n JS y Go. Examinemos detalladamente la arquitectura de Hyperledger Fabric y asegur\u00e9monos de que es un sistema universal, en el que solo hay una especificidad en el almacenamiento y registro de datos. La especificidad radica en que los datos, como en todas las blockchains, se almacenan en bloques que se a\u00f1aden a la blockchain solo si los participantes han llegado a un consenso y, despu\u00e9s de la grabaci\u00f3n, los datos no se pueden modificar o eliminar sin ser detectados.<\/p>\n<h2>Arquitectura de Hyperledger Fabric<\/h2>\n<p>\nEn el esquema se presenta la arquitectura de Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organizaciones <\/b> \u2014 las organizaciones contienen nodos peer, es decir, la blockchain existe gracias al apoyo de las organizaciones. Diferentes organizaciones pueden unirse a un mismo canal.<\/p>\n<p><b>Channel <\/b> \u2014 estructura l\u00f3gica que agrupa los nodos peer, as\u00ed se define la blockchain. Hyperledger Fabric puede manejar simult\u00e1neamente varias blockchains con diferentes l\u00f3gicas empresariales.<\/p>\n<p><b>Proveedor de Servicios de Membres\u00eda (MSP)<\/b> \u2014 es la CA (Autoridad de Certificaci\u00f3n) para emitir identidades y asignar roles. Para crear un nodo es necesario interactuar con el MSP.<\/p>\n<p><b>Nodos peer<\/b> \u2014 verifican las transacciones, almacenan la cadena de bloques, ejecutan contratos inteligentes e interact\u00faan con aplicaciones. Los pares tienen una identidad (certificado digital), que es emitido por una MSP. A diferencia de la red Bitcoin o Ethereum, donde todos los nodos son iguales, en Hyperledger Fabric los nodos desempe\u00f1an diferentes roles:<\/p>\n<ul>\n<li>El par puede ser <b>par endosante<\/b> (EP) y ejecutar contratos inteligentes.<\/li>\n<li><b>Par de compromiso<\/b> (CP) \u2014 solo almacenan datos en la cadena de bloques y actualizan el 'Estado Mundial'.<\/li>\n<li><b>Par ancla<\/b> (AP) \u2014 si varias organizaciones participan en la cadena de bloques, se utilizan pares ancla para la comunicaci\u00f3n entre ellas. Cada organizaci\u00f3n debe tener uno o varios pares ancla. Con la ayuda de AP, cualquier par en la organizaci\u00f3n puede obtener informaci\u00f3n sobre todos los pares en otras organizaciones. Para la sincronizaci\u00f3n de informaci\u00f3n entre AP se utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">el protocolo gossip<\/a><\/noindex>.<\/li>\n<li><b>Par l\u00edder<\/b> \u2014 si una organizaci\u00f3n tiene varios pares, solo el par l\u00edder recibir\u00e1 bloques del servicio de ordenaci\u00f3n y los entregar\u00e1 a los dem\u00e1s pares. El l\u00edder puede ser asignado est\u00e1ticamente o ser seleccionado din\u00e1micamente por los pares de la organizaci\u00f3n. Para la sincronizaci\u00f3n de informaci\u00f3n sobre los l\u00edderes tambi\u00e9n se utiliza el protocolo gossip.<\/li>\n<\/ul>\n<p>\n<b>Activos <\/b> \u2014 entidades de valor que se almacenan en la cadena de bloques. M\u00e1s concretamente, son datos clave-valor en formato JSON. Estos son los datos que se registran en la cadena de bloques 'Blockchain'. Tienen un historial almacenado en la cadena de bloques y un estado actual que se guarda en la base de datos 'Estado Mundial'. Las estructuras de datos se llenan de manera arbitraria dependiendo de las necesidades comerciales. No hay campos obligatorios, la \u00fanica recomendaci\u00f3n es que los activos deben tener un propietario y representar valor. <\/p>\n<p><b>Libro mayor <\/b> \u2014 se compone de la cadena de bloques 'Blockchain' y de la base de datos 'Estado Mundial', que contiene el estado actual de los activos. El Estado Mundial utiliza LevelDB o CouchDB.<\/p>\n<p><b>Contrato inteligente<\/b> \u2014 mediante contratos inteligentes se implementa la l\u00f3gica empresarial del sistema. En Hyperledger Fabric, los contratos inteligentes se denominan chaincode. Con chaincode se definen los activos y las transacciones sobre ellos. Hablando en t\u00e9rminos t\u00e9cnicos, los contratos inteligentes son m\u00f3dulos de programaci\u00f3n escritos en lenguajes de programaci\u00f3n JS o Go.<\/p>\n<p><b>Pol\u00edtica de endoso<\/b> \u2014 para cada chaincode se pueden establecer pol\u00edticas sobre cu\u00e1ntas y de qui\u00e9n se deben esperar confirmaciones para una transacci\u00f3n. Si no se establece una pol\u00edtica, por defecto se utiliza: \u201cla transacci\u00f3n debe ser confirmada por cualquier miembro (member) de cualquier organizaci\u00f3n en el canal\u201d. Ejemplos de pol\u00edticas:<\/p>\n<ul>\n<li>La transacci\u00f3n debe ser confirmada por cualquier administrador de la organizaci\u00f3n;<\/li>\n<li>Cualquier miembro (member) o cliente de la organizaci\u00f3n debe confirmarla;<\/li>\n<li>Cualquier peer de la organizaci\u00f3n debe confirmarla.<\/li>\n<\/ul>\n<p>\n<b>Servicio de ordenamiento<\/b> \u2014 encapsula transacciones en bloques y las env\u00eda a los peers en el canal. Garantiza la entrega de mensajes a todos los peers en la red. Se utiliza un <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">broker de mensajes Kafka<\/a><\/noindex>, para desarrollo y pruebas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hyperledger\/fabric\/tree\/master\/orderer\/consensus\/solo\">Solo<\/a><\/noindex>.<\/p>\n<h2>CallFlow<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>La aplicaci\u00f3n interact\u00faa con Hyperledger Fabric, utilizando Go, Node.js o el SDK de Java;<\/li>\n<li>El cliente crea la transacci\u00f3n tx y la env\u00eda a los peers endorsing;<\/li>\n<li>El peer verifica la firma del cliente, ejecuta la transacci\u00f3n y env\u00eda la firma de respaldo de vuelta al cliente. El chaincode se ejecuta solo en los peers endorsing, y el resultado de su ejecuci\u00f3n se env\u00eda a todos los peers. Este algoritmo de trabajo se llama consenso PBFT (Practical Byzantine Fault Tolerant). Se diferencia de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">el BFT cl\u00e1sico<\/a><\/noindex> en que el mensaje se env\u00eda y se espera la confirmaci\u00f3n no de todos los participantes, sino solo de un conjunto espec\u00edfico;<\/li>\n<li>Despu\u00e9s de que el cliente recibe el n\u00famero de respuestas correspondiente a la pol\u00edtica de respaldo, env\u00eda la transacci\u00f3n al servicio de ordenamiento;<\/li>\n<li>El servicio de ordenamiento forma un bloque y lo env\u00eda a todos los peers comprometedores. El servicio de ordenamiento garantiza la escritura secuencial de bloques, lo que excluye el llamado fork del libro mayor (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">ver la secci\u00f3n \"Forks\"<\/a><\/noindex>);<\/li>\n<li>Los peers reciben el bloque, verifican nuevamente la pol\u00edtica de respaldo, registran el bloque en la cadena de bloques y cambian el estado en la base de datos de \"World state\".<\/li>\n<\/ul>\n<p>\nEs decir, se produce una separaci\u00f3n de roles entre los nodos. Esto garantiza la escalabilidad y seguridad de la cadena de bloques:<\/p>\n<ul>\n<li>Los smart contracts (chaincode) son ejecutados por los peers endorsing. Esto garantiza la confidencialidad de los smart contracts, ya que no se almacenan en todos los participantes, sino solo en los peers endorsing.<\/li>\n<li>El servicio de ordenamiento debe funcionar r\u00e1pidamente. Esto se asegura mediante que el servicio de ordenamiento solo forma bloques y los env\u00eda a un conjunto fijo de peers l\u00edderes.<\/li>\n<li>Los committing peers solo almacenan la cadena de bloques \u2014 puede haber muchos y no requieren de gran potencia ni de un funcionamiento instant\u00e1neo. <\/li>\n<\/ul>\n<p>\nPara m\u00e1s detalles sobre las soluciones arquitect\u00f3nicas de Hyperledger Fabric y por qu\u00e9 funciona de esta manera, se puede ver aqu\u00ed: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Or\u00edgenes de la arquitectura<\/a><\/noindex> o aqu\u00ed: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: un sistema operativo distribuido para cadenas de bloques con permisos<\/a><\/noindex>.<\/p>\n<p>As\u00ed que, Hyperledger Fabric es realmente un sistema vers\u00e1til, con el que se puede:<\/p>\n<ul>\n<li>Implementar l\u00f3gica de negocios arbitraria, utilizando el mecanismo de smart contracts;<\/li>\n<li>Registrar y obtener datos de una base de datos blockchain en formato JSON;<\/li>\n<li>Proporcionar y verificar acceso a la API, utilizando una Autoridad de Certificaci\u00f3n. <\/li>\n<\/ul>\n<p>\nAhora que tenemos una mejor comprensi\u00f3n de las especificaciones de Hyperledger Fabric, \u00a1finalmente hagamos algo \u00fatil!<\/p>\n<h2>Desplegando blockchain<\/h2>\n<p><\/p>\n<h3>Planteamiento del problema<\/h3>\n<p>\nLa tarea es implementar una red Citcoin con las siguientes funciones: crear una cuenta, obtener balance, recargar el saldo, transferir monedas de una cuenta a otra. Dibujemos el modelo de objeto, que luego se implementar\u00e1 en el contrato inteligente. As\u00ed que tendremos cuentas que se identifican por nombres (name) y contienen saldo (balance), y una lista de cuentas. Las cuentas y la lista de cuentas son, en t\u00e9rminos de Hyperledger Fabric, activos. Por lo tanto, tienen un historial y un estado actual. Intentar\u00e9 ilustrarlo claramente:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLas figuras superiores son el estado actual, que se almacena en la base 'World state'. Debajo de ellas, las figuras que muestran la historia, que se almacena en la blockchain. El estado actual de los activos cambia con transacciones. Un activo solo se puede cambiar en su totalidad, por lo que como resultado de ejecutar una transacci\u00f3n se crea un nuevo objeto y el valor actual del activo pasa a la historia. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nCreamos una cuenta en <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM Cloud<\/a><\/noindex>. Para utilizar la plataforma blockchain, debe actualizarse a Pay-As-You-Go. Este proceso puede no ser r\u00e1pido, ya que IBM solicita informaci\u00f3n adicional y la verifica manualmente. De lo positivo, puedo decir que IBM tiene buenos materiales de aprendizaje que permiten desplegar Hyperledger Fabric en su nube. Me gust\u00f3 el siguiente ciclo de art\u00edculos y ejemplos:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Crear una red blockchain b\u00e1sica utilizando la Plataforma Blockchain<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Crear y ejecutar un contrato inteligente blockchain<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Emitir eventos desde la Plataforma Blockchain<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nA continuaci\u00f3n se muestran capturas de pantalla de la plataforma Blockchain de IBM. Esto no es una gu\u00eda para crear un blockchain, sino simplemente una demostraci\u00f3n del alcance de la tarea. As\u00ed que, para nuestros prop\u00f3sitos, hacemos una Organizaci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCreamos nodos: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCreamos usuarios:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCreamos un Canal y lo llamamos citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn esencia, un Canal es un blockchain, por lo que comienza con el bloque cero (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Escribimos un Smart Contract<\/h3>\n<p><\/p>\n<pre><code class=\"javascript\">\/*\n * Citcoin smart-contract v1.5 for Hyperledger Fabric\n * (c) Alexey Sushkov, 2019\n *\/\n \n'use strict';\n \nconst { Contract } = require('fabric-contract-api');\nconst maxAccounts = 5;\n \nclass CitcoinEvents extends Contract {\n \n    async instantiate(ctx) {\n        console.info('instantiate');\n        let emptyList = [];\n        await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList)));\n    }\n    \/\/ Get all accounts\n    async GetAccounts(ctx) {\n        \/\/ Get account list:\n        let accounts = '{}'\n        let accountsData = await ctx.stub.getState('accounts');\n        if (accountsData) {\n            accounts = JSON.parse(accountsData.toString());\n        } else {\n            throw new Error('accounts not found');\n        }\n        return accountsData.toString()\n    }\n     \/\/ add a account object to the blockchain state identifited by their name\n    async AddAccount(ctx, name, balance) {\n        \/\/ this is account data:\n        let account = {\n            name: name,\n            balance: Number(balance),       \n            type: 'account',\n        };\n        \/\/ create account:\n        await ctx.stub.putState(name, Buffer.from(JSON.stringify(account)));\n \n        \/\/ Add account to list:\n        let accountsData = await ctx.stub.getState('accounts');\n        if (accountsData) {\n            let accounts = JSON.parse(accountsData.toString());\n            if (accounts.length &lt; maxAccounts)\n            {\n                accounts.push(name);\n                await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts)));\n            } else {\n                throw new Error('Max accounts number reached');\n            }\n        } else {\n            throw new Error('accounts not found');\n        }\n        \/\/ return  object\n        return JSON.stringify(account);\n    }\n    \/\/ Sends money from Account to Account\n    async SendFrom(ctx, fromAccount, toAccount, value) {\n        \/\/ get Account from\n        let fromData = await ctx.stub.getState(fromAccount);\n        let from;\n        if (fromData) {\n            from = JSON.parse(fromData.toString());\n            if (from.type !== 'account') {\n                throw new Error('wrong from type');\n            }   \n        } else {\n            throw new Error('Accout from not found');\n        }\n        \/\/ get Account to\n        let toData = await ctx.stub.getState(toAccount);\n        let to;\n        if (toData) {\n            to = JSON.parse(toData.toString());\n            if (to.type !== 'account') {\n                throw new Error('wrong to type');\n            }  \n        } else {\n            throw new Error('Accout to not found');\n        }\n \n        \/\/ update the balances\n        if ((from.balance - Number(value)) &gt;= 0 ) {\n            from.balance -= Number(value);\n            to.balance += Number(value);\n        } else {\n            throw new Error('From Account: not enought balance');          \n        }\n \n        await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from)));\n        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));\n                 \n        \/\/ define and set Event\n        let Event = {\n            type: \"SendFrom\",\n            from: from.name,\n            to: to.name,\n            balanceFrom: from.balance,\n            balanceTo: to.balance,\n            value: value\n        };\n        await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event)));\n \n        \/\/ return to object\n        return JSON.stringify(from);\n    }\n \n    \/\/ get the state from key\n    async GetState(ctx, key) {\n        let data = await ctx.stub.getState(key);\n        let jsonData = JSON.parse(data.toString());\n        return JSON.stringify(jsonData);\n    }\n    \/\/ GetBalance   \n    async GetBalance(ctx, accountName) {\n        let data = await ctx.stub.getState(accountName);\n        let jsonData = JSON.parse(data.toString());\n        return JSON.stringify(jsonData);\n    }\n     \n    \/\/ Refill own balance\n    async RefillBalance(ctx, toAccount, value) {\n        \/\/ get Account to\n        let toData = await ctx.stub.getState(toAccount);\n        let to;\n        if (toData) {\n            to = JSON.parse(toData.toString());\n            if (to.type !== 'account') {\n                throw new Error('wrong to type');\n            }  \n        } else {\n            throw new Error('Accout to not found');\n        }\n \n        \/\/ update the balance\n        to.balance += Number(value);\n        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));\n                 \n        \/\/ define and set Event\n        let Event = {\n            type: \"RefillBalance\",\n            to: to.name,\n            balanceTo: to.balance,\n            value: value\n        };\n        await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event)));\n \n        \/\/ return to object\n        return JSON.stringify(from);\n    }\n}\nmodule.exports = CitcoinEvents;\n<\/code><\/pre>\n<p>\nIntuitivamente, aqu\u00ed deber\u00eda estar todo claro:<\/p>\n<ul>\n<li>Hay varias funciones (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) que ser\u00e1 invocada por el programa demo utilizando la API de Hyperledger Fabric.<\/li>\n<li>Las funciones SendFrom y RefillBalance generan eventos (Event) que recibir\u00e1 el programa demo.<\/li>\n<li>La funci\u00f3n instantiate se llama una vez al instanciar un contrato inteligente. En realidad, se llama no una vez, sino cada vez que se cambia la versi\u00f3n del contrato inteligente. Por lo tanto, inicializar la lista con un array vac\u00edo es una mala idea, ya que al cambiar la versi\u00f3n del contrato inteligente perderemos la lista actual. Pero no hay problema, solo estoy aprendiendo).<\/li>\n<li>Las cuentas y la lista de cuentas (accounts) son estructuras de datos JSON. Se utiliza JS para manipular los datos.<\/li>\n<li>El valor actual del activo se puede obtener mediante la funci\u00f3n getState, y actualizarse mediante putState.<\/li>\n<li>Al crear una cuenta se llama a la funci\u00f3n AddAccount, en la que se compara el n\u00famero m\u00e1ximo de cuentas en la blockchain (maxAccounts = 5). Y aqu\u00ed hay un error (\u00bflo notaron?), que causa un crecimiento infinito del n\u00famero de cuentas. Hay que evitar este tipo de errores).<\/li>\n<\/ul>\n<p>\nLuego, cargamos el contrato inteligente en el canal e instanciamos:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVemos la transacci\u00f3n para establecer el contrato inteligente:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVemos los detalles de nuestro canal:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo resultado, obtenemos el siguiente esquema de la red blockchain en la nube de IBM. Tambi\u00e9n en el esquema hay un programa de demostraci\u00f3n que se ejecuta en la nube de Amazon en un servidor virtual (hablaremos de \u00e9l en la siguiente secci\u00f3n):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Creaci\u00f3n de GUI para las llamadas a la API de Hyperledger Fabric<\/h2>\n<p>\nHyperledger Fabric tiene una API que se puede utilizar para:<\/p>\n<ul>\n<li>Crear un canal;<\/li>\n<li>Conectar un peer al canal;<\/li>\n<li>Instalar e instanciar contratos inteligentes en el canal;<\/li>\n<li>Llamar a transacciones;<\/li>\n<li>Solicitar informaci\u00f3n en la blockchain.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Desarrollo de la aplicaci\u00f3n<\/h3>\n<p>\nEn nuestro programa de demostraci\u00f3n, utilizaremos la API solo para llamar a transacciones y solicitar informaci\u00f3n, ya que ya hemos realizado los otros pasos utilizando la plataforma de blockchain de IBM. Vamos a escribir la GUI utilizando el stack tecnol\u00f3gico est\u00e1ndar: Express.js + Vue.js + Node.js. Se podr\u00eda escribir un art\u00edculo separado sobre c\u00f3mo comenzar a crear aplicaciones web modernas. Aqu\u00ed dejo un enlace a la serie de conferencias que m\u00e1s me gust\u00f3: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Como resultado, se ha creado una aplicaci\u00f3n cliente-servidor con una interfaz gr\u00e1fica familiar en el estilo Material Design de Google. La API REST entre el cliente y el servidor consta de varias llamadas:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 inicializar la blockchain;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 obtener la lista de todas las cuentas;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 crear la cuenta de Bob;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 obtener informaci\u00f3n sobre la cuenta de Bob;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 transferir dos monedas de Bob a Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 cerrar la conexi\u00f3n con la blockchain.<\/li>\n<\/ul>\n<p>\nLa descripci\u00f3n de la API con ejemplos se encuentra en<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> el sitio \u00abPostman\u00bb<\/a><\/noindex> \u2014 un programa ampliamente conocido para probar APIs HTTP.<\/p>\n<h3>Aplicaci\u00f3n demo en la nube de Amazon<\/h3>\n<p>\nLa aplicaci\u00f3n la sub\u00ed a Amazon, ya que IBM a\u00fan no ha podido actualizar mi cuenta y permitir la creaci\u00f3n de servidores virtuales. Como un toque final, a\u00f1ad\u00ed el dominio: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Mantendr\u00e9 el servidor encendido un poco, luego lo apagar\u00e9, ya que se acumulan costos de alquiler, y las monedas citcoin a\u00fan no est\u00e1n listadas en el intercambio) En el art\u00edculo incluir\u00e9 capturas de pantalla de la demo para que quede claro c\u00f3mo funciona. La aplicaci\u00f3n demo puede:<\/p>\n<ul>\n<li>Inicializar la blockchain;<\/li>\n<li>Crear una cuenta (pero actualmente no se puede crear una nueva, ya que se ha alcanzado el n\u00famero m\u00e1ximo de cuentas establecido en el contrato inteligente);<\/li>\n<li>Obtener la lista de cuentas;<\/li>\n<li>Transferir monedas citcoin entre Alice, Bob y Alex;<\/li>\n<li>Obtener eventos (pero en este momento no se pueden mostrar eventos, por lo que en la interfaz se indica que no se admiten eventos por simplicidad);<\/li>\n<li>Registrar acciones.<\/li>\n<\/ul>\n<p>\nPrimero inicializamos la blockchain:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLuego creamos nuestra cuenta, sin escatimar en el saldo:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObtenemos la lista de todas las cuentas disponibles:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nElegimos el remitente y el destinatario, obteniendo sus saldos. Si el remitente y el destinatario son la misma persona, se recargar\u00e1 su saldo:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn el registro, seguimos la ejecuci\u00f3n de las transacciones:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEso es todo con el programa demo. A continuaci\u00f3n, podemos ver nuestra transacci\u00f3n en la blockchain:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nY la lista general de transacciones:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCon esto hemos completado con \u00e9xito la implementaci\u00f3n del PoC para crear la red Citcoin. \u00bfQu\u00e9 m\u00e1s se necesita para que Citcoin se convierta en una red completa para transferir monedas? Muy poco:<\/p>\n<ul>\n<li>En la etapa de creaci\u00f3n de la cuenta, implementar la generaci\u00f3n de clave privada \/ p\u00fablica. La clave privada debe almacenarse en el usuario de la cuenta, la p\u00fablica en la blockchain.<\/li>\n<li>Realizar la transferencia de monedas, en la que se use la clave p\u00fablica en lugar del nombre para identificar al usuario.<\/li>\n<li>Cifrar las transacciones que van del usuario al servidor con su clave privada.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Conclusi\u00f3n <\/h2>\n<p>\nHemos implementado la red Citcoin con funciones: a\u00f1adir cuenta, obtener saldo, recargar su cuenta, transferir monedas de una cuenta a otra. Entonces, \u00bfqu\u00e9 nos cost\u00f3 construir el PoC?<\/p>\n<ul>\n<li>Es necesario estudiar la blockchain en general y Hyperledger Fabric en particular;<\/li>\n<li>Aprender a utilizar las nubes de IBM o Amazon;<\/li>\n<li>Aprender el lenguaje de programaci\u00f3n JS y alg\u00fan framework web;<\/li>\n<li>Si necesitamos almacenar algunos datos fuera de la cadena de bloques, en una base de datos separada, deber\u00edamos aprender a integrarnos, por ejemplo, con PostgreSQL;<\/li>\n<li>Y, por \u00faltimo, pero no menos importante, \u00a1sin conocimientos de Linux no se va a ninguna parte en el mundo moderno!)<\/li>\n<\/ul>\n<p>\nClaro, no es ciencia espacial, \u00a1pero tendr\u00e1s que esforzarte!<\/p>\n<h3>C\u00f3digos fuente en GitHub<\/h3>\n<p>\nHe dejado los archivos fuente en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Descripci\u00f3n breve del repositorio:<br \/>\nCat\u00e1logo &#171;<b>servidor<\/b>&#187; \u2014 servidor Node.js<br \/>\nCat\u00e1logo &#171;<b>client<\/b>&#187; \u2014 cliente Node.js<br \/>\nCat\u00e1logo &#171;<b>blockchain<\/b>&#187; (los valores de los par\u00e1metros y las claves, por supuesto, no son funcionales y se dan solo a modo de ejemplo):<\/p>\n<ul>\n<li>contract \u2014 c\u00f3digo fuente del contrato inteligente<\/li>\n<li>wallet \u2014 claves del usuario para utilizar el API de Hyperledger Fabric. <\/li>\n<li>*.cds \u2014 versiones compiladas de contratos inteligentes<\/li>\n<li>*.json archivos \u2014 ejemplos de archivos de configuraci\u00f3n para utilizar el API de Hyperledger Fabric<\/li>\n<\/ul>\n<p>\n<b>\u00a1Esto es solo el comienzo!<\/b><br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466157\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c?) \u0438 \u043a\u0435\u0439\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043a\u0435\u0439\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c?). \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438! \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0438\u043b\u043e\u0442\u043e\u0432 \u0438 PoC (Proof of Concept) \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430, \u0442.\u043a. \u043a \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28421,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37868","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d: \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 PoC \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:20:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Blockchain: \u00bfqu\u00e9 nos cuesta construir un PoC? | ProHoster","description":"\u00a1Los ojos tienen miedo, pero las manos pican! En art\u00edculos anteriores, analizamos las tecnolog\u00edas sobre las que se construyen las cadenas de bloques (\u00bfQu\u00e9 nos cuesta la cadena de bloques?","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d: \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 PoC \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c? | ProHoster","og:description":"\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:20:16+00:00","article:modified_time":"2019-10-31T19:20:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37868","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:34:11","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:19:22","updated":"2026-01-23 19:34:11","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}