{"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\/et\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Plokiahel: mida me peame PoC\u2019i loomiseks?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Silmad kardavad, kuid k\u00e4ed s\u00fcgelevad!<\/i><\/p>\n<p>Eelmistes artiklites arutlesime tehnoloogiate \u00fcle, millele plokiahelad toetuvad (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Mis on vajalik blockchain'i loomiseks?<\/a><\/noindex>) ja juhtumite \u00fcle, mida nende abil ellu viia (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Mis meid takistab juhtumi loomisel?<\/a><\/noindex>). On aeg asuda tegudele! Pilootprojekti ja PoC (Proof of Concept) elluviimiseks eelistan kasutada pilveteenuseid, kuna neile p\u00e4\u00e4seb ligi igast maailma nurgast ja sageli ei pea aega raiskama t\u00fc\u00fctule keskkonna seadistamisele, kuna eksisteerivad eelkonfigureeritud lahendused. Alustame millegi lihtsa loomist, n\u00e4iteks v\u00f5rku raha \u00fclekandmiseks osalejate vahel, ja nimetame seda tagasihoidlikult Citcoiniks. Selleks kasutame IBM-i pilve ja universaalset plokiahelat Hyperledger Fabric. Esmalt uurime, miks Hyperledger Fabrici nimetatakse universaalseks plokiahelaks?<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" 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 universaalne plokiahel<\/h2>\n<p>\n\u00dcldiselt \u00f6eldes on universaalne teabes\u00fcsteem:<\/p>\n<ul>\n<li>Serverite kogum ja tarkvara s\u00fcda, mis t\u00e4idab \u00e4ri loogikat;<\/li>\n<li>Liidesed s\u00fcsteemiga suhtlemiseks;<\/li>\n<li>Seadmete \/ inimeste registreerimise, autentimise ja autoriseerimise vahendid;<\/li>\n<li>Andmebaas, mis salvestab operatiivsed ja arhiivandmed:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHyperledger Fabrici ametlikku definitsiooni saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">veebisaidil<\/a><\/noindex>, kuid l\u00fchidalt \u00f6eldes on Hyperledger Fabric avatud l\u00e4htekoodiga platvorm, mis v\u00f5imaldab luua suletud plokiahelasid ja teostada mis tahes nutikaid lepinguid, mis on kirjutatud programmeerimiskeeltes JS ja Go. Vaatame l\u00e4hemalt Hyperledger Fabrici arhitektuuri ja veendume, et see on universaalne s\u00fcsteem, millel on ainult andmete salvestamise ja kirjutamise erip\u00e4ra. Erip\u00e4ra seisneb selles, et andmed, nagu k\u00f5igis plokiahelates, salvestatakse plokkides, mis lisatakse plokiahelasse ainult siis, kui osalised saavutavad konsensuse, ja p\u00e4rast salvestamist ei saa andmeid m\u00e4rkamatult muuta v\u00f5i eemaldada.<\/p>\n<h2>Hyperledger Fabrici arhitektuur<\/h2>\n<p>\nDiagrammil on kujutatud Hyperledger Fabrici arhitektuur:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisatsioonid <\/b> \u2014 organisatsioonidesse kuuluvad peerid, seega toetavad plokiahelat organisatsioonid. Erinevad organisatsioonid v\u00f5ivad kuuluda \u00fchte kanali.<\/p>\n<p><b>Kanal <\/b> \u2014 loogiline struktuur, mis \u00fchendab peer'e gruppidesse, seega m\u00e4\u00e4ratleb plokiahela. Hyperledger Fabric suudab samal ajal t\u00f6\u00f6delda mitmeid plokiahelaid erineva \u00e4ri loogikaga.<\/p>\n<p><b>Liikmeministeerium (MSP)<\/b> \u2014 see on CA (sertifitseerimisasutus), mis annab identiteete ja m\u00e4\u00e4rab rolle. Noodi loomiseks tuleb suhelda MSP-ga.<\/p>\n<p><b>Peer nodes<\/b> \u2014 kontrollivad tehinguid, salvestavad plokiahelat, t\u00e4idavad nutilepinguid ja suhtlevad rakendustega. Peeridel on identiteet (digitaalne sertifikaat), mille annab v\u00e4lja MSP. Erinevalt Bitcoin v\u00f5i Etheriumi v\u00f5rgust, kus k\u00f5ik nodid on v\u00f5rdsed, m\u00e4ngivad Hyperledger Fabricis nodid erinevaid rolle:<\/p>\n<ul>\n<li>Peer v\u00f5ib olla <b>endorsing peer<\/b> (EP) ja t\u00e4ita nutilepinguid.<\/li>\n<li><b>Committing peer<\/b> (CP) \u2014 salvestavad andmeid plokiahelasse ja uuendavad \"World state\".<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 kui plokiahelas osaleb mitu organisatsiooni, kasutatakse ankur-peer'e nende vaheliseks suhtlemiseks. Igal organisatsioonil peab olema \u00fcks v\u00f5i mitu ankur-peer'i. AP abil v\u00f5ib iga peer organisatsioonis saada teavet k\u00f5igi teiste organisatsioonide peer'ide kohta. Teabe s\u00fcmbioosi saavutamiseks kasutatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip protokolli<\/a><\/noindex>.<\/li>\n<li><b>Leader Peer<\/b> \u2014 kui organisatsioonil on mitu peer'i, siis ainult liider-peer saab blokeerida Ordering service'ist ja edastada neid teistele peer'idele. Liidrit v\u00f5ib m\u00e4\u00e4rata staatiliselt v\u00f5i valida d\u00fcnaamiliselt organisatsioonis olevate peer'ide poolt. Liidrite vahelise teabe s\u00fcnkroniseerimiseks kasutatakse samuti gossip protokolli.<\/li>\n<\/ul>\n<p>\n<b>Assets <\/b> \u2014 v\u00e4\u00e4rtuslikud \u00fcksused, mida hoitakse plokiahelas. Veelgi t\u00e4psemalt \u2014 need on key-value andmed JSON formaadis. Just need andmed salvestatakse plokiahelasse \"Blockchain\". Neil on ajalugu, mida hoitakse plokiahelas ja praegune seisund, mis hoitakse andmebaasis \"World state\". Andmestruktuure t\u00e4iendatakse vastavalt \u00e4rivajadustele. Kohustuslikke v\u00e4lju ei ole, ainus soovitus on, et varadel peab olema omanik ja need peaksid esindama v\u00e4\u00e4rtust. <\/p>\n<p><b>Ledger <\/b> \u2014 koosneb plokiahest \"Blockchain\" ja andmebaasist \"World state\", kus hoitakse varade praegust seisundit. World state kasutab LevelDB v\u00f5i CouchDB.<\/p>\n<p><b>Smart contract<\/b> \u2014 nutilepingute kaudu rakendatakse s\u00fcsteemi \u00e4riloogikat. Hyperledger Fabricis nimetatakse nutilepinguid chaincode'iks. Chaincode'i abil m\u00e4\u00e4ratakse varad ja tehingud nendega. Tehniliselt \u00f6eldes on nutilepingud programmeerimismoodulid, mis on ellu viidud programmeerimiskeeltel JS v\u00f5i Go.<\/p>\n<p><b>Endorsement policy<\/b> \u2014 iga chaincode'i jaoks v\u00f5ib m\u00e4\u00e4rata poliitika, kui palju ja kellelt on vaja tehingu kinnitust. Kui poliitika pole m\u00e4\u00e4ratud, kasutatakse vaikimisi: \"tehingut peab kinnitama iga liikmesorganisatsiooni liige kanalil\". Poliitika n\u00e4idised:<\/p>\n<ul>\n<li>Tehingu peab kinnitama organisatsiooni mis tahes administraator;<\/li>\n<li>Peab kinnitama organisatsiooni mis tahes liige v\u00f5i klient;<\/li>\n<li>Peab kinnitama organisatsiooni mis tahes peer.<\/li>\n<\/ul>\n<p>\n<b>Tellimisteenus<\/b> \u2014 pakib tehingud plokkidesse ja saadab need peer-idele kanalis. Tagab s\u00f5numite edastamise k\u00f5ikidele peer-idele v\u00f5rgus. T\u00f6\u00f6stuslike s\u00fcsteemide jaoks kasutatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">Kafka s\u00f5numite maaklerit<\/a><\/noindex>, arendamiseks ja testimiseks <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=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Rakendus suhtleb Hyperledger Fabric'iga, kasutades Go, Node.js v\u00f5i Java SDK-d;<\/li>\n<li>Kliendil on tehingu tx ja saadab selle endorseerimise peer-idele;<\/li>\n<li>Peer kontrollib kliendi allkirja, viib tehingu l\u00e4bi ja saadab tagasi endorsement signature kliendile. Chaincode viiakse l\u00e4bi ainult endorseerimise peer-ides ning selle t\u00e4itmise tulemus saadetakse k\u00f5igile peer-idele. Sellist t\u00f6\u00f6meetodit nimetatakse \u2014 PBFT (Practical Byzantine Fault Tolerant) konsensus. Erineb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassikalisest BFT-st<\/a><\/noindex> selle poolest, et s\u00f5num saadetakse ja oodatakse kinnitamist mitte k\u00f5igilt osalejatelt, vaid ainult kindlast kogumist;<\/li>\n<li>P\u00e4rast seda, kui klient on saanud vastuste arvu, mis vastab endorsement policy-le, saadab ta tehingu tellimisteenusele;<\/li>\n<li>Tellimisteenus koostab ploki ja saadab selle k\u00f5ikidele kaasaskantavatele peer-idele. Tellimisteenus tagab plokkide j\u00e4rjekindla kirjutamise, mis v\u00e4listab nn raamatupidamise fork'i (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">vt jaotist \"Forkid\"<\/a><\/noindex>);<\/li>\n<li>Peer-id saavad ploki, kontrollivad veelkord endorsement policy-d, kirjutavad ploki plokiahelasse ja muudavad olekut \"World state\" andmebaasis.<\/li>\n<\/ul>\n<p>\nSee t\u00e4hendab, et node'de vahel toimub rollide jagamine. See tagab plokiahela skaleeritavuse ja turvalisuse:<\/p>\n<ul>\n<li>Nutikaid lepinguid (chaincode) viivad l\u00e4bi endorseerimise peer-id. See tagab nutikate lepingute konfidentsiaalsuse, kuna need ei ole k\u00f5igi osalejate, vaid ainult endorseerimise peer-ide valduses.<\/li>\n<li>Tellimine peab toimuma kiiresti. See tagatakse sellega, et tellimine koostab ainult ploki ja saadab selle kindlale juhiv\u00f5rgustikule.<\/li>\n<li>Kaasaskantavad peer-id ainult hoiavad plokiahelat \u2014 neid v\u00f5ib olla palju ja nad ei vaja suurt v\u00f5imsust ega kohest t\u00f6\u00f6d. <\/li>\n<\/ul>\n<p>\nRohkem Hyperledger Fabric'i arhitektuurilahenduste kohta ja miks see t\u00f6\u00f6tab nii, mitte teisiti, saab vaadata siit: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architektuuri originaalid<\/a><\/noindex> v\u00f5i siit: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: jaotatud operatsioonis\u00fcsteem lubatud plokiahelate jaoks<\/a><\/noindex>.<\/p>\n<p>Seega, Hyperledger Fabric on t\u00f5eliselt universaalne s\u00fcsteem, millega saab:<\/p>\n<ul>\n<li>Reaaliseerida igasugust \u00e4riloogikat, kasutades nutikate lepingute mehhanismi;<\/li>\n<li>Salvestame ja saame andmeid plokiahela andmebaasist JSON formaadis;<\/li>\n<li>Pakume ja kontrollime API-le ligip\u00e4\u00e4su, kasutades sertifikaadi ametit. <\/li>\n<\/ul>\n<p>\nN\u00fc\u00fcd, kui oleme natuke paremini tuttavad Hyperledger Fabric spetsiifikaga, laseme l\u00f5puks teha midagi kasulikku!<\/p>\n<h2>K\u00e4ivitame plokiahela<\/h2>\n<p><\/p>\n<h3>\u00dclesande seadmine<\/h3>\n<p>\n\u00dclesanne on luua Citcoin v\u00f5rk, mis sisaldab j\u00e4rgmisi funktsioone: luua konto, saada saldo, t\u00e4iendada kontot, edastada m\u00fcnte \u00fchest kontost teise. Joonistame objekti mudeli, mille me hiljem teeme tarklepingus. Niisiis, meil on kontod, mis tuvastatakse nimede (name) kaudu ja sisaldavad saldo (balance) ning konto loend. Kontod ja konto loend on Hyperledger Fabricis varad (assets). Vastavalt on neil ajalugu ja praegune seisukord. Proovin seda visuaalselt esitada:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dclemised kujundid \u2013 see on praegune seisukord, mis salvestatakse \"World state\" andmebaasi. Allpool on kujundid, mis n\u00e4itavad ajalugu, mis salvestatakse plokiahelasse. Varade praegune seisukord muutub tehingute kaudu. Vara muutub ainult t\u00e4ielikult, seega tehingu teostamise tulemusena luuakse uus objekt ja vara praegune v\u00e4\u00e4rtus l\u00e4heb ajalukku. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nLoome konto <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM Cloudis<\/a><\/noindex>. Plokiahela platvormi kasutamiseks tuleb see uuendada Pay-As-You-Go versiooniks. See protsess ei pruugi olla kiire, kuna IBM k\u00fcsib t\u00e4iendavat teavet ja kontrollib seda k\u00e4sitsi. Positiivse k\u00fclje pealt v\u00f5in \u00f6elda, et IBM-l on head \u00f5ppematerjalid, mis v\u00f5imaldavad Hyperledger Fabricit nende pilves k\u00e4ivitada. Mulle meeldis j\u00e4rgmine artiklite ja n\u00e4idete ts\u00fckkel:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Loo p\u00f5hiline plokiahela v\u00f5rk, kasutades plokiahela platvormi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Looge ja k\u00e4ivitage plokiahela tarkleping<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Emiteerige s\u00fcndmusi plokiahela platvormilt<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nJ\u00e4rgnevalt on toodud ekraanipildid IBM plokiahela platvormist. See ei ole juhend plokiahela loomise kohta, vaid lihtsalt \u00fclesande ulatuse demonstreerimine. Niisiis, meie vajaduste j\u00e4rgi loome \u00fche organisatsiooni:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLoome selles s\u00f5lmed: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLoome kasutajad:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLooge kanali ja nimetage see citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00f5him\u00f5tteliselt on kanal plokiahel, seega algab see nullbloki (Genesis block) l\u00f5petamisest:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kirjutame tarklepingut<\/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>\nSiin peaks k\u00f5ik intuitiivselt selge olema:<\/p>\n<ul>\n<li>On mitu funktsiooni (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), mida demo program kasutab Hyperledger Fabric API abil.<\/li>\n<li>Funktsioonid SendFrom ja RefillBalance genereerivad s\u00fcndmusi (Event), mida demo programm saab.<\/li>\n<li>Funktsioon instantiate kutsutakse v\u00e4lja ainult \u00fcks kord nutika lepingu instantiimise ajal. Tegelikult kutsutakse seda v\u00e4lja mitte ainult \u00fcks kord, vaid iga kord nutika lepingu versiooni muutmisel. Seet\u00f5ttu on loetelu algse t\u00fchi massiiv - halb idee, kuna n\u00fc\u00fcd kaotame nutika lepingu versiooni muutmisel praeguse loendi. Kuid see pole probleem, ma alles \u00f5ppin).<\/li>\n<li>Account'id ja account'ide (accounts) loend - need on JSON andmestruktuurid. Andmete manipuleerimiseks kasutatakse JS-i.<\/li>\n<li>K\u00e4esoleva asset'i praeguse v\u00e4\u00e4rtuse saab k\u00e4tte funktsiooni getState kaudu, samas kui seadistamiseks kasutatakse putState'i.<\/li>\n<li>Account'i loomisel kutsutakse v\u00e4lja funktsioon AddAccount, kus v\u00f5rreldakse plokiahelas maksimaalselt lubatud account'ide arvu (maxAccounts = 5). Siin on viga (kas m\u00e4rkisite?), mis p\u00f5hjustab account'ide arvukuse l\u00f5putu kasvu. Selliseid vigu tuleks v\u00e4ltida).<\/li>\n<\/ul>\n<p>\nEdasi laadime nutika lepingu Channelisse ja instantiime selle:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVaadake nutika lepingu seadistamise tehingut:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVaadake meie Channeli \u00fcksikasju:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTulemusena saame j\u00e4rgmise plokiahela v\u00f5rgu skeemi IBM-i pilves. Skeemil on ka demoprogramm, mis t\u00f6\u00f6tab Amazoni pilves virtuaalsel serveril (\u00fcksikasjad on j\u00e4rgmises osas):<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>GUI loomine Hyperledger Fabric API kutsumiste jaoks<\/h2>\n<p>\nHyperledger Fabric'il on API, mida saab kasutada:<\/p>\n<ul>\n<li>Channeli loomiseks;<\/li>\n<li>Peer'i \u00fchendamiseks channeliga;<\/li>\n<li>Nutika lepingu seadistamiseks ja instantiimiseks channelis;<\/li>\n<li>Tehingute nn kutse jaoks;<\/li>\n<li>Informatsiooni k\u00fcsimiseks plokiahelas.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Rakenduse arendus<\/h3>\n<p>\nMeie demoprogrammis kavatseme kasutada API-d ainult tehingute kutsumiseks ja informatsiooni k\u00fcsimiseks, kuna \u00fclej\u00e4\u00e4nud sammud oleme juba teinud, kasutades IBM-i plokiahela platvormi. Kirjutame GUI, kasutades standardset tehnoloogiate virna: Express.js + Vue.js + Node.js. Kuidas alustada kaasaegsete veebirakenduste loomist, v\u00f5iks kirjutada eraldi artikli. Siin j\u00e4tan lingi loengusarjale, mis mulle enim meeldis: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Tulemusena sai kliendi-serveri rakendus tuttava Material Design stiilis graafilise liidese. REST API kliendi ja serveri vahel koosneb mitmest kutsetest:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init - plokiahela initsialiseerimine;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list - saada k\u00f5igi account'ide loend;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 - luua Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob - saada teavet Bob account'i kohta;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 - edastada kaks m\u00fcnti Bobilt Alicele;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 lukusta blockchaini \u00fchendus.<\/li>\n<\/ul>\n<p>\nAPI kirjeldus koos n\u00e4idetega on pandud<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> \u00abPostman\u00bb site'ile<\/a><\/noindex> \u2014 laialdaselt tuntud programm HTTP API-de testimiseks.<\/p>\n<h3>Demo rakendus Amazonis<\/h3>\n<p>\nRakendus on \u00fcles laaditud Amazonisse, kuna IBM ei ole siiani suutnud uuendada minu kontot ning lubada virtuaalserverite loomist. Nagu kirss tordil on domeen: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Hoian serverit natuke sisse l\u00fclitatuna, seej\u00e4rel l\u00fclitan v\u00e4lja, kuna rendihinnad voolavad, aga citcoin m\u00fcntide kauplemine b\u00f6rsil ei ole veel alustatud) Panen artiklisse ekraanipildid, et selgitada rakenduse toimimist. Demo rakendus oskab:<\/p>\n<ul>\n<li>Alustada blockchaini;<\/li>\n<li>Luua Konto (aga praegu ei saa uut Kontot luua, kuna blockchainis on saavutatud maksimaalne number kontosid, mis on m\u00e4\u00e4ratud nutilepingus);<\/li>\n<li>Saada Kontode nimekiri;<\/li>\n<li>Edastada citcoin m\u00fcnte Alice'i, Bob'i ja Alexi vahel;<\/li>\n<li>Saada s\u00fcndmusi (aga hetkel ei saa s\u00fcndmusi n\u00e4idata, seega on kasutajaliideses lihtsuse huvides kirjutatud, et s\u00fcndmusi ei toetata);<\/li>\n<li>Logida tegevusi.<\/li>\n<\/ul>\n<p>\nEsiteks alustame blockchaini:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeej\u00e4rel loome oma konto, ei kisenda saldo \u00fcle:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaame nimekirja k\u00f5ikidest saadaval olevatest kontodest:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nValime saatja ja saaja, saame nende saldode: Kui saatja ja saaja on \u00fcks ja sama, toimub tema konto t\u00e4iendamine:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLogis j\u00e4lgime tehingute t\u00e4itmist:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuna demo programm sellega ka l\u00f5ppeb. Edasi saab vaadata meie tehingut blockchainis:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa kogu tehingute loend:<\/p>\n<p><img decoding=\"async\" alt=\"Plokiahel: mida me peame PoC\u2019i loomiseks?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelleks saime edukalt l\u00f5petatud Citcoini v\u00f5rgu PoC rakendamise. Mida on veel vaja teha, et Citcoinist saaks t\u00e4ie\u00f5iguslik m\u00fcnte \u00fclekandmise v\u00f5rk? Ainult v\u00e4he:<\/p>\n<ul>\n<li>Konto loomise etapis rakendada privaatse \/ avaliku v\u00f5tme genereerimist. Privaatv\u00f5ti peab olema kontoa kasutaja k\u00e4es, avalik v\u00f5tme blockchainis.<\/li>\n<li>Teha m\u00fcns\u00fc transfer, kus kasutaja identifitseerimiseks kasutatakse mitte nime, vaid avalikku v\u00f5tme.<\/li>\n<li>Kr\u00fcpteerida tehingud, mis l\u00e4hevad kasutajalt serverisse tema privaatse v\u00f5tme abil.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokkuv\u00f5te <\/h2>\n<p>\nOleme rakendanud Citcoin v\u00f5rku funktsioonidega: konto lisamine, saldo saamine, oma konto t\u00e4iendamine, m\u00fcnte edastamine \u00fchelt konto teisele. Nii et, mida maksis PoC ehitamine?<\/p>\n<ul>\n<li>Peame uurima blockchaini \u00fcldiselt ja Hyperledger Fabric'i eriti;<\/li>\n<li>\u00d5ppima kasutama IBM'i v\u00f5i Amazoni pilvi;<\/li>\n<li>\u00d5ppima programmeerimiskeelt JS ja m\u00f5nda veebiraamistikku;<\/li>\n<li>Kui m\u00f5nda teavet tuleb hoida mitte plokiahelas, vaid eraldi andmebaasis, tuleks \u00f5ppida n\u00e4iteks PostgreSQL-iga integreerima;<\/li>\n<li>Ja viimane nimekirjas, kuid mitte v\u00e4henenud t\u00e4htsusega \u2014 ilma Linuxi tundmiseta ei p\u00e4\u00e4se t\u00e4nap\u00e4eva maailmas kuhugi!)<\/li>\n<\/ul>\n<p>\nMuidugi, see ei ole raketiteadus, aga veidi tuleb vaeva n\u00e4ha!<\/p>\n<h3>Allikakood GitHubis<\/h3>\n<p>\nAllikaid olen pannud <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. L\u00fchike kirjeldus repodega:<br \/>\nKataloog &#171;<b>server<\/b>&#187; \u2014 Node.js server<br \/>\nKataloog &#171;<b>client<\/b>&#187; \u2014 Node.js klient<br \/>\nKataloog &#171;<b>blockchain<\/b>&#187; (parameetrite v\u00e4\u00e4rtused ja v\u00f5tmed on loomulikult mitte t\u00f6\u00f6kindlad ja on toodud ainult n\u00e4itena):<\/p>\n<ul>\n<li>contract \u2014 nutilepingu allikas<\/li>\n<li>wallet \u2014 kasutaja v\u00f5tmed Hyperledger Fabric API kasutamiseks. <\/li>\n<li>*.cds \u2014 kompileeritud versioonid nutilepingutest<\/li>\n<li>*.json failid \u2014 n\u00e4ited konfiguratsioonifailidest Hyperledger Fabric API kasutamiseks<\/li>\n<\/ul>\n<p>\n<b>See on alles algus!<\/b><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466157\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c?) \u0438 \u043a\u0435\u0439\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043a\u0435\u0439\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c?). \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438! \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0438\u043b\u043e\u0442\u043e\u0432 \u0438 PoC (Proof of Concept) \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430, \u0442.\u043a. \u043a \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28421,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37868","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f, \u0430 \u0440\u0443\u043a\u0438 \u0447\u0435\u0448\u0443\u0442\u0441\u044f! \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u044b (\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Blokeerimine: mida meil on PoC ehitamiseks tarvis? | ProHoster","description":"Silmad kardavad, aga k\u00e4ed s\u00fcgelevad! Eelmistes artiklites selgitasime tehnoloogiaid, millele plokiahelad toetuvad (Mida me peame blokkahelat teadma.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}