{"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 kostet es uns, PoC aufzubauen?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Die Augen f\u00fcrchten sich, aber die H\u00e4nde jucken!<\/i><\/p>\n<p>In den fr\u00fcheren 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 hindert uns daran, Blockchain zu bauen?<\/a><\/noindex>) und den Anwendungsf\u00e4llen, die wir damit umsetzen k\u00f6nnen (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Was kostet uns der Aufbau eines Anwendungsfalls?<\/a><\/noindex>). Es ist an der Zeit, selbst aktiv zu werden! F\u00fcr die Umsetzung von Prototypen und PoC (Proof of Concept) bevorzuge ich es, Cloud-Dienste zu nutzen, da man von \u00fcberall auf der Welt darauf zugreifen kann und man oft keine Zeit mit der m\u00fchsamen Installation der Umgebung verschwenden muss, da es vorkonfigurierte Setups gibt. Lassen Sie uns etwas Einfaches machen, zum Beispiel ein Netzwerk zur \u00dcbertragung von M\u00fcnzen zwischen den Teilnehmern und nennen wir es bescheiden Citcoin. Daf\u00fcr verwenden wir die IBM-Cloud und die universelle Blockchain Hyperledger Fabric. Zuerst kl\u00e4ren wir, warum Hyperledger Fabric als universelle Blockchain bezeichnet wird.<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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>Eine Gruppe 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\/Menschen;<\/li>\n<li>Eine Datenbank, die operative und archivierte Daten speichert:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie offizielle Version von Hyperledger Fabric kann man nachlesen auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">Website<\/a><\/noindex>, kurz gesagt, Hyperledger Fabric ist eine Open-Source-Plattform, die es erm\u00f6glicht, private Blockchains zu erstellen und beliebige Smart Contracts auszuf\u00fchren, die in den Programmiersprachen JS und Go geschrieben sind. Lassen Sie uns detailliert auf die Architektur von Hyperledger Fabric schauen und sicherstellen, dass es sich um ein universelles System handelt, das nur spezifische Anforderungen an Speicherung und Aufzeichnung von Daten hat. Die Spezifikationen besagen, dass die Daten, wie in allen Blockchains, in Bl\u00f6cken gespeichert werden, die nur dann in die Blockchain aufgenommen werden, wenn die Teilnehmer einen Konsens erreicht haben, und nach der Aufzeichnung k\u00f6nnen die Daten nicht unbemerkt ver\u00e4ndert oder gel\u00f6scht werden.<\/p>\n<h2>Die Architektur von Hyperledger Fabric<\/h2>\n<p>\nDas Diagramm zeigt die Architektur von Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisationen <\/b> \u2014 Organisationen enthalten Peers, wodurch die Blockchain durch die Unterst\u00fctzung der Organisationen existiert. Verschiedene Organisationen k\u00f6nnen Teil eines Channels sein.<\/p>\n<p><b>Channel <\/b> \u2014 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 ein CA (Zertifizierungsstelle) zur Ausstellung von Identit\u00e4ten und zur Zuweisung von Rollen. Um einen Node zu erstellen, muss man mit dem MSP interagieren.<\/p>\n<p><b>Peer-Nodes<\/b> \u2014 sie \u00fcberpr\u00fcfen Transaktionen, speichern die Blockchain, f\u00fchren Smart Contracts aus und interagieren mit Anwendungen. Peers haben eine Identit\u00e4t (digitales Zertifikat), das von MSP ausgestellt wird. Im Gegensatz zum Bitcoin- oder Ethereum-Netzwerk, in dem alle Knoten gleichberechtigt sind, haben die Knoten in Hyperledger Fabric unterschiedliche Rollen:<\/p>\n<ul>\n<li>Peer kann sein <b>endorsender Peer<\/b> (EP) und f\u00fchren Smart Contracts aus.<\/li>\n<li><b>Committer Peer<\/b> (CP) \u2014 speichert nur Daten in der Blockchain und aktualisiert den \"Weltzustand\".<\/li>\n<li><b>Anker-Peer<\/b> (AP) \u2014 wenn mehrere Organisationen an der Blockchain teilnehmen, werden Anker-Peer zur Verbindung zwischen ihnen verwendet. Jede Organisation muss einen oder mehrere Anker-Peer haben. Mithilfe von AP kann jeder Peer in der Organisation Informationen \u00fcber alle Peers in anderen Organisationen abrufen. F\u00fcr die Synchronisierung der Informationen zwischen AP wird <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 Leader-Peer Bl\u00f6cke vom Ordering-Service erhalten und sie an die anderen Peers weitergeben. Der Leader kann statisch festgelegt oder dynamisch von den Peers in der Organisation ausgew\u00e4hlt werden. Auch f\u00fcr die Synchronisierung der Informationen \u00fcber die Leader wird das Gossip-Protokoll verwendet.<\/li>\n<\/ul>\n<p>\n<b>Assets <\/b> \u2014 Werte, die in der Blockchain gespeichert sind. Genauer gesagt sind dies Key-Value-Daten im JSON-Format. Diese Daten werden in die Blockchain \"Blockchain\" geschrieben. Sie haben eine Historie, die in der Blockchain gespeichert ist, und einen aktuellen Zustand, der in der Datenbank \"Weltzustand\" gespeichert ist. Die Datenstrukturen werden je nach Gesch\u00e4ftsanforderungen zuf\u00e4llig gef\u00fcllt. Es gibt keine obligatorischen Felder, die einzige Empfehlung ist, dass Assets einen Besitzer haben und einen Wert darstellen. <\/p>\n<p><b>Ledger <\/b> \u2014 besteht aus der Blockchain \"Blockchain\" und der Datenbank \"Weltzustand\", in der der aktuelle Zustand der Assets gespeichert ist. Der Weltzustand 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 Chaincode genannt. Mit Chaincode werden Assets und Transaktionen dar\u00fcber definiert. Technisch gesprochen sind Smart Contracts Programmiermodule, die in den Programmiersprachen JS oder Go implementiert sind.<\/p>\n<p><b>Endorsement-Politik<\/b> \u2014 f\u00fcr jeden Chaincode k\u00f6nnen Richtlinien festgelegt werden, wie viele und von wem Best\u00e4tigungen f\u00fcr die Transaktion erwartet werden m\u00fcssen. Wenn keine Politik festgelegt ist, wird standardm\u00e4\u00dfig verwendet: 'Die Transaktion muss von einem Mitglied (Member) jeder Organisation im Channel best\u00e4tigt werden.' Beispiele f\u00fcr Politiken:<\/p>\n<ul>\n<li>Die Transaktion muss von einem beliebigen Administrator der Organisation best\u00e4tigt werden;<\/li>\n<li>Jedes Mitglied oder jeder Kunde der Organisation muss best\u00e4tigen;<\/li>\n<li>Jeder Peer der Organisation muss best\u00e4tigen.<\/li>\n<\/ul>\n<p>\n<b>Bestelldienst<\/b> \u2013 verpackt Transaktionen in Bl\u00f6cke und sendet sie an die Peers im Kanal. 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\">Kafka Nachrichtenbroker<\/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 kostet es uns, PoC aufzubauen?\" 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, indem sie das Go-, Node.js- oder Java-SDK verwendet;<\/li>\n<li>Der Client erstellt die Transaktion tx und sendet sie an die Endorsing-Peers;<\/li>\n<li>Der Peer \u00fcberpr\u00fcft die Signatur des Clients, f\u00fchrt die Transaktion aus und sendet die Best\u00e4tigungssignatur zur\u00fcck an den Client. Chaincode wird nur auf Endorsing-Peers ausgef\u00fchrt, und das Ergebnis wird an alle Peers verteilt. Ein solches Verfahren 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 verteilt wird und die 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 Best\u00e4tigungsrichtlinie entspricht, sendet er die Transaktion an den Bestelldienst;<\/li>\n<li>Der Bestelldienst erstellt den Block und sendet ihn an alle Commit-Peers. Der Bestelldienst sorgt f\u00fcr die sequentielle Aufzeichnung der Bl\u00f6cke, was einen sogenannten Ledger-Fork ausschlie\u00dft (<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 Best\u00e4tigungsrichtlinie, speichern den Block in der Blockchain und \u00e4ndern den Status in der \u201eWeltzustands\u201c-Datenbank.<\/li>\n<\/ul>\n<p>\nDas hei\u00dft, es erfolgt eine Rollenverteilung zwischen den Knoten. Dies sorgt f\u00fcr Skalierbarkeit und Sicherheit der Blockchain:<\/p>\n<ul>\n<li>Smart Contracts (Chaincode) werden von den Endorsing-Peers ausgef\u00fchrt. Dies gew\u00e4hrleistet die Vertraulichkeit der Smart Contracts, da sie nicht bei allen Teilnehmern gespeichert werden, sondern nur bei den Endorsing-Peers.<\/li>\n<li>Die Bestellung muss schnell arbeiten. Dies wird dadurch sichergestellt, dass die Bestellung nur den Block erstellt und ihn an eine feste Anzahl von Leader-Peers sendet.<\/li>\n<li>Commit-Peers speichern nur die Blockchain \u2013 es k\u00f6nnen viele davon vorhanden sein und sie erfordern keine gro\u00dfe Leistung oder sofortige Verarbeitung. <\/li>\n<\/ul>\n<p>\nWeitere Informationen zu den architektonischen Entscheidungen von Hyperledger Fabric und warum es so funktioniert, wie es funktioniert, finden Sie hier: <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 genehmigte Blockchains<\/a><\/noindex>.<\/p>\n<p>Also ist Hyperledger Fabric tats\u00e4chlich ein universelles System, mit dem man:<\/p>\n<ul>\n<li>beliebige Gesch\u00e4ftslogik mit Hilfe des Smart Contract-Mechanismus umsetzen kann;<\/li>\n<li>Daten in einem Blockchain-Datenbankformat JSON aufzeichnen und abrufen;<\/li>\n<li>Zugriff auf die API bereitstellen und \u00fcberpr\u00fcfen unter Verwendung einer Zertifizierungsstelle. <\/li>\n<\/ul>\n<p>\nJetzt, da wir ein wenig \u00fcber die Besonderheiten von Hyperledger Fabric verstanden haben, lasst uns endlich etwas N\u00fctzliches tun!<\/p>\n<h2>Blockchain bereitstellen<\/h2>\n<p><\/p>\n<h3>Aufgabenstellung<\/h3>\n<p>\nDie Aufgabe besteht darin, ein Citcoin-Netzwerk mit folgenden Funktionen zu implementieren: ein Konto erstellen, den Kontostand abrufen, das Konto aufladen, M\u00fcnzen von einem Konto auf ein anderes \u00fcbertragen. Wir werden ein objektdiagramm zeichnen, das wir sp\u00e4ter in einem Smart Contract umsetzen. Also, wir werden Konten haben, die durch Namen (name) identifiziert werden und einen Kontostand (balance) sowie eine Liste von Konten enthalten. Konten und die Liste der Konten sind in den Begriffen von Hyperledger Fabric Assets. Dementsprechend haben sie eine Historie und einen aktuellen Zustand. Ich werde versuchen, dies anschaulich darzustellen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie oberen Figuren sind der aktuelle Zustand, der in der 'World state'-Datenbank gespeichert ist. Darunter sind die Figuren, die die Historie zeigen, die in der Blockchain gespeichert ist. Der aktuelle Zustand der Assets wird durch Transaktionen ge\u00e4ndert. Ein Asset \u00e4ndert sich nur ganz, weshalb als Ergebnis der Ausf\u00fchrung einer Transaktion ein neues Objekt erstellt wird und der aktuelle Wert des Assets in die Historie \u00fcbergeht. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nEin Konto in <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">der IBM Cloud<\/a><\/noindex>. Um die Blockchain-Plattform nutzen zu k\u00f6nnen, muss sie auf Pay-As-You-Go aktualisiert werden. Dieser Prozess kann nicht schnell sein, da IBM zus\u00e4tzliche Informationen anfordert und diese manuell \u00fcberpr\u00fcft. Aus dem Positive kann ich sagen, dass IBM gute Schulungsmaterialien hat, die es erm\u00f6glichen, Hyperledger Fabric in ihrer Cloud einzurichten. Mir hat der folgende Artikelzyklus 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 einfaches 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 Ausf\u00fchren eines Blockchain-Smart Contracts<\/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 aufgef\u00fchrt. Dies ist keine Anleitung zur Erstellung einer Blockchain, sondern einfach eine Demonstration des Umfangs der Aufgabe. F\u00fcr unsere Zwecke erstellen wir eine Organisation:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDarin erstellen wir Knoten: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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 kostet es uns, PoC aufzubauen?\" 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 kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Grunde genommen ist ein Channel eine Blockchain, weshalb er mit einem nullten Block (Genesis block) beginnt:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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 aufrufen wird.<\/li>\n<li>Die Funktionen SendFrom und RefillBalance generieren Ereignisse (Event), die das Demo-Programm erhalten wird.<\/li>\n<li>Die Funktion instantiate wird einmal beim Instanziieren des Smart Contracts aufgerufen. Tats\u00e4chlich wird sie 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 der Versions\u00e4nderung des Smart Contracts die aktuelle Liste verlieren w\u00fcrden. Aber macht nichts, ich lerne ja nur).<\/li>\n<li>Accounts und die Liste der Accounts (accounts) sind JSON-Datenstrukturen. F\u00fcr die Manipulation der Daten wird JS verwendet.<\/li>\n<li>Den aktuellen Wert des Assets kann man mit dem Aufruf der Funktion getState abrufen und mit putState aktualisieren.<\/li>\n<li>Beim Erstellen eines Accounts wird die Funktion AddAccount aufgerufen, in der mit der maximalen Anzahl der Accounts in der Blockchain (maxAccounts = 5) verglichen wird. Und hier gibt es einen Fehler (habt ihr ihn bemerkt?), der zu einem unbegrenzten Wachstum der Anzahl der Accounts f\u00fchrt. Solche Fehler sollten vermieden werden).<\/li>\n<\/ul>\n<p>\nLaden Sie dann den Smart Contract in den Channel und instanziieren Sie ihn:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dcberpr\u00fcfen Sie die Transaktion zur Einrichtung des Smart Contracts:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSehen Sie sich die Details zu unserem Channel an:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInfolgedessen erhalten wir das folgende Schema des Blockchain-Netzwerks in der IBM-Cloud. Auf dem Schema ist auch ein Demo-Programm zu sehen, das in der Amazon-Cloud auf einem virtuellen Server l\u00e4uft (detaillierte Informationen dazu gibt es im n\u00e4chsten Abschnitt):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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 des Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric verf\u00fcgt \u00fcber eine API, die f\u00fcr Folgendes verwendet werden kann:<\/p>\n<ul>\n<li>Erstellung eines Channels;<\/li>\n<li>Verbindung eines Peers mit einem Channel;<\/li>\n<li>Installation und Instanziierung von Smart Contracts im Channel;<\/li>\n<li>Aufruf von Transaktionen;<\/li>\n<li>Anforderung 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 Anforderung von Informationen verwenden, da wir die anderen Schritte bereits durchgef\u00fchrt haben, indem wir die IBM-Blockchain-Plattform genutzt haben. Wir schreiben die GUI unter Verwendung des Standard-Technologiestacks: Express.js + Vue.js + Node.js. Wie man moderne Webanwendungen erstellt, k\u00f6nnte man einen separaten Artikel schreiben. 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>. Infolgedessen entstand eine Client-Server-Anwendung mit einer vertrauten grafischen Benutzeroberfl\u00e4che im Stil des Material Designs 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 Liste aller Accounts abrufen;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 Bob Account erstellen;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 Informationen zum Bob Account 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 \u2013 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 \"Postman\"<\/a><\/noindex> \u2013 einem weit verbreiteten Programm zum Testen von HTTP-APIs.<\/p>\n<h3>Demo-Anwendung in der Cloud von Amazon<\/h3>\n<p>\nIch habe die Anwendung auf Amazon hochgeladen, da IBM immer noch nicht in der Lage war, mein Konto zu aktualisieren und mir zu erlauben, virtuelle Server zu erstellen. 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 ein wenig laufen lassen, dann aber abschalten, da die Kosten f\u00fcr die Miete anfallen und die Citcoin-M\u00fcnzen an der B\u00f6rse noch nicht gehandelt werden) Ich f\u00fcge Screenshots der Demo hinzu, um die Logik der Funktionsweise zu verdeutlichen. Die Demo-Anwendung kann:<\/p>\n<ul>\n<li>Die Blockchain initialisieren;<\/li>\n<li>Ein Konto erstellen (aber zurzeit kann kein neues Konto erstellt werden, da in der Blockchain die maximal Anzahl an Konten, die im Smart Contract festgelegt ist, erreicht wurde);<\/li>\n<li>Eine Liste der Konten abrufen;<\/li>\n<li>Citcoin-M\u00fcnzen zwischen Alice, Bob und Alex transferieren;<\/li>\n<li>Ereignisse abrufen (aber derzeit k\u00f6nnen Ereignisse nicht angezeigt werden, deshalb steht im Interface vereinfacht, 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 kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDann legen wir unser Konto an und sparen nicht am Guthaben:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir holen die Liste aller verf\u00fcgbaren Konten:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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 erhalten deren Guthaben. Wenn Absender und Empf\u00e4nger dieselbe Person sind, wird das Konto aufgeladen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Log \u00fcberwachen wir die Ausf\u00fchrung der Transaktionen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMit der Demo-Anwendung sind wir damit am Ende. Weiterhin k\u00f6nnen wir unsere Transaktion in der Blockchain betrachten:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Was kostet es uns, PoC aufzubauen?\" 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 kostet es uns, PoC aufzubauen?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDamit haben wir erfolgreich die Implementierung des PoC zur Schaffung des Citcoin-Netzes abgeschlossen. Was m\u00fcssen wir noch tun, damit Citcoin ein vollwertiges Netzwerk f\u00fcr die \u00dcbertragung von M\u00fcnzen wird? Nicht viel:<\/p>\n<ul>\n<li>Bei der Erstellung des Kontos die Generierung des privaten \/ \u00f6ffentlichen Schl\u00fcssels umsetzen. Der private Schl\u00fcssel soll beim Benutzer des Kontos aufbewahrt werden, der \u00f6ffentliche in der Blockchain.<\/li>\n<li>Die \u00dcbertragung von M\u00fcnzen so gestalten, dass 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 implementiert: Konto hinzuf\u00fcgen, Guthaben abrufen, das eigene Konto aufladen, M\u00fcnzen von einem Konto auf ein anderes \u00fcbertragen. Was hat uns also der PoC gekostet, um es aufzubauen?<\/p>\n<ul>\n<li>Wir mussten die Blockchain allgemein und Hyperledger Fabric im Besonderen studieren;<\/li>\n<li>Wir mussten lernen, die Cloud-Dienste von IBM oder Amazon zu nutzen;<\/li>\n<li>Wir mussten die Programmiersprache JS und ein Web-Framework lernen;<\/li>\n<li>Wenn bestimmte Daten nicht in der Blockchain, sondern in einer separaten Datenbank gespeichert werden m\u00fcssen, lernen Sie, sich beispielsweise mit PostgreSQL zu integrieren;<\/li>\n<li>Und das Letzte auf der Liste, aber nicht weniger wichtig \u2013 ohne Linux-Kenntnisse kommt man in der modernen Welt nicht weit!)<\/li>\n<\/ul>\n<p>\nNat\u00fcrlich ist es keine Raketenwissenschaft, aber Sie m\u00fcssen sich anstrengen!<\/p>\n<h3>Quellcodes auf GitHub<\/h3>\n<p>\nIch habe die Quellcodes 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; (Werte der Parameter und Schl\u00fcssel sind nat\u00fcrlich nicht funktional und dienen nur als Beispiel):<\/p>\n<ul>\n<li>contract \u2013 Quellcode des Smart Contracts<\/li>\n<li>wallet \u2013 Benutzerschl\u00fcssel zur Verwendung der Hyperledger Fabric API. <\/li>\n<li>*.cds \u2013 kompilierte Versionen von Smart Contracts<\/li>\n<li>*.json-Dateien \u2013 Beispielkonfigurationsdateien f\u00fcr die Verwendung der Hyperledger Fabric API<\/li>\n<\/ul>\n<p>\n<b>Es ist erst 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 5.0.1.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\/de\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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.\" \/>\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 uns, ein PoC zu erstellen? | ProHoster","description":"Die Augen haben Angst, aber die H\u00e4nde kribbeln! In den letzten Artikeln haben wir die Technologien untersucht, auf denen Blockchains basieren (Was kostet uns die Blockchain.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}