{"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\/da\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>\u00d8jnene frygter, men h\u00e6nderne kl\u00f8r!<\/i><\/p>\n<p>I de tidligere artikler har vi unders\u00f8gt de teknologier, som blockchain er bygget p\u00e5 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Hvad koster det at bygge en blockchain?<\/a><\/noindex>) og de anvendelsestilf\u00e6lde, som man kan realisere med dem (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Hvad koster det os at bygge et anvendelsestilf\u00e6lde?<\/a><\/noindex>). Det er tid til at f\u00e5 h\u00e6nderne i sving! For at implementere pilotprojekter og PoC (Proof of Concept) foretr\u00e6kker jeg at bruge cloud-l\u00f8sninger, da de kan tilg\u00e5s fra enhver del af verden, og det ofte ikke kr\u00e6ver tid at installere et milj\u00f8, da der er forh\u00e5ndskonfigurerede ops\u00e6tninger. S\u00e5 lad os g\u00f8re noget simpelt, for eksempel et netv\u00e6rk til at overf\u00f8re valuta mellem deltagerne, og lad os beskytte dette beskedne navn Bitcoin. Til dette vil vi bruge IBM's cloud og den universelle blockchain Hyperledger Fabric. Lad os f\u00f8rst finde ud af, hvorfor Hyperledger Fabric kaldes en universel blockchain?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge 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 universel blockchain<\/h2>\n<p>\nGenerelt set er et universelt informationssystem:<\/p>\n<ul>\n<li>Et s\u00e6t servere og en software-kerne, der udf\u00f8rer forretningslogik;<\/li>\n<li>Gr\u00e6nseflader til interaktion med systemet;<\/li>\n<li>V\u00e6rkt\u00f8jer til registrering, godkendelse og autorisering af enheder \/ personer;<\/li>\n<li>En database, der gemmer operationelle og arkivdata:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen officielle version af, hvad Hyperledger Fabric er, kan l\u00e6ses p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">websitet<\/a><\/noindex>, og kort sagt, Hyperledger Fabric er en open-source platform, der g\u00f8r det muligt at bygge lukkede blockchains og udf\u00f8re vilk\u00e5rlige smarte kontrakter skrevet i programmeringssprogene JS og Go. Lad os se n\u00e6rmere p\u00e5 arkitekturen af Hyperledger Fabric og overbevise os selv om, at dette er et universelt system, som kun har specifikationen for opbevaring og registrering af data. Specifikationen er, at data, som i alle blockchains, gemmes i blokke, der kun placeres i blockchain, hvis deltagerne n\u00e5r til konsensus, og efter registrering kan data ikke \u00e6ndres eller slettes ubem\u00e6rket.<\/p>\n<h2>Arkitekturen af Hyperledger Fabric<\/h2>\n<p>\nDiagrammet viser arkitekturen af Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisationer <\/b> \u2014 organisationer indeholder peers, s\u00e5ledes at blockchain findes takket v\u00e6re organisationernes st\u00f8tte. Forskellige organisationer kan v\u00e6re med i \u00e9n channel.<\/p>\n<p><b>Channel <\/b> \u2014 en logisk struktur, der samler peers i grupper, s\u00e5ledes at blockchain defineres. Hyperledger Fabric kan samtidig behandle flere blockchains med forskellig forretningslogik.<\/p>\n<p><b>Membership Services Provider (MSP)<\/b> \u2014 det er CA (Certificate Authority) for udstedelse af identiteter og tildeling af roller. For at oprette en node skal man interagere med MSP.<\/p>\n<p><b>Peer noder<\/b> \u2014 verificerer transaktioner, opbevarer blockchainen, udf\u00f8rer smart contracts og interagerer med applikationer. Peer-noder har en identitet (digitalt certifikat), som udstedes af MSP. I mods\u00e6tning til Bitcoin- eller Ethereum-netv\u00e6rket, hvor alle noder er ligev\u00e6rdige, spiller noderne i Hyperledger Fabric forskellige roller:<\/p>\n<ul>\n<li>En peer kan v\u00e6re <b>endorsing peer<\/b> (EP) og udf\u00f8re smart contracts.<\/li>\n<li><b>Committing peer<\/b> (CP) \u2014 gemmer kun data i blockchainen og opdaterer \"World state\".<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 hvis flere organisationer deltager i blockchainen, anvendes anchor peer til at kommunikere mellem dem. Hver organisation skal have en eller flere anchor peers. Med hj\u00e6lp fra AP kan enhver peer i organisationen f\u00e5 information om alle peers i andre organisationer. Til at synkronisere information mellem AP'er anvendes <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip protokollen<\/a><\/noindex>.<\/li>\n<li><b>Leader Peer<\/b> \u2014 hvis en organisation har flere peers, vil kun leader peer modtage blokke fra Ordering service og viderebringe dem til de andre peers. Lederen kan b\u00e5de v\u00e6re statisk defineret og v\u00e6lges dynamisk af peers i organisationen. For at synkronisere information om ledere anvendes ogs\u00e5 gossip protokollen.<\/li>\n<\/ul>\n<p>\n<b>Aktiver <\/b> \u2014 enheder af v\u00e6rdi, der opbevares i blockchainen. Mere specifikt er det key-value data i JSON-format. Det er disse data, der skrives til blockchainen \"Blockchain\". De har en historie, der opbevares i blockchainen, og en nuv\u00e6rende tilstand, der opbevares i databasen \"World state\". Datastrukturerne fyldes tilf\u00e6ldigt afh\u00e6ngigt af forretningsopgaverne. Der er ingen obligatoriske felter, mens den eneste anbefaling er, at aktiverne skal have en ejer og repr\u00e6sentere v\u00e6rdi. <\/p>\n<p><b>Ledger <\/b> \u2014 best\u00e5r af blockchainen \"Blockchain\" og databasen \"World state\", hvor den nuv\u00e6rende tilstand af aktiverne opbevares. World state bruger LevelDB eller CouchDB.<\/p>\n<p><b>Smart kontrakt<\/b> \u2014 med smart contracts implementeres forretningslogikken i systemet. I Hyperledger Fabric kaldes smart contracts chaincode. Med chaincode defineres aktiverne og transaktionerne p\u00e5 dem. Hvis vi taler i tekniske termer, er smart contracts softwaremoduler implementeret i programmeringssprogene JS eller Go.<\/p>\n<p><b>Endorsement policy<\/b> \u2014 for hver chaincode kan der angives politikker for, hvor mange og fra hvem, der skal forventes bekr\u00e6ftelser til en transaktion. Hvis politikken ikke er angivet, anvendes som standard: \u201ctransaktionen skal bekr\u00e6ftes af ethvert medlem (member) fra enhver organisation i kanalen\u201d. Eksempler p\u00e5 politikker:<\/p>\n<ul>\n<li>Transaktionen skal bekr\u00e6ftes af en hvilken som helst administrator af organisationen;<\/li>\n<li>Det skal bekr\u00e6ftes af ethvert medlem eller kunde i organisationen;<\/li>\n<li>Det skal bekr\u00e6ftes af enhver peer i organisationen.<\/li>\n<\/ul>\n<p>\n<b>Bestillingstjeneste<\/b> \u2014 pakker transaktioner i blokke og sender dem til peers i kanalen. Sikrer levering af beskeder til alle peers i netv\u00e6rket. Til industrielle systemer anvendes <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">Kafka-beskedbroker<\/a><\/noindex>, til udvikling og 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: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Applikationen interagerer med Hyperledger Fabric ved hj\u00e6lp af Go, Node.js eller Java SDK;<\/li>\n<li>Klienten opretter transaktionen tx og sender den til endorsing peers;<\/li>\n<li>Peer kontrollerer klientens underskrift, udf\u00f8rer transaktionen og sender endorsement-underskriften tilbage til klienten. Chaincode udf\u00f8res kun p\u00e5 endorsing peers, og resultatet af deres udf\u00f8relse distribueres til alle peers. Denne arbejdsmetode kaldes \u2014 PBFT (Practical Byzantine Fault Tolerant) konsensus. Det adskiller sig fra <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassisk BFT<\/a><\/noindex> ved at meddelelsen distribueres og bekr\u00e6ftelse forventes ikke fra alle deltagere, men kun fra et bestemt s\u00e6t;<\/li>\n<li>N\u00e5r kunden har modtaget et antal svar, der svarer til endorsing policy, sender han transaktionen til bestillingstjenesten;<\/li>\n<li>Bestillingstjenesten danner en blok og sender den til alle committing peers. Bestillingstjenesten sikrer sekventiel skrivning af blokke, hvilket udelukker s\u00e5kaldt ledger fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">se afsnittet \"Forks\"<\/a><\/noindex>);<\/li>\n<li>Peers modtager blokken, kontrollerer endnu en gang endorsing policy, gemmer blokken i blockchainen og opdaterer tilstanden i \"World state\" DB.<\/li>\n<\/ul>\n<p>\nDet vil sige, der opn\u00e5s en opdeling af rollerne mellem noderne. Dette sikrer skalerbarhed og sikkerhed i blockchainen:<\/p>\n<ul>\n<li>Smart contracts (chaincode) udf\u00f8res af endorsing peers. Dette sikrer fortrolighed af smart contracts, da de ikke lagres hos alle deltagere, men kun p\u00e5 endorsing peers.<\/li>\n<li>Bestilling skal fungere hurtigt. Dette sikres ved at Bestilling kun danner blokken og sender den til et fast s\u00e6t af leader peers.<\/li>\n<li>Committing peers gemmer kun blockchainen \u2014 der kan v\u00e6re mange af dem, og de kr\u00e6ver ikke stor kapacitet og \u00f8jeblikkelig reaktion. <\/li>\n<\/ul>\n<p>\nYderligere arkitektoniske l\u00f8sninger i Hyperledger Fabric og hvorfor det fungerer som det g\u00f8r, kan ses her: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architecture Origins<\/a><\/noindex> eller her: <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 er virkelig et alsidigt system, hvorved man kan:<\/p>\n<ul>\n<li>Implementere enhver forretningslogik ved hj\u00e6lp af smart contract-mekanismen;<\/li>\n<li>Registrere og hente data fra blockchain-database i JSON-format;<\/li>\n<li>Tilvejebringe og verificere adgang til API ved hj\u00e6lp af Certificate Authority. <\/li>\n<\/ul>\n<p>\nNu hvor vi har f\u00e5et en grundl\u00e6ggende forst\u00e5else af Hyperledger Fabric, lad os endelig g\u00f8re noget nyttigt!<\/p>\n<h2>Udrulning af blockchain<\/h2>\n<p><\/p>\n<h3>Problemformulering<\/h3>\n<p>\nOpgaven er at implementere et Citcoin-netv\u00e6rk med f\u00f8lgende funktioner: oprette en konto, f\u00e5 saldo, genopfylde saldo, overf\u00f8re m\u00f8nter fra \u00e9n konto til en anden. Lad os tegne en objektsmodel, som vi senere vil implementere i smart contracten. S\u00e5 vi vil have konti, der identificeres med navne (name) og indeholder en saldo (balance), samt en liste over konti. Konti og listen over konti er, i termerne af Hyperledger Fabric, aktiver. F\u00f8lgelig har de en historie og en aktuel tilstand. Jeg vil fors\u00f8ge at illustrere dette visuelt:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe \u00f8verste figurer repr\u00e6senterer den nuv\u00e6rende tilstand, som opbevares i \"World state\". Under dem er figurer, der viser historikken, som opbevares i blockchainen. Den aktuelle tilstand af aktiver \u00e6ndres via transaktioner. Et aktiv \u00e6ndres kun i sin helhed, s\u00e5 resultatet af en transaktion skaber et nyt objekt, og den aktuelle v\u00e6rdi af aktivet g\u00e5r til historien. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nOpretter en konto i <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM Cloud<\/a><\/noindex>. For at bruge blockchain-platformen skal den opgraderes til Pay-As-You-Go. Denne proces kan tage tid, da IBM anmoder om yderligere information og behandler den manuelt. Positivt er, at IBM har gode undervisningsmaterialer, der g\u00f8r det muligt at udrulle Hyperledger Fabric i deres cloud. Jeg kunne godt lide f\u00f8lgende serie af artikler og eksempler:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Opret et grundl\u00e6ggende blockchain-netv\u00e6rk ved hj\u00e6lp af Blockchain Platform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Opret og udf\u00f8r en blockchain smart contract<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Udsend begivenheder fra Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNedenfor er screenshots fra IBM's Blockchain platform. Dette er ikke en vejledning til oprettelse af blockchain, men blot en demonstration af omfanget af opgaven. S\u00e5 lad os for vores form\u00e5l oprette \u00e9n organisation:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI den opretter vi noder: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOpretter brugere:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOpretter Channel og kalder den citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI bund og grund er Channel en blockchain, s\u00e5 den starter med blok nummer nul (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge 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 skal alt v\u00e6re klart her:<\/p>\n<ul>\n<li>Der er flere funktioner (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), som demon-programmet vil kalde ved hj\u00e6lp af Hyperledger Fabric API.<\/li>\n<li>Funktionerne SendFrom og RefillBalance genererer begivenheder (Event), som demon-programmet vil modtage.<\/li>\n<li>Funktionen instantiate kaldes \u00e9n gang, n\u00e5r smartkontrakten instansieres. Faktisk kaldes den ikke kun \u00e9n gang, men hver gang versionen af smartkontrakten \u00e6ndres. Derfor er det en d\u00e5rlig id\u00e9 at initialisere listen med et tomt array, da vi nu vil miste den nuv\u00e6rende liste, n\u00e5r versionen af smartkontrakten \u00e6ndres. Men ingen bekymringer, jeg er kun i gang med at l\u00e6re).<\/li>\n<li>Accounts og listen over accounts (accounts) er JSON datastrukturer. Dataene manipuleres med JS.<\/li>\n<li>Den nuv\u00e6rende v\u00e6rdi af asset kan opn\u00e5s ved at kalde funktionen getState, og opdateres med putState.<\/li>\n<li>N\u00e5r der oprettes en Account, kaldes funktionen AddAccount, hvor der sammenlignes med det maksimale antal accounts i blockchainen (maxAccounts = 5). Her er der et problem (har I bem\u00e6rket det?), som f\u00f8rer til en uendelig v\u00e6kst af antallet af accounts. S\u00e5danne fejl skal undg\u00e5s)<\/li>\n<\/ul>\n<p>\nDern\u00e6st uploader vi smartkontrakten til Channel og instansierer den:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os se transaktionen for installation af Smart Contract:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os se detaljerne om vores Channel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge 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\u00f8lgende diagram af blockchain-netv\u00e6rket i IBM's cloud. Diagrammet viser ogs\u00e5 et demo-program, der k\u00f8rer i Amazon's cloud p\u00e5 en virtuel server (mere om dette i n\u00e6ste sektion):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Oprettelse af GUI til kald af Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric har et API, der kan bruges til:<\/p>\n<ul>\n<li>Oprettelse af channel;<\/li>\n<li>Forbindelse af peer til channel;<\/li>\n<li>Installation og instansiering af smartkontrakter i channel;<\/li>\n<li>Kald af transaktioner;<\/li>\n<li>Anmodning om information i blockchainen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Udvikling af applikation<\/h3>\n<p>\nI vores demo-program vil vi kun bruge API til at kalde transaktioner og anmode om information, da vi allerede har gjort de andre skridt ved at bruge IBM blockchain-platformen. Vi skriver GUI'en ved at bruge den standard teknologi-stack: Express.js + Vue.js + Node.js. Der kan skrives en separat artikel om, hvordan man starter med at oprette moderne webapplikationer. Her lader jeg et link til en r\u00e6kke forel\u00e6sninger, som jeg fandt mest interessante: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Som resultat blev der skabt en klient-server-applikation med et velkendt grafisk interface i stil med Material Design fra Google. REST API mellem klienten og serveren best\u00e5r af flere kald:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 initialisere blockchain;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 hente listen over alle accounts;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 oprette Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 hente information om Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 overf\u00f8re to m\u00f8nter fra Bob til Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 lukke forbindelsen til blockchainen.<\/li>\n<\/ul>\n<p>\nAPI-beskrivelsen med eksempler er lagt p\u00e5<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> siden \"Postman\"<\/a><\/noindex> \u2014 et velkendt program til test af HTTP API'er.<\/p>\n<h3>Demo-applikationen i Amazon-cloud<\/h3>\n<p>\nJeg har uploadet applikationen til Amazon, da IBM stadig ikke har v\u00e6ret i stand til at opgradere min konto og tillade mig at oprette virtuelle servere. Som en lille ekstra tilf\u00f8jelse tilf\u00f8jede jeg dom\u00e6net: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Jeg vil holde serveren t\u00e6ndt lidt, men derefter slukke den, da omkostningerne for leje l\u00f8ber, og citcoin-m\u00f8nter er endnu ikke noteret p\u00e5 b\u00f8rsen) I artiklen medtager jeg screenshots af demoen for at tydeligg\u00f8re logikken. Demo-applikationen kan:<\/p>\n<ul>\n<li>Initialisere blockchain;<\/li>\n<li>Oprette Account (men lige nu kan der ikke oprettes en ny Account, da det maksimale antal accounts, der er angivet i smart-kontrakten, er n\u00e5et);<\/li>\n<li>Modtage listen over Accounts;<\/li>\n<li>Overf\u00f8re citcoin-m\u00f8nter mellem Alice, Bob og Alex;<\/li>\n<li>Modtage begivenheder (men i \u00f8jeblikket kan begivenheder ikke vises, s\u00e5 der st\u00e5r for enkelhed i gr\u00e6nsefladen, at begivenheder ikke underst\u00f8ttes);<\/li>\n<li>Logge handlinger.<\/li>\n<\/ul>\n<p>\nF\u00f8rst initialiserer vi blockchain:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDern\u00e6st opretter vi vores konto, og vi g\u00e5r ikke ned p\u00e5 balancen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi f\u00e5r listen over alle tilg\u00e6ngelige accounts:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi v\u00e6lger afsender og modtager og f\u00e5r deres saldi. Hvis afsender og modtager er den samme, vil hans saldo blive opfyldt:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI loggen f\u00f8lger vi transaktionernes udf\u00f8relse:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet er i grund og bund det hele med demo-programmet. Derefter kan vi se vores transaktion i blockchainen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg den samlede liste over transaktioner:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: hvad kr\u00e6ver det for os at bygge en PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHermed har vi med succes afsluttet implementeringen af PoC for oprettelsen af Citcoin-netv\u00e6rket. Hvad skal der ellers g\u00f8res, for at Citcoin bliver et fuldgyldigt netv\u00e6rk til overf\u00f8rsel af m\u00f8nter? Meget lidt:<\/p>\n<ul>\n<li>Ved oprettelsen af account-en skal der implementeres generation af privat\/publik n\u00f8gle. Den private n\u00f8gle skal opbevares af brugeren af account-en, den offentlige i blockchainen.<\/li>\n<li>Foretage overf\u00f8rsler af m\u00f8nter, hvor identifikation af brugeren ikke sker ved navn, men ved den offentlige n\u00f8gle.<\/li>\n<li>Kryptere transaktioner, der g\u00e5r fra brugeren til serveren med hans private n\u00f8gle.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Konklusion <\/h2>\n<p>\nVi har implementeret netv\u00e6rket Citcoin med funktioner: tilf\u00f8je account, f\u00e5 saldo, opfylde sin konto, overf\u00f8re m\u00f8nter fra \u00e9n konto til en anden. S\u00e5 hvad kostede det os at bygge PoC?<\/p>\n<ul>\n<li>Vi skal l\u00e6re om blockchain generelt og Hyperledger Fabric i s\u00e6rdeleshed;<\/li>\n<li>L\u00e6re at bruge IBM- eller Amazon-cloud.<\/li>\n<li>L\u00e6r programmeringssproget JS og en web framework;<\/li>\n<li>Hvis visse data skal opbevares i en separat database frem for i blockchain, s\u00e5 l\u00e6r at integrere med f.eks. PostgreSQL;<\/li>\n<li>Og sidst men ikke mindst \u2014 uden kendskab til Linux kommer man ikke langt i dagens verden!)<\/li>\n<\/ul>\n<p>\nSelvf\u00f8lgelig er det ikke raketvidenskab, men du skal arbejde for det!<\/p>\n<h3>Kildekoderne p\u00e5 GitHub<\/h3>\n<p>\nKildekoden er lagt p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Kort beskrivelse af repositoryet:<br \/>\nKatalog &#171;<b>server<\/b>&#187; \u2014 Node.js server<br \/>\nKatalog &#171;<b>client<\/b>&#187; \u2014 Node.js klient<br \/>\nKatalog &#171;<b>blockchain<\/b>&#187; (parameterv\u00e6rdier og n\u00f8gler er selvf\u00f8lgelig ikke fungerende og kun angivet som eksempel):<\/p>\n<ul>\n<li>contract \u2014 kildekoden til smart contracten<\/li>\n<li>wallet \u2014 brugerens n\u00f8gler til brug af Hyperledger Fabric API. <\/li>\n<li>*.cds \u2014 kompilerede versioner af smart contracts<\/li>\n<li>*.json filer \u2014 eksempler p\u00e5 konfigurationsfiler til brug af Hyperledger Fabric API<\/li>\n<\/ul>\n<p>\n<b>Det er kun begyndelsen!<\/b><br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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: hvad kr\u00e6ver det at lave et PoC? | ProHoster","description":"\u00d8jnene frygter, men h\u00e6nderne kribler! I tidligere artikler har vi set p\u00e5 de teknologier, som blockchain er bygget p\u00e5 (Hvad kr\u00e6ver det at lave en blockchain.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}