{"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\/lv\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Acis baid\u0101s, bet rokas niez!<\/i><\/p>\n<p>Iepriek\u0161\u0113j\u0101s rakstos m\u0113s izp\u0113t\u012bj\u0101m tehnolo\u0123ijas, uz kur\u0101m balst\u0101s blok\u0137\u0113des (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Ko mums izmaks\u0101 blockchain rad\u012bt?<\/a><\/noindex>) un gad\u012bjumus, kurus iesp\u0113jams \u012bstenot ar to pal\u012bdz\u012bbu (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Kas mums j\u0101dara, lai uzb\u016bv\u0113tu gad\u012bjumu?<\/a><\/noindex>). Ir pien\u0101cis laiks str\u0101d\u0101t ar rok\u0101m! Lai realiz\u0113tu pilotprojektus un PoC (Proof of Concept), es dodu priek\u0161roku izmantot m\u0101koni, jo pie tam ir pieejams no jebkuras vietas pasaul\u0113, un bie\u017ei vien nav j\u0101t\u0113r\u0113 laiks garlaic\u012bgai vides uzst\u0101d\u012b\u0161anai, jo ir iepriek\u0161 konfigur\u0113tas sist\u0113mas. T\u0101tad, apskat\u012bsim kaut ko vienk\u0101r\u0161u, piem\u0113ram, t\u012bklu mon\u0113tu p\u0101rs\u016bt\u012b\u0161anai starp dal\u012bbniekiem, ko nosauksim pietic\u012bgi par Citoins. \u0160im nol\u016bkam izmantosim IBM m\u0101koni un univers\u0101lo blok\u0137\u0113di Hyperledger Fabric. Vispirms izp\u0113t\u012bsim, k\u0101p\u0113c Hyperledger Fabric d\u0113v\u0113 par univers\u0101lo blok\u0137\u0113di?<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" 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 univers\u0101la blok\u0137\u0113de<\/h2>\n<p>\nJa run\u0101jam visp\u0101r\u012bgi, tad univers\u0101la inform\u0101cijas sist\u0113ma ir:<\/p>\n<ul>\n<li>Serveru kopums un programmat\u016bras kodols, kas izpilda biznesa lo\u0123iku;<\/li>\n<li>Interfeisi mijiedarb\u012bbai ar sist\u0113mu;<\/li>\n<li>R\u012bki ier\u012b\u010du \/ cilv\u0113ku re\u0123istr\u0113\u0161anai, autentific\u0113\u0161anai un autoriz\u0113\u0161anai;<\/li>\n<li>Datu b\u0101ze, kas glab\u0101 operat\u012bvos un arhiv\u0113tos datus:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOfici\u0101lo versiju par to, kas ir Hyperledger Fabric, var izlas\u012bt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">vietn\u0113<\/a><\/noindex>, bet \u012bsum\u0101, Hyperledger Fabric \u2014 ir opensource platforma, kas \u013cauj veidot sl\u0113gtas blok\u0137\u0113des un veikt jebk\u0101dus viedos l\u012bgumus, kas uzrakst\u012bti programm\u0113\u0161anas valod\u0101s JS un Go. Apskat\u012bsim detaliz\u0113ti Hyperledger Fabric arhitekt\u016bru un p\u0101rliecin\u0101simies, ka t\u0101 ir univers\u0101la sist\u0113ma, kur\u0101 past\u0101v specifika datu glab\u0101\u0161an\u0101 un ierakst\u0113. \u0160\u012b specifika ir t\u0101da, ka dati, k\u0101 vis\u0101s blok\u0137\u0113d\u0113s, tiek glab\u0101ti blokos, kuri tiek ievietoti blok\u0137\u0113d\u0113 tikai tad, ja dal\u012bbnieki ir non\u0101ku\u0161i pie konsensa, un p\u0113c ierakst\u012b\u0161anas datus nav iesp\u0113jams neman\u0101mi labot vai dz\u0113st.<\/p>\n<h2>Hyperledger Fabric arhitekt\u016bra<\/h2>\n<p>\nSh\u0113m\u0101 att\u0113lota Hyperledger Fabric arhitekt\u016bra:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Organiz\u0101cijas <\/b> \u2014 organiz\u0101cijas satur peer\u2019us, t\u0101d\u0113j\u0101di blok\u0137\u0113de past\u0101v, pateicoties organiz\u0101ciju atbalstam. At\u0161\u0137ir\u012bgas organiz\u0101cijas var pievienoties vienam kan\u0101lam.<\/p>\n<p><b>Channel <\/b> \u2014 lo\u0123isk\u0101 strukt\u016bra, kas apvieno peer\u2019us grup\u0101s, t\u0101d\u0113j\u0101di nosakot blok\u0137\u0113di. Hyperledger Fabric var vienlaikus apstr\u0101d\u0101t vair\u0101kas blok\u0137\u0113des ar at\u0161\u0137ir\u012bg\u0101m biznesa lo\u0123ik\u0101m.<\/p>\n<p><b>Membership Services Provider (MSP)<\/b> \u2014 tas ir CA (Certificate Authority), kas izsniedz identit\u0101tes un pie\u0161\u0137ir lomas. Lai izveidotu mezglu, j\u0101sadarbojas ar MSP.<\/p>\n<p><b>Peer mezgli<\/b> \u2014 p\u0101rbauda dar\u012bjumus, glab\u0101 blok\u0137\u0113di, izpilda viedos l\u012bgumus un mijiedarbojas ar lietotn\u0113m. Peer-iem ir identit\u0101te (digit\u0101lais sertifik\u0101ts), ko izdod MSP. At\u0161\u0137ir\u012bb\u0101 no Bitcoin vai Etherium t\u012bkla, kur visas mezgls ir l\u012bdzv\u0113rt\u012bgi, Hyperledger Fabric mezgli ie\u0146em da\u017e\u0101das lomas:<\/p>\n<ul>\n<li>Peer var b\u016bt <b>apstiprino\u0161ais peer<\/b> (EP) un izpild\u012bt viedos l\u012bgumus.<\/li>\n<li><b>Apstiprino\u0161ais peer<\/b> (CP) \u2014 tikai glab\u0101 datus blok\u0137\u0113d\u0113 un aktualiz\u0113 \u201eWorld state\u201d.<\/li>\n<li><b>Ankura Peer<\/b> (AP) \u2014 ja blok\u0137\u0113d\u0113 piedal\u0101s vair\u0101kas organiz\u0101cijas, tad ankoru peer-iem izmanto, lai sazin\u0101tos starp t\u0101m. Katrai organiz\u0101cijai j\u0101b\u016bt vienam vai vair\u0101kiem ankoru peer. Ar AP jebkur\u0161 peer organiz\u0101cij\u0101 var sa\u0146emt inform\u0101ciju par visiem peer-iem cit\u0101s organiz\u0101cij\u0101s. Lai sinhroniz\u0113tu inform\u0101ciju starp AP, tiek izmantots <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossipa protokols<\/a><\/noindex>.<\/li>\n<li><b>L\u012bdera Peer<\/b> \u2014 ja organiz\u0101cijai ir vair\u0101ki peer-iem, tad tikai l\u012bdera peer sa\u0146ems blokos no Ordering service un nodos tos p\u0101r\u0113jiem peer-iem. L\u012bderi var noteikt gan statiski, gan izv\u0113l\u0113ties dinamiski organiz\u0101cijas peer-iem. Lai sinhroniz\u0113tu inform\u0101ciju par l\u012bderiem, ar\u012b tiek izmantots gossipa protokols.<\/li>\n<\/ul>\n<p>\n<b>Akt\u012bvi <\/b> \u2014 vien\u012bbas, kas ir v\u0113rt\u012bgas un tiek glab\u0101tas blok\u0137\u0113d\u0113. Prec\u012bz\u0101k \u2014 t\u0101s ir key-value dati JSON form\u0101t\u0101. Tie\u0161i \u0161ie dati tiek ierakst\u012bti blok\u0137\u0113d\u0113 \u201eBlockchain\u201d. Tiem ir v\u0113sture, kas tiek glab\u0101ta blok\u0137\u0113d\u0113, un pa\u0161reiz\u0113jais st\u0101voklis, kas tiek glab\u0101ts \u201eWorld state\u201d datu b\u0101z\u0113. Datu strukt\u016bras piepild\u0101s br\u012bvi atkar\u012bb\u0101 no biznesa uzdevumiem. Nav nek\u0101du oblig\u0101tu lauku, vien\u012bg\u0101 rekomend\u0101cija \u2014 akt\u012bviem j\u0101b\u016bt \u012bpa\u0161niekam un j\u0101b\u016bt v\u0113rt\u012bg\u0101m. <\/p>\n<p><b>Gr\u0101mata <\/b> \u2014 sast\u0101v no blok\u0137\u0113des \u201eBlockchain\u201d un datu b\u0101zes \u201eWorld state\u201d, kur\u0101 tiek glab\u0101ts pa\u0161reiz\u0113jais akt\u012bvu st\u0101voklis. World state izmanto LevelDB vai CouchDB.<\/p>\n<p><b>Viedais l\u012bgums<\/b> \u2014 ar viedajiem l\u012bgumiem tiek \u012bstenota sist\u0113mas biznesa lo\u0123ika. Hyperledger Fabric viedie l\u012bgumi tiek saukti par chaincode. Ar chaincode tiek noteikti akt\u012bvi un dar\u012bjumi ar tiem. Tehnisk\u0101 valod\u0101 sakot, viedie l\u012bgumi ir programmat\u016bras modu\u013ci, kas izstr\u0101d\u0101ti JS vai Go programm\u0113\u0161anas valod\u0101s.<\/p>\n<p><b>Apstiprin\u0101\u0161anas politika<\/b> \u2014 katram chaincode var noteikt politikas, cik daudz un no k\u0101 nepiecie\u0161ams sagaid\u012bt apstiprin\u0101jumus dar\u012bjumam. Ja politika nav noteikta, tad p\u0113c noklus\u0113juma tiek izmantots: \u201cdar\u012bjumu j\u0101apstiprina jebkuram dal\u012bbniekam (member) no jebkuras organiz\u0101cijas kan\u0101l\u0101\u201d. Politiku piem\u0113ri:<\/p>\n<ul>\n<li>Transakciju j\u0101apstiprina jebkuram organiz\u0101cijas administratoram;<\/li>\n<li>To var apstiprin\u0101t jebkur\u0161 organiz\u0101cijas loceklis vai klients;<\/li>\n<li>To j\u0101apstiprina jebkuram organiz\u0101cijas peer.<\/li>\n<\/ul>\n<p>\n<b>Pas\u016bt\u012b\u0161anas pakalpojums<\/b> \u2014 iesai\u0146o transakcijas blokos un nos\u016bta peer am kan\u0101l\u0101. Garant\u0113 zi\u0146ojumu pieg\u0101di visiem peer am t\u012bkl\u0101. R\u016bpnieciskaj\u0101m sist\u0113m\u0101m tiek izmantots <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">zi\u0146ojumu brokeris Kafka<\/a><\/noindex>, izstr\u0101dei un test\u0113\u0161anai <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=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Lietotne mijiedarbojas ar Hyperledger Fabric, izmantojot Go, Node.js vai Java SDK;<\/li>\n<li>Klients izveido transakciju tx un nos\u016bta to uz apstiprin\u0101juma peer am;<\/li>\n<li>Peer p\u0101rbauda klienta parakstu, veic transakciju un nos\u016bta apstiprin\u0101juma parakstu atpaka\u013c klientam. Chaincode tiek izpild\u012bta tikai apstiprin\u0101juma peer, un izpildes rezult\u0101ts tiek izplat\u012bts visiem peer am. \u0160is darba algoritms tiek saukts par \u2014 PBFT (Practical Byzantine Fault Tolerant) konsensu. Tas at\u0161\u0137iras no <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klasisk\u0101 BFT<\/a><\/noindex> tas, ka zi\u0146ojums tiek izplat\u012bts un tiek gaid\u012bts apstiprin\u0101jums nevis no visiem dal\u012bbniekiem, bet tikai no noteikta kopuma;<\/li>\n<li>P\u0113c tam, kad klients sa\u0146\u0113mis atbildes skaitu, kas atbilst apstiprin\u0101juma politikai, vi\u0146\u0161 nos\u016bta transakciju uz Pas\u016bt\u012b\u0161anas pakalpojumu;<\/li>\n<li>Pas\u016bt\u012b\u0161anas pakalpojums veido bloku un nos\u016bta to visiem apstiprin\u0101\u0161anas peer am. Pas\u016bt\u012b\u0161anas pakalpojums nodro\u0161ina sec\u012bgu bloku ierakstu, t\u0101d\u0113j\u0101di izsl\u0113dzot t\u0101 d\u0113v\u0113to, ledger fork (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">skat\u012bt sada\u013cu \u00abForks\u00bb<\/a><\/noindex>);<\/li>\n<li>Peer sa\u0146em bloku, v\u0113lreiz p\u0101rbauda apstiprin\u0101juma politiku, ieraksta bloku blok\u0137\u0113d\u0113 un maina st\u0101vokli \u00abWorld state\u00bb DB.<\/li>\n<\/ul>\n<p>\nT.i., tiek izveidota lomu sadal\u012b\u0161ana starp mezgliem. Tas nodro\u0161ina blok\u0137\u0113des m\u0113rogojam\u012bbu un dro\u0161\u012bbu:<\/p>\n<ul>\n<li>Viedie l\u012bgumi (chaincode) tiek izpild\u012bti apstiprin\u0101juma peer. Tas nodro\u0161ina smarta kontraktu konfidencialit\u0101ti, jo tie netiek glab\u0101ti pie visiem dal\u012bbniekiem, bet tikai apstiprin\u0101juma peer os.<\/li>\n<li>Pas\u016bt\u012bjumam j\u0101str\u0101d\u0101 \u0101tri. To nodro\u0161ina tas, ka Pas\u016bt\u012b\u0161ana tikai veido bloku un nos\u016bta to noteiktai grupai l\u012bdera peer.<\/li>\n<li>Apstiprin\u0101juma peer tikai glab\u0101 blok\u0137\u0113di \u2014 to var b\u016bt daudz un tiem nav nepiecie\u0161ama liela jauda vai nekav\u0113jo\u0161a darb\u012bba. <\/li>\n<\/ul>\n<p>\nDetaliz\u0113t\u0101k ar arhitekt\u016bras risin\u0101jumiem Hyperledger Fabric un k\u0101p\u0113c tas darbojas t\u0101, nevis cit\u0101di var apskat\u012bt \u0161eit: <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architecture Origins<\/a><\/noindex> vai \u0161eit: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.10228v2\">Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains<\/a><\/noindex>.<\/p>\n<p>T\u0101tad, Hyperledger Fabric ir patiesi univers\u0101la sist\u0113ma, ar kuru var:<\/p>\n<ul>\n<li>Realiz\u0113t p\u0113c pas\u016bt\u012bjuma izstr\u0101d\u0101tu biznesa lo\u0123iku, izmantojot viedl\u012bgumu meh\u0101nismu;<\/li>\n<li>Re\u0123istr\u0113t un ieg\u016bt datus no blok\u0137\u0113des datub\u0101zes JSON form\u0101t\u0101;<\/li>\n<li>Nodro\u0161in\u0101t un p\u0101rbaud\u012bt piek\u013cuvi API, izmantojot Sertifik\u0101cijas iest\u0101di. <\/li>\n<\/ul>\n<p>\nTagad, kad esam nedaudz iepazinu\u0161ies ar Hyperledger Fabric specifiku, s\u0101ksim beidzot kaut ko noder\u012bgu!<\/p>\n<h2>Izveidojam blok\u0137\u0113di<\/h2>\n<p><\/p>\n<h3>Uzdevuma formul\u0113\u0161ana<\/h3>\n<p>\nUzdevums ir \u012bstenot Citcoin t\u012bklu ar \u0161\u0101d\u0101m funkcij\u0101m: izveidot kontu, ieg\u016bt bilanci, papildin\u0101t kontu, p\u0101rs\u016bt\u012bt mon\u0113tas no vienas konta uz citu. Uzz\u012bm\u0113sim objektu modeli, ko v\u0113l\u0101k \u012bstenosim viedo l\u012bgumu. T\u0101tad mums b\u016bs konti, kas tiek identific\u0113ti ar nosaukumiem (name) un satur bilanci (balance), un kontu saraksts. Konti un kontu saraksts \u2014 Hyperledger Fabric terminolo\u0123ij\u0101 ir akt\u012bvi (assets). T\u0101dej\u0101di tiem ir v\u0113sture un pa\u0161reiz\u0113jais st\u0101voklis. M\u0113\u0123in\u0101\u0161u to vizu\u0101li att\u0113lot:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAug\u0161\u0113j\u0101s fig\u016bras att\u0113lo pa\u0161reiz\u0113jo st\u0101vokli, kas tiek glab\u0101ts \u201eWorld state\u201d. Zem t\u0101m ir fig\u016bras, kas par\u0101da v\u0113sturi, kas tiek glab\u0101ta blok\u0137\u0113d\u0113. Akt\u012bvu pa\u0161reiz\u0113jais st\u0101voklis tiek main\u012bts ar dar\u012bjumiem. Akt\u012bvs tiek main\u012bts tikai kopum\u0101, t\u0101d\u0113\u013c transaction veik\u0161anas rezult\u0101t\u0101 tiek izveidots jauns objekts, un pa\u0161reiz\u0113j\u0101 akt\u012bva v\u0113rt\u012bba non\u0101k v\u0113stur\u0113. <\/p>\n<h3>IBM m\u0101ko\u0146pakalpojums <\/h3>\n<p>\nIzveidojam kontu <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM m\u0101ko\u0146pakalpojum\u0101<\/a><\/noindex>. Lai izmantotu blok\u0137\u0113des platformu, tai ir j\u0101veic atjaunin\u0101jums uz Pay-As-You-Go. \u0160is process var b\u016bt l\u0113ns, jo IBM pieprasa papildu inform\u0101ciju un to p\u0101rbauda manu\u0101li. No pozit\u012bv\u0101s puses, varu teikt, ka IBM ir labi m\u0101c\u012bbu materi\u0101li, kas \u013cauj izveidot Hyperledger Fabric sav\u0101 m\u0101ko\u0146pakalpojum\u0101. Man patika \u0161is rakstu un piem\u0113ru cikls:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Izveidojiet pamata blok\u0137\u0113des t\u012bklu, izmantojot Blok\u0137\u0113des platformu<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Izveidojiet un izpildiet blok\u0137\u0113des viedo l\u012bgumu<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Izlaist notikumus no Blok\u0137\u0113des platformas<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nT\u0101l\u0101k ir sniegtas IBM Blok\u0137\u0113des platformas ekr\u0101nuz\u0146\u0113mumi. Tas nav rokasgr\u0101mata blok\u0137\u0113des izveido\u0161anai, bet tikai uzdevuma apjoma demonstr\u0101cija. T\u0101tad m\u016bsu m\u0113r\u0137iem izveidojam vienu organiz\u0101ciju:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIzveidojam mezglus: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIzveidojam lietot\u0101jus:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIzveidojam kan\u0101lu un nosaucam to par citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPatiess kan\u0101ls ir blok\u0137\u0113de, t\u0101p\u0113c tas s\u0101kas ar nulles bloku (Genesis block):<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Rakst\u0101m viedo l\u012bgumu<\/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>\nCik intuit\u012bvi tas j\u0101b\u016bt skaidram:<\/p>\n<ul>\n<li>Past\u0101v vair\u0101kas funkcijas (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), kuras demo programma izsauks, izmantojot Hyperledger Fabric API.<\/li>\n<li>Funkcijas SendFrom un RefillBalance \u0123ener\u0113 notikumus (Event), kurus demo programma sa\u0146ems.<\/li>\n<li>Instanti\u0113\u0161anas funkcija tiek izsaukta vienu reizi, kad tiek izveidots viedais l\u012bgums. Paties\u012bb\u0101 to izsauc nevis vienu reizi, bet katru reizi, kad tiek main\u012bta vied\u0101 l\u012bguma versija. T\u0101d\u0113\u013c saraksta inicializ\u0113\u0161ana ar tuk\u0161u mas\u012bvu ir slikta ideja, jo tagad, mainot vied\u0101 l\u012bguma versiju, m\u0113s pazaud\u0113sim eso\u0161o sarakstu. Bet nekas, es tikai m\u0101cos).<\/li>\n<li>Accounti un accountu saraksts (accounts) ir JSON datu strukt\u016bras. Datu manipul\u0101cijai tiek izmantots JS.<\/li>\n<li>Ieg\u016bt pa\u0161reiz\u0113jo asset v\u0113rt\u012bbu var ar getState funkcijas izsaukumu, bet atjaunin\u0101t to ar putState.<\/li>\n<li>Izveidei Account tiek izsaukta AddAccount funkcija, kur\u0101 tiek sal\u012bdzin\u0101ts maksim\u0101lais account skaits blok\u0137\u0113d\u0113 (maxAccounts = 5). Un \u0161eit ir k\u013c\u016bda (paman\u012bj\u0101t?), kas noved pie bezgal\u012bga account skaita pieauguma. \u0160\u0101d\u0101m k\u013c\u016bd\u0101m j\u0101izvair\u0101s)<\/li>\n<\/ul>\n<p>\nT\u0101l\u0101k m\u0113s aug\u0161upiel\u0101d\u0113jam viedo l\u012bgumu kan\u0101l\u0101 un to instanc\u0113jam:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkat\u0101mies dar\u012bjumu vied\u0101 l\u012bguma uzst\u0101d\u012b\u0161anai:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkat\u0101mies deta\u013cas par m\u016bsu kan\u0101lu:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRezult\u0101t\u0101 ieg\u016bstam \u0161\u0101du blok\u0137\u0113des t\u012bkla sh\u0113mu IBM m\u0101ko\u0146a vid\u0113. Sh\u0113m\u0101 ir ar\u012b demo programma, kas darbojas Amazon m\u0101ko\u0146\u012b uz virtu\u0101l\u0101 servera (par to s\u012bk\u0101k n\u0101kamaj\u0101 sada\u013c\u0101):<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>GUI izveide Hyperledger Fabric API izsaukumiem<\/h2>\n<p>\nHyperledger Fabric ir API, ko var izmantot:<\/p>\n<ul>\n<li>Lai izveidotu kan\u0101lu;<\/li>\n<li>Lai piesl\u0113gtu peer kan\u0101lam;<\/li>\n<li>Lai instal\u0113tu un instanc\u0113tu viedos l\u012bgumus kan\u0101l\u0101;<\/li>\n<li>Lai izsauktu dar\u012bjumus;<\/li>\n<li>Lai piepras\u012btu inform\u0101ciju blok\u0137\u0113d\u0113.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Pieteikuma izstr\u0101de<\/h3>\n<p>\nM\u016bsu demo programm\u0101 m\u0113s izmantosim API tikai dar\u012bjumu izsauk\u0161anai un inform\u0101cijas piepras\u012b\u0161anai, jo citus so\u013cus m\u0113s jau esam veiku\u0161i, izmantojot IBM blok\u0137\u0113des platformu. Rakst\u012bsim GUI, izmantojot standarta tehnolo\u0123iju kaudzi: Express.js + Vue.js + Node.js. Par to, k\u0101 uzs\u0101kt m\u016bsdien\u012bgu t\u012bmek\u013ca pieteikumu izveidi, var\u0113tu uzrakst\u012bt atsevi\u0161\u0137u rakstu. \u0160eit atst\u0101\u0161u saiti uz lekciju s\u0113riju, kas man visvair\u0101k patika: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Rezult\u0101t\u0101 izveidoj\u0101m klient-server lietojumprogrammu ar paz\u012bstamu grafisko saskarni, kas atbilst Google Materi\u0101la dizainam. REST API starp klientu un serveri sast\u0101v no vair\u0101kiem izsaukumiem:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 inicializ\u0113t blok\u0137\u0113di;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 ieg\u016bt visu accountu sarakstu;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 izveidot Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 ieg\u016bt inform\u0101ciju par Bob account;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 p\u0101rs\u016bt\u012bt divas mon\u0113tas no Bob uz Alice;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 p\u0101rtraukt savienojumu ar blok\u0137\u0113di.<\/li>\n<\/ul>\n<p>\nAPI apraksts ar piem\u0113riem ir pieejams<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> vietn\u0113 \u00abPostman\u00bb<\/a><\/noindex> \u2014 pla\u0161i paz\u012bstamaj\u0101 programm\u0101 HTTP API test\u0113\u0161anai.<\/p>\n<h3>Demonstr\u0101cijas lietojumprogramma Amazon m\u0101ko\u0146\u012b<\/h3>\n<p>\nLietojumprogrammu aug\u0161upiel\u0101d\u0113ju Amazon, jo IBM joproj\u0101m nav var\u0113jusi atjaunin\u0101t manu kontu un \u013caut izveidot virtu\u0101los serverus. K\u0101 v\u012bksnu pievienoju dom\u0113nu: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Atst\u0101s\u0161u serveri uz nedaudz laika iesl\u0113gtu, p\u0113c tam izsl\u0113g\u0161u, jo nomas centi kr\u0101jas, bet citcoin mon\u0113tas bir\u017e\u0101 v\u0113l netiek kot\u0113tas) Ierakst\u0101 ievieto\u0161u ekr\u0101nuz\u0146\u0113mumus no demonstr\u0101cijas, lai par\u0101d\u012btu darba lo\u0123iku. Demonstr\u0101cijas lietojumprogramma var:<\/p>\n<ul>\n<li>Ies\u0101kt blok\u0137\u0113di;<\/li>\n<li>Izveidot kontu (bet \u0161obr\u012bd jaunu kontu nevar izveidot, jo blok\u0137\u0113d\u0113 ir sasniegts maksim\u0101lais kontu skaits, kas noteikts viedaj\u0101 kontrakt\u0101);<\/li>\n<li>Ieg\u016bt visu kontu sarakstu;<\/li>\n<li>P\u0101rs\u016bt\u012bt citcoin mon\u0113tas starp Alice, Bob un Alex;<\/li>\n<li>Sa\u0146emt notikumus (bet \u0161obr\u012bd notikumus nav iesp\u0113jams par\u0101d\u012bt, t\u0101p\u0113c interfeis\u0101 vienk\u0101r\u0161\u012bbas labad ir nor\u0101d\u012bts, ka notikumi netiek atbalst\u012bti);<\/li>\n<li>\u017durn\u0101lu darb\u012bbas.<\/li>\n<\/ul>\n<p>\nVispirms m\u0113s ies\u0101kat blok\u0137\u0113di:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0113c tam izveidojam savu kontu, nekaun\u0113jamies no bilances:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIeg\u016bstam visu pieejamo kontu sarakstu:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIzv\u0113lamies s\u016bt\u012bt\u0101ju un sa\u0146\u0113m\u0113ju, ieg\u016bstam vi\u0146u bilances. Ja s\u016bt\u012bt\u0101js un sa\u0146\u0113m\u0113js ir viens un tas pats, tad tiks papildin\u0101ta vi\u0146a konta bilance:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u017durn\u0101l\u0101 sekojam l\u012bdzi dar\u012bjumu izpildei:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPar pa\u0161u demonstr\u0101cijas programmu ir viss. T\u0101l\u0101k varam apskat\u012bt m\u016bsu dar\u012bjumu blok\u0137\u0113d\u0113:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn kop\u0113jo dar\u012bjumu sarakstu:<\/p>\n<p><img decoding=\"async\" alt=\"Blok\u0137\u0113de: ko mums maks\u0101 PoC uzb\u016bv\u0113t?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAr to m\u0113s veiksm\u012bgi pabeidz\u0101m PoC par Citcoin t\u012bkla izveidi. Ko v\u0113l j\u0101dara, lai Citcoin k\u013c\u016btu par pilnv\u0113rt\u012bgu val\u016btas p\u0101rskait\u012bjumu t\u012bklu? \u013boti maz:<\/p>\n<ul>\n<li>Account veido\u0161anas posm\u0101 ieviest priv\u0101t\u0101\/publisk\u0101 atsl\u0113gas \u0123ener\u0113\u0161anu. Priv\u0101tajai atsl\u0113gai j\u0101uzglab\u0101jas lietot\u0101ja account\u0101, publiskajai \u2014 blok\u0137\u0113d\u0113.<\/li>\n<li>Veikt mon\u0113tu p\u0101rskait\u012bjumus, kur identific\u0113\u0161anai tiek izmantota ne v\u0101rds, bet publisk\u0101 atsl\u0113ga.<\/li>\n<li>\u0160ifr\u0113t dar\u012bjumus, kas n\u0101k no lietot\u0101ja uz serveri, izmantojot vi\u0146a priv\u0101to atsl\u0113gu.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Secin\u0101jums <\/h2>\n<p>\nM\u0113s esam izveidoju\u0161i Citcoin t\u012bklu ar funkcij\u0101m: pievienot kontu, ieg\u016bt bilanci, papildin\u0101t savu kontu, p\u0101rs\u016bt\u012bt mon\u0113tas no viena konta uz citu. T\u0101tad, kas mums izmaks\u0101ja PoC izveidi?<\/p>\n<ul>\n<li>Nepiecie\u0161ams izp\u0113t\u012bt blok\u0137\u0113di kopum\u0101 un Hyperledger Fabric it \u012bpa\u0161i;<\/li>\n<li>Iem\u0101c\u012bties izmantot IBM vai Amazon m\u0101ko\u0146us;<\/li>\n<li>Iem\u0101c\u012bties programm\u0113\u0161anas valodu JS un k\u0101du web ietvaru;<\/li>\n<li>Ja k\u0101di dati j\u0101uzglab\u0101 nevis blok\u0137\u0113d\u0113, bet atsevi\u0161\u0137\u0101 datu b\u0101z\u0113, tad iem\u0101c\u012bties integr\u0113ties, piem\u0113ram, ar PostgreSQL;<\/li>\n<li>Un p\u0113d\u0113jais sarakst\u0101, bet ne p\u0113c noz\u012bm\u012bbas \u2014 bez Linux zin\u0101\u0161an\u0101m m\u016bsdienu pasaul\u0113 nekur nav iesp\u0113jams!)<\/li>\n<\/ul>\n<p>\nProtams, tas nav nekas sare\u017e\u0123\u012bts, bet b\u016bs j\u0101str\u0101d\u0101!<\/p>\n<h3>Avota kodi GitHub<\/h3>\n<p>\nAvoti novietoti uz <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. \u012ass repo apraksts:<br \/>\nKatal\u014dgs &#171;<b>serveris<\/b>&#187; \u2014 Node.js servers<br \/>\nKatal\u014dgs &#171;<b>klients<\/b>&#187; \u2014 Node.js klients<br \/>\nKatal\u014dgs &#171;<b>blockchain<\/b>&#187; (parametru v\u0113rt\u012bbas un atsl\u0113gas, protams, ir neder\u012bgas un sniegtas tikai piem\u0113ram):<\/p>\n<ul>\n<li>contract \u2014 vied\u0101 l\u012bguma avots<\/li>\n<li>wallet \u2014 lietot\u0101ja atsl\u0113gas Hyperledger Fabric API izmanto\u0161anai. <\/li>\n<li>*.cds \u2014 kompil\u0113t\u0101s viedl\u012bgumu versijas<\/li>\n<li>*.json faili \u2014 piem\u0113ru konfigur\u0101cijas faili Hyperledger Fabric API izmanto\u0161anai<\/li>\n<\/ul>\n<p>\n<b>Tas ir tikai s\u0101kums!<\/b><br \/>\n<br \/>Avots: <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\/lv\/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=\"lv_LV\" \/>\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\/lv\/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\udd47Blok\u0137\u0113de: kas mums nepiecie\u0161ams PoC izveidei? | ProHoster","description":"Acis baid\u0101s, bet rokas niez! Iepriek\u0161\u0113j\u0101s rakstos m\u0113s apskat\u012bj\u0101m tehnolo\u0123ijas, uz kur\u0101m balst\u0101s blok\u0137\u0113des (Kas mums nepiecie\u0161ams blok\u0137\u0113d\u0113m.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}