{"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":"Blockchain: what does it take to build a PoC?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Silmad kardavad, aga k\u00e4ed s\u00fcgelevad!<\/i><\/p>\n<p>Eelmistes artiklites k\u00e4sitlesime tehnoloogiaid, millel plokiahelad p\u00f5hinevad (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Mis meil maksab plokiahela \u00fclesehitamine?<\/a><\/noindex>) ja juhtumeid, mida nende abil ellu viia (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Mida on vaja juhtumi loomiseks?<\/a><\/noindex>). On aeg hakata k\u00e4t t\u00f6\u00f6le panema! Pilootide ja PoC (t\u00f5estus kontseptsioonist) elluviimiseks eelistan kasutada pilveteenuseid, kuna neile p\u00e4\u00e4seb juurde igast maailma nurgast ning tihti ei pea kulutama aega t\u00fc\u00fctule keskkonna seadistamisele, kuna on olemas eelnevalt seadistatud konfiguratsioonid. Alustame lihtsa asjaga, n\u00e4iteks v\u00f5rguga, et saata m\u00fcnte osalejate vahel ning nimetame seda tagasihoidlikult Citooniks. Selleks kasutame IBM-i pilve ja universaalset plokiahelat Hyperledger Fabric. Esiteks, miks nimetatakse Hyperledger Fabricit universaalseks plokiahelaks?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a 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 universaalne plokiahel<\/h2>\n<p>\n\u00dcldiselt \u00f6eldes on universaalne teabehalduse s\u00fcsteem:<\/p>\n<ul>\n<li>Serverite kogum ja tarkvaratuum, mis teostab \u00e4riloogikat;<\/li>\n<li>Liidesed s\u00fcsteemiga suhtlemiseks;<\/li>\n<li>Seadmete\/inimeste registreerimise, autentimise ja autoriseerimise vahendid;<\/li>\n<li>Andmebaas, mis salvestab operatiivseid ja arhiivandmeid:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAmetlikku versiooni sellest, mis on Hyperledger Fabric, saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">veebilehel<\/a><\/noindex>, ja l\u00fchidalt \u00f6eldes on Hyperledger Fabric avatud l\u00e4htekoodiga platvorm, mis v\u00f5imaldab luua erablokke ja teostada mis tahes nutikaid lepinguid, mis on kirjutatud programmeerimiskeeltes JS ja Go. Vaadakem l\u00e4hemalt Hyperledger Fabric'i arhitektuuri ja veendugem, et see on universaalne s\u00fcsteem, millel on vaid spetsiifilised andmete salvestamise ja kirjutamise omadused. Spetsiifilisus seisneb selles, et andmed, nagu k\u00f5igis blokeeringutes, salvestatakse blokkidesse, mis lisatakse plokiahelasse ainult siis, kui osalejad on j\u00f5udnud konsensusele, ja p\u00e4rast salvestamist ei saa andmeid m\u00e4rkamatult muuta ega kustutada.<\/p>\n<h2>Hyperledger Fabric'i arhitektuur<\/h2>\n<p>\nDiagrammil on n\u00e4idatud Hyperledger Fabric'i arhitektuur:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organisatsioonid <\/b> \u2014 organisatsioonid sisaldavad peer'e, seega eksisteerib plokiahel organisatsioonide toetuse t\u00f5ttu. Erinevad organisatsioonid v\u00f5ivad kuuluda \u00fchte kanalisse.<\/p>\n<p><b>Kanal <\/b> \u2014 loogiline struktuur, mis \u00fchendab peer'e gruppidesse, seega m\u00e4\u00e4ratleb see plokiahela. Hyperledger Fabric suudab samal ajal t\u00f6\u00f6delda mitut plokiahelat erineva \u00e4ri loogikaga.<\/p>\n<p><b>Liikmesuse teenuste pakkuja (MSP)<\/b> \u2014 on CA (Certificate Authority) identiteedi v\u00e4ljastamiseks ja rollide m\u00e4\u00e4ramiseks. Nodede loomiseks tuleb suhelda MSP-ga.<\/p>\n<p><b>Peer nodid<\/b> \u2014 kontrollivad tehinguid, salvestavad plokiahelat, t\u00e4idavad nutilepinguid ja suhtlevad rakendustega. Peeridel on identiteet (digitaalne sertifikaat), mille v\u00e4ljastab 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) \u2013 salvestavad ainult andmeid plokiahelas ja ajakohastavad 'World state'.<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2013 kui plokiahelas osaleb mitu organisatsiooni, siis kasutatakse ankur peer-e omavaheliseks \u00fchendamiseks. Iga organisatsioon peaks omama \u00fchte v\u00f5i mitut ankur peer-i. AP kaudu saab iga peer organisatsioonis teavet k\u00f5ikide peer-ide kohta teistes organisatsioonides. AP-de vahelise teabe s\u00fcnkroniseerimiseks 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 juhtpeer saab blokke Ordering service'ilt ja jagab neid teiste peer'ide hulka. Juht v\u00f5ib olla m\u00e4\u00e4ratud staatiliselt v\u00f5i valida d\u00fcnaamiliselt peer'ide seas organisatsioonis. Infovahetuseks juhtide \u00fcle kasutatakse samuti gossip protokolli.<\/li>\n<\/ul>\n<p>\n<b>Varad <\/b> \u2014 v\u00e4\u00e4rtuslikud \u00fcksused, mida hoitakse plokiahelas. T\u00e4psemalt on need key-value andmed JSON formaadis. Just need andmed salvestatakse plokiahelasse \u201eBlockchain\u201d. Neil on ajalugu, mis salvestatakse plokiahelas, ja hetke seis, mis salvestatakse andmebaasis \u201eWorld state\u201d. Andmestruktuurid t\u00e4idetakse vastavalt \u00e4ri\u00fclesannetele. Kohustuslikke v\u00e4lju ei ole, ainus soovitus on, et varadel peaks olema omanik ja need peaksid omama v\u00e4\u00e4rtust. <\/p>\n<p><b>Raamatupidamine <\/b> \u2014 koosneb plokiahest \u201eBlockchain\u201d ja andmebaasist \u201eWorld state\u201d, kus hoitakse varade hetke seise. World state kasutab LevelDB-d v\u00f5i CouchDB-d.<\/p>\n<p><b>Nutileping<\/b> \u2014 \u00e4riga smartlepingute abil rakendatakse s\u00fcsteemi \u00e4ri loogikat. Hyperledger Fabricis nimetatakse smartlepinguid chaincode'iks. Chaincode abil m\u00e4\u00e4ratakse varad ja nendega seotud tehingud. Tehniliselt \u00f6eldes on smartlepingud programmimoodulid, mis on kirjutatud programmeerimiskeeltes JS v\u00f5i Go.<\/p>\n<p><b>Kinnituspolitika<\/b> \u2014 iga chaincode jaoks saab m\u00e4\u00e4rata poliitikad, kui palju ja kellelt tuleb tehingu kinnitusi oodata. Kui poliitikat ei ole m\u00e4\u00e4ratud, kasutatakse vaikimisi: \u201etehingu peab kinnitama \u00fcksk\u00f5ik milline liige (member) \u00fcksk\u00f5ik millisest organisatsioonist kanalil (channel).\u201d N\u00e4iteid poliitikatest:<\/p>\n<ul>\n<li>Tehingu peab kinnitama igasugune organisatsiooni administraator;<\/li>\n<li>Peab kinnitama iga liige (member) v\u00f5i organisatsiooni klient;<\/li>\n<li>Peab kinnitama iga organisatsiooni peer.<\/li>\n<\/ul>\n<p>\n<b>Tellimisteenus<\/b> \u2014 pakib tehingud plokkidesse ja saadab need peer'idele kanalisse. Tagab s\u00f5numite saatmise k\u00f5igile v\u00f5rgus olevatele peer'idele. T\u00f6\u00f6stuslikes s\u00fcsteemides kasutatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">Kafka s\u00f5numivahendajat<\/a><\/noindex>, arenduseks 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=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Rakendus suhtleb Hyperledger Fabriciga, kasutades Go, Node.js v\u00f5i Java SDK;<\/li>\n<li>Kliendil on tehing tx ja ta saadab selle kinnitavatele peer'idele;<\/li>\n<li>Peer kontrollib kliendi allkirja, viib tehingu l\u00e4bi ja saadab endorsement signature kliendile tagasi. Chaincode t\u00f6\u00f6tab ainult endorsing peer'il ja selle t\u00e4itmise tulemus edastatakse k\u00f5ikidele peer'idele. See t\u00f6\u00f6mehanism on tuntud kui PBFT (Practical Byzantine Fault Tolerant) konsensus. See erineb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klassikalisest BFT<\/a><\/noindex> selle poolest, et s\u00f5num saadetakse ja oodatakse kinnitust mitte k\u00f5igilt osalistelt, vaid ainult kindlast hulgast;<\/li>\n<li>P\u00e4rast seda, kui klient on saanud vastuseid, mis vastavad endorsement policy'le, saadab ta tehingu Ordering service'ile;<\/li>\n<li>Ordering service koostab ploki ja saadab selle k\u00f5ikidele committing peer'idele. Ordering service tagab plokkide j\u00e4rjestikuse salvestamise, mis v\u00e4listab nn ledger fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">vt jaotist \u201eForkid\u201d<\/a><\/noindex>);<\/li>\n<li>Peer'id saavad ploki, kontrollivad uuesti endorsement policy't, salvestavad ploki plokiahelasse ja muudavad seisundit \u201eWorld state\u201d DB-s.<\/li>\n<\/ul>\n<p>\nSt. see tagab rollide jagamise s\u00f5lmepunktide vahel. See v\u00f5imaldab skalaarida ja suurendada plokiahela turvalisust:<\/p>\n<ul>\n<li>Nutilepingud (chaincode) t\u00e4idavad endorsing peer'id. See tagab nutilepingute konfidentsiaalsuse, kuna need ei ole k\u00f5ikide osalejate juures, vaid ainult endorsing peer'idel.<\/li>\n<li>Tellimus peab toimuma kiiresti. Seda tagab asjaolu, et tellimus loob ainult plokki ja saadab selle kindlale rikkapeeride kogumile.<\/li>\n<li>Kohustavad peers lihtsalt hoiavad plokiahelat \u2014 neid v\u00f5ib olla palju ja nad ei n\u00f5ua suurt v\u00f5imsust ega kiiret toimimist. <\/li>\n<\/ul>\n<p>\n\u00dcksikasjalikumalt arhitektuuri lahendustest Hyperledger Fabric ja miks see t\u00f6\u00f6tab just nii, saab vaadata siit: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Arhitektuuri algused<\/a><\/noindex> v\u00f5i sealt: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: jaotatud ops\u00fcsteem privileege saanud plokiahelatele<\/a><\/noindex>.<\/p>\n<p>Nii et Hyperledger Fabric on t\u00f5eliselt universaalne s\u00fcsteem, mille abil saab:<\/p>\n<ul>\n<li>Rakendada suvalist \u00e4riloogikat, kasutades nutikate lepingute mehhanismi;<\/li>\n<li>Salvestada ja saada andmeid plokiahela andmebaasist JSON-formaadis;<\/li>\n<li>Osutada ja kontrollida ligip\u00e4\u00e4su API-le, kasutades sertifitseerimisasutust. <\/li>\n<\/ul>\n<p>\nN\u00fc\u00fcd, kui oleme veidi tutvunud Hyperledger Fabric erip\u00e4radega, teeme l\u00f5puks midagi kasulikku!<\/p>\n<h2>Seame \u00fcles plokiahela<\/h2>\n<p><\/p>\n<h3>\u00dclesande seadmine<\/h3>\n<p>\n\u00dclesanne on luua Citcoin v\u00f5rk j\u00e4rgmiste funktsioonidega: konto loomine, saldo saamine, konto t\u00e4iendamine ja m\u00fcntide \u00fclekandmine \u00fchest kontost teise. Joonistame objekti mudeli, mille hiljem rakendame nutilepingus. Seega on meil kontod, mida tuvastatakse nimede (name) ja mis sisaldavad saldo (balance) ning konto loend. Kontod ja konto loend on Hyperledger Fabric'i m\u00f5istes varad (assets). Vastavalt on neil ajalugu ja hetkeolek. Proovin seda visuaalselt illustreerida:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dclemised kujundid on hetkeolek, mis on salvestatud andmebaasi \u201eWorld state\u201c. Allpool on kujundid, mis n\u00e4itavad ajalugu, mis salvestatakse plokiahelas. Varade hetkeolekut muudetakse tehingute kaudu. Vara muutub ainult tervikuna, seega tehingu t\u00e4itmise tulemusena luuakse uus objekt ja vara hetkev\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 Cloude<\/a><\/noindex>. Ettev\u00f5tte blockchain platvormi kasutamiseks tuleb seda uuendada Pay-As-You-Go mudelile. See protsess v\u00f5ib olla ajamahukas, kuna IBM k\u00fcsib lisainfot ja kontrollib seda k\u00e4sitsi. Positiivse poole pealt v\u00f5in \u00f6elda, et IBM-il on head \u00f5pikurid, mis aitavad Hyperledger Fabricit nende pilves k\u00e4ivitada. Mulle meeldis j\u00e4rgmine artikkel ja n\u00e4idisprotsesside 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 blockchain v\u00f5rgu kasutades Blockchain platvormi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Loo ja t\u00e4ida blockchain nutileping<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Emit events from Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nJ\u00e4rgnevalt tuuakse v\u00e4lja IBM Blockchain platvormi ekraanipildid. See pole juhend blockchain'i loomise kohta, vaid lihtsalt \u00fclesande ulatuse n\u00e4itamine. Nii et meie eesm\u00e4rkide jaoks loome \u00fche organisatsiooni:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelle alla loome s\u00f5lmed: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" 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=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLoo kanal ja nimeta see citcoiniks:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSisuliselt on kanal blockchain, seega algab see nullplokist (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kirjuta nutileping<\/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>\nIntuitiivselt peaks siin k\u00f5ik selge olema:<\/p>\n<ul>\n<li>On mitu funktsiooni (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), mida demoprogramm kutsub Hyperledger Fabric API kaudu.<\/li>\n<li>Funktsioonid SendFrom ja RefillBalance genereerivad s\u00fcndmusi (Event), mida demoprogramm saab.<\/li>\n<li>instantiate funktsioon k\u00e4ivitatakse \u00fcks kord nutilepingu instantsimise ajal. Tegelikult k\u00e4ivitatakse see mitte \u00fche, vaid iga kord, kui nutilepingut muudetakse. Seega on loetelu algv\u00e4\u00e4rtustamine t\u00fchi massiiv \u2014 halb m\u00f5te, sest n\u00fc\u00fcd, kui nutilepingut uuendatakse, kaotame me praeguse loendi. Aga pole hullu, ma alles \u00f5pin).<\/li>\n<li>Account-id ja account-ide (accounts) loend on JSON andmestruktuurid. Andmete manipuleerimiseks kasutatakse JS-i.<\/li>\n<li>V\u00f5ite praeguse asset-i v\u00e4\u00e4rtuse saada, kasutades funktsiooni getState, ja uuendada seda funktsiooniga putState.<\/li>\n<li>Account-i loomisel k\u00e4ivitatakse funktsioon AddAccount, kus v\u00f5rreldakse blockchainis maksimaalset account-ide arvu (maxAccounts = 5). Ja siin on aps (kas m\u00e4rkate?), mis viib account-ide arvu l\u00f5pmatu kasvu. Selliseid vigu tuleks v\u00e4ltida).<\/li>\n<\/ul>\n<p>\nSeej\u00e4rel laadime nutilepingut Channelisse ja instantsime selle:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVaadake Smart Contracti seadistamise tehingut:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" 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=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaame j\u00e4rgmise plaani IBM-i pilve blockchaini v\u00f5rgust. Skeemil on samuti demo programm, mis t\u00f6\u00f6tab Amazonis virtuaalses serveris (\u00fcksikasjad on j\u00e4rgmises peat\u00fckis):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>GUI loomine Hyperledger Fabric API kutseteks<\/h2>\n<p>\nHyperledger Fabric'il on API, mida saab kasutada:<\/p>\n<ul>\n<li>kanali loomiseks;<\/li>\n<li>peer'i \u00fchendamiseks kanaliga;<\/li>\n<li>tarkade lepingute seadistamiseks ja instantsimiseks kanalil;<\/li>\n<li>tehingute kutsumiseks;<\/li>\n<li>informatsiooni p\u00e4rimiseks blockchainis.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Rakenduse arendamine<\/h3>\n<p>\nKasutame meie demo programmis API-d ainult tehingute kutsmiseks ja informatsiooni p\u00e4rimiseks, kuna k\u00f5ik muud sammud on juba tehtud, kasutades IBM-i blockchain platvormi. Loome GUI, kasutades standardt\u00f6\u00f6tleja tehnoloogiaid: Express.js + Vue.js + Node.js. Kuidas alustada t\u00e4nap\u00e4evaste veebirakenduste loomist v\u00f5ib kirjutada eraldi artiklis. Siin on link loengute seeriale, mis mulle k\u00f5ige rohkem meeldis: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Tulemuseks on kliendi-serveri rakendus tuttava graafilise liidesega, mis j\u00e4rgib Google'i Material Design'i stiili. REST API kliendi ja serveri vahel koosneb mitmest kutsetest:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 blockchaini initsialiseerimine;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 saada k\u00f5igi kontode nimekiri;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 loo konto Bob;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 saa teavet Bob konto kohta;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 saada kaks m\u00fcnter Bob-ilt Alice'ile;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 katkesta \u00fchendus plokiahelaga.<\/li>\n<\/ul>\n<p>\nAPI kirjeldus koos n\u00e4idetega on saadaval<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> veebilehel \"Postman\"<\/a><\/noindex> \u2014 laialdaselt tuntud programm HTTP API testimiseks.<\/p>\n<h3>Demorakendus Amazonis<\/h3>\n<p>\nOlen rakenduse \u00fcles laadinud Amazonile, kuna IBM pole siiani suudnud minu kontot uuendada ja lubada virtuaalsete serverite loomist. Nagu kirsiks tordil, lisasin domeeni: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Hoian serverit natuke sisse l\u00fclitatuna, siis l\u00fclitan v\u00e4lja, kuna renti kajastuvad sendid ja citcoin m\u00fcndid b\u00f6rsil pole veel noteeritud) Artiklis lisasin ekraanipildid demost, et oleks arusaadav t\u00f6\u00f6loogika. Demorakendus saab:<\/p>\n<ul>\n<li>Algatada plokiahela;<\/li>\n<li>Luua konto (kuid praegu uut kontot luua ei saa, kuna plokiahelas on saavutatud maksimaalne arvu kontosid, mis on m\u00e4\u00e4ratud nutilepingus);<\/li>\n<li>Saada konto nimekiri;<\/li>\n<li>\u00dcle kanda citcoin m\u00fcnte Alice, Bobi ja Alexi vahel;<\/li>\n<li>Saada s\u00fcndmusi (aga hetkel ei saa s\u00fcndmusi mingil moel n\u00e4idata, seega on liideses lihtsuse huvides kirjas, et s\u00fcndmusi ei toetata);<\/li>\n<li>Logige tegevused.<\/li>\n<\/ul>\n<p>\nEsialgu initsialiseerime plokiahela:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeej\u00e4rel loome oma konto, mitte ei h\u00f5lma p\u00f5hjaga:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaame k\u00f5ikide saadaval olevate kontode loendi:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nValime saatja ja saaja, saame nende bilansid. Kui saatja ja saaja on sama, siis toimub tema konto t\u00e4iendamine:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" 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=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDemoprogrammiga on see k\u00f5ik. J\u00e4rgmine samm on meie tehingu vaatamine plokiahelas:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa tehingute \u00fcldine nimekiri:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: what does it take to build a PoC?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSellega oleme edukalt l\u00f5petanud Citcoin v\u00f5rgu PoC rakendamise. Mida veel on vaja teha, et Citcoinist saaks t\u00e4ie\u00f5iguslik m\u00fcntide \u00fclekandmise v\u00f5rk? V\u00e4ga v\u00e4he:<\/p>\n<ul>\n<li>Konto loomise etapis rakendada privaatse\/publikus v\u00f5ti genereerimist. Privaatne v\u00f5ti peab olema kasutaja kontol, publiku plokiahelas.<\/li>\n<li>Teha m\u00fcntide \u00fclekandmine, kus kasutaja tuvastamiseks kasutatakse mitte nime, vaid publikust v\u00f5tit.<\/li>\n<li>Kr\u00fcpteerida tehingud, mis l\u00e4hevad kasutajalt serverisse, tema privaatse v\u00f5tmega.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokkuv\u00f5te <\/h2>\n<p>\nMeie oleme loonud Citcoin v\u00f5rgu funktsioonidega: konto lisamine, saldo saamine, oma kontot t\u00e4iendamine, m\u00fcntide edastamine \u00fchest kontost teise. Nii et mis maksis meile PoC ehitamine?<\/p>\n<ul>\n<li>Tuleb uurida plokiahelat \u00fcldiselt ja Hyperledger Fabric'i eriti;<\/li>\n<li>\u00d5ppida kasutama IBM v\u00f5i Amazoni pilvi;<\/li>\n<li>Selgeks saada programmeerimiskeel JS ja m\u00f5ni veebiraamistik;<\/li>\n<li>Kui mingid andmed tuleb salvestada mitte plokiahelasse, vaid eraldi andmebaasi, siis \u00f5ppida integreeruma n\u00e4iteks PostgreSQL-iga;<\/li>\n<li>Ja viimane, kuid mitte v\u00e4hem oluline \u2014 ilma Linuxi tundmisega ei p\u00e4\u00e4se t\u00e4nap\u00e4eva maailmas kuhugi!)<\/li>\n<\/ul>\n<p>\nMuidugi, ei ole see just rocket science, aga higi tuleb valada!<\/p>\n<h3>Allikakoode GitHubis<\/h3>\n<p>\nAllikakoode olen pannud <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. L\u00fchikirjeldus hoidlast:<br \/>\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 &#171;<b>server<\/b>&#187; \u2014 Node.js \u0441\u0435\u0440\u0432\u0435\u0440<br \/>\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 &#171;<b>client<\/b>&#187; \u2014 Node.js \u043a\u043b\u0438\u0435\u043d\u0442<br \/>\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 &#171;<b>plokiahel<\/b>&#187; (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0438, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430):<\/p>\n<ul>\n<li>contract \u2014 nutilepingute algfail<\/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\u00e4idised konfiguratsioonifailidest Hyperledger Fabric API kasutamiseks<\/li>\n<\/ul>\n<p>\n<b>It&#8217;s only the beginning!<\/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.0.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 \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\" \/>\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.0.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 \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\" \/>\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\udd47Plokiahel: mis on meil vaja PoC loomiseks? | ProHoster","description":"Silmad kardavad, aga k\u00e4ed s\u00fcgelevad! Eelmistes artiklites k\u00e4sitlesime tehnoloogiaid, millele plokiahelad toetuvad (Mis on plokiahela ehitamine?) ja juhtumeid, mida nende abil ellu viia (Mis on juhtumi loomine?). N\u00fc\u00fcd on aeg hakata k\u00e4tega t\u00f6\u00f6tama! Pilootide ja PoC (Proof of Concept) rakendamiseks eelistan kasutada pilveteenuseid, kuna neile on juurdep\u00e4\u00e4s.","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 \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","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}]}}