{"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\/hu\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","title":{"rendered":"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>A szemek f\u00e9lnek, de a kezek viszketnek!<\/i><\/p>\n<p>A kor\u00e1bbi cikkekben foglalkoztunk a blokkl\u00e1ncok alapj\u00e1t k\u00e9pez\u0151 technol\u00f3gi\u00e1kkal (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">Mit nek\u00fcnk a blockchain fel\u00e9p\u00edt\u00e9se?<\/a><\/noindex>) \u00e9s azokra az esetekre, amelyeket ezek seg\u00edts\u00e9g\u00e9vel meg lehet val\u00f3s\u00edtani (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449986\/\">Mit is jelent sz\u00e1munkra egy eset fel\u00e9p\u00edt\u00e9se?<\/a><\/noindex>). Itt az id\u0151, hogy k\u00e9zbe vegy\u00fck a dolgokat! A pilotok \u00e9s PoC (Proof of Concept) megval\u00f3s\u00edt\u00e1s\u00e1hoz \u00e1ltal\u00e1ban felh\u0151ket haszn\u00e1lok, mivel ezekhez a vil\u00e1g b\u00e1rmely pontj\u00e1r\u00f3l hozz\u00e1f\u00e9rhet\u00fcnk, \u00e9s gyakran nem kell id\u0151t pazarolni a k\u00f6rnyezet unalmas telep\u00edt\u00e9s\u00e9re, mivel vannak el\u0151re telep\u00edtett konfigur\u00e1ci\u00f3k. Teh\u00e1t csin\u00e1ljunk valami egyszer\u0171t, p\u00e9ld\u00e1ul egy h\u00e1l\u00f3zatot, amely lehet\u0151v\u00e9 teszi a p\u00e9nz \u00e1tutal\u00e1s\u00e1t a r\u00e9sztvev\u0151k k\u00f6z\u00f6tt, \u00e9s nevezz\u00fck el szer\u00e9nyen Cointcoin-nak. Ehhez az IBM felh\u0151t \u00e9s a Hyperledger Fabric egyetemes blokkl\u00e1ncot fogjuk haszn\u00e1lni. El\u0151sz\u00f6r n\u00e9zz\u00fck meg, mi\u00e9rt nevezik a Hyperledger Fabric-ot egyetemes blokkl\u00e1ncnak?<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" 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 egyetemes blokkl\u00e1nc<\/h2>\n<p>\n\u00c1ltal\u00e1noss\u00e1gban elmondhat\u00f3, hogy az egyetemes inform\u00e1ci\u00f3s rendszer a k\u00f6vetkez\u0151kb\u0151l \u00e1ll:<\/p>\n<ul>\n<li>Szerverek \u00e9s egy program\u00e1s alap, amely v\u00e9grehajtja az \u00fczleti logik\u00e1t;<\/li>\n<li>Fel\u00fcletek a rendszerrel val\u00f3 interakci\u00f3hoz;<\/li>\n<li>Eszk\u00f6z\u00f6k \u00e9s szem\u00e9lyek regisztr\u00e1ci\u00f3j\u00e1nak, azonos\u00edt\u00e1s\u00e1nak \u00e9s jogosults\u00e1g\u00e1nak biztos\u00edt\u00e1s\u00e1ra;<\/li>\n<li>Adatb\u00e1zis, amely m\u0171k\u00f6d\u00e9si \u00e9s arch\u00edv adatokat t\u00e1rol:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/f11fe73de54b0573d44fae903d367df9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA Hyperledger Fabric hivatalos verzi\u00f3j\u00e1t elolvashatja a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.hyperledger.org\">weboldalon<\/a><\/noindex>, r\u00f6viden pedig a Hyperledger Fabric egy ny\u00edlt forr\u00e1sk\u00f3d\u00fa platform, amely lehet\u0151v\u00e9 teszi z\u00e1rt blokkl\u00e1ncok l\u00e9trehoz\u00e1s\u00e1t \u00e9s tetsz\u0151leges okosszerz\u0151d\u00e9sek v\u00e9grehajt\u00e1s\u00e1t, amelyek JavaScript \u00e9s Go programoz\u00e1si nyelveken \u00edr\u00f3dtak. N\u00e9zz\u00fck meg r\u00e9szletesen a Hyperledger Fabric architekt\u00far\u00e1j\u00e1t, \u00e9s gy\u0151z\u0151dj\u00fcnk meg arr\u00f3l, hogy ez egy egyetemes rendszer, amelyben csak az adatok t\u00e1rol\u00e1s\u00e1nak \u00e9s r\u00f6gz\u00edt\u00e9s\u00e9nek saj\u00e1toss\u00e1gai vannak. Az a saj\u00e1toss\u00e1g, hogy az adatok, mint minden blokkl\u00e1ncban, blokkokban ker\u00fclnek t\u00e1rol\u00e1sra, amelyeket csak akkor helyeznek el a blokkl\u00e1ncon, ha a r\u00e9sztvev\u0151k konszenzusra jutottak, \u00e9s a r\u00f6gz\u00edtett adatokat nem lehet \u00e9szrev\u00e9tlen\u00fcl m\u00f3dos\u00edtani vagy t\u00f6r\u00f6lni.<\/p>\n<h2>Hyperledger Fabric architekt\u00far\u00e1ja<\/h2>\n<p>\nA diagramban a Hyperledger Fabric architekt\u00far\u00e1ja l\u00e1that\u00f3:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/7488d70b330af2bbae1db67005f22a3e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Szervezetek <\/b> \u2014 a szervezetek peer-eket tartalmaznak, \u00edgy a blokkl\u00e1nc a szervezetek t\u00e1mogat\u00e1s\u00e1nak k\u00f6sz\u00f6nhet\u0151en l\u00e9tezik. K\u00fcl\u00f6nb\u00f6z\u0151 szervezetek egy channelbe l\u00e9phetnek be.<\/p>\n<p><b>Csatorna <\/b> \u2014 logikai strukt\u00fara, amely a peer-eket csoportokba t\u00f6m\u00f6r\u00edti, \u00edgy l\u00e9trej\u00f6n a blokkl\u00e1nc. A Hyperledger Fabric egyidej\u0171leg t\u00f6bb blokkl\u00e1ncot is k\u00e9pes kezelni, elt\u00e9r\u0151 \u00fczleti logik\u00e1val.<\/p>\n<p><b>Tags\u00e1gi Szolg\u00e1ltat\u00e1sok Szolg\u00e1ltat\u00f3ja (MSP)<\/b> \u2014 ez a CA (Tan\u00fas\u00edtv\u00e1nyhat\u00f3s\u00e1g) az identit\u00e1sok kiad\u00e1s\u00e1ra \u00e9s szerepek kioszt\u00e1s\u00e1ra. Egy node l\u00e9trehoz\u00e1s\u00e1hoz kapcsolatba kell l\u00e9pni az MSP-vel.<\/p>\n<p><b>Peer node-ok<\/b> \u2014 ellen\u0151rzik a tranzakci\u00f3kat, t\u00e1rolj\u00e1k a blokkl\u00e1ncot, v\u00e9grehajtj\u00e1k az okos szerz\u0151d\u00e9seket \u00e9s kapcsolatba l\u00e9pnek az alkalmaz\u00e1sokkal. A peer-ek rendelkeznek egy identit\u00e1ssal (digit\u00e1lis tan\u00fas\u00edtv\u00e1ny), amelyet az MSP ad ki. A Bitcoin vagy Ethereum h\u00e1l\u00f3zatokkal ellent\u00e9tben, ahol minden csom\u00f3pont egyenl\u0151, a Hyperledger Fabric csom\u00f3pontjai k\u00fcl\u00f6nb\u00f6z\u0151 szerepeket t\u00f6ltenek be:<\/p>\n<ul>\n<li>A Peer lehet <b>endorseol\u00f3 peer<\/b> (EP), \u00e9s v\u00e9grehajtj\u00e1k az okos szerz\u0151d\u00e9seket.<\/li>\n<li><b>K\u00f6vetel\u0151 peer<\/b> (CP) \u2014 csak az adatokat t\u00e1rolj\u00e1k a blokkl\u00e1ncban, \u00e9s friss\u00edtik a \u201eWorld state\u201d-et.<\/li>\n<li><b>Horgony Peer<\/b> (AP) \u2014 ha t\u00f6bb szervezet vesz r\u00e9szt a blokkl\u00e1ncban, akkor a horgony peer-eket haszn\u00e1lj\u00e1k a k\u00f6z\u00f6tti kapcsolatra. Minden szervezetnek rendelkeznie kell egy vagy t\u00f6bb horgony peer-rel. Az AP seg\u00edts\u00e9g\u00e9vel b\u00e1rmely peer a szervezeten bel\u00fcl inform\u00e1ci\u00f3t kaphat az \u00f6sszes peer-r\u0151l m\u00e1s szervezetekben. Az AP-k k\u00f6z\u00f6tti inform\u00e1ci\u00f3szinkroniz\u00e1l\u00e1shoz <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip protokollt<\/a><\/noindex>.<\/li>\n<li><b>Vezet\u0151 Peer<\/b> \u2014 ha a szervezetnek t\u00f6bb peer-je van, akkor csak a vezet\u0151 peer fog blokkokat kapni az Ordering service-t\u0151l, \u00e9s \u00e1tadni azokat a t\u00f6bbi peer-nek. A vezet\u0151 statikusan be\u00e1ll\u00edthat\u00f3 vagy dinamikusan v\u00e1laszthat\u00f3 a szervezet peer-jei \u00e1ltal. A vezet\u0151k k\u00f6z\u00f6tti inform\u00e1ci\u00f3szinkroniz\u00e1l\u00e1shoz szint\u00e9n gossip protokollt haszn\u00e1lnak.<\/li>\n<\/ul>\n<p>\n<b>Eszk\u00f6z\u00f6k <\/b> \u2014 \u00e9rt\u00e9kes entit\u00e1sok, amelyek a blokkl\u00e1ncban t\u00e1rol\u00f3dnak. Pontosabban \u2014 ezek kulcs-\u00e9rt\u00e9k adatok JSON form\u00e1tumban. Ezek az adatok ker\u00fclnek r\u00f6gz\u00edt\u00e9sre a \u201eBlokkl\u00e1nc\u201d-ban. T\u00f6rt\u00e9net\u00fck van, amely a blokkl\u00e1ncban van t\u00e1rolva, \u00e9s aktu\u00e1lis \u00e1llapotuk, amely az \u201eWorld state\u201d adatb\u00e1zisban tal\u00e1lhat\u00f3. Az adatszerkezetek v\u00e9letlenszer\u0171en vannak kit\u00f6ltve az \u00fczleti feladatoknak megfelel\u0151en. Nincsenek k\u00f6telez\u0151 mez\u0151k, az egyetlen aj\u00e1nl\u00e1s \u2014 az eszk\u00f6z\u00f6knek rendelkezni\u00fck kell tulajdonossal \u00e9s \u00e9rt\u00e9ket kell k\u00e9pviselni\u00fck. <\/p>\n<p><b>K\u00f6nyvel\u00e9s <\/b> \u2014 a \u201eBlokkl\u00e1ncb\u00f3l\u201d \u00e9s a \u201eWorld state\u201d adatb\u00e1zisb\u00f3l \u00e1ll, ahol az eszk\u00f6z\u00f6k aktu\u00e1lis \u00e1llapota tal\u00e1lhat\u00f3. A World state a LevelDB-t vagy CouchDB-t haszn\u00e1lja.<\/p>\n<p><b>Okos szerz\u0151d\u00e9s<\/b> \u2014 az okos szerz\u0151d\u00e9seken kereszt\u00fcl val\u00f3s\u00edtj\u00e1k meg a rendszer \u00fczleti logik\u00e1j\u00e1t. A Hyperledger Fabricben az okos szerz\u0151d\u00e9sek chaincode-nak nevezik. A chaincode seg\u00edts\u00e9g\u00e9vel defini\u00e1lj\u00e1k az eszk\u00f6z\u00f6ket \u00e9s azokkal kapcsolatos tranzakci\u00f3kat. Technikai nyelven az okos szerz\u0151d\u00e9sek olyan programmodulok, amelyek JS vagy Go programoz\u00e1si nyelveken vannak megval\u00f3s\u00edtva.<\/p>\n<p><b>J\u00f3v\u00e1hagy\u00e1si politika<\/b> \u2014 minden chaincode-hoz megadhat\u00f3k politik\u00e1k, hogy mennyit \u00e9s kit\u0151l kell v\u00e1rni a tranzakci\u00f3 j\u00f3v\u00e1hagy\u00e1s\u00e1ra. Ha a politika nincs megadva, akkor alap\u00e9rtelmezetten a k\u00f6vetkez\u0151 haszn\u00e1latos: \u201ca tranzakci\u00f3t b\u00e1rmely tag (member) b\u00e1rmely szervezett\u0151l a channel-ben meg kell hogy er\u0151s\u00edtse\u201d. P\u00e9ld\u00e1k politik\u00e1kra:<\/p>\n<ul>\n<li>A tranzakci\u00f3t b\u00e1rmely szervezet adminisztr\u00e1tora meg kell, hogy er\u0151s\u00edtse;<\/li>\n<li>B\u00e1rmely szervezeti tag vagy \u00fcgyf\u00e9l meg kell, hogy er\u0151s\u00edtse;<\/li>\n<li>B\u00e1rmely szervezeti peernek meg kell, hogy er\u0151s\u00edtse.<\/li>\n<\/ul>\n<p>\n<b>Rendelkez\u00e9si szolg\u00e1ltat\u00e1s<\/b> \u2014 a tranzakci\u00f3kat blokkokba csomagolja \u00e9s elk\u00fcldi a peer-eknek a csatorn\u00e1ban. Garant\u00e1lja a \u00fczenetek k\u00e9zbes\u00edt\u00e9s\u00e9t az \u00f6sszes peer-hez a h\u00e1l\u00f3zatban. Ipari rendszerekhez haszn\u00e1latos <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Apache_Kafka\">Kafka \u00fczenetk\u00f6zvet\u00edt\u0151<\/a><\/noindex>, fejleszt\u00e9shez \u00e9s tesztel\u00e9shez <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: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/9060864bd1002da881d7f17ef8ec0b0c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Az alkalmaz\u00e1s a Hyperledger Fabric-el kommunik\u00e1l a Go, Node.js vagy Java SDK haszn\u00e1lat\u00e1val;<\/li>\n<li>A kliens l\u00e9trehozza a tx tranzakci\u00f3t, \u00e9s elk\u00fcldi azt az endors\u00e1l\u00f3 peer-eknek;<\/li>\n<li>A peer ellen\u0151rzi a kliens al\u00e1\u00edr\u00e1s\u00e1t, v\u00e9grehajtja a tranzakci\u00f3t, \u00e9s visszak\u00fcldi az endorsement al\u00e1\u00edr\u00e1st a kliensnek. A chaincode csak az endors\u00e1l\u00f3 peer-en ker\u00fcl v\u00e9grehajt\u00e1sra, \u00e9s a v\u00e9grehajt\u00e1s eredm\u00e9ny\u00e9t minden peer-hez eljuttatj\u00e1k. Ez a munkamenet algoritmus \u2014 PBFT (Practical Byzantine Fault Tolerant) konszenzus. K\u00fcl\u00f6nb\u00f6zik a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Byzantine_fault\">klasszikus BFT-t\u0151l<\/a><\/noindex> azzal, hogy az \u00fczenetet nem az \u00f6sszes r\u00e9sztvev\u0151t\u0151l k\u00fcldik el \u00e9s v\u00e1rj\u00e1k meg a meger\u0151s\u00edt\u00e9st, hanem csak egy meghat\u00e1rozott halmazt\u00f3l;<\/li>\n<li>Miut\u00e1n a kliens megkapta a meger\u0151s\u00edt\u00e9s politik\u00e1nak megfelel\u0151 v\u00e1laszok sz\u00e1m\u00e1t, elk\u00fcldi a tranzakci\u00f3t a Rendelkez\u00e9si szolg\u00e1ltat\u00e1snak;<\/li>\n<li>A Rendelkez\u00e9si szolg\u00e1ltat\u00e1s blokkot k\u00e9pez, \u00e9s elk\u00fcldi azt az \u00f6sszes elk\u00f6telezett peer-nek. A Rendelkez\u00e9si szolg\u00e1ltat\u00e1s biztos\u00edtja a blokkok folyamatos r\u00f6gz\u00edt\u00e9s\u00e9t, ami kiz\u00e1rja a ledger fork-ot (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443282\/\">l\u00e1sd a \u201eForkok\u201d fejezetet<\/a><\/noindex>);<\/li>\n<li>A peer-ek megkapj\u00e1k a blokkot, \u00fajra ellen\u0151rzik az endorsement politik\u00e1t, r\u00f6gz\u00edtik a blokkot a blokkl\u00e1ncon \u00e9s m\u00f3dos\u00edtj\u00e1k az \u00e1llapotot a \u201eWorld state\u201d DB-ben.<\/li>\n<\/ul>\n<p>\nTeh\u00e1t a node-ok k\u00f6z\u00f6tt szerepk\u00fcl\u00f6nbs\u00e9g alakul ki. Ez biztos\u00edtja a blokkl\u00e1nc sk\u00e1l\u00e1zhat\u00f3s\u00e1g\u00e1t \u00e9s biztons\u00e1g\u00e1t:<\/p>\n<ul>\n<li>Az endors\u00e1l\u00f3 peer-ek hajtj\u00e1k v\u00e9gre a okos szerz\u0151d\u00e9seket (chaincode). Ez biztos\u00edtja a okos szerz\u0151d\u00e9sek titkoss\u00e1g\u00e1t, mivel ezek nem minden r\u00e9sztvev\u0151n\u00e9l t\u00e1rol\u00f3dnak, hanem csak az endors\u00e1l\u00f3 peer-eken.<\/li>\n<li>A Rendelkez\u00e9si szolg\u00e1ltat\u00e1snak gyorsan kell m\u0171k\u00f6dnie. Ezt biztos\u00edtja, hogy a Rendelkez\u00e9s csak a blokkot k\u00e9pezi \u00e9s elk\u00fcldi egy fix vezet\u0151 peer halmaz sz\u00e1m\u00e1ra.<\/li>\n<li>Az elk\u00f6telezett peer-ek csak a blokkl\u00e1ncot t\u00e1rolj\u00e1k \u2014 sokan l\u00e9tezhetnek, \u00e9s nem ig\u00e9nyelnek nagy teljes\u00edtm\u00e9nyt \u00e9s azonnali m\u0171k\u00f6d\u00e9st. <\/li>\n<\/ul>\n<p>\nTov\u00e1bbi inform\u00e1ci\u00f3kat a Hyperledger Fabric architektur\u00e1lis megold\u00e1sair\u00f3l, \u00e9s hogy mi\u00e9rt m\u0171k\u00f6dik \u00edgy, itt tal\u00e1l. <noindex><a rel=\"nofollow\" href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/latest\/arch-deep-dive.html\">Architecture Origins<\/a><\/noindex> vagy itt: <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>Teh\u00e1t a Hyperledger Fabric val\u00f3ban egy sokoldal\u00fa rendszer, amellyel az al\u00e1bbiakat lehet megval\u00f3s\u00edtani:<\/p>\n<ul>\n<li>Tetsz\u0151leges \u00fczleti logika megval\u00f3s\u00edt\u00e1sa az okos szerz\u0151d\u00e9sek mechanizmus\u00e1nak haszn\u00e1lat\u00e1val;<\/li>\n<li>Az adatok r\u00f6gz\u00edt\u00e9se \u00e9s lek\u00e9rdez\u00e9se JSON form\u00e1tumban a blokkl\u00e1nc adatb\u00e1zisb\u00f3l;<\/li>\n<li>Hozz\u00e1f\u00e9r\u00e9s biztos\u00edt\u00e1sa \u00e9s ellen\u0151rz\u00e9se az API-hoz, a Tan\u00fas\u00edt\u00f3 Hat\u00f3s\u00e1g haszn\u00e1lat\u00e1val. <\/li>\n<\/ul>\n<p>\nMost, hogy egy kicsit tiszt\u00e1ban vagyunk a Hyperledger Fabric saj\u00e1toss\u00e1gaival, n\u00e9zz\u00fcnk v\u00e9gre valamit, ami hasznos!<\/p>\n<h2>Blokkl\u00e1nc telep\u00edt\u00e9se<\/h2>\n<p><\/p>\n<h3>L\u00e9pj\u00fcnk \u00e1t a kit\u0171z\u00f6tt feladatra: \u00edrjunk egy XDP mechanizmust SYN cookie-kkal.<\/h3>\n<p>\nA feladat \u2014 egy Citcoin h\u00e1l\u00f3zat megval\u00f3s\u00edt\u00e1sa a k\u00f6vetkez\u0151 funkci\u00f3kkal: fi\u00f3k l\u00e9trehoz\u00e1sa, egyenleg lek\u00e9rdez\u00e9se, egyenleg felt\u00f6lt\u00e9se, \u00e9rm\u00e9k \u00e1tutal\u00e1sa egyik fi\u00f3kr\u00f3l a m\u00e1sikra. Rajzoljunk meg egy objektum modellt, amelyet k\u00e9s\u0151bb megval\u00f3s\u00edtunk a okos szerz\u0151d\u00e9sben. Teh\u00e1t lesznek fi\u00f3kok, amelyek nevekkel (name) azonos\u00edthat\u00f3k \u00e9s egyenleget (balance) tartalmaznak, \u00e9s egy fi\u00f3klista. A fi\u00f3kok \u00e9s a fi\u00f3klista a Hyperledger Fabric terminol\u00f3gi\u00e1j\u00e1ban eszk\u00f6z\u00f6k (assets). Ennek megfelel\u0151en van t\u00f6rt\u00e9nelm\u00fck \u00e9s aktu\u00e1lis \u00e1llapotuk. Megpr\u00f3b\u00e1lom szeml\u00e9letesen \u00e1br\u00e1zolni:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/a4f111da59bc7982b51d583857db6d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA fels\u0151 figur\u00e1k az aktu\u00e1lis \u00e1llapotot jelzik, amely az \u201eWorld state\u201d adatb\u00e1zisban t\u00e1rol\u00f3dik. Az alattuk l\u00e9v\u0151 figur\u00e1k a blokkl\u00e1ncban t\u00e1rolt t\u00f6rt\u00e9nelmet mutatj\u00e1k. Az eszk\u00f6z\u00f6k aktu\u00e1lis \u00e1llapota tranzakci\u00f3k alapj\u00e1n v\u00e1ltozik. Az eszk\u00f6z csak eg\u00e9szben v\u00e1ltozik, \u00edgy egy tranzakci\u00f3 v\u00e9grehajt\u00e1sa \u00faj objektumot hoz l\u00e9tre, m\u00edg az eszk\u00f6z aktu\u00e1lis \u00e9rt\u00e9ke a t\u00f6rt\u00e9netbe ker\u00fcl. <\/p>\n<h3>IBM Felh\u0151 <\/h3>\n<p>\nFi\u00f3kot hozunk l\u00e9tre az <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.ibm.com\">IBM felh\u0151ben<\/a><\/noindex>. A blokkl\u00e1nc platform haszn\u00e1lat\u00e1hoz azt friss\u00edteni kell Pay-As-You-Go-ra. Ez a folyamat nem biztos, hogy gyors, mivel az IBM tov\u00e1bbi inform\u00e1ci\u00f3t k\u00e9r \u00e9s azt manu\u00e1lisan ellen\u0151rzi. Pozit\u00edvumk\u00e9nt elmondhat\u00f3, hogy az IBM-nek j\u00f3 tanulm\u00e1nyi anyagai vannak, amelyek lehet\u0151v\u00e9 teszik a Hyperledger Fabric telep\u00edt\u00e9s\u00e9t a felh\u0151j\u00fckben. Tetszett a k\u00f6vetkez\u0151 ciklus cikk \u00e9s p\u00e9lda:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/Create-BlockchainNetwork-IBPV20\/blob\/master\/README.md\">Alapblokkl\u00e1nc h\u00e1l\u00f3zat l\u00e9trehoz\u00e1sa a Blokkl\u00e1nc Platform seg\u00edts\u00e9g\u00e9vel<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/SmartContractTrading-wFabric1-4-VSCodeExt\/blob\/master\/README.md\">Blokkl\u00e1nc okos szerz\u0151d\u00e9s l\u00e9trehoz\u00e1sa \u00e9s v\u00e9grehajt\u00e1sa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IBM\/auction-events\/blob\/master\/README.md\">Esem\u00e9nyek kibocs\u00e1t\u00e1sa a Blokkl\u00e1nc Platformr\u00f3l<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAz al\u00e1bbiakban az IBM Blokkl\u00e1nc platformj\u00e1nak k\u00e9perny\u0151k\u00e9pei l\u00e1that\u00f3k. Ez nem egy blokkl\u00e1nc l\u00e9trehoz\u00e1s\u00e1ra vonatkoz\u00f3 \u00fatmutat\u00f3, hanem a feladat terjedelm\u00e9t bemutat\u00f3 d\u00e9monstr\u00e1ci\u00f3. Teh\u00e1t a c\u00e9ljaink \u00e9rdek\u00e9ben l\u00e9trehozunk egy Szervezetet:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/7cb30cade6315abc69f4322a2dbcd094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzen bel\u00fcl csom\u00f3pontokat hozunk l\u00e9tre: Orderer CA, Org1 CA, Orderer Peer:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/4a2239a9b7ded8ba5a11ffad86a35094.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFelhaszn\u00e1l\u00f3kat hozunk l\u00e9tre:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/6792b12c9316f47b0cdfaf771dacc782.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nChannel-t hozunk l\u00e9tre, \u00e9s elnevezz\u00fck citcoin:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/ea3983f209326713dcd25762c348ac96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e9nyeg\u00e9ben a Channel \u2014 ez a blokkl\u00e1nc, ez\u00e9rt nulladik blokkal (Genesis block) kezd\u0151dik:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/416df6b6ef832c6550a2642592e57250.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Okos Szerz\u0151d\u00e9st \u00edrunk<\/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>\nItt intuit\u00edvan mindennek vil\u00e1gosnak kell lennie:<\/p>\n<ul>\n<li>T\u00f6bb funkci\u00f3nk van (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), amelyeket a demo program a Hyperledger Fabric API seg\u00edts\u00e9g\u00e9vel fog h\u00edvni.<\/li>\n<li>A SendFrom \u00e9s RefillBalance funkci\u00f3k esem\u00e9nyeket (Event) gener\u00e1lnak, amelyeket a demo program fog fogadni.<\/li>\n<li>Az instantiate funkci\u00f3t egyszer h\u00edvj\u00e1k meg, amikor a okos szerz\u0151d\u00e9s p\u00e9ld\u00e1nyos\u00edt\u00e1sa t\u00f6rt\u00e9nik. Val\u00f3j\u00e1ban nem egyszer h\u00edvj\u00e1k meg, hanem minden alkalommal, amikor a okos szerz\u0151d\u00e9s verzi\u00f3ja megv\u00e1ltozik. Ez\u00e9rt a lista \u00fcres t\u00f6mbk\u00e9nt val\u00f3 inicializ\u00e1l\u00e1sa rossz \u00f6tlet, mivel \u00edgy a okos szerz\u0151d\u00e9s verzi\u00f3v\u00e1lt\u00e1sakor elvesz\u00edtj\u00fck az aktu\u00e1lis list\u00e1t. De semmi baj, csak tanulok).<\/li>\n<li>A fi\u00f3kok (accounts) \u00e9s a fi\u00f3kok list\u00e1ja (accounts) JSON adatszerkezetek. Az adatokkal val\u00f3 manipul\u00e1ci\u00f3hoz JS-t haszn\u00e1lunk.<\/li>\n<li>A jelenlegi asset \u00e9rt\u00e9k\u00e9t a getState f\u00fcggv\u00e9ny h\u00edv\u00e1s\u00e1val lehet lek\u00e9rni, friss\u00edteni pedig a putState seg\u00edts\u00e9g\u00e9vel.<\/li>\n<li>Fi\u00f3k l\u00e9trehoz\u00e1sakor az AddAccount f\u00fcggv\u00e9ny h\u00edv\u00f3dik meg, ahol \u00f6sszehasonl\u00edt\u00e1s t\u00f6rt\u00e9nik a blokkl\u00e1ncon l\u00e9v\u0151 maxim\u00e1lis fi\u00f3kok sz\u00e1m\u00e1val (maxAccounts = 5). Itt van egy hiba (\u00e9szrevetted?), amely v\u00e9gtelen n\u00f6veked\u00e9st okoz a fi\u00f3kok sz\u00e1m\u00e1ban. Az ilyen hib\u00e1kat el kell ker\u00fclni)<\/li>\n<\/ul>\n<p>\nEzut\u00e1n bet\u00f6ltj\u00fck a okos szerz\u0151d\u00e9st a Channel-be, \u00e9s p\u00e9ld\u00e1nyos\u00edtjuk:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/45ad234efc9838b711f96642988f073e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e9zz\u00fck meg a Smart Contract telep\u00edt\u00e9si tranzakci\u00f3t:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/39605b9d09468fd0c5f0557ed8b692a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e9zz\u00fck meg a Channel r\u00e9szleteit:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/ccaf803cf34e52f77dac448f9c83e672.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnnek eredm\u00e9nyek\u00e9nt a k\u00f6vetkez\u0151 blokkl\u00e1nc-h\u00e1l\u00f3zati s\u00e9m\u00e1t kapjuk az IBM felh\u0151j\u00e9ben. A s\u00e9m\u00e1n egy dem\u00f3program is l\u00e1that\u00f3, amely az Amazon felh\u0151j\u00e9ben egy virtu\u00e1lis szerveren fut (err\u0151l a k\u00f6vetkez\u0151 r\u00e9szben r\u00e9szletesebben lesz sz\u00f3):<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/64e5c0f27d351ee3b60d2ea471a7f58c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>GUI l\u00e9trehoz\u00e1sa a Hyperledger Fabric API h\u00edv\u00e1saihoz<\/h2>\n<p>\nA Hyperledger Fabric-nek van egy API-ja, amely a k\u00f6vetkez\u0151kre haszn\u00e1lhat\u00f3:<\/p>\n<ul>\n<li>Channel l\u00e9trehoz\u00e1s\u00e1ra;<\/li>\n<li>Peer csatlakoztat\u00e1sa a channelhez;<\/li>\n<li>Okos szerz\u0151d\u00e9sek telep\u00edt\u00e9se \u00e9s p\u00e9ld\u00e1nyos\u00edt\u00e1sa a channel-en;<\/li>\n<li>Tranzakci\u00f3k h\u00edv\u00e1sa;<\/li>\n<li>Inform\u00e1ci\u00f3 lek\u00e9r\u00e9se a blokkl\u00e1ncb\u00f3l.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Alkalmaz\u00e1s fejleszt\u00e9se<\/h3>\n<p>\nA dem\u00f3programunkban az API-t csak tranzakci\u00f3k h\u00edv\u00e1s\u00e1ra \u00e9s inform\u00e1ci\u00f3k lek\u00e9r\u00e9s\u00e9re haszn\u00e1ljuk, mivel a t\u00f6bbi l\u00e9p\u00e9st m\u00e1r elv\u00e9gezt\u00fck az IBM blokkl\u00e1nc platformj\u00e1n. GUI-t \u00edrunk a standard technol\u00f3giai stack haszn\u00e1lat\u00e1val: Express.js + Vue.js + Node.js. Arr\u00f3l, hogy hogyan kezdj\u00fcnk modern webalkalmaz\u00e1sokat k\u00e9sz\u00edteni, k\u00fcl\u00f6n cikket lehetne \u00edrni. Itt hagyok egy linket egy olyan el\u0151ad\u00e1ssorozathoz, amely nekem legjobban tetszett: <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/Fa4cRMaTDUI\">Full Stack Web App using Vue.js &amp; Express.js<\/a><\/noindex>. Ennek eredm\u00e9nyek\u00e9nt egy kliens-szerver alkalmaz\u00e1s lett, ismer\u0151s grafikus felhaszn\u00e1l\u00f3i fel\u00fclettel, a Google Material Design st\u00edlus\u00e1ban. A kliens \u00e9s a szerver k\u00f6z\u00f6tti REST API t\u00f6bb h\u00edv\u00e1sb\u00f3l \u00e1ll:<\/p>\n<ul>\n<li>HyperledgerDemo\/v1\/init \u2014 blokkl\u00e1nc inicializ\u00e1l\u00e1sa;<\/li>\n<li>HyperledgerDemo\/v1\/accounts\/list \u2014 az \u00f6sszes fi\u00f3k list\u00e1j\u00e1nak lek\u00e9r\u00e9se;<\/li>\n<li>HyperledgerDemo\/v1\/account?name=Bob&amp;balance=100 \u2014 Bob fi\u00f3k l\u00e9trehoz\u00e1sa;<\/li>\n<li>HyperledgerDemo\/v1\/info?account=Bob \u2014 inform\u00e1ci\u00f3k lek\u00e9r\u00e9se Bob fi\u00f3kr\u00f3l;<\/li>\n<li>HyperledgerDemo\/v1\/transaction?from=Bob&amp;to=Alice&amp;volume=2 \u2014 k\u00e9t \u00e9rme \u00e1tutal\u00e1sa Bobt\u00f3l Alice-hoz;<\/li>\n<li>HyperledgerDemo\/v1\/disconnect \u2014 a kapcsolat lez\u00e1r\u00e1sa a blokkl\u00e1nccal.<\/li>\n<\/ul>\n<p>\nAPI le\u00edr\u00e1s\u00e1t p\u00e9ld\u00e1kkal feltettem a<noindex><a rel=\"nofollow\" href=\"https:\/\/documenter.getpostman.com\/view\/7152141\/SVfTNSeb\"> s\u00edt \u201ePostman\u201d<\/a><\/noindex> \u2014 a HTTP API tesztel\u00e9s\u00e9re sz\u00e9les k\u00f6rben ismert program.<\/p>\n<h3>Dem\u00f3 alkalmaz\u00e1s az Amazon felh\u0151ben<\/h3>\n<p>\nAz alkalmaz\u00e1st az Amazonra t\u00f6lt\u00f6ttem fel, mivel az IBM m\u00e9g mindig nem tudta friss\u00edteni a fi\u00f3k\u00f3mat \u00e9s enged\u00e9lyezni a virtu\u00e1lis szerverek l\u00e9trehoz\u00e1s\u00e1t. Mint egy cseresznye a tort\u00e1n, hozz\u00e1tettem a domaint: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.citcoin.info\">www.citcoin.info<\/a><\/noindex>. Kicsit fenntartom a szervert, majd kikapcsolom, mivel a b\u00e9rleti d\u00edj k\u00f6lts\u00e9gei szaladnak, a citcoin \u00e9rm\u00e9k pedig m\u00e9g nem jegyzettek a t\u0151zsd\u00e9n) A cikkbe k\u00e9perny\u0151k\u00e9peket helyezek el a dem\u00f3r\u00f3l, hogy \u00e9rthet\u0151 legyen a m\u0171k\u00f6d\u00e9s logik\u00e1ja. A dem\u00f3 alkalmaz\u00e1s k\u00e9pes:<\/p>\n<ul>\n<li>Blokkl\u00e1nc inicializ\u00e1l\u00e1sa;<\/li>\n<li>Fi\u00f3k l\u00e9trehoz\u00e1sa (de jelenleg \u00faj fi\u00f3kot nem lehet l\u00e9trehozni, mivel a blokkl\u00e1ncban el\u00e9rt\u00fck a maxim\u00e1lis fi\u00f3ksz\u00e1mot, amelyet a okos szerz\u0151d\u00e9s meghat\u00e1rozott);<\/li>\n<li>Fi\u00f3kok list\u00e1j\u00e1nak lek\u00e9rdez\u00e9se;<\/li>\n<li>Citcoin \u00e9rm\u00e9k \u00e1tvitele Alice, Bob \u00e9s Alex k\u00f6z\u00f6tt;<\/li>\n<li>Esem\u00e9nyek lek\u00e9rdez\u00e9se (de jelenleg az esem\u00e9nyek nem jelen\u00edthet\u0151k meg, ez\u00e9rt a fel\u00fclet egyszer\u0171s\u00e9g\u00e9nek \u00e9rdek\u00e9ben azt \u00edrja, hogy az esem\u00e9nyek nem t\u00e1mogatottak);<\/li>\n<li>M\u0171veletek napl\u00f3z\u00e1sa.<\/li>\n<\/ul>\n<p>\nEl\u0151sz\u00f6r inicializ\u00e1ljuk a blokkl\u00e1ncot:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/773ce08270f1b22e64a79fce267bb25f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzut\u00e1n l\u00e9trehozzuk a saj\u00e1t fi\u00f3kunkat, nem sp\u00f3rolunk a egyenleggel:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/f1cd24aedd5e9618046c5e1ab49ceede.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLek\u00e9rj\u00fck az \u00f6sszes el\u00e9rhet\u0151 fi\u00f3kot:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/796f897ca1345430f755055372d03421.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKiv\u00e1lasztjuk a k\u00fcld\u0151t \u00e9s a c\u00edmzettet, megkapjuk az egyenleg\u00fcket. Ha a k\u00fcld\u0151 \u00e9s a c\u00edmzett ugyanaz, akkor a sz\u00e1ml\u00e1t felt\u00f6ltj\u00fck:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/58eb2ed4a4bac51e0dca1b0331d7910a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c1ttekintj\u00fck a tranzakci\u00f3k v\u00e9grehajt\u00e1s\u00e1t a napl\u00f3ban:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/528760998e8dc27a73c4409f55b22087.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA dem\u00f3 programmal ennyi. Most megn\u00e9zhetj\u00fck a tranzakci\u00f3nkat a blokkl\u00e1ncon:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/1d6bc12f3609b118472afec31b089f09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9s az \u00f6sszes tranzakci\u00f3 list\u00e1j\u00e1t:<\/p>\n<p><img decoding=\"async\" alt=\"Blockchain: mit \u00e9r nek\u00fcnk a PoC fel\u00e9p\u00edt\u00e9se?\" src=\"\/wp-content\/uploads\/2019\/09\/96675fcda8088307326dadf7852e6ce7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzzel sikeresen befejezt\u00fck a Citcoin h\u00e1l\u00f3zat PoC megval\u00f3s\u00edt\u00e1s\u00e1t. Mit kell m\u00e9g tenni ahhoz, hogy a Citcoin teljes \u00e9rt\u00e9k\u0171 h\u00e1l\u00f3zatt\u00e1 v\u00e1ljon az \u00e9rm\u00e9k \u00e1tvitel\u00e9re? Csak egy kicsit:<\/p>\n<ul>\n<li>A fi\u00f3k l\u00e9trehoz\u00e1sakor meg kell val\u00f3s\u00edtani a priv\u00e1t\/publikus kulcs gener\u00e1l\u00e1s\u00e1t. A priv\u00e1t kulcsnak a fi\u00f3k felhaszn\u00e1l\u00f3j\u00e1n\u00e1l kell t\u00e1rol\u00f3dnia, a publikusnak a blokkl\u00e1ncon.<\/li>\n<li>Tranzakci\u00f3kat kell v\u00e9grehajtani, melyekn\u00e9l a felhaszn\u00e1l\u00f3 azonos\u00edt\u00e1sa nem n\u00e9vvel, hanem publikus kulccsal t\u00f6rt\u00e9nik.<\/li>\n<li>Titkos\u00edtani kell a felhaszn\u00e1l\u00f3t\u00f3l a szerver fel\u00e9 halad\u00f3 tranzakci\u00f3kat a priv\u00e1t kulccsal.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Z\u00e1r\u00e1s <\/h2>\n<p>\nA Citcoin h\u00e1l\u00f3zatot val\u00f3s\u00edtottuk meg olyan funkci\u00f3kkal, mint: fi\u00f3k hozz\u00e1ad\u00e1sa, egyenleg lek\u00e9rdez\u00e9se, sz\u00e1mla felt\u00f6lt\u00e9s, \u00e9rm\u00e9k \u00e1tvitele egyik sz\u00e1ml\u00e1r\u00f3l a m\u00e1sikra. Sz\u00f3val mit is \u00e1ll\u00edtottunk el\u0151 a PoC keret\u00e9ben?<\/p>\n<ul>\n<li>Meg kell ismerkedni a blokkl\u00e1nccal \u00e1ltal\u00e1ban \u00e9s k\u00fcl\u00f6n\u00f6sen a Hyperledger Fabric-el;<\/li>\n<li>Meg kell tanulni haszn\u00e1lni az IBM vagy az Amazon felh\u0151it;<\/li>\n<li>Meg kell tanulni a JS programoz\u00e1si nyelvet \u00e9s egy webes keretrendszert;<\/li>\n<li>Ha b\u00e1rmilyen adatot a blokkl\u00e1ncon k\u00edv\u00fcl szeretn\u00e9l t\u00e1rolni, akkor meg kell tanulnod p\u00e9ld\u00e1ul integr\u00e1lni a PostgreSQL-t.<\/li>\n<li>\u00c9s v\u00e9g\u00fcl, de nem utols\u00f3sorban \u2014 a Linux ismerete n\u00e9lk\u00fcl manaps\u00e1g nem megy sehov\u00e1!)<\/li>\n<\/ul>\n<p>\nTerm\u00e9szetesen nem \u0171rhaj\u00f3z\u00e1s, de lesz vele munka!<\/p>\n<h3>\ud83e\udd47DoubleContact 0.2.0 | ProHoster<\/h3>\n<p>\nA forr\u00e1sk\u00f3dokat elhelyeztem a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AlexeySushkov\/Citcoin-blockchain\">GitHub<\/a><\/noindex>. A repository r\u00f6vid le\u00edr\u00e1sa:<br \/>\nKatal\u00f3g &#171;<b>server<\/b>&#187; \u2014 Node.js szerver<br \/>\nKatal\u00f3g &#171;<b>client<\/b>&#187; \u2014 Node.js kliens<br \/>\nKatal\u00f3g &#171;<b>blockchain<\/b>&#187; (a param\u00e9terek \u00e9rt\u00e9kei \u00e9s kulcsai term\u00e9szetesen nem m\u0171k\u00f6dnek, \u00e9s csak p\u00e9ldak\u00e9nt szerepelnek):<\/p>\n<ul>\n<li>contract \u2014 a smart contract forr\u00e1sa<\/li>\n<li>wallet \u2014 a felhaszn\u00e1l\u00f3 kulcsai a Hyperledger Fabric API haszn\u00e1lat\u00e1hoz. <\/li>\n<li>*.cds \u2014 a smart contractok leford\u00edtott verzi\u00f3i<\/li>\n<li>*.json f\u00e1jlok \u2014 p\u00e9ld\u00e1k a konfigur\u00e1ci\u00f3s f\u00e1jlokra a Hyperledger Fabric API haszn\u00e1lat\u00e1hoz<\/li>\n<\/ul>\n<p>\n<b>Ez csak a kezdet!<\/b><br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47Blokkl\u00e1nc: mire van sz\u00fcks\u00e9g a PoC fel\u00e9p\u00edt\u00e9s\u00e9hez? | ProHoster","description":"A szemek f\u00e9lnek, de a kezek viszketnek! Az el\u0151z\u0151 cikkekben \u00e1ttekintett\u00fck a blokkl\u00e1ncok alaptechnol\u00f3gi\u00e1it (Mire van sz\u00fcks\u00e9g a blokkl\u00e1nchoz?).","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/blokchejn-chto-nam-stoit-poc-postroit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/37868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=37868"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/37868\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/28421"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=37868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=37868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=37868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}