{"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\/de\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: Was brauchen wir, um ein PoC zu erstellen?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Die Augen f\u00fcrchten sich, doch die H\u00e4nde jucken!<\/i><\/p>\n<p>In den vorherigen Artikeln haben wir uns mit den Technologien besch\u00e4ftigt, auf denen Blockchains basieren (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Was kostet es, eine Blockchain zu erstellen?<\/a><\/noindex>) und mit den Anwendungsf\u00e4llen, die wir damit realisieren k\u00f6nnen (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Was hindert uns daran, einen Anwendungsfall zu erstellen?<\/a><\/noindex>). Jetzt ist es an der Zeit, selbst Hand anzulegen! F\u00fcr die Umsetzung von Piloten und PoC (Proof of Concept) bevorzuge ich die Nutzung von Clouds, da man von \u00fcberall auf der Welt darauf zugreifen kann und oft keine Zeit mit dem m\u00fchsamen Einrichten von Umgebungen verbringen muss, da bereits vorkonfigurierte Setups vorhanden sind. Lassen Sie uns also etwas Einfaches machen, zum Beispiel ein Netzwerk, um M\u00fcnzen zwischen Teilnehmern zu \u00fcbertragen, und nennen wir es bescheiden Citcoin. Daf\u00fcr verwenden wir die IBM-Cloud und die universelle Blockchain Hyperledger Fabric. Zun\u00e4chst kl\u00e4ren wir, warum Hyperledger Fabric als universelle Blockchain bezeichnet wird?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" 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 die universelle Blockchain<\/h2>\n<p>\nAllgemein gesagt ist ein universelles Informationssystem:<\/p>\n<ul>\n<li>Ein Satz von Servern und eine Software, die die Gesch\u00e4ftslogik ausf\u00fchrt;<\/li>\n<li>Schnittstellen zur Interaktion mit dem System;<\/li>\n<li>Mittel zur Registrierung, Authentifizierung und Autorisierung von Ger\u00e4ten \/ Personen;<\/li>\n<li>Eine Datenbank, die operative und archivierte Daten speichert:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie offizielle Version, was Hyperledger Fabric ist, kann man lesen auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">Webseite<\/a><\/noindex>, kurz gesagt, Hyperledger Fabric ist eine Open-Source-Plattform, die es erm\u00f6glicht, private Blockchains zu erstellen und arbitr\u00e4re Smart Contracts in den Programmiersprachen JS und Go auszuf\u00fchren. Lassen Sie uns die Architektur von Hyperledger Fabric im Detail betrachten und sicherstellen, dass es sich um ein universelles System handelt, das spezielle Anforderungen an die Speicherung und Aufzeichnung von Daten hat. Diese Besonderheit besteht darin, dass die Daten, wie in allen Blockchains, in Bl\u00f6cken gespeichert werden, die nur dann in die Blockchain eingef\u00fcgt werden, wenn die Teilnehmer einen Konsens erzielt haben, und nach der Aufzeichnung sind die Daten nicht unbemerkt \u00e4nderbar oder l\u00f6schbar.<\/p>\n<h2>Architektur von Hyperledger Fabric<\/h2>\n<p>\nDie Architektur von Hyperledger Fabric ist in folgendem Diagramm dargestellt:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisationen <\/b> \u2013 Organisationen enthalten Peers, das hei\u00dft, die Blockchain existiert durch die Unterst\u00fctzung der Organisationen. Verschiedene Organisationen k\u00f6nnen einem Kanal beitreten.<\/p>\n<p><b>Kanal <\/b> \u2013 eine logische Struktur, die Peers in Gruppen zusammenfasst, wodurch die Blockchain definiert wird. Hyperledger Fabric kann gleichzeitig mehrere Blockchains mit unterschiedlicher Gesch\u00e4ftslogik verarbeiten.<\/p>\n<p><b>Membership Services Provider (MSP)<\/b> \u2014 ist eine CA (Zertifizierungsstelle) zur Erstellung von Identit\u00e4ten und Rollenverteilungen. Um einen Knoten zu erstellen, muss mit dem MSP interagiert werden.<\/p>\n<p><b>Peer-Knoten<\/b> \u2014 pr\u00fcfen Transaktionen, speichern die Blockchain, f\u00fchren Smart Contracts aus und interagieren mit Anwendungen. Peer-Knoten besitzen eine Identit\u00e4t (digitales Zertifikat), das von MSP ausgegeben wird. Im Gegensatz zu Netzwerken wie Bitcoin oder Ethereum, wo alle Knoten gleichberechtigt sind, \u00fcbernehmen Knoten in Hyperledger Fabric unterschiedliche Rollen:<\/p>\n<ul>\n<li>Ein Peer kann sein <b>endorsing peer<\/b> (EP) und Smart Contracts ausf\u00fchren.<\/li>\n<li><b>Committing peer<\/b> (CP) \u2014 speichert nur Daten in der Blockchain und aktualisiert den \u201eWorld State\u201c.<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 wenn mehrere Organisationen an der Blockchain beteiligt sind, werden Anchor Peer verwendet, um Verbindungen zwischen ihnen herzustellen. Jede Organisation muss einen oder mehrere Anchor Peer haben. Mit einem AP kann jeder Peer in der Organisation Informationen \u00fcber alle Peers in anderen Organisationen abrufen. Zur Synchronisierung von Informationen zwischen AP wird das <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">Gossip-Protokoll<\/a><\/noindex>.<\/li>\n<li><b>Leader Peer<\/b> \u2014 Wenn eine Organisation mehrere Peers hat, wird nur der f\u00fchrende Peer Bl\u00f6cke vom Ordering-Service empfangen und an die anderen Peers weitergeben. Der F\u00fchrende kann sowohl statisch festgelegt als auch dynamisch von den Peers innerhalb der Organisation ausgew\u00e4hlt werden. Zur Synchronisierung der Informationen \u00fcber die F\u00fchrenden wird ebenfalls das Gossip-Protokoll verwendet.<\/li>\n<\/ul>\n<p>\n<b>Assets <\/b> \u2014 sind Entit\u00e4ten von Wert, die in der Blockchain gespeichert werden. Genauer gesagt handelt es sich um Key-Value-Daten im JSON-Format. Diese Daten werden in die Blockchain \u201eBlockchain\u201c geschrieben. Sie haben eine Historie, die in der Blockchain gespeichert wird, und einen aktuellen Zustand, der in der Datenbank \u201eWorld state\u201c gespeichert ist. Die Datenstrukturen werden je nach Gesch\u00e4ftszweck beliebig bef\u00fcllt. Es gibt keine verpflichtenden Felder, die einzige Empfehlung ist, dass Assets einen Eigent\u00fcmer haben und einen Wert darstellen. <\/p>\n<p><b>Ledger <\/b> \u2014 besteht aus der Blockchain \u201eBlockchain\u201c und der Datenbank \u201eWorld state\u201c, in der der aktuelle Zustand der Assets gespeichert ist. Der World state verwendet LevelDB oder CouchDB.<\/p>\n<p><b>Smart Contract<\/b> \u2014 Die Gesch\u00e4ftslogik des Systems wird durch Smart Contracts umgesetzt. In Hyperledger Fabric werden Smart Contracts als Chaincode bezeichnet. Mit Chaincode werden Assets und die Transaktionen \u00fcber sie definiert. Technisch gesehen sind Smart Contracts Programmmodule, die in den Programmiersprachen JS oder Go implementiert sind.<\/p>\n<p><b>Genehmigungspolitik<\/b> \u2014 F\u00fcr jeden Chaincode k\u00f6nnen Politiken festgelegt werden, wie viele und von wem Best\u00e4tigungen f\u00fcr die Transaktion ben\u00f6tigt werden. Wenn keine Politik festgelegt ist, gilt standardm\u00e4\u00dfig: \u201eDie Transaktion muss von jedem Mitglied (Member) jeder Organisation im Channel best\u00e4tigt werden\u201c. Beispiele f\u00fcr Politiken:<\/p>\n<ul>\n<li>Die Transaktion muss von einem Administrator der Organisation best\u00e4tigt werden;<\/li>\n<li>Es muss von einem Mitglied (Member) oder einem Kunden der Organisation best\u00e4tigt werden;<\/li>\n<li>Es muss von einem Peer der Organisation best\u00e4tigt werden.<\/li>\n<\/ul>\n<p>\n<b>Bestellservice<\/b> \u2014 Verpackt Transaktionen in Bl\u00f6cke und sendet sie an die Peers im Channel. Garantiert die Zustellung von Nachrichten an alle Peers im Netzwerk. F\u00fcr industrielle Systeme wird <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">der Nachrichtenbroker Kafka<\/a><\/noindex>, f\u00fcr Entwicklung und Test <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: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Die Anwendung interagiert mit Hyperledger Fabric \u00fcber das Go-, Node.js- oder Java-SDK;<\/li>\n<li>Der Client erstellt die Transaktion tx und sendet sie an die best\u00e4tigenden Peers;<\/li>\n<li>Der Peer \u00fcberpr\u00fcft die Signatur des Clients, f\u00fchrt die Transaktion aus und sendet die Endorsement-Signatur zur\u00fcck an den Client. Chaincode wird nur auf dem endorsierenden Peer ausgef\u00fchrt, und das Ergebnis seiner Ausf\u00fchrung wird an alle Peers verteilt. Dieses Arbeitsalgorithmus wird als PBFT (Practical Byzantine Fault Tolerant) Konsens bezeichnet. Es unterscheidet sich von <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassischem BFT<\/a><\/noindex> dadurch, dass die Nachricht gesendet wird und eine Best\u00e4tigung nicht von allen Teilnehmern, sondern nur von einer bestimmten Gruppe erwartet wird;<\/li>\n<li>Nachdem der Client die Anzahl der Antworten erhalten hat, die der Endorsement-Policy entspricht, sendet er die Transaktion an den Ordering-Service;<\/li>\n<li>Der Ordering-Service bildet den Block und sendet ihn an alle commitierenden Peers. Der Ordering-Service gew\u00e4hrleistet eine konsistente Aufzeichnung von Bl\u00f6cken, wodurch das sogenannte Ledger-Fork ausgeschlossen wird (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">siehe Abschnitt \u201eForks\u201c<\/a><\/noindex>);<\/li>\n<li>Die Peers erhalten den Block, \u00fcberpr\u00fcfen erneut die Endorsement-Policy, schreiben den Block in die Blockchain und \u00e4ndern den Zustand in der \u201eWorld state\u201c DB.<\/li>\n<\/ul>\n<p>\nDas bedeutet, dass eine Rollentrennung zwischen den Knoten erfolgt. Dies gew\u00e4hrleistet die Skalierbarkeit und Sicherheit der Blockchain:<\/p>\n<ul>\n<li>Smart Contracts (Chaincode) werden von den endorsierenden Peers ausgef\u00fchrt. Dies gew\u00e4hrleistet die Vertraulichkeit der Smart Contracts, da sie nicht bei allen Teilnehmern, sondern nur bei den endorsierenden Peers gespeichert werden.<\/li>\n<li>Die Bestellung muss schnell funktionieren. Das wird erreicht, indem die Bestellung nur einen Block erstellt und ihn an eine feste Gruppe von Leader-Peers sendet.<\/li>\n<li>Die Commit-Peers speichern lediglich die Blockchain \u2014 es kann viele davon geben, und sie ben\u00f6tigen keine gro\u00dfe Leistung und sofortige Reaktionszeiten. <\/li>\n<\/ul>\n<p>\nWeitere architektonische L\u00f6sungen von Hyperledger Fabric und warum es so funktioniert, kann hier angesehen werden: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architektur Urspr\u00fcnge<\/a><\/noindex> oder hier: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: Ein verteiltes Betriebssystem f\u00fcr berechtigte Blockchains<\/a><\/noindex>.<\/p>\n<p>Also, Hyperledger Fabric ist wirklich ein vielseitiges System, mit dem man folgende Dinge tun kann:<\/p>\n<ul>\n<li>Willk\u00fcrliche Gesch\u00e4ftslogik umsetzen, indem man den Mechanismus der Smart Contracts verwendet;<\/li>\n<li>Daten in der Blockchain-Datenbank im JSON-Format aufzeichnen und abrufen;<\/li>\n<li>Zugriff auf APIs bereitstellen und \u00fcberpr\u00fcfen, indem man die Zertifizierungsstelle nutzt. <\/li>\n<\/ul>\n<p>\nJetzt, da wir ein wenig \u00fcber die Besonderheiten von Hyperledger Fabric Klarheit haben, lassen Sie uns endlich etwas N\u00fctzliches tun!<\/p>\n<h2>Blockchain bereitstellen<\/h2>\n<p><\/p>\n<h3>Problemstellung<\/h3>\n<p>\nDie Aufgabe besteht darin, ein Citcoin-Netzwerk mit folgenden Funktionen zu implementieren: ein Konto erstellen, den Kontostand abrufen, das Konto aufladen und M\u00fcnzen von einem Konto auf ein anderes \u00fcberweisen. Lassen Sie uns ein Objektmodell skizzieren, das wir sp\u00e4ter in einem Smart Contract umsetzen werden. Wir werden also Konten haben, die durch Namen (name) identifiziert werden und einen Kontostand (balance) enthalten, sowie eine Liste der Konten. Konten und die Liste der Konten sind in den Begriffen von Hyperledger Fabric Assets. Daher haben sie eine Historie und einen aktuellen Status. Ich werde versuchen, dies anschaulich darzustellen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie oberen Figuren zeigen den aktuellen Zustand, der im \u201eWorld State\u201c gespeichert ist. Darunter befinden sich die Figuren, die die Historie zeigen, die in der Blockchain gespeichert wird. Der aktuelle Zustand der Assets ver\u00e4ndert sich durch Transaktionen. Ein Asset wird nur vollst\u00e4ndig ge\u00e4ndert, weshalb bei der Ausf\u00fchrung einer Transaktion ein neues Objekt erstellt wird, w\u00e4hrend der aktuelle Wert des Assets in die Historie \u00fcbergeht. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nErstellen Sie ein Konto in der <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM Cloud<\/a><\/noindex>. Um die Blockchain-Plattform nutzen zu k\u00f6nnen, muss sie auf Pay-As-You-Go aktualisiert werden. Dieser Prozess kann zeitaufwendig sein, da IBM zus\u00e4tzliche Informationen anfordert und diese manuell \u00fcberpr\u00fcft. Positiv ist, dass IBM gute Schulungsmaterialien bietet, die helfen, Hyperledger Fabric in ihrer Cloud zu implementieren. Mir haben die folgende Artikelreihe und die Beispiele gefallen:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Erstellen Sie ein grundlegendes Blockchain-Netzwerk mit der Blockchain-Plattform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Erstellen und f\u00fchren Sie einen Blockchain-Smart-Contract aus<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Ereignisse von der Blockchain-Plattform ausgeben<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nIm Folgenden sind Screenshots der IBM Blockchain-Plattform zu sehen. Dies ist keine Anleitung zur Erstellung einer Blockchain, sondern lediglich eine Demonstration des Umfangs der Aufgabe. F\u00fcr unsere Zwecke erstellen wir eine Organisation:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn dieser Organisation erstellen wir die Nodes: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir legen Benutzer an:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir erstellen einen Channel und nennen ihn citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Grunde ist ein Channel eine Blockchain, daher beginnt er mit dem Genesis-Block:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Wir schreiben einen 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>\nHier sollte alles intuitiv verst\u00e4ndlich sein:<\/p>\n<ul>\n<li>Es gibt mehrere Funktionen (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), die das Demo-Programm \u00fcber die Hyperledger Fabric API aufruft.<\/li>\n<li>Die Funktionen SendFrom und RefillBalance erzeugen Ereignisse (Event), die das Demo-Programm empfangen wird.<\/li>\n<li>Die Funktion instantiate wird einmal aufgerufen, wenn der Smart Contract instanziiert wird. Tats\u00e4chlich wird sie jedoch nicht nur einmal aufgerufen, sondern jedes Mal, wenn die Version des Smart Contracts ge\u00e4ndert wird. Daher ist die Initialisierung der Liste mit einem leeren Array eine schlechte Idee, da wir bei einer Versions\u00e4nderung die aktuelle Liste verlieren w\u00fcrden. Aber egal, ich lerne ja gerade).<\/li>\n<li>Accounts und die Liste der Accounts sind JSON-Datenstrukturen. F\u00fcr die Manipulation der Daten wird JS verwendet.<\/li>\n<li>Der aktuelle Wert des Assets kann durch den Aufruf der Funktion getState abgerufen und mit putState aktualisiert werden.<\/li>\n<li>Bei der Erstellung des Accounts wird die Funktion AddAccount aufgerufen, die die maximale Anzahl der Accounts in der Blockchain (maxAccounts = 5) vergleicht. Hier gibt es einen Fehler (haben Sie es bemerkt?), der zu einem endlosen Wachstum der Anzahl der Accounts f\u00fchrt. Solche Fehler sollten vermieden werden).<\/li>\n<\/ul>\n<p>\nDann laden wir den Smart Contract in den Channel und instanziieren ihn:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir sehen die Transaktion zur Einrichtung des Smart Contracts:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir sehen Einzelheiten zu unserem Channel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Ergebnis ist das folgende Schema des Blockchain-Netzwerks in der IBM Cloud. Auch in dem Diagramm ist ein Demo-Programm zu sehen, das in der Amazon Cloud auf einem virtuellen Server l\u00e4uft (n\u00e4here Informationen dazu finden Sie im n\u00e4chsten Abschnitt):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Erstellung einer GUI f\u00fcr Aufrufe der Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric bietet eine API, die f\u00fcr folgende Zwecke genutzt werden kann:<\/p>\n<ul>\n<li>Erstellung von Channels;<\/li>\n<li>Anschluss eines Peers an einen Channel;<\/li>\n<li>Installation und Instanziierung von Smart Contracts im Channel;<\/li>\n<li>Aufruf von Transaktionen;<\/li>\n<li>Abfrage von Informationen in der Blockchain.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Anwendungsentwicklung<\/h3>\n<p>\nIn unserem Demo-Programm werden wir die API nur f\u00fcr den Aufruf von Transaktionen und die Abfrage von Informationen verwenden, da wir die anderen Schritte bereits unter Verwendung der IBM Blockchain-Plattform durchgef\u00fchrt haben. Wir schreiben die GUI unter Verwendung des Standardtechnologiestacks: Express.js + Vue.js + Node.js. Ein separater Artikel k\u00f6nnte sich mit der Erstellung moderner Webanwendungen befassen. Hier lasse ich einen Link zu einer Vorlesungsreihe, die mir am besten gefallen hat: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Daraus entstand eine Client-Server-Anwendung mit einer vertrauten grafischen Benutzeroberfl\u00e4che im Material Design-Stil von Google. Die REST API zwischen Client und Server besteht aus mehreren Aufrufen:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 Blockchain initialisieren;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 eine Liste aller Accounts abrufen;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 einen Account f\u00fcr Bob erstellen;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 Informationen \u00fcber den Account von Bob abrufen;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 zwei M\u00fcnzen von Bob an Alice \u00fcberweisen;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 die Verbindung zur Blockchain schlie\u00dfen.<\/li>\n<\/ul>\n<p>\nDie API-Beschreibung mit Beispielen habe ich auf<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> der Website \u201ePostman\u201c<\/a><\/noindex> \u2014 einem weithin bekannten Programm zum Testen von HTTP-APIs, bereitgestellt.<\/p>\n<h3>Die Demo-Anwendung l\u00e4uft in der Cloud von Amazon.<\/h3>\n<p>\nIch habe die Anwendung auf Amazon hochgeladen, da IBM es bis jetzt nicht geschafft hat, mein Konto zu aktualisieren und mir die Erstellung virtueller Server zu erm\u00f6glichen. Als Sahneh\u00e4ubchen habe ich die Domain hinzugef\u00fcgt: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Ich werde den Server etwas l\u00e4nger laufen lassen, danach abschalten, da die Mietkosten anfallen und die Citcoin-M\u00fcnzen an der B\u00f6rse noch nicht gehandelt werden.) In den Artikel f\u00fcge ich Screenshots der Demo ein, um die Funktionsweise zu verdeutlichen. Die Demo-Anwendung kann:<\/p>\n<ul>\n<li>die Blockchain initialisieren;<\/li>\n<li>Accounts erstellen (aber aktuell kann kein neuer Account erstellt werden, da in der Blockchain die maximale Anzahl der Accounts, die im Smart Contract definiert ist, erreicht wurde);<\/li>\n<li>eine Liste von Accounts abrufen;<\/li>\n<li>Citcoin-M\u00fcnzen zwischen Alice, Bob und Alex \u00fcberweisen;<\/li>\n<li>Ereignisse empfangen (aber aktuell k\u00f6nnen keine Ereignisse angezeigt werden, daher steht zur Vereinfachung im Interface, dass Ereignisse nicht unterst\u00fctzt werden);<\/li>\n<li>Aktionen protokollieren.<\/li>\n<\/ul>\n<p>\nZuerst initialisieren wir die Blockchain:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDanach erstellen wir unser Konto und lassen uns mit dem Guthaben nicht lumpen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir erhalten eine Liste aller verf\u00fcgbaren Konten:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir w\u00e4hlen den Absender und den Empf\u00e4nger aus und pr\u00fcfen deren Guthaben. Wenn Absender und Empf\u00e4nger identisch sind, wird dessen Konto aufgeladen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Protokoll verfolgen wir die Ausf\u00fchrung von Transaktionen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas w\u00e4re alles zur Demoversion. Als N\u00e4chstes k\u00f6nnen wir unsere Transaktion in der Blockchain betrachten:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnd die Gesamtliste der Transaktionen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was brauchen wir, um ein PoC zu erstellen?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDamit haben wir die Umsetzung des PoC zur Schaffung des Citcoin-Netzwerks erfolgreich abgeschlossen. Was muss noch getan werden, damit Citcoin ein vollwertiges Netzwerk f\u00fcr den M\u00fcnztransfer wird? Nur wenig:<\/p>\n<ul>\n<li>Bei der Erstellung des Kontos sollte die Generierung des privaten \/ \u00f6ffentlichen Schl\u00fcssels implementiert werden. Der private Schl\u00fcssel sollte beim Benutzer des Kontos aufbewahrt werden, der \u00f6ffentliche Schl\u00fcssel in der Blockchain.<\/li>\n<li>Durchf\u00fchrung von Geldtransfers, bei denen zur Identifizierung des Benutzers nicht der Name, sondern der \u00f6ffentliche Schl\u00fcssel verwendet wird.<\/li>\n<li>Transaktionen, die vom Benutzer an den Server gesendet werden, mit seinem privaten Schl\u00fcssel verschl\u00fcsseln.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Fazit <\/h2>\n<p>\nWir haben das Citcoin-Netzwerk mit Funktionen realisiert: Konto hinzuf\u00fcgen, Guthaben abrufen, Ihr Konto aufladen, M\u00fcnzen von einem Konto auf ein anderes \u00fcbertragen. Was hat uns also der Aufbau des PoC gekostet?<\/p>\n<ul>\n<li>Es ist notwendig, die Blockchain im Allgemeinen und Hyperledger Fabric im Besonderen zu studieren;<\/li>\n<li>Lerne, die Cloud-Dienste von IBM oder Amazon zu nutzen;<\/li>\n<li>Lerne die Programmiersprache JS und ein beliebiges Web-Framework;<\/li>\n<li>Wenn einige Daten nicht in der Blockchain, sondern in einer separaten Datenbank gespeichert werden m\u00fcssen, lerne, dich beispielsweise mit PostgreSQL zu integrieren;<\/li>\n<li>Und last but not least \u2013 ohne Kenntnisse in Linux kommt man in der modernen Welt nicht weit!)<\/li>\n<\/ul>\n<p>\nNat\u00fcrlich ist es nicht die Raketenwissenschaft, aber es wird ein gewisses Ma\u00df an Anstrengung erforden!<\/p>\n<h3>Quellcodes auf GitHub<\/h3>\n<p>\nDie Quellcodes habe ich auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Kurze Beschreibung des Repositories:<br \/>\nKatalog &#171;<b>server<\/b>&#187; \u2014 Node.js Server<br \/>\nKatalog &#171;<b>client<\/b>&#187; \u2014 Node.js Client<br \/>\nKatalog &#171;<b>Blockchain<\/b>&#187; (Parameterwerte und Schl\u00fcssel, selbstverst\u00e4ndlich, sind nicht funktionsf\u00e4hig und dienen nur als Beispiel):<\/p>\n<ul>\n<li>contract \u2013 Quellcode des Smart Contracts<\/li>\n<li>wallet \u2013 Benutzerschl\u00fcssel zur Nutzung der Hyperledger Fabric API. <\/li>\n<li>*.cds \u2013 kompilierte Versionen von Smart Contracts<\/li>\n<li>*.json-Dateien \u2013 Beispiele f\u00fcr Konfigurationsdateien zur Nutzung der Hyperledger Fabric API.<\/li>\n<\/ul>\n<p>\n<b>Es ist nur der Anfang!<\/b><br \/>\n<br \/>Quelle: <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 4.9.10 - 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 \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\" \/>\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\/de\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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: Was kostet es, einen PoC zu erstellen? | ProHoster","description":"Die Augen scheuen, die H\u00e4nde jucken! In fr\u00fcheren Artikeln haben wir uns mit den Technologien besch\u00e4ftigt, auf denen Blockchains basieren (Was kostet es, eine Blockchain aufzubauen?) und mit den Anwendungsf\u00e4llen, die man damit umsetzen kann (Was kostet es, einen Anwendungsfall zu erstellen?). Jetzt ist es an der Zeit, selbst aktiv zu werden! F\u00fcr die Durchf\u00fchrung von Piloten und PoCs (Proof of Concept) ziehe ich Cloud-L\u00f6sungen vor, da sie leicht zug\u00e4nglich sind.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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 \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","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}