{"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\/no\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: Hva koster det \u00e5 lage PoC?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Augene er redde, men hendene kl\u00f8r!<\/i><\/p>\n<p>I tidligere artikler har vi unders\u00f8kt teknologiene som blockchain bygger p\u00e5 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Hva skal vi bygge blockchain for?<\/a><\/noindex>) og eksemplene som kan realiseres med dem (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Hva koster det \u00e5 bygge et case?<\/a><\/noindex>). Det er p\u00e5 tide \u00e5 jobbe med hendene! For \u00e5 realisere piloter og PoC (Proof of Concept) foretrekker jeg \u00e5 bruke skyer, siden man kan f\u00e5 tilgang fra hvor som helst i verden, og ofte trenger man ikke \u00e5 bruke tid p\u00e5 den kjedelige installasjonen av milj\u00f8er, da det finnes forh\u00e5ndsinstallerte konfigurasjoner. S\u00e5 la oss lage noe enkelt, for eksempel et nettverk for overf\u00f8ring av mynter mellom deltakere, og vi kaller det beskjedent Ccoin. Til dette vil vi bruke IBM-skyen og den universelle blockchainen Hyperledger Fabric. La oss f\u00f8rst finne ut hvorfor Hyperledger Fabric kalles en universell blockchain.<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage 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>\nGenerelt sett er et universelt informasjonssystem:<\/p>\n<ul>\n<li>Et sett med servere og et programkjernel som utf\u00f8rer forretningslogikk;<\/li>\n<li>Grensesnitt for interaksjon med systemet;<\/li>\n<li>Verkt\u00f8y for registrering, autentisering og autorisering av enheter \/ personer;<\/li>\n<li>En database som lagrer drifts- og arkivdata:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen offisielle versjonen av hva Hyperledger Fabric er, kan leses p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">nettsiden<\/a><\/noindex>, og kort sagt er Hyperledger Fabric en open source-plattform som gj\u00f8r det mulig \u00e5 bygge lukkede blockchains og utf\u00f8re vilk\u00e5rlig smartkontrakter skrevet i programmeringsspr\u00e5kene JS og Go. La oss se n\u00e6rmere p\u00e5 arkitekturen til Hyperledger Fabric og overbevise oss om at dette er et universelt system, som bare har spesifikasjoner for lagring og innsending av data. Spesifikasjonen best\u00e5r i at data, akkurat som i alle blockchains, lagres i blokker, som bare settes inn i blockchainen dersom deltakerne har blitt enige, og etter at dataene er skrevet, er det umulig \u00e5 endre eller slette dem usett.<\/p>\n<h2>Arkitekturen til Hyperledger Fabric<\/h2>\n<p>\nDiagrammet viser arkitekturen til Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisasjoner <\/b> \u2014 organisasjoner inneholder peer-er, slik at blockchain eksisterer takket v\u00e6re st\u00f8tten fra organisasjonene. Ulike organisasjoner kan delta i \u00e9n kanal.<\/p>\n<p><b>Kanal <\/b> \u2014 en logisk struktur som samler peer-er i grupper, netts \u00e5 definere blockchain. Hyperledger Fabric kan samtidig h\u00e5ndtere flere blockchains med ulik forretningslogikk.<\/p>\n<p><b>Medlemskapstjenesteleverand\u00f8r (MSP)<\/b> \u2014 dette er CA (Certificate Authority) for utstedelse av identiteter og tildeling av roller. For \u00e5 opprette en node m\u00e5 man samarbeide med MSP.<\/p>\n<p><b>Peer-noder<\/b> \u2014 verifiserer transaksjoner, lagrer blokkjeden, utf\u00f8rer smarte kontrakter og samhandler med applikasjoner. Peer-noder har identitet (digitalt sertifikat) som tildeles av MSP. I motsetning til Bitcoin- eller Ethereum-nettverk, hvor alle noder er likestilte, spiller nodene i Hyperledger Fabric ulike roller:<\/p>\n<ul>\n<li>En peer kan v\u00e6re <b>endorsing peer<\/b> (EP) og utf\u00f8re smarte kontrakter.<\/li>\n<li><b>Committing peer<\/b> (CP) \u2014 lagrer kun data i blokkjeden og oppdaterer \u00abWorld state\u00bb.<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 hvis flere organisasjoner deltar i blokkjeden, brukes anchor peer-er for kommunikasjon mellom dem. Hver organisasjon m\u00e5 ha en eller flere anchor peer-er. Med hjelp av AP kan enhver peer i en organisasjon f\u00e5 informasjon om alle peer-er i andre organisasjoner. For \u00e5 synkronisere informasjon mellom AP brukes <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip-protokoll<\/a><\/noindex>.<\/li>\n<li><b>Leader Peer<\/b> \u2014 hvis en organisasjon har flere peer-er, vil kun leder-peer motta blokker fra Ordering service og distribuere dem til de andre peer-ene. Lederen kan v\u00e6re b\u00e5de statisk tildelt og dynamisk valgt av peer-er i organisasjonen. For \u00e5 synkronisere informasjon om ledere brukes ogs\u00e5 gossip-protokoll.<\/li>\n<\/ul>\n<p>\n<b>Assets <\/b> \u2014 enheter som har verdi, som lagres i blokkjeden. Mer spesifikt er det key-value data i JSON-format. Det er disse dataene som registreres i blokkjeden \u00abBlockchain\u00bb. De har en historie som lagres i blokkjeden og n\u00e5v\u00e6rende tilstand som lagres i databasen \u00abWorld state\u00bb. Datakonstruksjoner fylles tilfeldig avhengig av forretningsbehov. Det finnes ingen obligatoriske felt, den eneste anbefalingen er at assets b\u00f8r ha en eier og representere verdi. <\/p>\n<p><b>Ledger <\/b> \u2014 best\u00e5r av blokkjeden \u00abBlockchain\u00bb og databasen \u00abWorld state\u00bb, hvor den n\u00e5v\u00e6rende tilstanden til assets lagres. World state bruker LevelDB eller CouchDB.<\/p>\n<p><b>Smart kontrakt<\/b> \u2014 forretningslogikken i systemet implementeres med smarte kontrakter. I Hyperledger Fabric kalles smarte kontrakter chaincode. Gjennom chaincode defineres assets og transaksjoner knyttet til dem. Teknisk sett er smarte kontrakter programmoduler implementert p\u00e5 programmeringsspr\u00e5kene JS eller Go.<\/p>\n<p><b>Endorsement policy<\/b> \u2014 for hver chaincode kan det defineres policyer for hvor mange og fra hvem man m\u00e5 forvente bekreftelser for en transaksjon. Hvis det ikke er definert noen policy, brukes som standard: \u201ctransaksjonen m\u00e5 bekreftes av ethvert medlem (member) fra hvilken som helst organisasjon i kanalen\u201d. Eksempler p\u00e5 policyer:<\/p>\n<ul>\n<li>Transaksjonen m\u00e5 bekreftes av en hvilken som helst administrator i organisasjonen;<\/li>\n<li>M\u00e5 bekreftes av et hvilket som helst medlem eller kunde i organisasjonen;<\/li>\n<li>M\u00e5 bekreftes av ethvert peer i organisasjonen.<\/li>\n<\/ul>\n<p>\n<b>Bestillingstjeneste<\/b> \u2014 pakker transaksjoner i blokker og sender dem til peer-ene i kanalen. Sikrer levering av meldinger til alle peer-er i nettverket. For industrielle systemer brukes <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">Kafka meldingsmegler<\/a><\/noindex>, for utvikling og testing <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: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Applikasjonen samhandler med Hyperledger Fabric ved \u00e5 bruke Go, Node.js eller Java SDK;<\/li>\n<li>Klienten oppretter transaksjonen tx og sender den til endorsing peer-er;<\/li>\n<li>Peer-en sjekker klientens signatur, utf\u00f8rer transaksjonen og sender endorsement-signaturen tilbake til klienten. Chaincode utf\u00f8res kun p\u00e5 endorsing peer-en, og resultatet av dette sendes til alle peer-er. En slik arbeidsalgoritme kalles \u2014 PBFT (Practical Byzantine Fault Tolerant) konsensus. Skiller seg fra <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassisk BFT<\/a><\/noindex> ved at meldingen sendes og bekreftelse bare forventes fra et bestemt sett av deltakere;<\/li>\n<li>N\u00e5r klienten har mottatt antallet svar som tilsvarer endorsement policy, sender han transaksjonen til bestillingstjenesten;<\/li>\n<li>Bestillingstjenesten danner en blokk og sender den til alle committing peer-er. Bestillingstjenesten sikrer sekvensiell skriving av blokker, noe som utelukker en s\u00e5kalt ledger-fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">se avsnittet \u00abForks\u00bb<\/a><\/noindex>);<\/li>\n<li>Peer-er mottar blokken, kontrollerer endorsement policy p\u00e5 nytt, skriver blokken til blokkjeden og endrer tilstanden i \u00abWorld state\u00bb DB.<\/li>\n<\/ul>\n<p>\nDet oppst\u00e5r alts\u00e5 et skill mellom rollene i nodene. Dette sikrer skalerbarhet og sikkerhet for blokkjeden:<\/p>\n<ul>\n<li>Smartkontrakter (chaincode) utf\u00f8res av endorsing peer-er. Dette sikrer konfidensialitet for smartkontrakter, ettersom de ikke lagres hos alle deltakere, men kun p\u00e5 endorsing peer-er.<\/li>\n<li>Bestilling m\u00e5 fungere raskt. Dette sikres ved at bestilling bare danner blokker og sender dem til et fast sett av leder-peer-er.<\/li>\n<li>Committing peers lagrer kun blokkjeden \u2014 de kan v\u00e6re mange og krever ikke stor kapasitet eller umiddelbar respons. <\/li>\n<\/ul>\n<p>\nMer om arkitektoniske l\u00f8sninger for Hyperledger Fabric og hvorfor den fungerer slik, kan du se her: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Arkitekturens opprinnelse<\/a><\/noindex> eller her: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: Et distribuert operativsystem for tillatte blokkjeder<\/a><\/noindex>.<\/p>\n<p>S\u00e5, Hyperledger Fabric er faktisk et allsidig system som gj\u00f8r at du kan:<\/p>\n<ul>\n<li>Implementere vilk\u00e5rlig forretningslogikk ved hjelp av mekanismen for smartkontrakter;<\/li>\n<li>Lagre og motta data fra en blokkjededatabase i JSON-format;<\/li>\n<li>Gi tilgang til og verifisere tilgang til API ved \u00e5 bruke et sertifiseringsorgan. <\/li>\n<\/ul>\n<p>\nN\u00e5 som vi har f\u00e5tt litt innblikk i spesifikasjonene til Hyperledger Fabric, la oss endelig gj\u00f8re noe nyttig!<\/p>\n<h2>Utrull av blokkjedene<\/h2>\n<p><\/p>\n<h3>Definering av oppgaven<\/h3>\n<p>\nOppgaven er \u00e5 implementere et Citcoin-nettverk med f\u00f8lgende funksjoner: opprette konto, f\u00e5 saldo, fylle p\u00e5 saldo, overf\u00f8re mynter fra \u00e9n konto til en annen. La oss tegne en objektmodell som vi deretter vil implementere i en smart kontrakt. S\u00e5, vi vil ha kontoer som identifiseres med navn (name) og har en saldo (balance), samt en liste med kontoer. Kontoer og listen over kontoer er, i henhold til Hyperledger Fabric, aktiva. De har derfor en historie og en n\u00e5v\u00e6rende tilstand. Jeg skal pr\u00f8ve \u00e5 illustrere dette:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe \u00f8verste figurene er den n\u00e5v\u00e6rende tilstanden som lagres i databasen \u00abWorld state\u00bb. Under dem er figurene som viser historikken lagret i blokkjedene. Den n\u00e5v\u00e6rende tilstanden av aktiva endres av transaksjoner. Aktiva endres bare fullt ut, derfor skapes det et nytt objekt ved fullf\u00f8ring av en transaksjon, og den n\u00e5v\u00e6rende verdien av aktiva g\u00e5r inn i historien. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nOpprett en konto i <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM Cloud<\/a><\/noindex>. For \u00e5 bruke blokkjedepublikasjonen m\u00e5 den oppgraderes til Pay-As-You-Go. Denne prosessen kan ta tid, da IBM ber om ytterligere informasjon og verifierer denne manuelt. P\u00e5 den positive siden kan jeg si at IBM har gode l\u00e6remateriell som gj\u00f8r det mulig \u00e5 rulle ut Hyperledger Fabric i deres sky. Jeg likte denne artikkelserien og eksemplene:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Opprett et grunnleggende blokkjedenettverk ved hjelp av Blockchain Platform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Opprett og kj\u00f8r en smart kontrakt for blokkjedene<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Emitere hendelser fra Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nF\u00f8lgende skjermbilder er fra IBM Blockchain-plattformen. Dette er ikke en veiledning for \u00e5 lage en blokkjed, men bare en demonstrasjon av oppgavens omfang. S\u00e5, for v\u00e5re form\u00e5l lager vi \u00e9n organisasjon:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer oppretter vi noder: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOpprett brukere:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOpprett Channel og gi den navnet citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI hovedsak er Channel en blokkjed, s\u00e5 den starter med blokk null (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Skriv 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 burde alt her v\u00e6re forst\u00e5elig:<\/p>\n<ul>\n<li>Det er flere funksjoner (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) som vil bli kalt av demo-programmet ved hjelp av Hyperledger Fabric API.<\/li>\n<li>Funksjonene SendFrom og RefillBalance genererer hendelser (Event) som demo-programmet vil motta.<\/li>\n<li>Instantiate-funksjonen blir kalt en gang ved instansiering av smartkontrakten. Faktisk blir den kalt ikke bare en gang, men hver gang versjonen av smartkontrakten endres. Derfor er det en d\u00e5rlig id\u00e9 \u00e5 initialisere listen med et tomt array, ettersom vi n\u00e5 vil miste den n\u00e5v\u00e6rende listen ved versjonsendring. Men det er greit, jeg l\u00e6rer jo bare).<\/li>\n<li>Account-er og listen over account-er (accounts) er JSON datastrukturer. For \u00e5 manipulere dataene brukes JS.<\/li>\n<li>Den n\u00e5v\u00e6rende verdien av asset-et kan hentes ved \u00e5 kalle funksjonen getState, og oppdateres ved hjelp av putState.<\/li>\n<li>N\u00e5r en Account blir opprettet, blir funksjonen AddAccount kalt, der det gj\u00f8res en sammenligning for det maksimale antallet account-er i blokkjeden (maxAccounts = 5). Og her er det en feil (la merke til det?), som f\u00f8rer til en uendelig vekst av antall account-er. Slike feil b\u00f8r unng\u00e5s)<\/li>\n<\/ul>\n<p>\nDeretter laster vi opp smartkontrakten til Channel og instansierer den:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi ser p\u00e5 transaksjonen for oppsett av Smart Contract:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi ser detaljene om v\u00e5r Channel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom et resultat f\u00e5r vi f\u00f8lgende diagram over blokkjedenettverket i IBM-skyen. Diagrammet viser ogs\u00e5 et demoprogram, som kj\u00f8rer i skyen p\u00e5 en virtuell server i Amazon (detaljer om denne vil komme i neste avsnitt):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Oppretting av GUI for \u00e5 kalle Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric har et API som kan brukes til:<\/p>\n<ul>\n<li>Opprettelse av channel;<\/li>\n<li>Koble til peer til channel;<\/li>\n<li>Installering og instansiering av smartkontrakter i channel;<\/li>\n<li>Kall av transaksjoner;<\/li>\n<li>Foresp\u00f8rsel om informasjon i blokkjeden.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Utvikling av applikasjonen<\/h3>\n<p>\nI v\u00e5rt demoprogram vil vi bruke API kun for \u00e5 kalle transaksjoner og foresp\u00f8rre informasjon, ettersom de andre trinnene allerede er gjort ved hjelp av IBM-blokkjedeplattformen. Vi lager GUI ved bruk av en standard teknologistack: Express.js + Vue.js + Node.js. Hvordan man kan begynne \u00e5 lage moderne webapplikasjoner kan skrives som en egen artikkel. Her legger jeg en lenke til en serie forelesninger som jeg likte best: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Som et resultat fikk vi en klient-server-applikasjon med et kjent grafisk grensesnitt i Google Material Design-stil. REST API mellom klienten og serveren best\u00e5r av flere kall:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 initialisere blokkjeden;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 f\u00e5 listen over alle account-er;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 opprette Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 f\u00e5 informasjon om Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 overf\u00f8re to mynter fra Bob til Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 bryte forbindelsen til blokkjedene.<\/li>\n<\/ul>\n<p>\nAPI-beskrivelsen med eksempler er plassert p\u00e5<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> siden \u00abPostman\u00bb<\/a><\/noindex> \u2014 et velkjent program for testing av HTTP API.<\/p>\n<h3>Demo-applikasjonen i Amazon-skyen<\/h3>\n<p>\nApplikasjonen lastet jeg opp til Amazon, fordi IBM fortsatt ikke har klart \u00e5 oppgradere kontoen min og gi meg lov til \u00e5 opprette virtuelle servere. Som en ekstra touch har jeg lagt til domenet: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Jeg vil holde serveren litt p\u00e5sl\u00e5tt, men s\u00e5 skru den av, fordi kostnadene for leie tikker inn, og citcoin-mynter er enn\u00e5 ikke notert p\u00e5 b\u00f8rsen) I artikkelen legger jeg ved skjermbilder av demoen, slik at logikken i arbeidet blir klar. Demo-applikasjonen kan:<\/p>\n<ul>\n<li>Initere blokkjedene;<\/li>\n<li>Opprette konto (men n\u00e5 kan ikke en ny konto opprettes, da det maksimale antallet kontoer spesifisert i smartkontrakten er n\u00e5dd);<\/li>\n<li>Hente listen over kontoer;<\/li>\n<li>Overf\u00f8re citcoin-mynter mellom Alice, Bob og Alex;<\/li>\n<li>Hente hendelser (men n\u00e5 kan ikke hendelser vises, s\u00e5 for enkelhet er det skrevet i grensesnittet at hendelser ikke st\u00f8ttes);<\/li>\n<li>Loggf\u00f8re handlinger.<\/li>\n<\/ul>\n<p>\nF\u00f8rst initierer vi blokkjedene:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDeretter oppretter vi kontoen v\u00e5r, uten \u00e5 spare p\u00e5 balansen:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi henter listen over alle tilgjengelige kontoer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi velger avsender og mottaker, f\u00e5r deres balanser. Hvis avsenderen og mottakeren er den samme, vil kontoen bli fylt p\u00e5:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI loggen f\u00f8lger vi med p\u00e5 fullf\u00f8ringen av transaksjoner:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet var alt med demo-programmet. N\u00e5 kan vi se v\u00e5r transaksjon i blokkjedene:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg den generelle listen over transaksjoner:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: Hva koster det \u00e5 lage PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi har n\u00e5 fullf\u00f8rt implementeringen av PoC for opprettelse av Citcoin-nettverket. Hva m\u00e5 gj\u00f8res ytterligere for at Citcoin skal bli et fullt ut nettverk for overf\u00f8ring av mynter? Bare litt:<\/p>\n<ul>\n<li>Ved opprettelsen av kontoen realiserer vi genereringen av privat \/ offentlig n\u00f8kkel. Den private n\u00f8kkelen skal lagres hos brukeren av kontoen, den offentlige i blokkjedene.<\/li>\n<li>Gj\u00f8re mynter overf\u00f8rt, der identifikasjonen av brukeren ikke bruker navn, men den offentlige n\u00f8kkelen.<\/li>\n<li>Kryptere transaksjoner som g\u00e5r fra brukeren til serveren med hans private n\u00f8kkel.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Konklusjon <\/h2>\n<p>\nVi har realisert Citcoin-nettverket med funksjonene: legge til konto, hente balanse, fylle p\u00e5 kontoen sin, overf\u00f8re mynter fra en konto til en annen. S\u00e5, hva kostet det oss \u00e5 bygge PoC?<\/p>\n<ul>\n<li>Det er n\u00f8dvendig \u00e5 studere blokkjedene generelt og Hyperledger Fabric spesielt;<\/li>\n<li>L\u00e6re \u00e5 bruke IBM- eller Amazon-skyer;<\/li>\n<li>L\u00e6re programmeringsspr\u00e5ket JS og et eller annet webframework;<\/li>\n<li>Hvis noen data m\u00e5 lagres ikke i blokkjeden, men i en separat database, m\u00e5 du l\u00e6re \u00e5 integrere deg med for eksempel PostgreSQL;<\/li>\n<li>Og sist men ikke minst \u2013 uten kjennskap til Linux kommer man ingen vei i dagens verden!)<\/li>\n<\/ul>\n<p>\nSelvf\u00f8lgelig er det ikke rakettvitenskap, men det vil kreve en innsats!<\/p>\n<h3>Kildekode 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 av depotet:<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; (parameterverdier og n\u00f8kkeler er selvf\u00f8lgelige ikke operative og er kun gitt som eksempel):<\/p>\n<ul>\n<li>contract \u2013 kildekoden til smartkontrakten<\/li>\n<li>wallet \u2013 brukerens n\u00f8kler for bruk av Hyperledger Fabric API. <\/li>\n<li>*.cds \u2013 kompilerte versjoner av smartkontrakter<\/li>\n<li>*.json-filer \u2013 eksempler p\u00e5 konfigurasjonsfiler for bruk av Hyperledger Fabric API<\/li>\n<\/ul>\n<p>\n<b>Det er bare begynnelsen!<\/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.5 - 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\/no\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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: hva koster oss \u00e5 bygge en PoC? | ProHoster","description":"\u00d8ynene er redde, men hendene kl\u00f8r! I de tidligere artiklene har vi sett p\u00e5 teknologiene som blockchain er bygget p\u00e5 (Hva koster oss blockchain.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}