{"id":38856,"date":"2019-10-31T22:26:22","date_gmt":"2019-10-31T19:26:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\/"},"modified":"2019-10-31T22:26:22","modified_gmt":"2019-10-31T19:26:22","slug":"publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Verejn\u00e1 sk\u00fa\u0161ka: rie\u0161enie pre s\u00fakromie a \u0161k\u00e1lovate\u013enos\u0165 v Ethereu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> \u2014 inovat\u00edvna technol\u00f3gia, ktor\u00e1 s\u013eubuje zlep\u0161i\u0165 mnoh\u00e9 oblasti \u013eudskeho \u017eivota. Pren\u00e1\u0161a re\u00e1lne procesy a produkty do digit\u00e1lneho priestoru, zabezpe\u010duje r\u00fdchlos\u0165 a spo\u013eahlivos\u0165 finan\u010dn\u00fdch oper\u00e1ci\u00ed, zni\u017euje ich n\u00e1klady a tie\u017e umo\u017e\u0148uje vytv\u00e1ra\u0165 modern\u00e9 DAPP aplik\u00e1cie s vyu\u017eit\u00edm inteligentn\u00fdch zml\u00fav v decentralizovan\u00fdch sie\u0165ach.<\/p>\n<p>Pri zoh\u013eadnen\u00ed mnoh\u00fdch v\u00fdhod a rozmanit\u00fdch oblast\u00ed aplik\u00e1cie blockchainu, sa m\u00f4\u017ee zda\u0165 zvl\u00e1\u0161tne, \u017ee t\u00e1to s\u013eubn\u00e1 technol\u00f3gia e\u0161te neprenikla do v\u0161etk\u00fdch odvetv\u00ed. Probl\u00e9m spo\u010d\u00edva v tom, \u017ee s\u00fa\u010dasn\u00fdm decentralizovan\u00fdm blockchainom ch\u00fdba \u0161k\u00e1lovate\u013enos\u0165. Ethereum sprac\u00fava pribli\u017ene 20 transakci\u00ed za sekundu, \u010do nesta\u010d\u00ed na uspokojenie potrieb s\u00fa\u010dasn\u00e9ho dynamick\u00e9ho podnikania. Z\u00e1rove\u0148 sa firmy vyu\u017e\u00edvaj\u00face technol\u00f3giu blockchainu neodv\u00e1\u017eia vzda\u0165 sa Etherea kv\u00f4li jeho vysokej \u00farovni ochrany pred hackingom a poruchami siete.<\/p>\n<p>Aby sa zabezpe\u010dila decentraliz\u00e1cia, bezpe\u010dnos\u0165 a \u0161k\u00e1lovate\u013enos\u0165 v blockchain, \u010d\u00edm sa rie\u0161i Trilema \u0161k\u00e1lovate\u013enosti, t\u00edm v\u00fdvoj\u00e1rov <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> vytvoril Plasma Cash \u2014 dc\u00e9rsku re\u0165azec pozost\u00e1vaj\u00facu zo smart kontraktu a s\u00fakromnej siete zalo\u017eenej na Node.js, ktor\u00e1 periodicky pren\u00e1\u0161a svoj stav do hlavnej re\u0165aze (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Verejn\u00e1 sk\u00fa\u0161ka: rie\u0161enie pre s\u00fakromie a \u0161k\u00e1lovate\u013enos\u0165 v Ethereu\" src=\"\/wp-content\/uploads\/2019\/10\/02cc45df3474179d0936c2a86fb7dee3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>K\u013e\u00fa\u010dov\u00e9 procesy v Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>Pou\u017e\u00edvate\u013e vyvol\u00e1 funkciu smart kontraktu `deposit`, pri\u010dom do nej posiela sumu v ETH, ktor\u00fa chce umiestni\u0165 do tokenu Plasma Cash. Funkcia smart kontraktu vytvor\u00ed token a generuje udalos\u0165 o tom.<\/p>\n<p><b>2. <\/b>Plasma Cash uzly, ktor\u00e9 s\u00fa prihl\u00e1sen\u00e9 na odber udalost\u00ed smart kontraktu, prij\u00edmaj\u00fa udalos\u0165 o vytvoren\u00ed vkladu a prid\u00e1vaj\u00fa do poolu transakciu o vytvoren\u00ed tokenu.<\/p>\n<p><b>3. <\/b>Periodicky \u0161peci\u00e1lne uzly Plasma Cash vezm\u00fa v\u0161etky transakcie z poolu (a\u017e do 1 mili\u00f3na) a vytvoria z nich blok, vypo\u010d\u00edtaj\u00fa Merkleho strom a n\u00e1sledne hash. Tento blok je odoslan\u00fd \u010fal\u0161\u00edm uzlom na overenie. Uzly kontroluj\u00fa, \u010di je hash Merkle platn\u00fd, \u010di s\u00fa transakcie platn\u00e9 (napr\u00edklad, \u010di je odosielate\u013e tokenu jeho vlastn\u00edkom). Po overen\u00ed bloku uzol vyvol\u00e1 funkciu `submitBlock` smart kontraktu, ktor\u00e1 uklad\u00e1 do hlavnej re\u0165aze \u010d\u00edslo a hash Merkle bloku. Smart kontrakt generuje udalos\u0165 o \u00faspe\u0161nom pridan\u00ed bloku. Transakcie s\u00fa odstr\u00e1nen\u00e9 z poolu. <\/p>\n<p><b>4. <\/b>Uzly, ktor\u00e9 dostali udalos\u0165 o odoslan\u00ed bloku, za\u010d\u00ednaj\u00fa aplikova\u0165 transakcie, ktor\u00e9 boli pridan\u00e9 do bloku.<\/p>\n<p><b>5. <\/b>V ur\u010ditom momente chce vlastn\u00edk (alebo nevlastn\u00edk) tokenu vybra\u0165 ho z Plasma Cash. Na to vol\u00e1 funkciu `startExit`, pri\u010dom jej odovzd\u00e1va inform\u00e1cie o posledn\u00fdch 2 transakci\u00e1ch tokenu, ktor\u00e9 potvrdzuj\u00fa, \u017ee je jeho vlastn\u00edkom. Smart kontrakt, vyu\u017e\u00edvaj\u00fac hash Merkle, overuje pr\u00edtomnos\u0165 transakci\u00ed v blokoch a odosiela token na v\u00fdber, ktor\u00fd sa uskuto\u010dn\u00ed za dve t\u00fd\u017edne.<\/p>\n<p><b>6. <\/b>Ak do\u0161lo k poru\u0161eniam pri v\u00fdbere tokenu (token bol min\u00fa\u0165 po za\u010dat\u00ed proced\u00fary v\u00fdberu alebo token bol u\u017e pred v\u00fdberom cudz\u00ed), vlastn\u00edk tokenu m\u00f4\u017ee odvola\u0165 v\u00fdber v priebehu dvoch t\u00fd\u017ed\u0148ov.<\/p>\n<p><img decoding=\"async\" alt=\"Verejn\u00e1 sk\u00fa\u0161ka: rie\u0161enie pre s\u00fakromie a \u0161k\u00e1lovate\u013enos\u0165 v Ethereu\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>S\u00fakromnos\u0165 sa dosahuje dvoma sp\u00f4sobmi<\/h2>\n<p>\n<b>1. <\/b>Hlavn\u00fd re\u0165azec ni\u010d nevie o transakci\u00e1ch, ktor\u00e9 sa formuj\u00fa a posielaj\u00fa v r\u00e1mci podradn\u00e9ho re\u0165azca. Verejnou zost\u00e1va inform\u00e1cia o tom, kto vlo\u017eil a vybral ETH do\/z Plasma Cash.<\/p>\n<p><b>2. <\/b>Podraden\u00fd re\u0165azec umo\u017e\u0148uje organizova\u0165 anonymn\u00e9 transakcie s vyu\u017eit\u00edm zk-SNARKs.<\/p>\n<h2>Technologick\u00fd stack<\/h2>\n<p><\/p>\n<ul>\n<li>NodeJS<\/li>\n<li>K\u013eu\u010d-hodnota<\/li>\n<li>Etherium<\/li>\n<li>Soild<\/li>\n<\/ul>\n<p><\/p>\n<h2>Testovanie <\/h2>\n<p>\nPri v\u00fdvoji Plasma Cash sme otestovali r\u00fdchlos\u0165 fungovania syst\u00e9mu a z\u00edskali nasleduj\u00face v\u00fdsledky:<\/p>\n<ul>\n<li>do 35 000 transakci\u00ed za sekundu sa prid\u00e1va do mraku;<\/li>\n<li>do 1 000 000 transakci\u00ed m\u00f4\u017ee by\u0165 ulo\u017een\u00fdch v bloku.<\/li>\n<\/ul>\n<p>\nTesty sa vykon\u00e1vali na 3 nasledovn\u00fdch serveroch:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake s NVMe SSD \u2014 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n Boli nasaden\u00e9 3 validuj\u00face uzly Plasma Cash.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core 'Summit Ridge' (Zen), SATA SSD \u2014 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n Bola vybudovan\u00e1 Ropsten testnet ETH uzol.<br \/>\n Boli nasaden\u00e9 3 validuj\u00face uzly Plasma Cash.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core s NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n Bola vytvoren\u00e1 1 odosielacia uzol Plasma Cash.<br \/>\n Boli nasaden\u00e9 3 validuj\u00face uzly Plasma Cash.<br \/>\n Prebiehal test na prid\u00e1vanie transakci\u00ed do siete Plasma Cash.<\/p>\n<p><b>Celkovo: <\/b>10 uzlov Plasma Cash v s\u00fakromnej sieti.<\/p>\n<h3>Test 1<\/h3>\n<p>\nExistuje limit na 1 mili\u00f3n transakci\u00ed v bloku. Preto 1 mili\u00f3n transakci\u00ed sa nach\u00e1dza v 2 blokoch (ke\u010f\u017ee syst\u00e9m stihne zobra\u0165 \u010das\u0165 transakci\u00ed a odosla\u0165 ich, k\u00fdm s\u00fa e\u0161te odosielan\u00e9).<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"pKwqyGkEgdQ\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/pKwqyGkEgdQ\/hqdefault.jpg\" alt=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nPo\u010diatocn\u00fd stav: posledn\u00fd blok #7; v datab\u00e1ze je ulo\u017een\u00fdch 1 mili\u00f3n transakci\u00ed a tokenov.<\/p>\n<p>00:00 \u2014 spustenie skriptu generovania transakci\u00ed<br \/>\n01:37 \u2014 vytvoren\u00fdch 1 mili\u00f3n transakci\u00ed a za\u010dalo sa odosielanie do uzla<br \/>\n01:46 \u2014 odosielacia uzol vzala z mraku 240k transakci\u00ed a formuje blok #8. Tie\u017e vid\u00edme, \u017ee sa do mraku prid\u00e1va 320k transakci\u00ed za 10 sek\u00fand<br \/>\n01:58 \u2014 blok #8 je podp\u00edsan\u00fd a odoslan\u00fd na valid\u00e1ciu<br \/>\n02:03 \u2014 blok #8 bol validovan\u00fd a bola vyvolan\u00e1 funkcia `submitBlock` smart kontraktu s hashom Merkle a \u010d\u00edslom bloku<br \/>\n02:10 \u2014 demo skript prestal fungova\u0165, ktor\u00fd odoslal 1 mili\u00f3n transakci\u00ed za 32 sek\u00fand<br \/>\n02:33 \u2014 uzly za\u010dali prij\u00edma\u0165 inform\u00e1cie o tom, \u017ee blok #8 bol pridan\u00fd do kore\u0148ov\u00e9ho re\u0165azca a za\u010dali vykon\u00e1va\u0165 240 000 transakci\u00ed<br \/>\n02:40 \u2014 z poolu bolo odstr\u00e1nen\u00fdch 240 000 transakci\u00ed, ktor\u00e9 s\u00fa u\u017e v bloku #8<br \/>\n02:56 \u2014 submit uzol vzal z poolu zost\u00e1vaj\u00face 760 000 transakci\u00ed a za\u010dal po\u010d\u00edta\u0165 hash Merkle a podpisova\u0165 blok #9<br \/>\n03:20 \u2014 v\u0161etky uzly obsahuj\u00fa 1 mili\u00f3n 240 000 transakci\u00ed a tokenov<br \/>\n03:35 \u2014 blok #9 bol podp\u00edsan\u00fd a odoslan\u00fd na valid\u00e1ciu in\u00fdm uzlom <br \/>\n03:41 \u2014 do\u0161lo k chybe siete<br \/>\n04:40 \u2014 pod\u013ea timeoutu prestalo o\u010dak\u00e1vanie na valid\u00e1ciu bloku #9<br \/>\n04:54 \u2014 submit uzol vzal z poolu zost\u00e1vaj\u00face 760 000 transakci\u00ed a za\u010dal po\u010d\u00edta\u0165 hash Merkle a podpisova\u0165 blok #9<br \/>\n05:32 \u2014 blok #9 bol podp\u00edsan\u00fd a odoslan\u00fd na valid\u00e1ciu in\u00fdm uzlom<br \/>\n05:53 \u2014 blok #9 bol validovan\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca<br \/>\n06:17 \u2014 uzly za\u010dali prij\u00edma\u0165 inform\u00e1cie o tom, \u017ee blok #9 bol pridan\u00fd do kore\u0148ov\u00e9ho re\u0165azca a za\u010dali vykon\u00e1va\u0165 760 000 transakci\u00ed<br \/>\n06:47 \u2014 pool sa vy\u010distil od transakci\u00ed, ktor\u00e9 s\u00fa v bloku #9<br \/>\n09:06 \u2014 v\u0161etky uzly obsahuj\u00fa 2 mili\u00f3ny transakci\u00ed a tokenov<\/p>\n<h3>Test 2<\/h3>\n<p>\nExistuje limit 350 000 na blok. V\u00fdsledkom je 3 bloky.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"mpTfTPKYRIc\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/mpTfTPKYRIc\/hqdefault.jpg\" alt=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nPo\u010diato\u010dn\u00fd stav: posledn\u00fd blok #9; v datab\u00e1ze je ulo\u017een\u00fdch 2 mili\u00f3ny transakci\u00ed a tokenov<\/p>\n<p>00:00 \u2014 skript na gener\u00e1ciu transakci\u00ed u\u017e be\u017e\u00ed<br \/>\n00:44 \u2014 bolo vytvoren\u00fdch 1 mili\u00f3n transakci\u00ed a za\u010dalo sa odosielanie do uzla<br \/>\n00:56 \u2014 submit uzol vzal z poolu 320 000 transakci\u00ed a vytv\u00e1ra blok #10. Taktie\u017e vid\u00edme, \u017ee do poolu prib\u00fada 320 000 transakci\u00ed za 10 sek\u00fand<br \/>\n01:12 \u2014 blok #10 bol podp\u00edsan\u00fd a odoslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n01:18 \u2014 demo skript prestal fungova\u0165, ktor\u00fd odoslal 1 mili\u00f3n transakci\u00ed za 34 sek\u00fand<br \/>\n01:20 \u2014 blok #10 bol validovan\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca <br \/>\n01:51 \u2014 v\u0161etky uzly z\u00edskali zo kore\u0148ov\u00e9ho re\u0165azca inform\u00e1cie o tom, \u017ee blok #10 bol pridan\u00fd, a za\u010d\u00ednaj\u00fa aplikova\u0165 320 000 transakci\u00ed<br \/>\n02:01 \u2014 pool sa vy\u010distil na 320 000 transakci\u00ed, ktor\u00e9 boli pridan\u00e9 do bloku #10<br \/>\n02:15 \u2014 submit uzol vzal z poolu 350 000 transakci\u00ed a vytv\u00e1ra blok #11<br \/>\n02:34 \u2014 blok #11 bol podp\u00edsan\u00fd a odoslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n02:51 \u2014 blok #11 bol validovan\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca <br \/>\n02:55 \u2014 posledn\u00fd uzol vykonal transakcie z bloku #10<br \/>\n10:59 \u2014 ve\u013emi dlh\u00e1 transakcia s odoslan\u00edm bloku #9 prebiehala v kore\u0148ovom re\u0165azci, ale nakoniec bola \u00faspe\u0161n\u00e1 a v\u0161etky uzly dostali inform\u00e1ciu a za\u010dali vykon\u00e1va\u0165 350k transakci\u00ed.<br \/>\n11:05 \u2014 t\u00e1to \u010disti\u010dka sa zbavila 320k transakci\u00ed, ktor\u00e9 boli pridan\u00e9 do bloku #11.<br \/>\n12:10 \u2014 v\u0161etky uzly obsahuj\u00fa 1 mili\u00f3n 670k transakci\u00ed a tokenov.<br \/>\n12:17 \u2014 uzol odoslania prevzal z poolu 330k transakci\u00ed a formuje blok #12.<br \/>\n12:32 \u2014 blok #12 bol podp\u00edsan\u00fd a odoslan\u00fd ostatn\u00fdm uzlom na overenie.<br \/>\n12:39 \u2014 blok #12 bol overen\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca. <br \/>\n13:44 \u2014 v\u0161etky uzly dostali z kore\u0148ov\u00e9ho re\u0165azca inform\u00e1ciu, \u017ee blok #12 bol pridan\u00fd a za\u010d\u00ednaj\u00fa aplikova\u0165 330k transakci\u00ed.<br \/>\n14:50 \u2014 v\u0161etky uzly obsahuj\u00fa 2 mili\u00f3ny transakci\u00ed a tokenov.<\/p>\n<h3>Test 3<\/h3>\n<p>\nNa prvom a druhom serveri bola jedna valida\u010dn\u00e1 uzol vymenen\u00e1 za uzol odoslania. <\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"w5QHab3heIc\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/w5QHab3heIc\/hqdefault.jpg\" alt=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nPo\u010diato\u010dn\u00fd stav: posledn\u00fd blok #84; v datab\u00e1ze je ulo\u017een\u00fdch 0 transakci\u00ed a tokenov.<\/p>\n<p>00:00 \u2014 Spustili sa 3 skripty, ktor\u00e9 generuj\u00fa a posielaj\u00fa po 1 mili\u00f3n transakci\u00ed.<br \/>\n01:38 \u2014 vytvoren\u00fdch 1 mili\u00f3n transakci\u00ed a za\u010dala sa odosiela\u0165 do uzla odoslania #3.<br \/>\n01:50 \u2014 uzol odoslania #3 prevzal z poolu 330k transakci\u00ed a formuje blok #85 (f21). Vid\u00edme tie\u017e, \u017ee do poolu bolo pridan\u00fdch 350k transakci\u00ed za 10 sek\u00fand.<br \/>\n01:53 \u2014 vytvoren\u00fdch 1 mili\u00f3n transakci\u00ed a za\u010dala sa odosiela\u0165 do uzla odoslania #1.<br \/>\n01:50 \u2014 uzol odoslania #3 prevzal z poolu 330k transakci\u00ed a formuje blok #85 (f21). Vid\u00edme tie\u017e, \u017ee do poolu bolo pridan\u00fdch 350k transakci\u00ed za 10 sek\u00fand.<br \/>\n02:01 \u2014 uzol odoslania #1 prevzal z poolu 250k transakci\u00ed a formuje blok #85 (65e).<br \/>\n02:06 \u2014 blok #85 (f21) bol podp\u00edsan\u00fd a odoslan\u00fd ostatn\u00fdm uzlom na overenie.<br \/>\n02:08 \u2014 skon\u010dil sa demo-skript servera #3, ktor\u00fd odoslal 1 mili\u00f3n transakci\u00ed za 30 sek\u00fand.<br \/>\n02:14 \u2014 blok #85 (f21) bol overen\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca. <br \/>\n02:19 \u2014 blok #85 (65e) bol podp\u00edsan\u00fd a odoslan\u00fd ostatn\u00fdm uzlom na overenie.<br \/>\n02:22 \u2014 vytvoren\u00fdch 1 mili\u00f3n transakci\u00ed a za\u010dala sa odosiela\u0165 do uzla odoslania #2.<br \/>\n02:27 \u2014 blok #85 (65e) bol overen\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca. <br \/>\n02:29 \u2014 uzol odoslania #2 prevzal z poolu 111855 transakci\u00ed a formuje blok #85 (256).<br \/>\n02:36 \u2014 blok #85 (256) bol podp\u00edsan\u00fd a odoslan\u00fd ostatn\u00fdm uzlom na overenie.<br \/>\n02:36 \u2014 skon\u010dil sa demo-skript servera #1, ktor\u00fd odoslal 1 mili\u00f3n transakci\u00ed za 42.5 sekundy.<br \/>\n02:38 \u2014 blok #85 (256) bol overen\u00fd a odoslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca.<br \/>\n03:08 \u2014 skon\u010dil sa demo-skript servera #2, ktor\u00fd odoslal 1 mili\u00f3n transakci\u00ed za 47 sek\u00fand. <br \/>\n03:38 \u2014 v\u0161etky uzly dostali z kore\u0148ov\u00e9ho re\u0165azca inform\u00e1ciu, \u017ee bloky #85 (f21), #86(65e), #87(256) boli pridan\u00e9 a za\u010d\u00ednaj\u00fa aplikova\u0165 330k, 250k, 111855 transakci\u00ed.<br \/>\n03:49 \u2014 pool sa vy\u010distil o 330k, 250k, 111855 transakci\u00ed, ktor\u00e9 boli pridan\u00e9 do blokov #85 (f21), #86(65e), #87(256)<br \/>\n03:59 \u2014 submit uzol #1 vzal z poolu 888145 transakci\u00ed a formuje blok #88 (214), submit uzol #2 vzal z poolu 750k transakci\u00ed a formuje blok #88 (50a), submit uzol #3 vzal z poolu 670k transakci\u00ed a formuje blok #88 (d3b)<br \/>\n04:44 \u2014 blok #88 (d3b) bol podp\u00edsan\u00fd a poslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n04:58 \u2014 blok #88 (214) bol podp\u00edsan\u00fd a poslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n05:11 \u2014 blok #88 (50a) bol podp\u00edsan\u00fd a poslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n05:11 \u2014 blok #85 (d3b) bol validovan\u00fd a poslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca <br \/>\n05:36 \u2014 blok #85 (214) bol validovan\u00fd a poslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca <br \/>\n05:43 \u2014 v\u0161etky uzly dostali z kore\u0148ov\u00e9ho re\u0165azca inform\u00e1cie o tom, \u017ee bloky #88 (d3b), #89(214) boli pridan\u00e9 a za\u010d\u00ednaj\u00fa aplikova\u0165 670k, 750k transakci\u00ed<br \/>\n06:50 \u2014 kv\u00f4li preru\u0161en\u00e9mu spojeniu blok #85 (50a) nebol validovan\u00fd<br \/>\n06:55 \u2014 submit uzol #2 vzal z poolu 888145 transakci\u00ed a formuje blok #90 (50a)<br \/>\n08:14 \u2014 blok #90 (50a) bol podp\u00edsan\u00fd a poslan\u00fd in\u00fdm uzlom na valid\u00e1ciu<br \/>\n09:04 \u2014 blok #90 (50a) bol validovan\u00fd a poslan\u00fd do kore\u0148ov\u00e9ho re\u0165azca <br \/>\n11:23 \u2014 v\u0161etky uzly dostali z kore\u0148ov\u00e9ho re\u0165azca inform\u00e1cie o tom, \u017ee blok #90 (50a) bol pridan\u00fd a za\u010d\u00ednaj\u00fa aplikova\u0165 888145 transakci\u00ed. Medzi\u010dasom server #3 u\u017e pridal transakcie z blokov #88 (d3b), #89(214)<br \/>\n12:11 \u2014 v\u0161etky pooly s\u00fa pr\u00e1zdne<br \/>\n13:41 \u2014 v\u0161etky uzly servera #3 obsahuj\u00fa 3 mili\u00f3ny transakci\u00ed a tokenov<br \/>\n14:35 \u2014 v\u0161etky uzly servera #1 obsahuj\u00fa 3 mili\u00f3ny transakci\u00ed a tokenov<br \/>\n19:24 \u2014 v\u0161etky uzly servera #2 obsahuj\u00fa 3 mili\u00f3ny transakci\u00ed a tokenov <\/p>\n<h2>Prek\u00e1\u017eky<\/h2>\n<p>\nPo\u010das v\u00fdvoja Plasma Cash sme narazili na nasleduj\u00face probl\u00e9my, ktor\u00e9 postupne rie\u0161ime:<\/p>\n<p><b>1.<\/b> Konflikt interakcie r\u00f4znych funkci\u00ed syst\u00e9mu. Napr\u00edklad funkcia prid\u00e1vania transakci\u00ed do poolu blokovala pr\u00e1cu submitu a valid\u00e1cie blokov, a naopak, \u010do viedlo k poklesu r\u00fdchlosti.<\/p>\n<p><b>2. <\/b>Nebolo ihne\u010f jasn\u00e9, ak\u00fdm sp\u00f4sobom posla\u0165 obrovsk\u00e9 mno\u017estvo transakci\u00ed a pritom minimalizova\u0165 n\u00e1klady na prenos d\u00e1t.<\/p>\n<p><b>3. <\/b>Nebolo jasn\u00e9, ak\u00fdm sp\u00f4sobom a kde uchov\u00e1va\u0165 d\u00e1ta, aby sme dosiahli vysok\u00e9 v\u00fdsledky.<\/p>\n<p><b>4. <\/b>Nebolo jasn\u00e9, ako zorganizova\u0165 sie\u0165 medzi uzlami, ke\u010f\u017ee ve\u013ekos\u0165 bloku s 1 mili\u00f3nom transakci\u00ed zaber\u00e1 pribli\u017ene 100 MB.<\/p>\n<p><b>5.<\/b> Pr\u00e1ca v jednofunk\u010dnom re\u017eime preru\u0161i\u0165 spojenie medzi uzlami, ke\u010f sa vykon\u00e1vaj\u00fa dlh\u00e9 v\u00fdpo\u010dty (napr\u00edklad kon\u0161trukcia Merkleho stromu a v\u00fdpo\u010det jeho hash).<\/p>\n<h2>Ako sme sa s t\u00fdmto v\u0161etk\u00fdm vysporiadali?<\/h2>\n<p>\nPrv\u00e1 verzia uzla Plasma Cash predstavovala ak\u00fdsi kombinovan\u00fd syst\u00e9m, ktor\u00fd mohol robi\u0165 v\u0161etko naraz: prij\u00edma\u0165 transakcie, odosiela\u0165 a validova\u0165 bloky, a poskytoval API na pr\u00edstup k d\u00e1tam. Ke\u010f\u017ee NodeJS je p\u00f4vodne jednoprvkov\u00fd, \u0165a\u017ek\u00e1 funkcia v\u00fdpo\u010dtu Merkleho stromu zablokovala funkciu prid\u00e1vania transakcie. Videli sme dve mo\u017enosti rie\u0161enia tohto probl\u00e9mu:<\/p>\n<p><b>1. <\/b>Spusti\u0165 nieko\u013eko procesov NodeJS, z ktor\u00fdch ka\u017ed\u00fd vykon\u00e1va ur\u010dit\u00e9 funkcie.<\/p>\n<p><b>2. <\/b>Pou\u017ei\u0165 worker_threads a prenies\u0165 vykonanie \u010dasti k\u00f3du do vl\u00e1kien.<\/p>\n<p>Nakoniec sme vyu\u017eili obe mo\u017enosti s\u00fa\u010dasne: logicky sme rozdelili jeden uzol na 3 \u010dasti, ktor\u00e9 m\u00f4\u017eu pracova\u0165 samostatne, ale z\u00e1rove\u0148 s\u00fa synchronizovan\u00e9.<\/p>\n<p><b>1.<\/b> Uzol pre odosielanie, ktor\u00fd prij\u00edma transakcie do poolu a vytv\u00e1ra bloky.<\/p>\n<p><b>2.<\/b> Validuj\u00faci uzol, ktor\u00fd kontroluje platnos\u0165 uzlov.<\/p>\n<p><b>3. <\/b>API uzol \u2014 poskytuje API na pr\u00edstup k d\u00e1tam.<\/p>\n<p>Ka\u017ed\u00e9mu uzlu sa d\u00e1 pripoji\u0165 prostredn\u00edctvom unix socketu pomocou CLI.<\/p>\n<p>\u0164a\u017ek\u00e9 oper\u00e1cie, ako je v\u00fdpo\u010det Merkleho stromu, sme preniesli do samostatn\u00e9ho vl\u00e1kna.<\/p>\n<p>Tak sme dosiahli norm\u00e1lnu funk\u010dnos\u0165 v\u0161etk\u00fdch funkci\u00ed Plasma Cash s\u00fa\u010dasne a bez v\u00fdpadkov.<\/p>\n<p>Hne\u010f ako syst\u00e9m funk\u010dne za\u010dal pracova\u0165, za\u010dali sme testova\u0165 r\u00fdchlos\u0165 a, \u017eia\u013e, z\u00edskali sme neuspokojiv\u00e9 v\u00fdsledky: 5 000 transakci\u00ed za sekundu a a\u017e 50 000 transakci\u00ed v bloku. Museli sme zisti\u0165, \u010do bolo implementovan\u00e9 nespr\u00e1vne.<\/p>\n<p>Za\u010dali sme testova\u0165 mechanizmus komunik\u00e1cie s Plasma Cash, aby sme zistili maxim\u00e1lnu v\u00fdkonnos\u0165 syst\u00e9mu. Predt\u00fdm sme p\u00edsali, \u017ee uzol Plasma Cash poskytuje unix socket rozhranie. P\u00f4vodne bolo textov\u00e9. JSON objekty sa posielali pomocou `JSON.parse()` a `JSON.stringify()`. <\/p>\n<pre><code class=\"plaintext\">{\n  \"action\": \"sendTransaction\",\n  \"payload\":{\n    \"prevHash\": \"0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0\",\n    \"prevBlock\": 41,\n    \"tokenId\": \"57570139642005649136210751546585740989890521125187435281313126554130572876445\",\n    \"newOwner\": \"0x200eabe5b26e547446ae5821622892291632d4f4\",\n    \"type\": \"pay\",\n    \"data\": \"\",\n    \"signature\": \"0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c\"\n  }\n}\n<\/code><\/pre>\n<p>\nZmerali sme r\u00fdchlos\u0165 prenosu tak\u00fdchto objektov a dostali sme ~ 130k za sekundu. Sk\u00fa\u0161ali sme nahradi\u0165 \u0161tandardn\u00e9 funkcie na pr\u00e1cu s json, ale v\u00fdkon sa nezv\u00fd\u0161il. Mus\u00ed by\u0165 motor V8 dobre optimalizovan\u00fd na tieto oper\u00e1cie.<\/p>\n<p>Pr\u00e1ca s transakciami, tokenmi a blokmi sa u n\u00e1s realizovala prostredn\u00edctvom tried. Pri vytv\u00e1ran\u00ed t\u00fdchto tried sa v\u00fdkon zn\u00ed\u017eil na polovicu, \u010do nazna\u010duje, \u017ee OOP n\u00e1m nevyhovuje. Museli sme prepisova\u0165 v\u0161etko na \u010disto funk\u010dn\u00fd pr\u00edstup.<\/p>\n<h2>Z\u00e1pis do datab\u00e1zy<\/h2>\n<p>\nP\u00f4vodne bol vybran\u00fd Redis ako jedno z najv\u00fdkonnej\u0161\u00edch rie\u0161en\u00ed, ktor\u00e9 vyhovuje na\u0161im po\u017eiadavk\u00e1m: key-value \u00falo\u017eisko, pr\u00e1ca s hash-tabulkami, mno\u017einami. Spustili sme redis-benchmark a dostali sme ~80 000 oper\u00e1ci\u00ed za sekundu v re\u017eime 1 pipelining.<\/p>\n<p>Pre vysok\u00fd v\u00fdkon sme Redis nastavili e\u0161te prec\u00edznej\u0161ie: <\/p>\n<ul>\n<li>Nastavili sme unix socket spojenie.<\/li>\n<li>Vypnuli sme ukladanie stavu na disk (pre spo\u013eahlivos\u0165 je mo\u017en\u00e9 nastavi\u0165 replik\u00e1ciu a vykon\u00e1va\u0165 ukladanie na disk v samostatnom Redis).<\/li>\n<\/ul>\n<p>\nV Redis je pool \u2014 to je hash-tabuka, preto\u017ee potrebujeme ma\u0165 mo\u017enos\u0165 z\u00edskava\u0165 v\u0161etky transakcie jednou po\u017eiadavkou a vymaz\u00e1va\u0165 transakcie jednotlivo. Sk\u00fa\u0161ali sme pou\u017ei\u0165 oby\u010dajn\u00fd zoznam, ale ten pri na\u010d\u00edtan\u00ed cel\u00e9ho zoznamu funguje pomal\u0161ie. <\/p>\n<p>Pri pou\u017eit\u00ed \u0161tandardnej kni\u017enice NodeJS pre Redis sme dosiahli v\u00fdkon 18 000 transakci\u00ed za sekundu. R\u00fdchlos\u0165 sa zn\u00ed\u017eila 9-kr\u00e1t. <\/p>\n<p>Ke\u010f\u017ee benchmark n\u00e1m uk\u00e1zal schopnosti jasne 5-kr\u00e1t v\u00e4\u010d\u0161ie, za\u010dali sme optimalizova\u0165. Zmenili sme kni\u017enicu na ioredis a dosiahli sme v\u00fdkon u\u017e 25 000 za sekundu. Transakcie sme prid\u00e1vali jednotlivo, pou\u017e\u00edvaj\u00fac pr\u00edkaz `hset`. Takto sme generovali mno\u017estvo po\u017eiadaviek do Redis. Napadlo n\u00e1s spoji\u0165 transakcie do d\u00e1vok a odosiela\u0165 ich jedn\u00fdm pr\u00edkazom `hmset`. V\u00fdsledok \u2014 32 000 za sekundu. <\/p>\n<p>Z viacer\u00fdch d\u00f4vodov, ktor\u00e9 pop\u00ed\u0161eme ni\u017e\u0161ie, pracujeme s \u00fadajmi pomocou `Buffer` a, ako sa uk\u00e1zalo, ak ho prevedieme na text (`buffer.toString('hex')`) pred z\u00e1pisom, m\u00f4\u017eeme dosiahnu\u0165 vy\u0161\u0161\u00ed v\u00fdkon. Tak sa podarilo zv\u00fd\u0161i\u0165 r\u00fdchlos\u0165 na 35 000 za sekundu. V s\u00fa\u010dasnosti sme sa rozhodli preru\u0161i\u0165 \u010fal\u0161iu optimaliz\u00e1ciu.<\/p>\n<p>Museli sme prejs\u0165 na bin\u00e1rny protokol, preto\u017ee:<\/p>\n<p><b>1. <\/b>Syst\u00e9m \u010dasto vypo\u010d\u00edtava hash, podpisy a podobne, a na to potrebuje \u00fadaje v `Buffer`.<\/p>\n<p><b>2.<\/b> Pri prenose medzi slu\u017ebami maj\u00fa bin\u00e1rne \u00fadaje men\u0161iu ve\u013ekos\u0165 ako text. Napr\u00edklad pri odosielan\u00ed bloku s 1 mili\u00f3nom transakci\u00ed m\u00f4\u017eu by\u0165 \u00fadaje v texte v\u00e4\u010d\u0161ie ako 300 megabajtov.<\/p>\n<p><b>3.<\/b> Neust\u00e1le konvertovanie \u00fadajov ovplyv\u0148uje v\u00fdkon.<\/p>\n<p>Preto sme ako z\u00e1klad vzali n\u00e1\u0161 vlastn\u00fd bin\u00e1rny protokol na uchov\u00e1vanie a prenos d\u00e1t, vyvinut\u00fd na b\u00e1ze vynikaj\u00facej kni\u017enice `binary-data`.<\/p>\n<p>V d\u00f4sledku toho m\u00e1me nasleduj\u00face d\u00e1tov\u00e9 \u0161trukt\u00fary:<\/p>\n<h3> \u2014 Transakcia<\/h3>\n<p><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    prevHash: BD.types.buffer(20),\n    prevBlock: BD.types.uint24le,\n    tokenId: BD.types.string(null),\n    type: BD.types.uint8,\n    newOwner: BD.types.buffer(20),\n    dataLength: BD.types.uint24le,\n    data: BD.types.buffer(({current}) =&gt; current.dataLength),\n    signature: BD.types.buffer(65),\n    hash: BD.types.buffer(32),\n    blockNumber: BD.types.uint24le,\n    timestamp: BD.types.uint48le,\n  }\n  ```\n<\/code><\/pre>\n<p><\/p>\n<h3> \u2014 Token<\/h3>\n<p><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    id: BD.types.string(null),\n    owner: BD.types.buffer(20),\n    block: BD.types.uint24le,\n    amount: BD.types.string(null),\n  }\n  ```\n<\/code><\/pre>\n<p><\/p>\n<h3> \u2014 Blok<\/h3>\n<p><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    number: BD.types.uint24le,\n    merkleRootHash: BD.types.buffer(32),\n    signature: BD.types.buffer(65),\n    countTx: BD.types.uint24le,\n    transactions: BD.types.array(Transaction.Protocol, ({current}) =&gt; current.countTx),\n    timestamp: BD.types.uint48le,\n  }\n  ```\n<\/code><\/pre>\n<p>\nBe\u017en\u00fdmi pr\u00edkazmi `BD.encode(block, Protocol).slice();` a ` BD.decode(buffer, Protocol)` premie\u0148ame d\u00e1ta na `Buffer` na ulo\u017eenie v Redis alebo na zaslanie inej uzloch a sp\u00e4tn\u00e9 z\u00edskanie d\u00e1t.<\/p>\n<p>M\u00e1me tie\u017e 2 bin\u00e1rne protokoly na prenos d\u00e1t medzi slu\u017ebami:<\/p>\n<p><i> \u2014 Protokol na interakciu s Plasma uzlom cez unix socket<\/i><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    type: BD.types.uint8,\n    messageId: BD.types.uint24le,\n    error: BD.types.uint8,\n    length: BD.types.uint24le,\n    payload: BD.types.buffer(({node}) =&gt; node.length)\n  }\n  ```\n<\/code><\/pre>\n<p>\n kde:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 akcia, ktor\u00fa je potrebn\u00e9 vykona\u0165, napr\u00edklad 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 d\u00e1ta, ktor\u00e9 je potrebn\u00e9 odosla\u0165 do pr\u00edslu\u0161nej funkcie;<\/li>\n<li> <b>`messageId`<\/b> \u2014 ID spr\u00e1vy na identifik\u00e1ciu odpovede. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protokol interakcie medzi uzlami<\/i><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    code: BD.types.uint8,\n    versionProtocol: BD.types.uint24le,\n    seq: BD.types.uint8,\n    countChunk: BD.types.uint24le,\n    chunkNumber: BD.types.uint24le,\n    length: BD.types.uint24le,\n    payload: BD.types.buffer(({node}) =&gt; node.length)\n  }\n  ```\n<\/code><\/pre>\n<p>\n kde:<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 k\u00f3d spr\u00e1vy, napr\u00edklad 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 verzia protokolu, preto\u017ee v sieti m\u00f4\u017eu by\u0165 uzly s r\u00f4znymi verziami a m\u00f4\u017eu fungova\u0165 odli\u0161ne;<\/li>\n<li> <b>`seq`<\/b> \u2014 identifik\u00e1tor spr\u00e1vy;<\/li>\n<li> <b>`countChunk`<\/b> a <b>`chunkNumber`<\/b> s\u00fa potrebn\u00e9 na fragment\u00e1ciu ve\u013ek\u00fdch spr\u00e1v;<\/li>\n<li> <b>`length`<\/b> a <b>`payload`<\/b> d\u013a\u017eka a samotn\u00e9 d\u00e1ta.<\/li>\n<\/ul>\n<p>\nKe\u010f\u017ee sme d\u00e1ta vopred typizovali, kone\u010dn\u00fd syst\u00e9m funguje ove\u013ea r\u00fdchlej\u0161ie ako kni\u017enica `rlp` od Etherea. Bohu\u017eia\u013e, zatia\u013e sa n\u00e1m nepodarilo od nej upusti\u0165, preto\u017ee je potrebn\u00e9 dola\u010fova\u0165 smart kontrakt, \u010do pl\u00e1nujeme urobi\u0165 v bud\u00facnosti.<\/p>\n<p>Ak sa n\u00e1m podarilo dosiahnu\u0165 r\u00fdchlos\u0165 <b>35 000<\/b> transakci\u00ed za sekundu, mus\u00edme ich spracov\u00e1va\u0165 v optim\u00e1lnom \u010dase. Ke\u010f\u017ee predpokladan\u00fd \u010das na vytvorenie bloku trv\u00e1 30 sek\u00fand, je potrebn\u00e9 zahrn\u00fa\u0165 do bloku <b>1 000 000<\/b> transakci\u00ed, \u010do znamen\u00e1 prenos viacer\u00fdch <b>100<\/b> MB d\u00e1t. <\/p>\n<p>P\u00f4vodne sme pou\u017e\u00edvali kni\u017enicu `ethereumjs-devp2p` na komunik\u00e1ciu medzi uzlami, ale t\u00e1to si neporadila s tak\u00fdm mno\u017estvom d\u00e1t. Preto sme vyu\u017eili kni\u017enicu `ws` a nastavili prenos bin\u00e1rnych d\u00e1t cez websocket. Samozrejme, pri prenose ve\u013ek\u00fdch bal\u00edkov d\u00e1t sme sa stretli s probl\u00e9mami, ale rozdelili sme ich na \u010dasti a teraz u\u017e tak\u00e9to probl\u00e9my nem\u00e1me.<\/p>\n<p>Taktie\u017e vytv\u00e1ranie Merkleho stromu a v\u00fdpo\u010det hashu <b>1 000 000<\/b> transakci\u00ed trv\u00e1 pribli\u017ene<b> 10<\/b> sek\u00fand nepretr\u017eit\u00e9ho v\u00fdpo\u010dtu. Po\u010das tohto \u010dasu sa spojenie so v\u0161etk\u00fdmi uzlami preru\u0161\u00ed. Rozhodli sme sa presun\u00fa\u0165 tento v\u00fdpo\u010det do samostatn\u00e9ho vl\u00e1kna.<\/p>\n<h2>V\u00fdvody:<\/h2>\n<p>\nNa\u0161a zistenia nie s\u00fa nov\u00e9, ale z nejak\u00e9ho d\u00f4vodu na ne mnoh\u00ed odborn\u00edci zab\u00fadaj\u00fa pri v\u00fdvoji. <\/p>\n<ul>\n<li>Pou\u017eitie funkcion\u00e1lneho programovania namiesto objektovo orientovan\u00e9ho programovania zvy\u0161uje v\u00fdkon.<\/li>\n<li>Monolit je hor\u0161\u00ed ne\u017e slu\u017eobn\u00e1 architekt\u00fara pre v\u00fdkonn\u00fd syst\u00e9m na NodeJS.<\/li>\n<li>Pou\u017eitie `worker_threads` na \u0165a\u017ek\u00e9 v\u00fdpo\u010dty zlep\u0161uje odozvu syst\u00e9mu, najm\u00e4 pri pr\u00e1ci s oper\u00e1ciami I\/O.<\/li>\n<li>unix socket je stabilnej\u0161\u00ed a r\u00fdchlej\u0161\u00ed ako http po\u017eiadavky.<\/li>\n<li>Ak je potrebn\u00e9 r\u00fdchlo pren\u00e1\u0161a\u0165 ve\u013ek\u00e9 d\u00e1ta cez sie\u0165, je lep\u0161ie vyu\u017ei\u0165 websockety a posiela\u0165 bin\u00e1rne d\u00e1ta rozdelen\u00e9 na \u010dasti, ktor\u00e9 m\u00f4\u017eu by\u0165 op\u00e4tovne zaslan\u00e9, ak ned\u00f4jdu, a potom ich zl\u00fa\u010di\u0165 do jednej spr\u00e1vy.<\/li>\n<\/ul>\n<p>\nPoz\u00fdvame v\u00e1s nav\u0161t\u00edvi\u0165 <b>GitHub<\/b> projektu: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opporty-com\/Plasma-Cash\/tree\/new-version\">https:\/\/github.com\/opporty-com\/Plasma-Cash\/tree\/new-version<\/a><\/noindex><\/p>\n<p>\u010cl\u00e1nok bol nap\u00edsan\u00fd v spolupr\u00e1ci s <i>Alexandrom Na\u0161ivanom<\/i>, hlavn\u00fdm v\u00fdvoj\u00e1rom <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/471096\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041e\u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0432 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0438\u0445 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 DAPP \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0432 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38856","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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0432 \u042d\u0444\u0438\u0440\u0438\u0443\u043c\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\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:26:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:26:22+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\udd47Verejn\u00fd test: rie\u0161enie pre s\u00fakromie a \u0161k\u00e1lovate\u013enos\u0165 v Ethereu | ProHoster","description":"Blockchain je inovat\u00edvna technol\u00f3gia s\u013eubuj\u00faca zlep\u0161i\u0165 mnoh\u00e9 oblasti \u013eudskej existencie.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0432 \u042d\u0444\u0438\u0440\u0438\u0443\u043c\u0435 | ProHoster","og:description":"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","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:26:22+00:00","article:modified_time":"2019-10-31T19:26:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38856","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 23:42:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:15:36","updated":"2026-01-23 23:42:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}