{"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\/sk\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>O\u010di sa boja\u017eia, ale ruky svrbia!<\/i><\/p>\n<p>V predch\u00e1dzaj\u00facich \u010dl\u00e1nkoch sme sa zaoberali technol\u00f3giami, na ktor\u00fdch s\u00fa postaven\u00e9 blockchainy (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">\u010co n\u00e1m stoj\u00ed postavi\u0165 blockchain?<\/a><\/noindex>) a pr\u00edpadmi, ktor\u00e9 je mo\u017en\u00e9 s ich pomocou realizova\u0165 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Ak\u00e9 je na\u0161ou \u00falohou postavi\u0165 pr\u00edpad?<\/a><\/noindex>). Pri\u0161iel \u010das zamera\u0165 sa na praktick\u00fa pr\u00e1cu! Na realiz\u00e1ciu pilotn\u00fdch projektov a PoC (Proof of Concept) uprednost\u0148ujem pou\u017e\u00edvanie cloudov\u00fdch slu\u017eieb, preto\u017ee k nim je pr\u00edstup z ktorejko\u013evek \u010dasti sveta a \u010dasto nemus\u00edm tr\u00e1vi\u0165 \u010das nudnou in\u0161tal\u00e1ciou prostredia, preto\u017ee existuj\u00fa predkonfigurovan\u00e9 nastavenia. Tak\u017ee, po\u010fme spravi\u0165 nie\u010do jednoduch\u00e9, napr\u00edklad sie\u0165 na prevod minc\u00ed medzi \u00fa\u010dastn\u00edkmi, a skromne ju nazveme CitiCoin. Na to budeme pou\u017e\u00edva\u0165 cloud od IBM a univerz\u00e1lny blockchain Hyperledger Fabric. Na za\u010diatok sa pozrime, pre\u010do sa Hyperledger Fabric naz\u00fdva univerz\u00e1lnym blockchainom?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" 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 univerz\u00e1lny blockchain<\/h2>\n<p>\nVo v\u0161eobecnosti je univerz\u00e1lna informa\u010dn\u00e1 s\u00fastava:<\/p>\n<ul>\n<li>S\u00fabor serverov a programov\u00e9 jadro, ktor\u00e9 vykon\u00e1va biznis logiku;<\/li>\n<li>Rozhrania na interakciu so syst\u00e9mom;<\/li>\n<li>Prostriedky na registr\u00e1ciu, autentifik\u00e1ciu a autoriz\u00e1ciu zariaden\u00ed \/ \u013eud\u00ed;<\/li>\n<li>D\u00e1tov\u00e1 b\u00e1za, ktor\u00e1 uchov\u00e1va prev\u00e1dzkov\u00e9 a arch\u00edvne d\u00e1ta:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOfici\u00e1lnu verziu toho, \u010do je Hyperledger Fabric, si m\u00f4\u017eete pre\u010d\u00edta\u0165 na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">webe<\/a><\/noindex>, a ak to zhrnieme, Hyperledger Fabric je opensource platforma, ktor\u00e1 umo\u017e\u0148uje vytv\u00e1ra\u0165 uzavret\u00e9 blockchainy a vykon\u00e1va\u0165 libovoln\u00e9 smart kontrakty nap\u00edsan\u00e9 v programovac\u00edch jazykoch JS a Go. Pozrime sa podrobne na architekt\u00faru Hyperledger Fabric a presved\u010dme sa, \u017ee ide o univerz\u00e1lny syst\u00e9m, ktor\u00fd m\u00e1 len \u0161pecifiku v ukladan\u00ed a zapisovan\u00ed d\u00e1t. \u0160pecifikum spo\u010d\u00edva v tom, \u017ee d\u00e1ta, podobne ako vo v\u0161etk\u00fdch blockchainoch, s\u00fa ulo\u017een\u00e9 v blokoch, ktor\u00e9 s\u00fa vlo\u017een\u00e9 do blockchainu len v pr\u00edpade, \u017ee \u00fa\u010dastn\u00edci dosiahli konsenzus, a po zap\u00edsan\u00ed nie je mo\u017en\u00e9 tieto d\u00e1ta nen\u00e1padne upravi\u0165 alebo odstr\u00e1ni\u0165.<\/p>\n<h2>Architekt\u00fara Hyperledger Fabric<\/h2>\n<p>\nNa sch\u00e9me je zobrazen\u00e1 architekt\u00fara Hyperledger Fabric:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organiz\u00e1cie <\/b> \u2014 organiz\u00e1cie obsahuj\u00fa peer-ov, pri\u010dom blockchain existuje v\u010faka podpore organiz\u00e1ci\u00ed. R\u00f4zne organiz\u00e1cie m\u00f4\u017eu by\u0165 s\u00fa\u010das\u0165ou jedn\u00e9ho kan\u00e1la.<\/p>\n<p><b>Channel <\/b> \u2014 logick\u00e1 \u0161trukt\u00fara, ktor\u00e1 sp\u00e1ja peer-ov do skup\u00edn, \u010d\u00edm sa ur\u010duje blockchain. Hyperledger Fabric m\u00f4\u017ee s\u00fa\u010dasne spracov\u00e1va\u0165 viacero blockchainov s r\u00f4znou biznis logikou.<\/p>\n<p><b>Membership Services Provider (MSP)<\/b> \u2014 je to CA (Certificate Authority) na vyd\u00e1vanie identities a pride\u013eovanie rol\u00ed. Na vytvorenie uzla je potrebn\u00e9 interagova\u0165 s MSP.<\/p>\n<p><b>Peer uzly<\/b> \u2014 kontroluj\u00fa transakcie, ukladaj\u00fa blockchain, vykon\u00e1vaj\u00fa smart kontrakty a komunikuj\u00fa s aplik\u00e1ciami. Peer uzly maj\u00fa identitu (digit\u00e1lny certifik\u00e1t), ktor\u00fd vyd\u00e1va MSP. Na rozdiel od siet\u00ed Bitcoin alebo Ethereum, kde s\u00fa v\u0161etky uzly rovnak\u00e9, v Hyperledger Fabric maj\u00fa uzly r\u00f4zne \u00falohy:<\/p>\n<ul>\n<li>Peer m\u00f4\u017ee by\u0165 <b>endorzuj\u00faci peer<\/b> (EP) a m\u00f4\u017ee vykon\u00e1va\u0165 smart kontrakty.<\/li>\n<li><b>Zachov\u00e1vaj\u00faci peer<\/b> (CP) \u2014 len ukladaj\u00fa d\u00e1ta do blockchainu a aktualizuj\u00fa \"World state\".<\/li>\n<li><b>Anchor Peer<\/b> (AP) \u2014 ak sa do blockchainu zap\u00e1ja nieko\u013eko organiz\u00e1ci\u00ed, tak sa anchor peer vyu\u017e\u00edvaj\u00fa na spojenie medzi nimi. Ka\u017ed\u00e1 organiz\u00e1cia mus\u00ed ma\u0165 jeden alebo nieko\u013eko anchor peer. Pomocou AP m\u00f4\u017ee ak\u00fdko\u013evek peer v organiz\u00e1cii z\u00edska\u0165 inform\u00e1cie o v\u0161etk\u00fdch peer-och v in\u00fdch organiz\u00e1ci\u00e1ch. Na synchroniz\u00e1ciu inform\u00e1ci\u00ed medzi AP sa pou\u017e\u00edva <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip protokol<\/a><\/noindex>.<\/li>\n<li><b>L\u00edder Peer<\/b> \u2014 ak organiz\u00e1cia m\u00e1 nieko\u013eko peer-ov, len l\u00edder peer bude prij\u00edma\u0165 bloky z Ordering service a distribuova\u0165 ich ostatn\u00fdm peer-om. L\u00edder m\u00f4\u017ee by\u0165 nastaven\u00fd staticky, alebo vybran\u00fd dynamicky peer-ami v organiz\u00e1cii. Na synchroniz\u00e1ciu inform\u00e1ci\u00ed o l\u00eddroch sa tie\u017e pou\u017e\u00edva gossip protokol.<\/li>\n<\/ul>\n<p>\n<b>Akt\u00edva <\/b> \u2014 entity, ktor\u00e9 maj\u00fa hodnotu a s\u00fa ulo\u017een\u00e9 v blockchainu. Presnej\u0161ie ide o key-value d\u00e1ta vo form\u00e1te JSON. Pr\u00e1ve tieto d\u00e1ta s\u00fa zapisovan\u00e9 do blockchainu \u201eBlockchain\u201c. Maj\u00fa hist\u00f3riu, ktor\u00e1 je ulo\u017een\u00e1 v blockchainu, a aktu\u00e1lny stav, ktor\u00fd je ulo\u017een\u00fd v datab\u00e1ze \u201eWorld state\u201c. \u0160trukt\u00fary d\u00e1t sa nap\u013a\u0148aj\u00fa libovo\u013ene v z\u00e1vislosti od obchodn\u00fdch \u00faloh. Nie s\u00fa \u017eiadne povinn\u00e9 polia, jedinou odpor\u00fa\u010danou podmienkou je, \u017ee akt\u00edva by mali ma\u0165 vlastn\u00edka a predstavova\u0165 hodnotu. <\/p>\n<p><b>Ledger <\/b> \u2014 pozost\u00e1va z blockchainu \u201eBlockchain\u201c a datab\u00e1zy \u201eWorld state\u201c, v ktorej sa uchov\u00e1va aktu\u00e1lny stav akt\u00edv. World state vyu\u017e\u00edva LevelDB alebo CouchDB.<\/p>\n<p><b>Smart kontrakt<\/b> \u2014 pomocou smart kontraktov sa realizuje obchodn\u00e1 logika syst\u00e9mu. V Hyperledger Fabric sa smart kontrakty naz\u00fdvaj\u00fa chaincode. Pomocou chaincode sa definuj\u00fa akt\u00edva a transakcie s nimi. Ak hovor\u00edme technicky, tak smart kontrakty s\u00fa programov\u00e9 moduly implementovan\u00e9 v programovac\u00edch jazykoch JS alebo Go.<\/p>\n<p><b>Politika schv\u00e1lenia<\/b> \u2014 pre ka\u017ed\u00fd chaincode je mo\u017en\u00e9 nastavi\u0165 politiky, ko\u013eko a od koho je potrebn\u00e9 o\u010dak\u00e1va\u0165 potvrdenia pre transakciu. Ak politika nie je nastaven\u00e1, predvolene sa pou\u017e\u00edva: \u201ctransakciu mus\u00ed potvrdi\u0165 ak\u00fdko\u013evek \u010dlen (member) akejko\u013evek organiz\u00e1cie v channel\u201d. Pr\u00edklady polit\u00edk:<\/p>\n<ul>\n<li>Transakciu mus\u00ed potvrdi\u0165 ktor\u00fdko\u013evek administr\u00e1tor organiz\u00e1cie;<\/li>\n<li>Mus\u00ed potvrdi\u0165 ktor\u00fdko\u013evek \u010dlen (member) alebo klient organiz\u00e1cie;<\/li>\n<li>Mus\u00ed potvrdi\u0165 ktor\u00fdko\u013evek peer organiz\u00e1cie.<\/li>\n<\/ul>\n<p>\n<b>Slu\u017eba Ordering<\/b> \u2014 bal\u00ed transakcie do blokov a posiela ich peer-om v kan\u00e1li. Zabezpe\u010duje doru\u010denie spr\u00e1v v\u0161etk\u00fdm peer-om v sieti. Pre priemyseln\u00e9 syst\u00e9my sa pou\u017e\u00edva <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">spr\u00e1vy broker Kafka<\/a><\/noindex>, pre v\u00fdvoj a testovanie <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: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Aplik\u00e1cia interaguje s Hyperledger Fabric, pou\u017e\u00edvaj\u00fac Go, Node.js alebo Java SDK;<\/li>\n<li>Klient vytv\u00e1ra transakciu tx a posiela ju na endorsing peer-ov;<\/li>\n<li>Peer kontroluje podpis klienta, vykon\u00e1va transakciu a posiela endorsement signature sp\u00e4\u0165 klientovi. Chaincode sa vykon\u00e1va len na endorsing peer, a v\u00fdsledok jeho vykonania sa rozosiela na v\u0161etky peer-y. Tak\u00fdto algoritmus pr\u00e1ce sa naz\u00fdva \u2014 PBFT (Practical Byzantine Fault Tolerant) konsenzus. Rozdiel oproti <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klasick\u00e9mu BFT<\/a><\/noindex> spo\u010d\u00edva v tom, \u017ee spr\u00e1va sa rozosiela a o\u010dak\u00e1va potvrdenie nie od v\u0161etk\u00fdch \u00fa\u010dastn\u00edkov, ale iba od konkr\u00e9tneho s\u00faboru;<\/li>\n<li>Ke\u010f klient dostane po\u010det odpoved\u00ed zodpovedaj\u00faci endorsement policy, posiela transakciu na slu\u017ebu Ordering;<\/li>\n<li>Slu\u017eba Ordering vytv\u00e1ra blok a posiela ho v\u0161etk\u00fdm committing peer-om. Slu\u017eba Ordering zabezpe\u010duje sekven\u010dn\u00e9 zapisovanie blokov, \u010d\u00edm sa vylu\u010duje takzvan\u00e9 ledger fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">pozri \u010das\u0165 \u201eForky\u201c<\/a><\/noindex>);<\/li>\n<li>Peer-om pr\u00edde blok, op\u00e4\u0165 overia endorsement policy, zap\u00ed\u0161u blok do blockchainu a zmenia stav v \u201eWorld state\u201c DB.<\/li>\n<\/ul>\n<p>\nTo znamen\u00e1, \u017ee doch\u00e1dza k rozdeleniu rol\u00ed medzi n\u00f3dami. To zabezpe\u010duje \u0161k\u00e1lovate\u013enos\u0165 a bezpe\u010dnos\u0165 blockchainu:<\/p>\n<ul>\n<li>Smart kontrakty (chaincode) vykon\u00e1vaj\u00fa endorsing peer-ov. To zabezpe\u010duje d\u00f4vernos\u0165 smart kontraktov, ke\u010f\u017ee s\u00fa uchov\u00e1van\u00e9 nie u v\u0161etk\u00fdch \u00fa\u010dastn\u00edkov, ale len na endorsing peer-och.<\/li>\n<li>Ordering mus\u00ed fungova\u0165 r\u00fdchlo. To sa zabezpe\u010duje t\u00fdm, \u017ee Ordering iba vytv\u00e1ra blok a posiela ho na pevn\u00fd s\u00fabor leader peer-ov.<\/li>\n<li>Committing peers iba uchov\u00e1vaj\u00fa blockchain \u2014 ich m\u00f4\u017ee by\u0165 ve\u013ea a nevy\u017eaduj\u00fa ve\u013ek\u00fa v\u00fdkonov\u00fa kapacitu a okam\u017eit\u00fa pr\u00e1cu. <\/li>\n<\/ul>\n<p>\nPodrobnej\u0161ie architektonick\u00e9 rie\u0161enia Hyperledger Fabric a pre\u010do funguje tak, a nie inak, si m\u00f4\u017eete pozrie\u0165 tu: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architekt\u00fara P\u00f4vodu<\/a><\/noindex> alebo tu: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: Distribuovan\u00fd opera\u010dn\u00fd syst\u00e9m pre povolen\u00e9 blockchainy<\/a><\/noindex>.<\/p>\n<p>Tak\u017ee, Hyperledger Fabric je naozaj univerz\u00e1lny syst\u00e9m, pomocou ktor\u00e9ho m\u00f4\u017eete:<\/p>\n<ul>\n<li>Realizova\u0165 \u013eubovo\u013en\u00fa obchodn\u00fa logiku, pou\u017e\u00edvaj\u00fac mechanizmus smart kontraktov;<\/li>\n<li>Zaznamen\u00e1va\u0165 a z\u00edskava\u0165 \u00fadaje z blockchain datab\u00e1zy vo form\u00e1te JSON;<\/li>\n<li>Poskytova\u0165 a overova\u0165 pr\u00edstup k API pomocou certifika\u010dnej autority. <\/li>\n<\/ul>\n<p>\nTeraz, ke\u010f sme si trochu objasnili \u0161pecifik\u00e1 Hyperledger Fabric, po\u010fme kone\u010dne spravi\u0165 nie\u010do u\u017eito\u010dn\u00e9!<\/p>\n<h2>Rozv\u00edjame blockchain<\/h2>\n<p><\/p>\n<h3>Stanovenie \u00falohy<\/h3>\n<p>\n\u00daloha \u2014 realizova\u0165 sie\u0165 Citcoin s nasleduj\u00facimi funkciami: vytvori\u0165 \u00fa\u010det, z\u00edska\u0165 zostatok, doplni\u0165 \u00fa\u010det, previes\u0165 mince z jedn\u00e9ho \u00fa\u010dtu na druh\u00fd. Vykresl\u00edme objektov\u00fd model, ktor\u00fd nesk\u00f4r implementujeme v smart kontrakte. Tak\u017ee budeme ma\u0165 \u00fa\u010dty, ktor\u00e9 s\u00fa identifikovan\u00e9 menami (name) a obsahuj\u00fa zostatok (balance), a zoznam \u00fa\u010dtov. \u00da\u010dty a zoznam \u00fa\u010dtov \u2014 to s\u00fa v term\u00ednoch Hyperledger Fabric akt\u00edva. Zodpovedaj\u00facim sp\u00f4sobom maj\u00fa hist\u00f3riu a aktu\u00e1lny stav. Pok\u00fasim sa to n\u00e1zorne zn\u00e1zorni\u0165:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHorn\u00e9 postavy \u2014 to je aktu\u00e1lny stav, ktor\u00fd sa uchov\u00e1va v datab\u00e1ze \u201eWorld state\u201c. Pod nimi postavy, ktor\u00e9 ukazuj\u00fa hist\u00f3riu, ktor\u00e1 sa uchov\u00e1va v blockchain. Aktu\u00e1lny stav akt\u00edv sa men\u00ed transakciami. Akt\u00edvum sa men\u00ed iba cel\u00e9, preto sa v d\u00f4sledku vykonania transakcie vytv\u00e1ra nov\u00fd objekt a aktu\u00e1lna hodnota akt\u00edva prech\u00e1dza do hist\u00f3rie. <\/p>\n<h3>IBM Cloud <\/h3>\n<p>\nZaklad\u00e1me \u00fa\u010det v <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM cloude<\/a><\/noindex>. Na pou\u017e\u00edvanie blockchain platformy ju treba upgradova\u0165 na Pay-As-You-Go. Tento proces nemus\u00ed by\u0165 r\u00fdchly, preto\u017ee IBM po\u017eaduje \u010fal\u0161ie inform\u00e1cie a kontroluje ich ru\u010dne. Z pozit\u00edvneho h\u013eadiska m\u00f4\u017eem poveda\u0165, \u017ee IBM m\u00e1 skvel\u00e9 vzdel\u00e1vacie materi\u00e1ly, ktor\u00e9 umo\u017e\u0148uj\u00fa rozvin\u00fa\u0165 Hyperledger Fabric v ich cloude. P\u00e1\u010dil sa mi nasleduj\u00faci cyklus \u010dl\u00e1nkov a pr\u00edkladov:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Vytvorte z\u00e1kladn\u00fa blockchain sie\u0165 pomocou Blockchain Platform<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Vytvorte a vykonajte blockchain smart kontrakt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Emitujte udalosti z Blockchain Platform<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNasleduj\u00fa obrazovky Blockchain platformy IBM. Toto nie je n\u00e1vod na vytv\u00e1ranie blockchainu, ale jednoducho uk\u00e1\u017eka rozsahu \u00falohy. Tak\u017ee pre na\u0161e \u00fa\u010dely vytv\u00e1rame jednu Organiz\u00e1ciu:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV nej vytv\u00e1rame uzly: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZaklad\u00e1me pou\u017e\u00edvate\u013eov:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVytv\u00e1rame Channel a naz\u00fdvame ho citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV podstate Channel \u2014 to je blockchain, preto za\u010d\u00edna s nulov\u00fdm blokom (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>P\u00ed\u0161eme 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>\nIntuit\u00edvne by to malo by\u0165 v\u0161etko jasn\u00e9:<\/p>\n<ul>\n<li>Existuje nieko\u013eko funkci\u00ed (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), ktor\u00e9 bude vy\u017eadova\u0165 demo program pomocou Hyperledger Fabric API.<\/li>\n<li>Funkcie SendFrom a RefillBalance generuj\u00fa udalosti (Event), ktor\u00e9 dostane demo program.<\/li>\n<li>Funkcia instantiate \u2013 sa vol\u00e1 len raz pri in\u0161tancii smart kontraktu. V skuto\u010dnosti sa vol\u00e1 nie jedenkr\u00e1t, ale zaka\u017ed\u00fdm pri zmene verzie smart kontraktu. Preto inicializ\u00e1cia zoznamu pr\u00e1zdnym po\u013eom nie je dobr\u00fd n\u00e1pad, preto\u017ee pri zmene verzie smart kontraktu pr\u00eddeme o aktu\u00e1lny zoznam. Ale ni\u010d, len sa u\u010d\u00edm).<\/li>\n<li>\u00da\u010dty a zoznam \u00fa\u010dtov (accounts) \u2013 to s\u00fa JSON \u0161trukt\u00fary \u00fadajov. Na manipul\u00e1ciu s \u00fadajmi sa pou\u017e\u00edva JS.<\/li>\n<li>Aktu\u00e1lnu hodnotu assetu m\u00f4\u017eeme z\u00edska\u0165 pomocou volania funkcie getState, a aktualizova\u0165 pomocou putState.<\/li>\n<li>Pri vytv\u00e1ran\u00ed \u00fa\u010dtu sa vol\u00e1 funkcia AddAccount, v ktorej sa porovn\u00e1va maxim\u00e1lny po\u010det \u00fa\u010dtov v blockchaine (maxAccounts = 5). A tu je probl\u00e9m (ste si v\u0161imli?), ktor\u00fd vedie k nekone\u010dn\u00e9mu rastu po\u010dtu \u00fa\u010dtov. Tak\u00fdmto chyb\u00e1m je potrebn\u00e9 sa vyh\u00fdba\u0165).<\/li>\n<\/ul>\n<p>\n\u010ealej nahr\u00e1me smart kontrakt do Channel a in\u0161tancujeme ho:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozrime sa na transakciu na nastavenie Smart Contract:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozrime sa na podrobnosti o na\u0161om Channel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV d\u00f4sledku z\u00edskavame nasleduj\u00facu sch\u00e9mu blockchain siete v cloude IBM. Na sch\u00e9me je tie\u017e demoprogram, ktor\u00fd je spusten\u00fd v cloude Amazon na virtu\u00e1lnom serveri (podrobnosti o \u0148om bud\u00fa v \u010fal\u0161ej \u010dasti):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Vytvorenie GUI pre volania Hyperledger Fabric API<\/h2>\n<p>\nHyperledger Fabric m\u00e1 API, ktor\u00e9 sa m\u00f4\u017ee pou\u017ei\u0165 na:<\/p>\n<ul>\n<li>Vytvorenie channel;<\/li>\n<li>Pripojenie peer k channel;<\/li>\n<li>In\u0161tal\u00e1ciu a in\u0161tancovanie smart kontraktov v channel;<\/li>\n<li>Volanie transakci\u00ed;<\/li>\n<li>\u017diados\u0165 o inform\u00e1cie v blockchaine.<\/li>\n<\/ul>\n<p><\/p>\n<h3>V\u00fdvoj aplik\u00e1cie<\/h3>\n<p>\nV na\u0161ej demoprogramu budeme pou\u017e\u00edva\u0165 API len na volanie transakci\u00ed a \u017eiados\u0165 o inform\u00e1cie, preto\u017ee ostatn\u00e9 kroky sme u\u017e uskuto\u010dnili pomocou blockchain platformy IBM. P\u00ed\u0161eme GUI s pou\u017eit\u00edm \u0161tandardn\u00e9ho technologick\u00e9ho stacku: Express.js + Vue.js + Node.js. O tom, ako za\u010da\u0165 vytv\u00e1ra\u0165 modern\u00e9 webov\u00e9 aplik\u00e1cie, by sa mohla nap\u00edsa\u0165 samostatn\u00e1 \u010dl\u00e1nok. Tu nech\u00e1m odkaz na s\u00e9riu predn\u00e1\u0161ok, ktor\u00e1 sa mi najviac p\u00e1\u010dila: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. V d\u00f4sledku toho vzniklo klient-serverov\u00e9 aplik\u00e1cie so zn\u00e1mym grafick\u00fdm rozhran\u00edm v \u0161t\u00fdle Material Design od Google. REST API medzi klientom a serverom pozost\u00e1va z nieko\u013ek\u00fdch volan\u00ed:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2013 inicializova\u0165 blockchain;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2013 z\u00edska\u0165 zoznam v\u0161etk\u00fdch \u00fa\u010dtov;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2013 vytvori\u0165 \u00fa\u010det Bob;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2013 z\u00edska\u0165 inform\u00e1cie o \u00fa\u010dte Bob;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 previes\u0165 dve mince od Bob k Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 uzavrie\u0165 spojenie s blokchainom.<\/li>\n<\/ul>\n<p>\nPopis API s pr\u00edkladmi som dal na<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> str\u00e1nku \u201ePostman\u201c<\/a><\/noindex> \u2014 \u0161iroko zn\u00e1my program na testovanie HTTP API.<\/p>\n<h3>Demo aplik\u00e1cia v cloude Amazon<\/h3>\n<p>\nAplik\u00e1ciu som nahral na Amazon, preto\u017ee IBM doteraz nemohol aktualizova\u0165 m\u00f4j \u00fa\u010det a povoli\u0165 mi vytv\u00e1ra\u0165 virtu\u00e1lne servery. Ako pomyseln\u00fa \u010dere\u0161ni\u010dku som pridal dom\u00e9nu: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Trochu podpor\u00edm server zapnut\u00fd, potom ho vypnem, preto\u017ee centy za pren\u00e1jom sa kumuluj\u00fa, a mince citcoin na burze e\u0161te nie s\u00fa obchodovan\u00e9) Do \u010dl\u00e1nku vklad\u00e1m screenshoty demoa, aby bola zrozumite\u013en\u00e1 logika fungovania. Demo aplik\u00e1cia m\u00f4\u017ee:<\/p>\n<ul>\n<li>Inicializova\u0165 blockchain;<\/li>\n<li>Vytv\u00e1ra\u0165 \u00fa\u010det (ale teraz nie je mo\u017en\u00e9 vytvori\u0165 nov\u00fd \u00fa\u010det, preto\u017ee v blockchaine bolo dosiahnut\u00e9 maxim\u00e1lne \u010d\u00edslo \u00fa\u010dtov, uveden\u00e9 v smart kontrakte);<\/li>\n<li>Z\u00edska\u0165 zoznam \u00fa\u010dtov;<\/li>\n<li>Prev\u00e1dza\u0165 mince citcoin medzi Alice, Bobom a Alexom;<\/li>\n<li>Z\u00edskava\u0165 udalosti (ale teraz sa \u017eiadne udalosti nem\u00f4\u017eu zobrazi\u0165, preto je v rozhran\u00ed zjednodu\u0161ene nap\u00edsan\u00e9, \u017ee udalosti nie s\u00fa podporovan\u00e9);<\/li>\n<li>Registrova\u0165 akcie.<\/li>\n<\/ul>\n<p>\nNajprv inicializujeme blockchain:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPotom si zaklad\u00e1me svoj \u00fa\u010det, ne\u0161etriac s bilanciou:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZ\u00edskavame zoznam v\u0161etk\u00fdch dostupn\u00fdch \u00fa\u010dtov:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVyber\u00e1me odosielate\u013ea a pr\u00edjemcu, a z\u00edskavame ich zostatky. Ak je odosielate\u013e a pr\u00edjemca ten ist\u00fd, dojde k nav\u00fd\u0161eniu jeho zostatku:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV logu sledujeme vykon\u00e1vanie transakci\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVlastne s demo programom je to v\u0161etko. Potom si m\u00f4\u017eeme pozrie\u0165 na\u0161u transakciu v blockchaine:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA celkov\u00fd zoznam transakci\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: \u010do n\u00e1s stoj\u00ed PoC vybudova\u0165?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00fdmto sme \u00faspe\u0161ne ukon\u010dili implement\u00e1ciu PoC na vytvorenie siete Citcoin. \u010co e\u0161te potrebujeme urobi\u0165, aby sa Citcoin stal plnohodnotnou sie\u0165ou na prevod minc\u00ed? Ve\u013emi m\u00e1lo:<\/p>\n<ul>\n<li>V etape vytv\u00e1rania \u00fa\u010dtu realizova\u0165 gener\u00e1ciu s\u00fakromn\u00e9ho \/ verejn\u00e9ho k\u013e\u00fa\u010da. S\u00fakromn\u00fd k\u013e\u00fa\u010d by mal by\u0165 ulo\u017een\u00fd u u\u017e\u00edvate\u013ea \u00fa\u010dtu, verejn\u00fd v blockchaine.<\/li>\n<li>Urobi\u0165 prevod minc\u00ed, pri ktorom sa na identifik\u00e1ciu u\u017e\u00edvate\u013ea pou\u017e\u00edva nie meno, ale verejn\u00fd k\u013e\u00fa\u010d.<\/li>\n<li>\u0160ifrova\u0165 transakcie, ktor\u00e9 id\u00fa od u\u017e\u00edvate\u013ea na server jeho s\u00fakromn\u00fdm k\u013e\u00fa\u010dom.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Z\u00e1ver <\/h2>\n<p>\nImplementovali sme sie\u0165 Citcoin s funkciami: prida\u0165 \u00fa\u010det, z\u00edska\u0165 zostatok, doplni\u0165 svoj \u00fa\u010det, previes\u0165 mince z jedn\u00e9ho \u00fa\u010dtu na in\u00fd. Tak\u017ee, \u010do n\u00e1s st\u00e1lo postavi\u0165 PoC?<\/p>\n<ul>\n<li>Je potrebn\u00e9 \u0161tudova\u0165 blockchain v\u0161eobecne a Hyperledger Fabric konkr\u00e9tne;<\/li>\n<li>Nau\u010di\u0165 sa pou\u017e\u00edva\u0165 cloudy IBM alebo Amazon;<\/li>\n<li>Nau\u010di\u0165 sa programovac\u00ed jazyk JS a nejak\u00fd webov\u00fd framework;<\/li>\n<li>Ak je potrebn\u00e9 uchov\u00e1va\u0165 niektor\u00e9 \u00fadaje mimo blockchainu, nau\u010di\u0165 sa integr\u00e1ciu, napr\u00edklad, s PostgreSQL;<\/li>\n<li>A posledn\u00e9, ale nie menej d\u00f4le\u017eit\u00e9 \u2014 bez znalosti Linuxu sa v modernom svete nikam nepohneme!)<\/li>\n<\/ul>\n<p>\nSamozrejme, nie je to raketov\u00e1 veda, ale bude treba zapoti\u0165 sa!<\/p>\n<h3>Zdrojov\u00e9 k\u00f3dy na GitHub<\/h3>\n<p>\nS\u00fabory s\u00fa ulo\u017een\u00e9 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. Stru\u010dn\u00fd popis repozit\u00e1ra:<br \/>\nKatal\u00f3g &#171;<b>server<\/b>&#187; \u2014 Node.js server<br \/>\nKatal\u00f3g &#171;<b>client<\/b>&#187; \u2014 Node.js klient<br \/>\nKatal\u00f3g &#171;<b>blockchain<\/b>&#187; (hodnoty parametrov a k\u013e\u00fa\u010de s\u00fa samozrejme nefunk\u010dn\u00e9 a uveden\u00e9 iba ako pr\u00edklad):<\/p>\n<ul>\n<li>contract \u2014 zdrojov\u00fd k\u00f3d smart kontraktu<\/li>\n<li>wallet \u2014 k\u013e\u00fa\u010de pou\u017e\u00edvate\u013ea pre pou\u017eitie Hyperledger Fabric API. <\/li>\n<li>*.cds \u2014 skompilovan\u00e9 verzie smart kontraktov<\/li>\n<li>*.json s\u00fabory \u2014 pr\u00edklady konfigura\u010dn\u00fdch s\u00faborov pre pou\u017eitie Hyperledger Fabric API<\/li>\n<\/ul>\n<p>\n<b>Je to len za\u010diatok!<\/b><br \/>\n<br \/>Zdroj: <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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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: \u010do n\u00e1s stoj\u00ed PoC postavi\u0165? | ProHoster","description":"O\u010di sa boja, ale ruky sa \u0161t\u00edpu! V predch\u00e1dzaj\u00facich \u010dl\u00e1nkoch sme sa podrobne zaoberali technol\u00f3giami, na ktor\u00fdch s\u00fa zalo\u017een\u00e9 blockchainy (\u010co n\u00e1s stoj\u00ed blockchain.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}