{"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\/cs\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Ve\u0159ejn\u00e9 testov\u00e1n\u00ed: \u0159e\u0161en\u00ed pro soukrom\u00ed a \u0161k\u00e1lovatelnost v Ethereum","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> \u2014 inovativn\u00ed technologie, kter\u00e1 slibuje zlep\u0161en\u00ed mnoha oblast\u00ed lidsk\u00e9ho \u017eivota. P\u0159en\u00e1\u0161\u00ed skute\u010dn\u00e9 procesy a produkty do digit\u00e1ln\u00edho prostoru, zaji\u0161\u0165uje rychlost a spolehlivost finan\u010dn\u00edch operac\u00ed, sni\u017euje jejich n\u00e1klady a umo\u017e\u0148uje vytv\u00e1\u0159et modern\u00ed DAPP aplikace s vyu\u017eit\u00edm chytr\u00fdch kontrakt\u016f v decentralizovan\u00fdch s\u00edt\u00edch.<\/p>\n<p>Vzhledem k mnoha v\u00fdhod\u00e1m a rozmanit\u00fdm oblastem pou\u017eit\u00ed blockchainu se m\u016f\u017ee zd\u00e1t divn\u00e9, \u017ee tato slibn\u00e1 technologie je\u0161t\u011b nepronikla do v\u0161ech odv\u011btv\u00ed. Probl\u00e9m spo\u010d\u00edv\u00e1 v tom, \u017ee modern\u00edm decentralizovan\u00fdm blockchain\u016fm chyb\u00ed \u0161k\u00e1lovatelnost. Ethereum zpracov\u00e1v\u00e1 p\u0159ibli\u017en\u011b 20 transakc\u00ed za sekundu, co\u017e nen\u00ed dostate\u010dn\u00e9 pro uspokojen\u00ed pot\u0159eb dne\u0161n\u00edho dynamick\u00e9ho podnik\u00e1n\u00ed. Sou\u010dasn\u011b spole\u010dnosti vyu\u017e\u00edvaj\u00edc\u00ed technologii blockchain necht\u011bj\u00ed opustit Ethereum kv\u016fli jeho vysok\u00e9 \u00farovni ochrany p\u0159ed hacknut\u00edm a selh\u00e1n\u00edm s\u00edt\u011b.<\/p>\n<p>Aby se zajistila decentralizace, bezpe\u010dnost a \u0161k\u00e1lovatelnost v blockchainu, co\u017e \u0159e\u0161\u00ed probl\u00e9m n\u00e1zvan\u00fd \u0160k\u00e1lovatelnost Trilemma, v\u00fdvoj\u00e1\u0159sk\u00fd t\u00fdm <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> vytvo\u0159il Plasma Cash \u2014 vedlej\u0161\u00ed \u0159et\u011bzec slo\u017een\u00fd z chytr\u00e9ho kontraktu a soukrom\u00e9 s\u00edt\u011b zalo\u017een\u00e9 na Node.js, kter\u00e1 pravideln\u011b p\u0159en\u00e1\u0161\u00ed sv\u016fj stav do hlavn\u00edho \u0159et\u011bzce (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Ve\u0159ejn\u00e9 testov\u00e1n\u00ed: \u0159e\u0161en\u00ed pro soukrom\u00ed a \u0161k\u00e1lovatelnost v Ethereum\" 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>Kl\u00ed\u010dov\u00e9 procesy v Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>U\u017eivatel vyvol\u00e1 funkci chytr\u00e9ho kontraktu `deposit`, do kter\u00e9 p\u0159ed\u00e1 \u010d\u00e1stku v ETH, kterou chce um\u00edstit do tokenu Plasma Cash. Funkce chytr\u00e9ho kontraktu vytvo\u0159\u00ed token a vygeneruje ud\u00e1lost o tom.<\/p>\n<p><b>2. <\/b>Node Plasma Cash, kter\u00e9 jsou p\u0159ihl\u00e1\u0161eny k ud\u00e1lostem chytr\u00e9ho kontraktu, obdr\u017e\u00ed ud\u00e1lost o vytvo\u0159en\u00ed vkladu a p\u0159idaj\u00ed do poolu transakci o vytvo\u0159en\u00ed tokenu.<\/p>\n<p><b>3. <\/b>Pravideln\u011b speci\u00e1ln\u00ed nodov\u00e9 Plasma Cash berou v\u0161echny transakce z poolu (a\u017e 1 milion) a vytv\u00e1\u0159ej\u00ed z nich blok, vypo\u010d\u00edt\u00e1vaj\u00ed Merkleho strom a t\u00edm p\u00e1dem hash. Tento blok je zasl\u00e1n ostatn\u00edm nod\u016fm k ov\u011b\u0159en\u00ed. Nodov\u00e9 kontroluj\u00ed, zda je hash Merkle platn\u00fd, zda jsou transakce platn\u00e9 (nap\u0159. zda je odes\u00edlatel tokenu jeho vlastn\u00edkem). Po ov\u011b\u0159en\u00ed bloku nod vyvol\u00e1 funkci `submitBlock` chytr\u00e9ho kontraktu, kter\u00e1 ulo\u017e\u00ed do hlavn\u00edho \u0159et\u011bzce \u010d\u00edslo a hash Merkleho bloku. Chytr\u00fd kontrakt generuje ud\u00e1lost o \u00fasp\u011b\u0161n\u00e9m p\u0159id\u00e1n\u00ed bloku. Transakce jsou odstran\u011bny z poolu. <\/p>\n<p><b>4. <\/b>Uzly, kter\u00e9 obdr\u017eely ud\u00e1lost o odesl\u00e1n\u00ed bloku, za\u010d\u00ednaj\u00ed aplikovat transakce, kter\u00e9 byly p\u0159id\u00e1ny do bloku.<\/p>\n<p><b>5. <\/b>V ur\u010dit\u00e9m okam\u017eiku chce vlastn\u00edk (nebo ne vlastn\u00edk) tokenu vybrat jej z Plasma Cash. Za t\u00edmto \u00fa\u010delem vyvol\u00e1 funkci `startExit`, p\u0159ed\u00e1 j\u00ed informace o posledn\u00edch 2 transakc\u00edch t\u00fdkaj\u00edc\u00edch se tokenu, kter\u00e9 potvrzuj\u00ed, \u017ee pr\u00e1v\u011b on je vlastn\u00edkem tokenu. Chytr\u00fd kontrakt, pomoc\u00ed Merkleho hash, ov\u011b\u0159uje p\u0159\u00edtomnost transakc\u00ed v bloc\u00edch a odes\u00edl\u00e1 token k v\u00fdb\u011bru, kter\u00fd se uskute\u010dn\u00ed za dva t\u00fddny.<\/p>\n<p><b>6. <\/b>Pokud do\u0161lo k poru\u0161en\u00ed b\u011bhem operace v\u00fdb\u011bru tokenu (token byl utracen po zah\u00e1jen\u00ed v\u00fdb\u011brov\u00e9ho procesu nebo token byl p\u0159ed v\u00fdb\u011brem ji\u017e ciz\u00ed), m\u016f\u017ee vlastn\u00edk tokenu pop\u0159\u00edt v\u00fdb\u011br b\u011bhem dvou t\u00fddn\u016f.<\/p>\n<p><img decoding=\"async\" alt=\"Ve\u0159ejn\u00e9 testov\u00e1n\u00ed: \u0159e\u0161en\u00ed pro soukrom\u00ed a \u0161k\u00e1lovatelnost v Ethereum\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Soukrom\u00ed je dosa\u017eeno dv\u011bma zp\u016fsoby<\/h2>\n<p>\n<b>1. <\/b>Ko\u0159enov\u00fd \u0159et\u011bzec nic nev\u00ed o transakc\u00edch, kter\u00e9 se formuj\u00ed a p\u0159en\u00e1\u0161ej\u00ed uvnit\u0159 dce\u0159in\u00e9ho \u0159et\u011bzce. Ve\u0159ejn\u00e9 z\u016fst\u00e1v\u00e1 informace o tom, kdo vlo\u017eil a vybral ETH do\/z Plasma Cash.<\/p>\n<p><b>2. <\/b>Dce\u0159in\u00fd \u0159et\u011bzec umo\u017e\u0148uje organizovat anonymn\u00ed transakce pomoc\u00ed zk-SNARKs.<\/p>\n<h2>Technologick\u00fd stack<\/h2>\n<p><\/p>\n<ul>\n<li>NodeJS<\/li>\n<li>Redis<\/li>\n<li>Etherium<\/li>\n<li>Soild<\/li>\n<\/ul>\n<p><\/p>\n<h2>Testov\u00e1n\u00ed <\/h2>\n<p>\nP\u0159i v\u00fdvoji Plasma Cash jsme testovali rychlost syst\u00e9mu a z\u00edskali n\u00e1sleduj\u00edc\u00ed v\u00fdsledky:<\/p>\n<ul>\n<li>do 35 000 transakc\u00ed za sekundu se p\u0159id\u00e1v\u00e1 do poolu;<\/li>\n<li>do 1 000 000 transakc\u00ed m\u016f\u017ee b\u00fdt ulo\u017eeno v bloku.<\/li>\n<\/ul>\n<p>\nTesty byly prov\u00e1d\u011bny na 3 n\u00e1sleduj\u00edc\u00edch serverech:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake v\u010detn\u011b NVMe SSD \u2014 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n Byly vzty\u010deny 3 validuj\u00edc\u00ed Plasma Cash uzly.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \u201eSummit Ridge\u201c (Zen), SATA SSD \u2014 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n Byla vzty\u010dena Ropsten testnet ETH uzel.<br \/>\n Byly vzty\u010deny 3 validuj\u00edc\u00ed Plasma Cash uzly.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core v\u010detn\u011b NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n Byl vzty\u010den 1 odes\u00edlac\u00ed Plasma Cash uzel.<br \/>\n Byly vzty\u010deny 3 validuj\u00edc\u00ed Plasma Cash uzly.<br \/>\n Byl spu\u0161t\u011bn test na p\u0159id\u00e1n\u00ed transakc\u00ed do Plasma Cash s\u00edt\u011b.<\/p>\n<p><b>Celkem: <\/b>10 Plasma Cash uzl\u016f v soukrom\u00e9 s\u00edti.<\/p>\n<h3>Test 1<\/h3>\n<p>\nExistuje limit na 1 milion transakc\u00ed v bloku. Proto 1 milion transakc\u00ed se dostane do 2 blok\u016f (proto\u017ee syst\u00e9m m\u00e1 \u010das vz\u00edt \u010d\u00e1st transakc\u00ed a odeslat zat\u00edmco jsou odes\u00edl\u00e1ny).<\/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=\"P\u0159ehr\u00e1t 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\u010d\u00e1te\u010dn\u00ed stav: posledn\u00ed blok #7; v datab\u00e1zi je ulo\u017eeno 1 milion transakc\u00ed a token\u016f.<\/p>\n<p>00:00 \u2014 spu\u0161t\u011bn\u00ed skriptu pro generov\u00e1n\u00ed transakc\u00ed<br \/>\n01:37 \u2014 vytvo\u0159eno 1 milion transakc\u00ed a za\u010dalo odes\u00edl\u00e1n\u00ed do uzlu<br \/>\n01:46 \u2014 odes\u00edlac\u00ed uzel vzal z poolu 240k transakc\u00ed a formuje blok #8. Tak\u00e9 vid\u00edme, \u017ee do poolu se b\u011bhem 10 sekund p\u0159idalo 320k transakc\u00ed.<br \/>\n01:58 \u2014 blok #8 je podeps\u00e1n a odesl\u00e1n na validaci.<br \/>\n02:03 \u2014 blok #8 byl validov\u00e1n a byla vyvol\u00e1na funkce `submitBlock` chytr\u00e9ho kontraktu s hash Merkle a \u010d\u00edslem bloku<br \/>\n02:10 \u2014 demo skript p\u0159estal b\u011b\u017eet, kter\u00fd odeslal 1 milion transakc\u00ed za 32 sekund<br \/>\n02:33 \u2014 uzly za\u010daly p\u0159ij\u00edmat informace o tom, \u017ee blok #8 byl p\u0159id\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce, a za\u010daly prov\u00e1d\u011bt 240 tis\u00edc transakc\u00ed<br \/>\n02:40 \u2014 z poolu bylo odstran\u011bno 240 tis\u00edc transakc\u00ed, kter\u00e9 jsou ji\u017e v bloku #8<br \/>\n02:56 \u2014 submit uzel vzal z poolu zb\u00fdvaj\u00edc\u00edch 760 tis\u00edc transakc\u00ed a za\u010dal po\u010d\u00edtat hash Merkle a podepisovat blok #9<br \/>\n03:20 \u2014 v\u0161echny uzly obsahuj\u00ed 1 milion 240 tis\u00edc transakc\u00ed a token\u016f<br \/>\n03:35 \u2014 blok #9 byl podeps\u00e1n a odesl\u00e1n na validaci k ostatn\u00edm uzl\u016fm <br \/>\n03:41 \u2014 do\u0161lo k chyb\u011b s\u00edt\u011b<br \/>\n04:40 \u2014 z d\u016fvodu timeoutu bylo zastaveno \u010dek\u00e1n\u00ed na validaci bloku #9<br \/>\n04:54 \u2014 submit uzel vzal z poolu zb\u00fdvaj\u00edc\u00edch 760 tis\u00edc transakc\u00ed a za\u010dal po\u010d\u00edtat hash Merkle a podepisovat blok #9<br \/>\n05:32 \u2014 blok #9 byl podeps\u00e1n a odesl\u00e1n na validaci k ostatn\u00edm uzl\u016fm<br \/>\n05:53 \u2014 blok #9 byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce<br \/>\n06:17 \u2014 uzly za\u010daly p\u0159ij\u00edmat informace o tom, \u017ee blok #9 byl p\u0159id\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce a za\u010daly prov\u00e1d\u011bt 760 tis\u00edc transakc\u00ed<br \/>\n06:47 \u2014 pool byl vy\u010di\u0161t\u011bn od transakc\u00ed, kter\u00e9 jsou v bloku #9<br \/>\n09:06 \u2014 v\u0161echny uzly obsahuj\u00ed 2 miliony transakc\u00ed a token\u016f<\/p>\n<h3>Test 2<\/h3>\n<p>\nExistuje limit 350 tis\u00edc na blok. V d\u016fsledku m\u00e1me 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=\"P\u0159ehr\u00e1t video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nV\u00fdchoz\u00ed stav: posledn\u00ed blok #9; v datab\u00e1zi je ulo\u017eeno 2 miliony transakc\u00ed a token\u016f<\/p>\n<p>00:00 \u2014 skript na generov\u00e1n\u00ed transakc\u00ed ji\u017e b\u011b\u017e\u00ed<br \/>\n00:44 \u2014 bylo vytvo\u0159eno 1 milion transakc\u00ed a za\u010dalo odes\u00edl\u00e1n\u00ed do uzlu<br \/>\n00:56 \u2014 submit uzel vzal z poolu 320 tis\u00edc transakc\u00ed a formuje blok #10. Tak\u00e9 vid\u00edme, \u017ee do poolu je p\u0159id\u00e1no 320 tis\u00edc transakc\u00ed za 10 sekund<br \/>\n01:12 \u2014 blok #10 byl podeps\u00e1n a odesl\u00e1n k ostatn\u00edm uzl\u016fm na validaci<br \/>\n01:18 \u2014 demo skript p\u0159estal b\u011b\u017eet, kter\u00fd odeslal 1 milion transakc\u00ed za 34 sekund<br \/>\n01:20 \u2014 blok #10 byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce <br \/>\n01:51 \u2014 v\u0161echny uzly obdr\u017eely z ko\u0159enov\u00e9ho \u0159et\u011bzce informace o tom, \u017ee blok #10 byl p\u0159id\u00e1n, a za\u010d\u00ednaj\u00ed aplikovat 320 tis\u00edc transakc\u00ed<br \/>\n02:01 \u2014 pool byl vy\u010di\u0161t\u011bn na 320 tis\u00edc transakc\u00ed, kter\u00e9 byly p\u0159id\u00e1ny do bloku #10<br \/>\n02:15 \u2014 submit uzel vzal z poolu 350 tis\u00edc transakc\u00ed a formuje blok #11<br \/>\n02:34 \u2014 blok #11 byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm na validaci<br \/>\n02:51 \u2014 blok #11 byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce <br \/>\n02:55 \u2014 posledn\u00ed uzel provedl transakce z bloku #10<br \/>\n10:59 \u2014 velmi dlouh\u00e1 transakce s odesl\u00e1n\u00edm bloku #9 byla vykon\u00e1na v ko\u0159enov\u00e9m \u0159et\u011bzci, ale byla \u00fasp\u011b\u0161n\u011b dokon\u010dena a v\u0161echny uzly byly informov\u00e1ny a za\u010daly vykon\u00e1vat 350k transakc\u00ed.<br \/>\n11:05 \u2014 pool se vy\u010distil o 320k transakc\u00ed, kter\u00e9 byly p\u0159id\u00e1ny do bloku #11.<br \/>\n12:10 \u2014 v\u0161echny uzly obsahuj\u00ed 1 milion 670k transakc\u00ed a token\u016f.<br \/>\n12:17 \u2014 submit uzel vzal z poolu 330k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #12.<br \/>\n12:32 \u2014 blok #12 byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci.<br \/>\n12:39 \u2014 blok #12 byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce. <br \/>\n13:44 \u2014 v\u0161echny uzly obdr\u017eely z ko\u0159enov\u00e9ho \u0159et\u011bzce informaci, \u017ee blok #12 byl p\u0159id\u00e1n, a za\u010d\u00ednaj\u00ed aplikovat 330k transakc\u00ed.<br \/>\n14:50 \u2014 v\u0161echny uzly obsahuj\u00ed 2 miliony transakc\u00ed a token\u016f.<\/p>\n<h3>Test 3<\/h3>\n<p>\nNa prvn\u00edm a druh\u00e9m serveru byla jedna valida\u010dn\u00ed uzel nahrazena submit uzlem. <\/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=\"P\u0159ehr\u00e1t video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nV\u00fdchoz\u00ed stav: posledn\u00ed blok #84; v datab\u00e1zi ulo\u017eeno 0 transakc\u00ed a token\u016f.<\/p>\n<p>00:00 \u2014 Spu\u0161t\u011bny 3 skripty, kter\u00e9 generuj\u00ed a odes\u00edlaj\u00ed po 1 milionu transakc\u00ed.<br \/>\n01:38 \u2014 vytvo\u0159eno 1 milion transakc\u00ed a za\u010dalo se odes\u00edl\u00e1n\u00ed do submit uzlu #3.<br \/>\n01:50 \u2014 submit uzel #3 vzal z poolu 330k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #85 (f21). Tak\u00e9 vid\u00edme, \u017ee do poolu p\u0159ibylo 350k transakc\u00ed za 10 sek.<br \/>\n01:53 \u2014 vytvo\u0159eno 1 milion transakc\u00ed a za\u010dalo se odes\u00edl\u00e1n\u00ed do submit uzlu #1.<br \/>\n01:50 \u2014 submit uzel #3 vzal z poolu 330k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #85 (f21). Tak\u00e9 vid\u00edme, \u017ee do poolu p\u0159ibylo 350k transakc\u00ed za 10 sek.<br \/>\n02:01 \u2014 submit uzel #1 vzal z poolu 250k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #85 (65e).<br \/>\n02:06 \u2014 blok #85 (f21) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci.<br \/>\n02:08 \u2014 demo skript serveru #3 p\u0159estal pracovat, kter\u00fd odeslal 1 milion transakc\u00ed za 30 sekund.<br \/>\n02:14 \u2014 blok #85 (f21) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce. <br \/>\n02:19 \u2014 blok #85 (65e) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci.<br \/>\n02:22 \u2014 vytvo\u0159eno 1 milion transakc\u00ed a za\u010dalo se odes\u00edl\u00e1n\u00ed do submit uzlu #2.<br \/>\n02:27 \u2014 blok #85 (65e) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce. <br \/>\n02:29 \u2014 submit uzel #2 vzal z poolu 111855 transakc\u00ed a vytv\u00e1\u0159\u00ed blok #85 (256).<br \/>\n02:36 \u2014 blok #85 (256) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci.<br \/>\n02:36 \u2014 demo skript serveru #1 p\u0159estal pracovat, kter\u00fd odeslal 1 milion transakc\u00ed za 42.5 sekund.<br \/>\n02:38 \u2014 blok #85 (256) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce.<br \/>\n03:08 \u2014 demo skript serveru #2 p\u0159estal pracovat, kter\u00fd odeslal 1 milion transakc\u00ed za 47 sek. <br \/>\n03:38 \u2014 v\u0161echny uzly obdr\u017eely z ko\u0159enov\u00e9ho \u0159et\u011bzce informaci, \u017ee bloky #85 (f21), #86 (65e), #87 (256) byly p\u0159id\u00e1ny a za\u010d\u00ednaj\u00ed aplikovat 330k, 250k, 111855 transakc\u00ed.<br \/>\n03:49 \u2014 pool se vy\u010distil o 330k, 250k, 111855 transakc\u00ed, kter\u00e9 byly p\u0159id\u00e1ny do blok\u016f #85 (f21), #86(65e), #87(256)<br \/>\n03:59 \u2014 submit uzel #1 vzal z poolu 888145 transakc\u00ed a vytv\u00e1\u0159\u00ed blok #88 (214), submit uzel #2 vzal z poolu 750k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #88 (50a), submit uzel #3 vzal z poolu 670k transakc\u00ed a vytv\u00e1\u0159\u00ed blok #88 (d3b)<br \/>\n04:44 \u2014 blok #88 (d3b) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci<br \/>\n04:58 \u2014 blok #88 (214) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci<br \/>\n05:11 \u2014 blok #88 (50a) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci<br \/>\n05:11 \u2014 blok #85 (d3b) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce <br \/>\n05:36 \u2014 blok #85 (214) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce <br \/>\n05:43 \u2014 v\u0161echny uzly obdr\u017eely z ko\u0159enov\u00e9ho \u0159et\u011bzce informace, \u017ee bloky #88 (d3b), #89(214) byly p\u0159id\u00e1ny a za\u010d\u00ednaj\u00ed aplikovat 670k, 750k transakc\u00ed<br \/>\n06:50 \u2014 kv\u016fli p\u0159eru\u0161en\u00ed spojen\u00ed blok #85 (50a) nebyl validov\u00e1n<br \/>\n06:55 \u2014 submit uzel #2 vzal z poolu 888145 transakc\u00ed a vytv\u00e1\u0159\u00ed blok #90 (50a)<br \/>\n08:14 \u2014 blok #90 (50a) byl podeps\u00e1n a odesl\u00e1n ostatn\u00edm uzl\u016fm k validaci<br \/>\n09:04 \u2014 blok #90 (50a) byl validov\u00e1n a odesl\u00e1n do ko\u0159enov\u00e9ho \u0159et\u011bzce <br \/>\n11:23 \u2014 v\u0161echny uzly obdr\u017eely z ko\u0159enov\u00e9ho \u0159et\u011bzce informace, \u017ee blok #90 (50a) byl p\u0159id\u00e1n, a za\u010d\u00ednaj\u00ed aplikovat 888145 transakc\u00ed. Mezit\u00edm server #3 ji\u017e d\u00e1vno aplikoval transakce z blok\u016f #88 (d3b), #89(214)<br \/>\n12:11 \u2014 v\u0161echny pooly jsou pr\u00e1zdn\u00e9<br \/>\n13:41 \u2014 v\u0161echny uzly serveru #3 obsahuj\u00ed 3 miliony transakc\u00ed a token\u016f<br \/>\n14:35 \u2014 v\u0161echny uzly serveru #1 obsahuj\u00ed 3 miliony transakc\u00ed a token\u016f<br \/>\n19:24 \u2014 v\u0161echny uzly serveru #2 obsahuj\u00ed 3 miliony transakc\u00ed a token\u016f <\/p>\n<h2>P\u0159ek\u00e1\u017eky<\/h2>\n<p>\nB\u011bhem v\u00fdvoje Plasma Cash jsme se setkali s n\u00e1sleduj\u00edc\u00edmi probl\u00e9my, kter\u00e9 jsme postupn\u011b \u0159e\u0161ili a \u0159e\u0161\u00edme:<\/p>\n<p><b>1.<\/b> Konflikt interakce r\u016fzn\u00fdch funkc\u00ed syst\u00e9mu. Nap\u0159\u00edklad funkce p\u0159id\u00e1n\u00ed transakc\u00ed do poolu blokovala pr\u00e1ci submitu a validace blok\u016f, a naopak, co\u017e vedlo k poklesu rychlosti.<\/p>\n<p><b>2. <\/b>Nebyla hned jasn\u00e1 cesta, jak odeslat obrovsk\u00e9 mno\u017estv\u00ed transakc\u00ed a z\u00e1rove\u0148 minimalizovat n\u00e1klady na p\u0159enos dat.<\/p>\n<p><b>3. <\/b>Nebyla jasn\u00e1 cesta a m\u00edsto, kde ukl\u00e1dat data, abychom dos\u00e1hli vysok\u00fdch v\u00fdsledk\u016f.<\/p>\n<p><b>4. <\/b>Nebyla jasn\u00e1 cesta, jak organizovat s\u00ed\u0165 mezi uzly, proto\u017ee velikost bloku s 1 milionem transakc\u00ed zab\u00edr\u00e1 p\u0159ibli\u017en\u011b 100 MB.<\/p>\n<p><b>5.<\/b> Pr\u00e1ce v jednovl\u00e1knov\u00e9m re\u017eimu p\u0159eru\u0161uje spojen\u00ed mezi uzly, kdy\u017e prob\u00edhaj\u00ed dlouh\u00e9 v\u00fdpo\u010dty (nap\u0159. sestaven\u00ed Merkleho stromu a v\u00fdpo\u010det jeho hash).<\/p>\n<h2>Jak jsme si s t\u00edm v\u0161\u00edm poradili?<\/h2>\n<p>\nPrvn\u00ed verze Plasma Cash uzlu p\u0159edstavovala jak\u00fdsi kombajn, kter\u00fd mohl d\u011blat v\u0161echno najednou: p\u0159ij\u00edmat transakce, sb\u00edrat a validovat bloky, poskytoval API pro p\u0159\u00edstup k dat\u016fm. Jeliko\u017e NodeJS byl p\u016fvodn\u011b jednovl\u00e1knov\u00fd, slo\u017eit\u00e1 funkce v\u00fdpo\u010dtu Merkleho stromu zablokovala p\u0159id\u00e1v\u00e1n\u00ed transakce. Vid\u011bli jsme dv\u011b mo\u017enosti \u0159e\u0161en\u00ed tohoto probl\u00e9mu:<\/p>\n<p><b>1. <\/b>Spustit n\u011bkolik proces\u016f NodeJS, z nich\u017e ka\u017ed\u00fd vykon\u00e1v\u00e1 ur\u010dit\u00e9 funkce.<\/p>\n<p><b>2. <\/b>Pou\u017e\u00edt worker_threads a p\u0159esunout \u010d\u00e1st k\u00f3du do vl\u00e1ken.<\/p>\n<p>Nakonec jsme vyu\u017eili ob\u011b mo\u017enosti sou\u010dasn\u011b: logicky jsme rozd\u011blili jeden uzel na 3 \u010d\u00e1sti, kter\u00e9 mohou fungovat samostatn\u011b, ale z\u00e1rove\u0148 synchronn\u011b.<\/p>\n<p><b>1.<\/b> Uzel pro sb\u011br, kter\u00fd p\u0159ij\u00edm\u00e1 transakce do poolu a zab\u00fdv\u00e1 se vytv\u00e1\u0159en\u00edm blok\u016f.<\/p>\n<p><b>2.<\/b> Validuj\u00edc\u00ed uzel, kter\u00fd kontroluje platnost uzl\u016f.<\/p>\n<p><b>3. <\/b>API uzel \u2014 poskytuje API pro p\u0159\u00edstup k dat\u016fm.<\/p>\n<p>Na ka\u017ed\u00e9m uzlu se lze p\u0159ipojit p\u0159es unix socket pomoc\u00ed cli.<\/p>\n<p>T\u011b\u017ek\u00e9 operace, jako je v\u00fdpo\u010det Merkleho stromu, jsme p\u0159esunuli do samostatn\u00e9ho vl\u00e1kna.<\/p>\n<p>T\u00edmto zp\u016fsobem jsme dos\u00e1hli norm\u00e1ln\u00edho fungov\u00e1n\u00ed v\u0161ech funkc\u00ed Plasma Cash sou\u010dasn\u011b a bez v\u00fdpadk\u016f.<\/p>\n<p>Jakmile syst\u00e9m za\u010dal funk\u010dn\u011b fungovat, za\u010dali jsme testovat rychlost a bohu\u017eel jsme z\u00edskali neuspokojiv\u00e9 v\u00fdsledky: 5 000 transakc\u00ed za sekundu a a\u017e 50 000 transakc\u00ed v bloku. Museli jsme zjistit, co bylo implementov\u00e1no nespr\u00e1vn\u011b.<\/p>\n<p>Nejprve jsme za\u010dali testovat mechanismus komunikace s Plasma Cash, abychom zjistili vrcholn\u00e9 mo\u017enosti syst\u00e9mu. D\u0159\u00edve jsme psali, \u017ee Plasma Cash uzel poskytuje unix socket rozhran\u00ed. P\u016fvodn\u011b bylo textov\u00e9. JSON objekty byly pos\u00edl\u00e1ny pomoc\u00ed `JSON.parse()` a `JSON.stringify()`. <\/p>\n<pre><code class=\"plaintext\">{\"action\": \"sendTransaction\",\"payload\":{\"prevHash\": \"0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0\",\"prevBlock\": 41,\"tokenId\": \"57570139642005649136210751546585740989890521125187435281313126554130572876445\",\"newOwner\": \"0x200eabe5b26e547446ae5821622892291632d4f4\",\"type\": \"pay\",\"data\": \"\",\"signature\": \"0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c\"}}\n<\/code><\/pre>\n<p>\nZm\u011b\u0159ili jsme rychlost p\u0159enosu takov\u00fdch objekt\u016f a dostali jsme ~ 130k za sekundu. Zkou\u0161eli jsme nahradit standardn\u00ed funkce pro pr\u00e1ci s json, ale v\u00fdkon se nezv\u00fd\u0161il. Mus\u00ed b\u00fdt engine V8 dob\u0159e optimalizov\u00e1n na tyto operace.<\/p>\n<p>Pr\u00e1ce s transakcemi, tokeny a bloky u n\u00e1s prob\u00edhala prost\u0159ednictv\u00edm t\u0159\u00edd. P\u0159i vytv\u00e1\u0159en\u00ed t\u011bchto t\u0159\u00edd poklesla v\u00fdkon na polovinu, co\u017e nazna\u010duje, \u017ee OOP pro n\u00e1s nen\u00ed vhodn\u00e9. Museli jsme v\u0161e p\u0159epsat na \u010dist\u011b funkcion\u00e1ln\u00ed p\u0159\u00edstup.<\/p>\n<h2>Z\u00e1pis do datab\u00e1ze<\/h2>\n<p>\nP\u016fvodn\u011b byla pro ukl\u00e1d\u00e1n\u00ed dat zvolena slu\u017eba Redis jako jedno z nejv\u00fdkonn\u011bj\u0161\u00edch \u0159e\u0161en\u00ed, kter\u00e9 spl\u0148uje na\u0161e po\u017eadavky: key-value \u00falo\u017ei\u0161t\u011b, pr\u00e1ce s hash tabulkami, mno\u017einami. Spustili jsme redis-benchmark a z\u00edskali ~80k operac\u00ed za sekundu v re\u017eimu 1 pipelining.<\/p>\n<p>Pro vysok\u00fd v\u00fdkon jsme Redis nastavili v\u00edce precizn\u011b: <\/p>\n<ul>\n<li>Nastavili jsme unix socket p\u0159ipojen\u00ed.<\/li>\n<li>Vypnuli jsme ukl\u00e1d\u00e1n\u00ed do souboru (pro spolehlivost lze nakonfigurovat replikaci a v jin\u00e9m Redis prov\u00e1d\u011bt ukl\u00e1d\u00e1n\u00ed na disk).<\/li>\n<\/ul>\n<p>\nV Redis je pool - to je hash tabulka, proto\u017ee pot\u0159ebujeme mo\u017enost z\u00edskat v\u0161echny transakce jedn\u00edm dotazem a odstranit transakce jednotliv\u011b. Zkou\u0161eli jsme pou\u017e\u00edt oby\u010dejn\u00fd seznam, ale p\u0159i vykl\u00e1d\u00e1n\u00ed cel\u00e9ho seznamu funguje pomaleji. <\/p>\n<p>P\u0159i pou\u017eit\u00ed standardn\u00ed knihovny Redis pro NodeJS jsme dos\u00e1hli v\u00fdkonu 18k transakc\u00ed za sekundu. Rychlost klesla 9kr\u00e1t. <\/p>\n<p>Proto\u017ee benchmark jasn\u011b ukazoval mo\u017enosti 5kr\u00e1t vy\u0161\u0161\u00ed, za\u010dali jsme optimalizovat. Zm\u011bnili jsme knihovnu na ioredis a dos\u00e1hli jsme v\u00fdkonu u\u017e 25k za sekundu. Transakce jsme p\u0159id\u00e1vali jednotliv\u011b pomoc\u00ed p\u0159\u00edkazu `hset`. Takto jsme generovali mnoho dotaz\u016f do Redis. Napadlo n\u00e1s spojit transakce do bal\u00ed\u010dk\u016f a pos\u00edlat je jedn\u00edm p\u0159\u00edkazem `hmset`. V\u00fdsledek \u2014 32k za sekundu. <\/p>\n<p>Z n\u011bkolika d\u016fvod\u016f, kter\u00e9 pop\u00ed\u0161eme n\u00ed\u017ee, pracujeme s daty pomoc\u00ed `Buffer` a jak se uk\u00e1zalo, pokud ho p\u0159evedeme na text (`buffer.toString('hex')`) p\u0159ed z\u00e1pisem, m\u016f\u017eeme z\u00edskat dal\u0161\u00ed v\u00fdkon. T\u00edmto zp\u016fsobem se poda\u0159ilo zv\u00fd\u0161it rychlost na 35k za sekundu. V tuto chv\u00edli jsme se rozhodli pozastavit dal\u0161\u00ed optimalizaci.<\/p>\n<p>Museli jsme p\u0159ej\u00edt na bin\u00e1rn\u00ed protokol, proto\u017ee:<\/p>\n<p><b>1. <\/b>Syst\u00e9m \u010dasto po\u010d\u00edt\u00e1 hashe, podpisy atd., a k tomu pot\u0159ebuje data v `Buffer`.<\/p>\n<p><b>2.<\/b> P\u0159i p\u0159enosu mezi slu\u017ebami maj\u00ed bin\u00e1rn\u00ed data men\u0161\u00ed hmotnost ne\u017e text. Nap\u0159\u00edklad p\u0159i odes\u00edl\u00e1n\u00ed bloku s 1 milionem transakc\u00ed mohou data v textu zab\u00edrat v\u00edce ne\u017e 300 megabajt\u016f.<\/p>\n<p><b>3.<\/b> Neust\u00e1l\u00e1 konverze dat ovliv\u0148uje v\u00fdkon.<\/p>\n<p>Proto jsme vych\u00e1zeli z vlastn\u00edho bin\u00e1rn\u00edho protokolu pro ukl\u00e1d\u00e1n\u00ed a p\u0159enos dat, kter\u00fd byl vyvinut na z\u00e1klad\u011b vynikaj\u00edc\u00ed knihovny `binary-data`.<\/p>\n<p>D\u00edky tomu jsme vytvo\u0159ili n\u00e1sleduj\u00edc\u00ed datov\u00e9 struktury:<\/p>\n<h3> \u2014 Transakce<\/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>\nObvykl\u00fdmi p\u0159\u00edkazy `BD.encode(block, Protocol).slice();` a ` BD.decode(buffer, Protocol)` p\u0159ev\u00e1d\u00edme data na `Buffer` pro ulo\u017een\u00ed do Redis nebo odesl\u00e1n\u00ed jin\u00e9 n\u00f3d\u011b a zp\u011btn\u00e9 z\u00edsk\u00e1n\u00ed dat.<\/p>\n<p>Tak\u00e9 m\u00e1me 2 bin\u00e1rn\u00ed protokoly pro p\u0159enos dat mezi slu\u017ebami:<\/p>\n<p><i> \u2014 Protokol pro komunikaci s Plasma Node pomoc\u00ed unix socketu<\/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 akce, kterou je t\u0159eba prov\u00e9st, nap\u0159\u00edklad 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 data, kter\u00e1 je t\u0159eba p\u0159edat odpov\u00eddaj\u00edc\u00ed funkci;<\/li>\n<li> <b>`messageId`<\/b> \u2014 id zpr\u00e1vy, abychom mohli identifikovat odpov\u011b\u010f. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protokol pro komunikaci mezi n\u00f3dami<\/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 zpr\u00e1vy, nap\u0159\u00edklad 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 verze protokolu, proto\u017ee v s\u00edti mohou b\u011b\u017eet n\u00f3dov\u00e9 s r\u016fzn\u00fdmi verzemi a mohou pracovat odli\u0161n\u011b;<\/li>\n<li> <b>`seq`<\/b> \u2014 identifik\u00e1tor zpr\u00e1vy;<\/li>\n<li> <b>`countChunk`<\/b> a <b>`chunkNumber`<\/b> nepostradateln\u00e9 pro rozd\u011blen\u00ed velk\u00fdch zpr\u00e1v;<\/li>\n<li> <b>`length`<\/b> a <b>`payload`<\/b> d\u00e9lka a samotn\u00e1 data.<\/li>\n<\/ul>\n<p>\nProto\u017ee jsme data p\u0159edem typizovali, kone\u010dn\u00fd syst\u00e9m funguje mnohem rychleji ne\u017e knihovna `rlp` od Etherea. Bohu\u017eel se n\u00e1m zat\u00edm nepoda\u0159ilo se j\u00ed vzd\u00e1t, proto\u017ee je pot\u0159eba dokon\u010dit smart kontrakt, co\u017e pl\u00e1nujeme ud\u011blat v budoucnosti.<\/p>\n<p>Pokud se n\u00e1m poda\u0159ilo dos\u00e1hnout rychlosti <b>35 000<\/b> transakc\u00ed za sekundu, mus\u00edme je tak\u00e9 zpracov\u00e1vat v optim\u00e1ln\u00edm \u010dase. Jeliko\u017e p\u0159ibli\u017en\u00e1 doba pro vytvo\u0159en\u00ed bloku trv\u00e1 30 sekund, mus\u00edme zahrnout do bloku <b>1 000 000<\/b> transakc\u00ed, co\u017e znamen\u00e1 p\u0159enos v\u00edce ne\u017e <b>100<\/b> MB dat. <\/p>\n<p>P\u016fvodn\u011b jsme pou\u017e\u00edvali knihovnu `ethereumjs-devp2p` pro propojen\u00ed uzl\u016f, ale ta si s takov\u00fdm mno\u017estv\u00edm dat neporadila. V d\u016fsledku toho jsme p\u0159e\u0161li na knihovnu `ws` a nastavili p\u0159enos bin\u00e1rn\u00edch dat pomoc\u00ed websocket\u016f. Samoz\u0159ejm\u011b jsme tak\u00e9 narazili na probl\u00e9my s p\u0159enosem velk\u00fdch datov\u00fdch bal\u00edk\u016f, ale rozd\u011blili jsme je na men\u0161\u00ed \u010d\u00e1sti a nyn\u00ed ji\u017e tyto probl\u00e9my nem\u00e1me.<\/p>\n<p>Tak\u00e9 vytvo\u0159en\u00ed Merkleova stromu a v\u00fdpo\u010det hash <b>1 000 000<\/b> transakc\u00ed vy\u017eaduje asi<b> 10<\/b> sekund nep\u0159etr\u017eit\u00e9ho v\u00fdpo\u010dtu. B\u011bhem t\u00e9to doby se spojen\u00ed se v\u0161emi uzly p\u0159eru\u0161\u00ed. Bylo rozhodnuto p\u0159esunout tento v\u00fdpo\u010det do samostatn\u00e9ho vl\u00e1kna.<\/p>\n<h2>Z\u00e1v\u011bry:<\/h2>\n<p>\nVe skute\u010dnosti na\u0161e zji\u0161t\u011bn\u00ed nejsou nov\u00e1, ale z n\u011bjak\u00e9ho d\u016fvodu na n\u011b mnoho specialist\u016f zapom\u00edn\u00e1 p\u0159i v\u00fdvoji. <\/p>\n<ul>\n<li>Pou\u017eit\u00ed funkcion\u00e1ln\u00edho programov\u00e1n\u00ed m\u00edsto objektov\u00e9ho programov\u00e1n\u00ed zvy\u0161uje v\u00fdkon.<\/li>\n<li>Monolit je hor\u0161\u00ed ne\u017e servisn\u00ed architektura pro v\u00fdkonn\u00fd syst\u00e9m na NodeJS.<\/li>\n<li>Pou\u017eit\u00ed `worker_threads` pro n\u00e1ro\u010dn\u00e9 v\u00fdpo\u010dty zlep\u0161uje odezvu syst\u00e9mu, zejm\u00e9na p\u0159i pr\u00e1ci s operacemi i\/o.<\/li>\n<li>unix socket je stabiln\u011bj\u0161\u00ed a rychlej\u0161\u00ed ne\u017e http po\u017eadavky.<\/li>\n<li>Pokud je pot\u0159eba rychle p\u0159en\u00e1\u0161et velk\u00e1 data po s\u00edti, je lep\u0161\u00ed pou\u017e\u00edt websockety a pos\u00edlat bin\u00e1rn\u00ed data rozd\u011blen\u00e1 na \u010d\u00e1sti, kter\u00e9 lze znovu odeslat, pokud nedoraz\u00ed, a pot\u00e9 je slou\u010dit do jedn\u00e9 zpr\u00e1vy.<\/li>\n<\/ul>\n<p>\nZveme v\u00e1s k n\u00e1v\u0161t\u011bv\u011b <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\u00e1nek byl naps\u00e1n ve spolupr\u00e1ci s <i>Alexandrem Na\u0161ivanem<\/i>, vedouc\u00edm v\u00fdvoj\u00e1\u0159em <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.3 - 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\/cs\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Ve\u0159ejn\u00fd test: \u0159e\u0161en\u00ed pro soukrom\u00ed a \u0161k\u00e1lovatelnost v Ethereum | ProHoster","description":"Blockchain je inovativn\u00ed technologie, kter\u00e1 slibuje zlep\u0161en\u00ed mnoha oblast\u00ed lidsk\u00e9ho \u017eivota.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}