{"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\/fr\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Les yeux ont peur, mais les mains d\u00e9mangent !<\/i><\/p>\n<p>Dans les articles pr\u00e9c\u00e9dents, nous avons explor\u00e9 les technologies sur lesquelles reposent les blockchains (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Quel est le co\u00fbt de construire une blockchain ?<\/a><\/noindex>) et les cas d'utilisation qui peuvent \u00eatre r\u00e9alis\u00e9s gr\u00e2ce \u00e0 elles (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Qu'est-ce qui nous emp\u00eache de construire un cas ?<\/a><\/noindex>). Il est temps de mettre la main \u00e0 la p\u00e2te ! Pour r\u00e9aliser des pilotes et des PoC (Proof of Concept), je pr\u00e9f\u00e8re utiliser le cloud, car ils sont accessibles de n'importe o\u00f9 dans le monde et, souvent, il n'est pas n\u00e9cessaire de perdre du temps sur une installation ennuyeuse, car il existe des configurations pr\u00e9d\u00e9finies. Alors, faisons quelque chose de simple, par exemple, un r\u00e9seau pour transf\u00e9rer des pi\u00e8ces entre participants et appelons-le modestement Cittcoin. Pour cela, nous allons utiliser le cloud IBM et la blockchain universelle Hyperledger Fabric. Commen\u00e7ons par comprendre pourquoi Hyperledger Fabric est appel\u00e9 blockchain universelle.<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire 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 universelle<\/h2>\n<p>\nEn g\u00e9n\u00e9ral, un syst\u00e8me d'information universel se compose de :<\/p>\n<ul>\n<li>Un ensemble de serveurs et un c\u0153ur logiciel ex\u00e9cutant la logique m\u00e9tier ;<\/li>\n<li>Interfaces pour interagir avec le syst\u00e8me ;<\/li>\n<li>Outils pour enregistrer, authentifier et autoriser les dispositifs \/ personnes ;<\/li>\n<li>Une base de donn\u00e9es qui stocke les donn\u00e9es op\u00e9rationnelles et archiv\u00e9es :<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa version officielle de ce qu'est Hyperledger Fabric peut \u00eatre consult\u00e9e sur <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">site<\/a><\/noindex>, et en r\u00e9sum\u00e9, Hyperledger Fabric est une plateforme open source permettant de construire des blockchains priv\u00e9es et d'ex\u00e9cuter des contrats intelligents arbitr\u00e9s dans des langages de programmation comme JS et Go. Analysons de plus pr\u00e8s l'architecture d'Hyperledger Fabric et v\u00e9rifions que c'est un syst\u00e8me universel, o\u00f9 il n'y a que des sp\u00e9cificit\u00e9s sur le stockage et l'enregistrement des donn\u00e9es. La sp\u00e9cificit\u00e9 r\u00e9side dans le fait que les donn\u00e9es, comme dans tous les blockchains, sont stock\u00e9es dans des blocs, qui ne peuvent \u00eatre ajout\u00e9s \u00e0 la blockchain que si les participants parviennent \u00e0 un consensus, et une fois enregistr\u00e9es, les donn\u00e9es ne peuvent pas \u00eatre modifi\u00e9es ou supprim\u00e9es furtivement.<\/p>\n<h2>Architecture d'Hyperledger Fabric<\/h2>\n<p>\nLe sch\u00e9ma montre l'architecture d'Hyperledger Fabric :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisations <\/b> \u2014 les organisations contiennent des pairs, de sorte que la blockchain existe gr\u00e2ce au soutien des organisations. Diff\u00e9rentes organisations peuvent faire partie d'un m\u00eame canal.<\/p>\n<p><b>Channel <\/b> \u2014 une structure logique qui regroupe des pairs, d\u00e9finissant ainsi la blockchain. Hyperledger Fabric peut traiter simultan\u00e9ment plusieurs blockchains avec diff\u00e9rentes logiques m\u00e9tier.<\/p>\n<p><b>Fournisseur de services d'adh\u00e9sion (MSP)<\/b> \u2014 c'est une CA (Autorit\u00e9 de certification) pour l'\u00e9mission d'identit\u00e9s et l'attribution de r\u00f4les. Pour cr\u00e9er un n\u0153ud, il est n\u00e9cessaire d'interagir avec le MSP.<\/p>\n<p><b>N\u0153uds pairs<\/b> \u2014 v\u00e9rifient les transactions, stockent la blockchain, ex\u00e9cutent des contrats intelligents et interagissent avec des applications. Les pairs ont une identit\u00e9 (certificat num\u00e9rique) d\u00e9livr\u00e9e par un MSP. Contrairement au r\u00e9seau Bitcoin ou Ethereum, o\u00f9 tous les n\u0153uds sont \u00e9gaux, dans Hyperledger Fabric, les n\u0153uds jouent des r\u00f4les diff\u00e9rents :<\/p>\n<ul>\n<li>Le pair peut \u00eatre <b>un pair d'approbation<\/b> (EP) et ex\u00e9cuter des contrats intelligents.<\/li>\n<li><b>Le pair d'engagement<\/b> (CP) \u2014 sauvegarde uniquement les donn\u00e9es dans la blockchain et actualise l'\u00e9tat mondial.<\/li>\n<li><b>Pair d'ancrage<\/b> (AP) \u2014 si plusieurs organisations participent \u00e0 la blockchain, les pairs d'ancrage sont utilis\u00e9s pour \u00e9tablir des liens entre elles. Chaque organisation doit avoir un ou plusieurs pairs d'ancrage. Gr\u00e2ce \u00e0 l'AP, tout pair d'une organisation peut obtenir des informations sur tous les pairs des autres organisations. Pour synchroniser les informations entre les AP, le <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">protocole de gossip<\/a><\/noindex>.<\/li>\n<li><b>Pair leader<\/b> \u2014 si une organisation a plusieurs pairs, seul le pair leader recevra des blocs du service de commande et les distribuera aux autres pairs. Le leader peut \u00eatre assign\u00e9 statiquement ou \u00eatre choisi dynamiquement par les pairs de l'organisation. Pour synchroniser les informations sur les leaders, le protocole de gossip est \u00e9galement utilis\u00e9.<\/li>\n<\/ul>\n<p>\n<b>Actifs <\/b> \u2014 entit\u00e9s ayant de la valeur, stock\u00e9es dans la blockchain. Plus pr\u00e9cis\u00e9ment, ce sont des donn\u00e9es cl\u00e9-valeur au format JSON. Ce sont ces donn\u00e9es qui sont enregistr\u00e9es dans la blockchain \u00abBlockchain\u00bb. Elles ont une histoire, qui est conserv\u00e9e dans la blockchain, et un \u00e9tat actuel qui est stock\u00e9 dans la base de donn\u00e9es \u00abWorld state\u00bb. Les structures de donn\u00e9es sont remplies al\u00e9atoirement selon les exigences commerciales. Il n'y a pas de champs obligatoires, la seule recommandation est que les actifs doivent avoir un propri\u00e9taire et repr\u00e9senter de la valeur. <\/p>\n<p><b>Grand livre <\/b> \u2014 compos\u00e9 de la blockchain \u00abBlockchain\u00bb et de la base de donn\u00e9es \u00abWorld state\u00bb, dans laquelle l'\u00e9tat actuel des actifs est stock\u00e9. L'\u00e9tat mondial utilise LevelDB ou CouchDB.<\/p>\n<p><b>Contrat intelligent<\/b> \u2014 la logique commerciale du syst\u00e8me est impl\u00e9ment\u00e9e \u00e0 l'aide de contrats intelligents. Dans Hyperledger Fabric, les contrats intelligents sont appel\u00e9s chaincode. Avec le chaincode, les actifs et les transactions qui leur sont associ\u00e9es sont d\u00e9finis. En termes techniques, les contrats intelligents sont des modules logiciels r\u00e9alis\u00e9s dans les langages de programmation JS ou Go.<\/p>\n<p><b>Politique d'approbation<\/b> \u2014 pour chaque chaincode, il est possible de d\u00e9finir des politiques concernant le nombre et les membres dont les confirmations sont n\u00e9cessaires pour une transaction. Si aucune politique n'est d\u00e9finie, la r\u00e8gle par d\u00e9faut est : \"la transaction doit \u00eatre approuv\u00e9e par tout membre (member) de n'importe quelle organisation dans le canal\". Exemples de politiques :<\/p>\n<ul>\n<li>La transaction doit \u00eatre approuv\u00e9e par n'importe quel administrateur de l'organisation ;<\/li>\n<li>Doit \u00eatre approuv\u00e9e par tout membre ou client de l'organisation ;<\/li>\n<li>Doit \u00eatre approuv\u00e9e par tout peer de l'organisation.<\/li>\n<\/ul>\n<p>\n<b>Service de commande<\/b> \u2014 emballe les transactions dans des blocs et les envoie aux peers dans le channel. Garantit la livraison des messages \u00e0 tous les peers du r\u00e9seau. Pour les syst\u00e8mes industriels, on utilise <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">le courtier de messages Kafka<\/a><\/noindex>, pour le d\u00e9veloppement et les tests. <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 : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>L'application interagit avec Hyperledger Fabric en utilisant les SDK Go, Node.js ou Java ;<\/li>\n<li>Le client cr\u00e9e une transaction tx et l'envoie aux endorsing peers ;<\/li>\n<li>Le peer v\u00e9rifie la signature du client, ex\u00e9cute la transaction et renvoie la signature d'endossement au client. Le chaincode n'est ex\u00e9cut\u00e9 que sur l'endorsing peer, et le r\u00e9sultat de son ex\u00e9cution est diffus\u00e9 \u00e0 tous les peers. Ce m\u00e9canisme de fonctionnement est appel\u00e9 \u2014 consensus PBFT (Practical Byzantine Fault Tolerant). Il se distingue de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">la BFT classique<\/a><\/noindex> en ce sens que le message est diffus\u00e9 et qu'une confirmation est attendue non pas de tous les participants, mais seulement d'un ensemble sp\u00e9cifique ;<\/li>\n<li>Apr\u00e8s que le client a re\u00e7u un nombre de r\u00e9ponses correspondant \u00e0 la politique d'endossement, il envoie la transaction au service de commande ;<\/li>\n<li>Le service de commande forme un bloc et l'envoie \u00e0 tous les committing peers. Le service de commande assure l'enregistrement s\u00e9quentiel des blocs, ce qui exclut ce qu'on appelle le fork du ledger (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">voir la section \u00ab Forks \u00bb<\/a><\/noindex>);<\/li>\n<li>Les peers re\u00e7oivent le bloc, v\u00e9rifient de nouveau la politique d'endossement, enregistrent le bloc dans la blockchain et modifient l'\u00e9tat dans la base de donn\u00e9es \u00ab World state \u00bb.<\/li>\n<\/ul>\n<p>\nC'est-\u00e0-dire qu'il y a une s\u00e9paration des r\u00f4les entre les n\u0153uds. Cela assure l'\u00e9volutivit\u00e9 et la s\u00e9curit\u00e9 de la blockchain :<\/p>\n<ul>\n<li>Les smart contracts (chaincode) sont ex\u00e9cut\u00e9s par les endorsing peers. Cela assure la confidentialit\u00e9 des smart contracts, car ils ne sont pas stock\u00e9s par tous les participants, mais seulement sur les endorsing peers.<\/li>\n<li>Le service de commande doit fonctionner rapidement. Cela est assur\u00e9 par le fait que le service de commande ne fait que former un bloc et l'envoyer \u00e0 un ensemble fixe de leader peers.<\/li>\n<li>Les committing peers stockent simplement la blockchain \u2014 ils peuvent \u00eatre nombreux et ne n\u00e9cessitent pas une grande puissance et un fonctionnement instantan\u00e9. <\/li>\n<\/ul>\n<p>\nPour plus de d\u00e9tails sur les solutions architecturales d'Hyperledger Fabric et pourquoi il fonctionne ainsi, vous pouvez consulter ici : <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Origines de l'architecture<\/a><\/noindex> ou ici : <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric : un syst\u00e8me d'exploitation distribu\u00e9 pour blockchains autoris\u00e9es<\/a><\/noindex>.<\/p>\n<p>Ainsi, Hyperledger Fabric est vraiment un syst\u00e8me polyvalent, qui permet de :<\/p>\n<ul>\n<li>R\u00e9aliser une logique commerciale arbitraire en utilisant le m\u00e9canisme des smart contracts ;<\/li>\n<li>Enregistrer et r\u00e9cup\u00e9rer des donn\u00e9es depuis une base de donn\u00e9es blockchain au format JSON;<\/li>\n<li>Fournir et v\u00e9rifier l'acc\u00e8s \u00e0 l'API en utilisant une autorit\u00e9 de certification. <\/li>\n<\/ul>\n<p>\nMaintenant que nous avons un peu compris la sp\u00e9cificit\u00e9 d'Hyperledger Fabric, faisons enfin quelque chose d'utile!<\/p>\n<h2>D\u00e9ploiement de la blockchain<\/h2>\n<p><\/p>\n<h3>D\u00e9finition du probl\u00e8me<\/h3>\n<p>\nLa t\u00e2che consiste \u00e0 impl\u00e9menter un r\u00e9seau Citcoin avec les fonctionnalit\u00e9s suivantes : cr\u00e9er un compte, obtenir un solde, approvisionner un compte, transf\u00e9rer des pi\u00e8ces d'un compte \u00e0 un autre. Dessinons un mod\u00e8le d'objet que nous allons ensuite impl\u00e9menter dans un contrat intelligent. Ainsi, nous aurons des comptes qui s'identifient par des noms (name) et contiennent un solde (balance), ainsi qu'une liste de comptes. Les comptes et la liste de comptes sont des actifs en termes d'Hyperledger Fabric. Par cons\u00e9quent, ils ont une histoire et un \u00e9tat actuel. Je vais essayer de le dessiner visuellement :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes figures sup\u00e9rieures repr\u00e9sentent l'\u00e9tat actuel, qui est stock\u00e9 dans la base \u00ab World state \u00bb. En dessous, les figures montrent l'historique qui est conserv\u00e9 dans la blockchain. L'\u00e9tat actuel des actifs est modifi\u00e9 par des transactions. Un actif ne peut \u00eatre modifi\u00e9 que dans son int\u00e9gralit\u00e9, donc \u00e0 la suite d'une transaction, un nouvel objet est cr\u00e9\u00e9 et la valeur actuelle de l'actif est envoy\u00e9e dans l'historique. <\/p>\n<h3>Cloud IBM <\/h3>\n<p>\nCr\u00e9ons un compte dans <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">le cloud IBM<\/a><\/noindex>. Pour utiliser la plateforme blockchain, il faut la mettre \u00e0 niveau vers Pay-As-You-Go. Ce processus peut prendre du temps, car IBM demande des informations suppl\u00e9mentaires et les v\u00e9rifie manuellement. En positif, je peux dire qu'IBM a de bons mat\u00e9riaux d'apprentissage, permettant de d\u00e9ployer Hyperledger Fabric dans leur cloud. J'ai appr\u00e9ci\u00e9 le cycle suivant d'articles et d'exemples :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Cr\u00e9er un r\u00e9seau blockchain de base en utilisant la Blockchain Platform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Cr\u00e9er et ex\u00e9cuter un contrat intelligent blockchain<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">\u00c9mettre des \u00e9v\u00e9nements depuis la Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nVoici quelques captures d'\u00e9cran de la plateforme Blockchain d'IBM. Ce n'est pas un guide sur la cr\u00e9ation d'une blockchain, mais simplement une d\u00e9monstration de l'ampleur de la t\u00e2che. Alors, pour nos besoins, cr\u00e9ons une Organisation :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous y cr\u00e9ons des n\u0153uds : Orderer CA, Org1 CA, Orderer Peer :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCr\u00e9ons des utilisateurs :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCr\u00e9ons un Canal et appelons-le citcoin :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn substance, un Canal est une blockchain, donc il commence avec le bloc z\u00e9ro (Genesis block) :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00c9crivons 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>\nIntuitivement, tout devrait \u00eatre clair ici :<\/p>\n<ul>\n<li>Il existe plusieurs fonctions (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) qui seront appel\u00e9es par le programme de d\u00e9monstration \u00e0 l'aide de l'API Hyperledger Fabric.<\/li>\n<li>Les fonctions SendFrom et RefillBalance g\u00e9n\u00e8rent des \u00e9v\u00e9nements (Event) que recevra le programme de d\u00e9monstration.<\/li>\n<li>La fonction instantiate est appel\u00e9e une fois lors de l'instanciation d'un smart contract. En r\u00e9alit\u00e9, elle est appel\u00e9e plusieurs fois lors de chaque changement de version du smart contract. Par cons\u00e9quent, initialiser la liste avec un tableau vide est une mauvaise id\u00e9e, car lors du changement de version, nous perdrons la liste actuelle. Mais pas de souci, je suis simplement en train d'apprendre).<\/li>\n<li>Les comptes et la liste des comptes (accounts) sont des structures de donn\u00e9es JSON. Le JS est utilis\u00e9 pour manipuler les donn\u00e9es.<\/li>\n<li>La valeur actuelle de l'asset peut \u00eatre obtenue en appelant la fonction getState, et mise \u00e0 jour avec putState.<\/li>\n<li>Lors de la cr\u00e9ation d'un compte, la fonction AddAccount est appel\u00e9e, o\u00f9 une comparaison avec le nombre maximum de comptes dans la blockchain (maxAccounts = 5) est effectu\u00e9e. Et ici, il y a une erreur (vous l'avez remarqu\u00e9 ?), qui entra\u00eene une croissance infinie du nombre de comptes. De telles erreurs doivent \u00eatre \u00e9vit\u00e9es)<\/li>\n<\/ul>\n<p>\nNous continuons en chargeant le smart contract dans le channel et en l'instanciant :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous regardons la transaction d'installation du Smart Contract :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous consultons les d\u00e9tails de notre Channel :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn cons\u00e9quence, nous obtenons le sch\u00e9ma suivant du r\u00e9seau blockchain dans le cloud IBM. Le sch\u00e9ma pr\u00e9sente \u00e9galement un programme d\u00e9mo, ex\u00e9cut\u00e9 dans le cloud Amazon sur un serveur virtuel (nous en parlerons plus en d\u00e9tail dans la section suivante) :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Cr\u00e9ation d'une interface graphique pour les appels \u00e0 l'API Hyperledger Fabric<\/h2>\n<p>\nHyperledger Fabric dispose d'une API qui peut \u00eatre utilis\u00e9e pour :<\/p>\n<ul>\n<li>Cr\u00e9er un channel ;<\/li>\n<li>Connecter un peer au channel ;<\/li>\n<li>Installer et instancier des smart contracts dans le channel ;<\/li>\n<li>Appeler des transactions ;<\/li>\n<li>Demander des informations dans la blockchain.<\/li>\n<\/ul>\n<p><\/p>\n<h3>D\u00e9veloppement d'application<\/h3>\n<p>\nDans notre programme d\u00e9mo, nous utiliserons l'API uniquement pour appeler des transactions et demander des informations, car nous avons d\u00e9j\u00e0 r\u00e9alis\u00e9 les autres \u00e9tapes en utilisant la plateforme blockchain IBM. Nous \u00e9crivons l'interface graphique en utilisant la pile technologique standard : Express.js + Vue.js + Node.js. On pourrait \u00e9crire un article s\u00e9par\u00e9 sur la fa\u00e7on de commencer \u00e0 cr\u00e9er des applications web modernes. Ici, je laisse un lien vers une s\u00e9rie de conf\u00e9rences que j'ai le plus appr\u00e9ci\u00e9es : <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. En cons\u00e9quence, cela a donn\u00e9 une application client-serveur avec une interface graphique famili\u00e8re dans le style Material Design de Google. L'API REST entre le client et le serveur se compose de plusieurs appels :<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 initialiser la blockchain ;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 obtenir la liste de tous les comptes ;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 cr\u00e9er le compte Bob ;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 obtenir des informations sur le compte Bob ;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 transf\u00e9rer deux pi\u00e8ces de Bob \u00e0 Alice ;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 fermer la connexion avec la blockchain.<\/li>\n<\/ul>\n<p>\nJ'ai mis la description de l'API avec des exemples sur<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> le site \u00abPostman\u00bb<\/a><\/noindex> \u2014 un programme bien connu pour tester les API HTTP.<\/p>\n<h3>L'application de d\u00e9monstration est h\u00e9berg\u00e9e sur Amazon Cloud.<\/h3>\n<p>\nJ'ai t\u00e9l\u00e9charg\u00e9 l'application sur Amazon, car IBM n'a toujours pas r\u00e9ussi \u00e0 mettre \u00e0 jour mon compte et \u00e0 me permettre de cr\u00e9er des serveurs virtuels. En prime, j'ai ajout\u00e9 le domaine : <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Je garderai le serveur allum\u00e9 un peu, puis je l'\u00e9teindrai, car les frais de location s'accumulent et les pi\u00e8ces de citcoin ne sont pas encore cot\u00e9es sur les \u00e9changes.) Dans cet article, je mets des captures d'\u00e9cran de la d\u00e9monstration pour illustrer la logique de fonctionnement. L'application de d\u00e9monstration peut :<\/p>\n<ul>\n<li>Initialiser la blockchain ;<\/li>\n<li>Cr\u00e9er un compte (mais actuellement, il n'est pas possible de cr\u00e9er un nouveau compte, car le nombre maximal de comptes mentionn\u00e9 dans le contrat intelligent a \u00e9t\u00e9 atteint) ;<\/li>\n<li>Obtenir la liste des comptes ;<\/li>\n<li>Transf\u00e9rer des pi\u00e8ces de citcoin entre Alice, Bob et Alex ;<\/li>\n<li>Recevoir des \u00e9v\u00e9nements (mais pour l'instant, il n'est pas possible d'afficher des \u00e9v\u00e9nements, donc pour simplifier l'interface, il est indiqu\u00e9 que les \u00e9v\u00e9nements ne sont pas pris en charge) ;<\/li>\n<li>Enregistrer les actions.<\/li>\n<\/ul>\n<p>\nD'abord, nous initialisons la blockchain :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnsuite, nous cr\u00e9ons notre propre compte, sans l\u00e9siner sur le solde :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous obtenons la liste de tous les comptes disponibles :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous choisissons l'exp\u00e9diteur et le destinataire, et nous obtenons leurs soldes. Si l'exp\u00e9diteur et le destinataire sont la m\u00eame personne, son solde sera approvisionn\u00e9 :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans le log, nous suivons l'ex\u00e9cution des transactions :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoil\u00e0, c'est tout pour l'application de d\u00e9monstration. Ensuite, nous pouvons consulter notre transaction dans la blockchain :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEt la liste g\u00e9n\u00e9rale des transactions :<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain : que nous co\u00fbte-t-il de construire un PoC ?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons r\u00e9ussi \u00e0 terminer la mise en \u0153uvre de la PoC pour la cr\u00e9ation du r\u00e9seau Citcoin. Que faut-il encore faire pour que Citcoin devienne un r\u00e9seau complet pour le transfert de pi\u00e8ces ? Pas grand-chose :<\/p>\n<ul>\n<li>Lors de la cr\u00e9ation du compte, mettre en place la g\u00e9n\u00e9ration d'une cl\u00e9 priv\u00e9e\/publique. La cl\u00e9 priv\u00e9e doit \u00eatre conserv\u00e9e par l'utilisateur du compte, la cl\u00e9 publique dans la blockchain.<\/li>\n<li>Effectuer un transfert de pi\u00e8ces, o\u00f9 l'identification de l'utilisateur est faite non pas par le nom, mais par la cl\u00e9 publique.<\/li>\n<li>Chiffrer les transactions envoy\u00e9es par l'utilisateur au serveur \u00e0 l'aide de sa cl\u00e9 priv\u00e9e.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Conclusion <\/h2>\n<p>\nNous avons impl\u00e9ment\u00e9 le r\u00e9seau Citcoin avec les fonctionnalit\u00e9s suivantes : ajouter un compte, obtenir un solde, approvisionner son compte, transf\u00e9rer des pi\u00e8ces d'un compte \u00e0 un autre. Alors, quel a \u00e9t\u00e9 le co\u00fbt de la construction de la PoC ?<\/p>\n<ul>\n<li>Il faut \u00e9tudier la blockchain en g\u00e9n\u00e9ral et Hyperledger Fabric en particulier ;<\/li>\n<li>Apprendre \u00e0 utiliser les clouds d'IBM ou d'Amazon ;<\/li>\n<li>Apprendre le langage de programmation JS et un framework web.<\/li>\n<li>Si certaines donn\u00e9es doivent \u00eatre stock\u00e9es en dehors de la blockchain, dans une base de donn\u00e9es distincte, apprenez \u00e0 vous int\u00e9grer, par exemple, avec PostgreSQL ;<\/li>\n<li>Et enfin, bien que ce soit le dernier de la liste, il n'est pas moins important \u2014 sans connaissances en Linux, on ne fait pas grand-chose dans le monde moderne !)<\/li>\n<\/ul>\n<p>\nBien s\u00fbr, ce n'est pas de la science fus\u00e9e, mais il va falloir fournir un effort !<\/p>\n<h3>Sources sur GitHub<\/h3>\n<p>\nJ'ai mis les sources sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Description succincte du d\u00e9p\u00f4t :<br \/>\nCatalogue &#171;<b>serveur<\/b>&#187; \u2014 Serveur Node.js<br \/>\nCatalogue &#171;<b>client<\/b>&#187; \u2014 Client Node.js<br \/>\nCatalogue &#171;<b>blockchain<\/b>&#187; (les valeurs des param\u00e8tres et des cl\u00e9s, bien s\u00fbr, ne sont pas fonctionnelles et sont donn\u00e9es uniquement \u00e0 titre d'exemple) :<\/p>\n<ul>\n<li>contract \u2014 code source du contrat intelligent<\/li>\n<li>wallet \u2014 cl\u00e9s de l'utilisateur pour utiliser l'API Hyperledger Fabric. <\/li>\n<li>*.cds \u2014 versions compil\u00e9es des contrats intelligents<\/li>\n<li>*.json fichiers \u2014 exemples de fichiers de configuration pour utiliser l'API Hyperledger Fabric<\/li>\n<\/ul>\n<p>\n<b>C'est seulement le d\u00e9but !<\/b><br \/>\n<br \/>Source : <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.1 - 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\/fr\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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 : que nous co\u00fbte la construction d'un PoC ? | ProHoster","description":"Les yeux ont peur, mais les mains s'agitent ! Dans les articles pr\u00e9c\u00e9dents, nous avons examin\u00e9 les technologies sur lesquelles reposent les blockchains (Que co\u00fbte un blockchain.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}