{"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\/sv\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: vad kostar det att bygga en PoC?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>\u00d6gonen skr\u00e4ms, men h\u00e4nderna kliar!<\/i><\/p>\n<p>I tidigare artiklar har vi g\u00e5tt igenom de teknologier som blockchain bygger p\u00e5 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Vad kostar det att bygga en blockchain?<\/a><\/noindex>) och de fallstudier som kan realiseras med deras hj\u00e4lp (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Vad kostar det att bygga en fallstudie?<\/a><\/noindex>). Det \u00e4r dags att arbeta praktiskt! F\u00f6r att genomf\u00f6ra piloter och PoC (Proof of Concept) f\u00f6redrar jag att anv\u00e4nda moln, eftersom de \u00e4r tillg\u00e4ngliga fr\u00e5n vilken plats som helst i v\u00e4rlden och ofta sparar tid p\u00e5 att installera milj\u00f6er, eftersom det finns f\u00f6rkonfigurerade inst\u00e4llningar. S\u00e5 l\u00e5t oss g\u00f6ra n\u00e5got enkelt, till exempel ett n\u00e4tverk f\u00f6r att \u00f6verf\u00f6ra mynt mellan deltagare och kalla det blygsamt Citcoin. F\u00f6r detta kommer vi att anv\u00e4nda IBM:s moln och den universella blockchainen Hyperledger Fabric. L\u00e5t oss f\u00f6rst ta reda p\u00e5 varf\u00f6r Hyperledger Fabric kallas en universell blockchain?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en 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 en universell blockchain<\/h2>\n<p>\nOm man talar i allm\u00e4nna termer, s\u00e5 \u00e4r ett universellt informationssystem:<\/p>\n<ul>\n<li>En upps\u00e4ttning servrar och en programk\u00e4rna som utf\u00f6r aff\u00e4rslogik;<\/li>\n<li>Gr\u00e4nssnitt f\u00f6r interaktion med systemet;<\/li>\n<li>Verktyg f\u00f6r registrering, autentisering och auktorisering av enheter \/ personer;<\/li>\n<li>En databas som lagrar operativa och arkiverade data:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen officiella versionen av vad Hyperledger Fabric \u00e4r kan l\u00e4sas p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">webbplats<\/a><\/noindex>, och kort sagt, Hyperledger Fabric \u00e4r en \u00f6ppen plattform som m\u00f6jligg\u00f6r byggandet av privata blockchain och utf\u00f6rande av godtyckliga smarta kontrakt skrivna p\u00e5 programmeringsspr\u00e5ken JS och Go. L\u00e5t oss titta n\u00e4rmare p\u00e5 arkitekturen i Hyperledger Fabric och f\u00f6rs\u00e4kra oss om att det \u00e4r ett universellt system d\u00e4r det bara finns specifika krav f\u00f6r lagring och registrering av data. Specifika krav inneb\u00e4r att data, precis som i alla blockchains, lagras i block som l\u00e4ggs till blockchainen endast om deltagarna n\u00e5r konsensus och efter registrering kan data inte \u00e4ndras eller tas bort obem\u00e4rkt.<\/p>\n<h2>Arkitektur av Hyperledger Fabric<\/h2>\n<p>\nI diagrammet visas arkitekturen f\u00f6r Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisationer <\/b> \u2014 organisationerna inneh\u00e5ller peers, vilket g\u00f6r att blockchainen existerar tack vare st\u00f6det fr\u00e5n organisationerna. Olika organisationer kan ing\u00e5 i en och samma channel.<\/p>\n<p><b>Channel <\/b> \u2014 en logisk struktur som f\u00f6renar peers i grupper, vilket definierar blockchainen. Hyperledger Fabric kan samtidigt hantera flera blockchains med olika aff\u00e4rslogik.<\/p>\n<p><b>Membership Services Provider (MSP)<\/b> \u2014 detta \u00e4r CA (Certificate Authority) f\u00f6r att utf\u00e4rda identiteter och tilldela roller. F\u00f6r att skapa en nod m\u00e5ste man interagera med MSP.<\/p>\n<p><b>Peer-noder<\/b> \u2014 kontrollerar transaktioner, lagrar blockkedjan, utf\u00f6r smarta kontrakt och interagerar med applikationer. Peer-noder har en identitet (digitalt certifikat) som utf\u00e4rdas av MSP. Till skillnad fr\u00e5n Bitcoin- eller Ethereum-n\u00e4tverk, d\u00e4r alla noder \u00e4r lika, spelar noder i Hyperledger Fabric olika roller:<\/p>\n<ul>\n<li>Peer kan vara <b>endorsing peer<\/b> (EP) och utf\u00f6ra smarta kontrakt.<\/li>\n<li><b>Committing peer<\/b> (CP) \u2014 sparar endast data i blockkedjan och uppdaterar \"World state\".<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 om flera organisationer deltar i blockkedjan, anv\u00e4nds anchor peers f\u00f6r att koppla samman dem. Varje organisation m\u00e5ste ha en eller flera anchor peers. Med hj\u00e4lp av AP kan varje peer i en organisation f\u00e5 information om alla peers i andra organisationer. F\u00f6r att synkronisera information mellan AP anv\u00e4nds <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip-protokollet<\/a><\/noindex>.<\/li>\n<li><b>Leader Peer<\/b> \u2014 om en organisation har flera peers, kommer endast ledande peer att ta emot block fr\u00e5n Ordering service och vidarebefordra dem till de andra peers. Ledaren kan antingen st\u00e4llas in statiskt eller v\u00e4ljas dynamiskt av peers inom organisationen. F\u00f6r att synkronisera information om ledarna anv\u00e4nds \u00e4ven gossip-protokollet.<\/li>\n<\/ul>\n<p>\n<b>Tillg\u00e5ngar <\/b> \u2014 enheter som har v\u00e4rde och som lagras i blockkedjan. Mer specifikt \u00e4r detta key-value data i JSON-format. Det \u00e4r dessa data som registreras i blockkedjan \"Blockchain\". De har en historia som lagras i blockkedjan och ett aktuellt tillst\u00e5nd som lagras i databasen \"World state\". Datastrukturer fylls j\u00e4mnt beroende p\u00e5 aff\u00e4rsbehov. Det finns inga obligatoriska f\u00e4lt, den enda rekommendationen \u00e4r att tillg\u00e5ngarna b\u00f6r ha en \u00e4gare och representera ett v\u00e4rde. <\/p>\n<p><b>Huvudbok <\/b> \u2014 best\u00e5r av blockkedjan \"Blockchain\" och databasen \"World state\", d\u00e4r det aktuella tillst\u00e5ndet f\u00f6r tillg\u00e5ngarna lagras. World state anv\u00e4nder LevelDB eller CouchDB.<\/p>\n<p><b>Smart kontrakt<\/b> \u2014 genom smarta kontrakt implementeras systemets aff\u00e4rslogik. I Hyperledger Fabric kallas smarta kontrakt f\u00f6r chaincode. Med hj\u00e4lp av chaincode definieras tillg\u00e5ngar och transaktioner p\u00e5 dem. Om man talar tekniskt \u00e4r smarta kontrakt programmoduler som implementeras i programmeringsspr\u00e5ken JS eller Go.<\/p>\n<p><b>Endorsement policy<\/b> \u2014 f\u00f6r varje chaincode kan man st\u00e4lla in policys f\u00f6r hur m\u00e5nga och fr\u00e5n vem bekr\u00e4ftelser m\u00e5ste f\u00f6rv\u00e4ntas f\u00f6r en transaktion. Om policyn inte \u00e4r angiven anv\u00e4nds som standard: \u201ctransaktionen m\u00e5ste bekr\u00e4ftas av varje medlem (member) i n\u00e5gon organisation i channel\u201d. Exempel p\u00e5 policys:<\/p>\n<ul>\n<li>Transaktionen m\u00e5ste bekr\u00e4ftas av en administrat\u00f6r i organisationen;<\/li>\n<li>M\u00e5ste bekr\u00e4ftas av en medlem eller kund i organisationen;<\/li>\n<li>M\u00e5ste bekr\u00e4ftas av en peer i organisationen.<\/li>\n<\/ul>\n<p>\n<b>Ordering service<\/b> \u2014 paketerar transaktioner i block och skickar dem till peers i channel. Den garanterar leverans av meddelanden till alla peers i n\u00e4tverket. F\u00f6r industrisystem anv\u00e4nds <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">meddelandebroker Kafka<\/a><\/noindex>, f\u00f6r utveckling och testning <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: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Applikationen interagerar med Hyperledger Fabric med hj\u00e4lp av Go, Node.js eller Java SDK;<\/li>\n<li>Klienten skapar transaktionen tx och skickar den till endorsing peers;<\/li>\n<li>Peer kontrollerar klientens signatur, utf\u00f6r transaktionen och skickar endorsement signature tillbaka till klienten. Chaincode k\u00f6rs endast p\u00e5 endorsing peers och resultatet av denna k\u00f6rning distribueras till alla peers. Denna arbetsmetod kallas \u2013 PBFT (Practical Byzantine Fault Tolerant) konsensus. Den skiljer sig fr\u00e5n <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassisk BFT<\/a><\/noindex> genom att meddelandet skickas och ett bekr\u00e4ftande svar inte f\u00f6rv\u00e4ntas fr\u00e5n alla deltagare, utan endast fr\u00e5n ett visst urval;<\/li>\n<li>Efter att klienten f\u00e5tt ett antal svar som motsvarar endorsement policy, skickar han transaktionen till Ordering service;<\/li>\n<li>Ordering service skapar ett block och skickar det till alla committing peers. Ordering service s\u00e4kerst\u00e4ller en sekventiell inspelning av block, vilket utesluter s\u00e5 kallad ledger fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">se avsnittet \"Forks\"<\/a><\/noindex>);<\/li>\n<li>Peers f\u00e5r blocket, kontrollerar ytterligare endorsement policy, skriver blocket i blockchain och \u00e4ndrar tillst\u00e5ndet i \"World state\" DB.<\/li>\n<\/ul>\n<p>\nDvs. det blir en uppdelning av roller mellan noderna. Detta m\u00f6jligg\u00f6r skalning och s\u00e4kerhet f\u00f6r blockchain:<\/p>\n<ul>\n<li>Smartkontrakt (chaincode) k\u00f6rs av endorsing peers. Detta s\u00e4kerst\u00e4ller konfidentialitet f\u00f6r smartkontrakten, eftersom de inte lagras av alla deltagare, utan endast av endorsing peers.<\/li>\n<li>Ordering m\u00e5ste arbeta snabbt. Detta s\u00e4kerst\u00e4lls genom att Ordering endast skapar block och skickar det till en fast upps\u00e4ttning leader peers.<\/li>\n<li>Committing peers lagrar endast blockchain \u2014 de kan vara m\u00e5nga och de kr\u00e4ver inte stor kraft och omedelbarhet. <\/li>\n<\/ul>\n<p>\nF\u00f6r mer information om den arkitektoniska l\u00f6sningen f\u00f6r Hyperledger Fabric och varf\u00f6r den fungerar s\u00e5, kan du se h\u00e4r: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architecture Origins<\/a><\/noindex> eller h\u00e4r: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains<\/a><\/noindex>.<\/p>\n<p>S\u00e5, Hyperledger Fabric \u00e4r verkligen ett m\u00e5ngsidigt system, med hj\u00e4lp av vilket man kan:<\/p>\n<ul>\n<li>Genomf\u00f6ra godtycklig aff\u00e4rslogik, med hj\u00e4lp av smartkontraktssystemet;<\/li>\n<li>Skriva och h\u00e4mta data fr\u00e5n blockkedjedatabasen i JSON-format;<\/li>\n<li>Tillhandah\u00e5lla och verifiera \u00e5tkomst till API, med hj\u00e4lp av certifikatutf\u00e4rdare. <\/li>\n<\/ul>\n<p>\nNu n\u00e4r vi har f\u00f6rst\u00e5tt n\u00e5gra specifika aspekter av Hyperledger Fabric, l\u00e5t oss \u00e4ntligen g\u00f6ra n\u00e5got nyttigt!<\/p>\n<h2>S\u00e4tter upp en blockkedja<\/h2>\n<p><\/p>\n<h3>Uppgiftsst\u00e4llande<\/h3>\n<p>\nUppgiften \u00e4r att implementera ett Citcoin-n\u00e4tverk med f\u00f6ljande funktioner: skapa konto, h\u00e4mta saldo, fylla p\u00e5 konto, \u00f6verf\u00f6ra mynt fr\u00e5n ett konto till ett annat. Vi kommer att rita en objektsmodell som vi sedan implementerar i smarta kontrakt. S\u00e5, vi kommer att ha konton som identifieras av namn (name) och som inneh\u00e5ller saldo (balance), samt en lista \u00f6ver konton. Konton och lista \u00f6ver konton \u00e4r tillg\u00e5ngar (assets) i termer av Hyperledger Fabric. D\u00e4rf\u00f6r har de en historia och ett aktuellt tillst\u00e5nd. Jag ska f\u00f6rs\u00f6ka att visa detta tydligt:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe \u00f6vre figurerna representerar det aktuella tillst\u00e5ndet som lagras i \"World state\". Under dem finns figurer som visar historiken som lagras i blockkedjan. Det aktuella tillst\u00e5ndet f\u00f6r tillg\u00e5ngar f\u00f6r\u00e4ndras genom transaktioner. En tillg\u00e5ng \u00e4ndras endast helt, s\u00e5 i resultatet av transaktionen skapas ett nytt objekt, medan det aktuella v\u00e4rdet f\u00f6r tillg\u00e5ngen g\u00e5r till historien. <\/p>\n<h3>IBM-molnet <\/h3>\n<p>\nSkapa ett konto i <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM-molnet<\/a><\/noindex>. F\u00f6r att anv\u00e4nda blockkedjeplattformen m\u00e5ste den uppgraderas till Pay-As-You-Go. Denna process kan ta tid, eftersom IBM beg\u00e4r ytterligare information och kontrollerar den manuellt. P\u00e5 den positiva sidan kan jag s\u00e4ga att IBM har bra utbildningsmaterial som g\u00f6r det m\u00f6jligt att s\u00e4tta upp Hyperledger Fabric i deras moln. Jag gillade f\u00f6ljande artiklar och exempel:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Skapa ett grundl\u00e4ggande blockkedjen\u00e4tverk med Blockchain Platform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Skapa och k\u00f6r ett blockkedje-smart kontrakt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">S\u00e4nd h\u00e4ndelser fr\u00e5n Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNedan f\u00f6ljer sk\u00e4rmdumpar av IBMs Blockchain-plattform. Detta \u00e4r ingen instruktion f\u00f6r att skapa en blockkedja, utan bara en demonstration av uppgiftens omfattning. S\u00e5 f\u00f6r v\u00e5ra \u00e4ndam\u00e5l skapar vi en organisation:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI den skapar vi noder: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkapar anv\u00e4ndare:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkapa Channel och kalla den citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI grunden \u00e4r Channel en blockkedja, s\u00e5 den b\u00f6rjar med block noll (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Skriver 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>\nIntuitivt b\u00f6r allt vara sj\u00e4lvklart h\u00e4r:<\/p>\n<ul>\n<li>Det finns flera funktioner (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) som demoprogrammet kommer att kalla via Hyperledger Fabric API.<\/li>\n<li>Funktionerna SendFrom och RefillBalance genererar h\u00e4ndelser (Event) som demoprogrammet kommer att ta emot.<\/li>\n<li>Funktionen instantiate anropas en g\u00e5ng vid instansiering av smarta kontrakt. Faktiskt anropas den inte bara en g\u00e5ng utan varje g\u00e5ng vid \u00e4ndring av versionen av det smarta kontraktet. D\u00e4rf\u00f6r \u00e4r det en d\u00e5lig id\u00e9 att initiera listan med en tom array, eftersom vi nu kommer att f\u00f6rlora den aktuella listan vid versionbyte. Men det \u00e4r okej, jag l\u00e4r mig ju bara).<\/li>\n<li>Conton och listan \u00f6ver konton (accounts) \u00e4r JSON datakonstruktioner. F\u00f6r datahantering anv\u00e4nds JS.<\/li>\n<li>Det aktuella v\u00e4rdet av tillg\u00e5ngen (asset) kan h\u00e4mtas med hj\u00e4lp av funktionen getState, och uppdateras med putState.<\/li>\n<li>Vid skapandet av ett Account anropas funktionen AddAccount, d\u00e4r en j\u00e4mf\u00f6relse g\u00f6rs med det maximala antalet konton i blockkedjan (maxAccounts = 5). H\u00e4r finns en bugg (la ni m\u00e4rke till det?) som leder till en o\u00e4ndlig \u00f6kning av antalet konton. S\u00e5dana fel m\u00e5ste undvikas).<\/li>\n<\/ul>\n<p>\nD\u00e4refter laddar vi upp det smarta kontraktet till Channel och instansierar det:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi tittar p\u00e5 transaktionen f\u00f6r installation av Smart Contract:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi ser detaljer om v\u00e5r Channel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom resultat f\u00e5r vi f\u00f6ljande schema av blockkedjen\u00e4tverket i IBM:s moln. Schemata visar ocks\u00e5 ett demo-program som k\u00f6rs i Amazons moln p\u00e5 en virtuell server (detaljer om det kommer i n\u00e4sta avsnitt):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Skapa GUI f\u00f6r att anropa Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric har ett API som kan anv\u00e4ndas f\u00f6r:<\/p>\n<ul>\n<li>Att skapa channel;<\/li>\n<li>Ansluta peer till channel;<\/li>\n<li>Installera och instansiera smarta kontrakt i channel;<\/li>\n<li>Anropa transaktioner;<\/li>\n<li>Beg\u00e4ra information i blockkedjan.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Utveckling av applikation<\/h3>\n<p>\nI v\u00e5rt demo-program kommer vi att anv\u00e4nda API:et endast f\u00f6r att anropa transaktioner och beg\u00e4ra information, eftersom de andra stegen redan har gjorts med hj\u00e4lp av IBM:s blockkedjeplattform. Vi skriver GUI med hj\u00e4lp av en standardteknikstack: Express.js + Vue.js + Node.js. Hur man b\u00f6rjar skapa moderna webbapplikationer skulle kunna bli en separat artikel. H\u00e4r l\u00e4mnar jag en l\u00e4nk till en serie f\u00f6rel\u00e4sningar som jag tyckte mycket om: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Som resultat blev det en klient-serverapplikation med ett bekant grafiskt gr\u00e4nssnitt i stil med Material Design fr\u00e5n Google. REST API mellan klienten och servern best\u00e5r av flera anrop:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 initiera blockkedjan;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 h\u00e4mta lista \u00f6ver alla konton;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 skapa Bob konto;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 h\u00e4mta information om Bob konto;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 \u00f6verf\u00f6ra tv\u00e5 mynt fr\u00e5n Bob till Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 st\u00e4nga anslutningen till blockkedjan.<\/li>\n<\/ul>\n<p>\nAPI-beskrivningen med exempel har jag lagt p\u00e5<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> sidan \"Postman\"<\/a><\/noindex> \u2014 en v\u00e4lk\u00e4nd programvara f\u00f6r testning av HTTP API.<\/p>\n<h3>Demoprogrammet i Amazon-molnet<\/h3>\n<p>\nJag har laddat upp appen till Amazon, eftersom IBM \u00e4nnu inte har kunnat uppgradera mitt konto och till\u00e5ta skapande av virtuella servrar. Som pricket \u00f6ver i:et har jag lagt en dom\u00e4n: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Jag kommer att h\u00e5lla servern p\u00e5slagen ett tag, men sedan st\u00e4nga av den eftersom kostnaderna f\u00f6r uthyrning tickar, och citcoin-mynten \u00e4r fortfarande inte noterade p\u00e5 b\u00f6rsen) I artikeln l\u00e4gger jag in sk\u00e4rmdumpar av demon s\u00e5 att logiken f\u00f6r arbetet blir tydlig. Demoprogrammet kan:<\/p>\n<ul>\n<li>Initiera blockkedjan;<\/li>\n<li>Skapa konto (men just nu g\u00e5r det inte att skapa nytt konto eftersom det maximala antalet konton som anges i smartkontraktet har n\u00e5tts);<\/li>\n<li>H\u00e4mta lista \u00f6ver konton;<\/li>\n<li>\u00d6verf\u00f6ra citcoin-mynt mellan Alice, Bob och Alex;<\/li>\n<li>H\u00e4mta h\u00e4ndelser (men just nu kan h\u00e4ndelser inte visas, d\u00e4rf\u00f6r har det skrivits i gr\u00e4nssnittet f\u00f6r enkelhetens skull att h\u00e4ndelser inte st\u00f6ds);<\/li>\n<li>Logga \u00e5tg\u00e4rder.<\/li>\n<\/ul>\n<p>\nF\u00f6rst initierar vi blockkedjan:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e4refter skapar vi v\u00e5rt konto, vi sn\u00e5lar inte med saldot:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi h\u00e4mtar lista \u00f6ver alla tillg\u00e4ngliga konton:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u00e4ljer avs\u00e4ndare och mottagare, vi f\u00e5r deras saldon. Om avs\u00e4ndare och mottagare \u00e4r samma person, s\u00e5 kommer dennes saldo att \u00f6ka:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI loggen f\u00f6ljer vi transaktionernas genomf\u00f6rande:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet var faktist allt om demoprogrammet. Vi kan nu se v\u00e5r transaktion i blockkedjan:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch den totala listan \u00f6ver transaktioner:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: vad kostar det att bygga en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nH\u00e4rmed har vi framg\u00e5ngsrikt avslutat genomf\u00f6randet av PoC f\u00f6r att skapa n\u00e4tverket Citcoin. Vad mer beh\u00f6vs f\u00f6r att Citcoin ska bli ett fullfj\u00e4drat n\u00e4tverk f\u00f6r \u00f6verf\u00f6ring av mynt? Inte mycket:<\/p>\n<ul>\n<li>Vid skapandet av kontot implementera genereringen av privat\/offentligt nyckel. Den privata nyckeln ska lagras av kontoanv\u00e4ndaren, den offentliga i blockkedjan.<\/li>\n<li>G\u00f6ra \u00f6verf\u00f6ring av mynt d\u00e4r anv\u00e4ndarens identifiering anv\u00e4nder den offentliga nyckeln ist\u00e4llet f\u00f6r namnet.<\/li>\n<li>Kryptera transaktionerna som g\u00e5r fr\u00e5n anv\u00e4ndaren till servern med dennes privata nyckel.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Slutsats <\/h2>\n<p>\nVi har implementerat n\u00e4tverket Citcoin med funktionerna: l\u00e4gga till konto, f\u00e5 saldo, fylla p\u00e5 sitt konto, \u00f6verf\u00f6ra mynt fr\u00e5n ett konto till ett annat. S\u00e5, vad kr\u00e4vdes f\u00f6r att bygga PoC?<\/p>\n<ul>\n<li>Vi m\u00e5ste studera blockkedjan i allm\u00e4nhet och Hyperledger Fabric i synnerhet;<\/li>\n<li>L\u00e4ra oss att anv\u00e4nda IBM:s eller Amazons molntj\u00e4nster;<\/li>\n<li>L\u00e4r dig programmeringsspr\u00e5ket JS och n\u00e5gon webbramverk;<\/li>\n<li>Om vissa data beh\u00f6ver lagras inte i blockchain, utan i en separat databas, s\u00e5 l\u00e4r dig att integrera, till exempel med PostgreSQL;<\/li>\n<li>Och sist men inte minst \u2014 utan kunskaper i Linux kommer man inte l\u00e5ngt i dagens v\u00e4rld!)<\/li>\n<\/ul>\n<p>\nSj\u00e4lvklart, inte rocket science, men det kommer att kr\u00e4va lite anstr\u00e4ngning!<\/p>\n<h3>K\u00e4llkoden p\u00e5 GitHub<\/h3>\n<p>\nK\u00e4llkoden har lagts p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Kort beskrivning av f\u00f6rvaret:<br \/>\nKatalog &#171;<b>server<\/b>&#187; \u2014 Node.js server<br \/>\nKatalog &#171;<b>klient<\/b>&#187; \u2014 Node.js klient<br \/>\nKatalog &#171;<b>blockchain<\/b>&#187; (parameterv\u00e4rden och nycklar, s\u00e5klart icke-fungerande och endast angivna som exempel):<\/p>\n<ul>\n<li>contract \u2014 k\u00e4llkod f\u00f6r smart kontrakt<\/li>\n<li>wallet \u2014 anv\u00e4ndarnycklar f\u00f6r att anv\u00e4nda Hyperledger Fabric API. <\/li>\n<li>*.cds \u2014 kompilerade versioner av smarta kontrakt<\/li>\n<li>*.json-filer \u2014 exempel p\u00e5 konfigurationsfiler f\u00f6r att anv\u00e4nda Hyperledger Fabric API<\/li>\n<\/ul>\n<p>\n<b>Det \u00e4r bara b\u00f6rjan!<\/b><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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: vad kostar det att bygga ett PoC? | ProHoster","description":"\u00d6gonen \u00e4r r\u00e4dda, men h\u00e4nderna kliar! I tidigare artiklar har vi g\u00e5tt igenom de teknologier som bygger blockchain (Vad kostar blockchain.)","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}