{"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\/et\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Plokiahel<\/b> \u2014 innovatiivne tehnoloogia, mis lubab parandada paljusid inimelu valdkondi. See viib reaalsed protsessid ja tooted digitaalsetesse ruumidesse, tagab finantstehingute kiirus ja usaldusv\u00e4\u00e4rsuse, v\u00e4hendab nende maksumust ning v\u00f5imaldab luua kaasaegseid DAPP rakendusi, kasutades nutikaid lepinguid detsentraliseeritud v\u00f5rkudes.<\/p>\n<p>Arvestades blockchaini arvukate eeliste ja mitmekesiste rakendusvaldkondadega, v\u00f5ib tunduda kummaline, et see lubav tehnoloogia pole veel k\u00f5igis t\u00f6\u00f6stusharudes juurdunud. Probleemiks on see, et kaasaegsetel detsentraliseeritud blockchainidel puudub skaleeritavus. Ethereum t\u00f6\u00f6tleb umbes 20 tehingut sekundis, mis pole piisav, et rahuldada t\u00e4nap\u00e4eva d\u00fcnaamilise \u00e4ri vajadusi. Samal ajal ei julge blockchaini tehnoloogiat kasutavad ettev\u00f5tted loobuda Ethereumi selle k\u00f5rge h\u00e4kkimise ja v\u00f5rgu t\u00f5rgete vastu kaitse t\u00f5ttu.<\/p>\n<p>Kuna tagada detsentraliseeritust, turvalisust ja skaleeritavust blockchainis, lahendades seega Skaala Trilemmas, on arendajate meeskond <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> loodud Plasma Cash \u2014 alakee, mis koosneb nutilepingust ja Node.js p\u00f5hist privaatsest v\u00f5rgust, mis perioodiliselt edastab oma oleku p\u00f5hikehasse (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis\" 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>Plasma Cashi peamised protsessid<\/h2>\n<p>\n<b>1. <\/b>Kasutaja kutsub nutilepingu `deposit` funktsiooni, edastades sellele summa ETHs, mille ta soovib Plasma Cashi tokenisse panna. Nutilepingu funktsioon loob tokeni ja genereerib selle kohta s\u00fcndmuse.<\/p>\n<p><b>2. <\/b>Plasma Cash nodid, mis on registreeritud nutilepingu s\u00fcndmustele, saavad deposiidi loomise s\u00fcndmuse ja lisavad tokeni loomise tehingu tehingute punkti.<\/p>\n<p><b>3. <\/b>Perioodiliselt v\u00f5tavad erilised Plasma Cash nodid k\u00f5ik tehingud punktist (kuni 1 miljon) ja loovad neist ploki, arvutavad Merkle puu ja vastavalt hashi. Antud plokk saadetakse teistele nodidele verifitseerimiseks. Nodid kontrollivad, kas Merkle hashi on kehtiv, ja kas tehingud on kehtivad (n\u00e4iteks, kas tokeni saatja on selle omanik). P\u00e4rast ploki verifitseerimist kutsub node nutilepingu `submitBlock` funktsiooni, mis salvestab p\u00f5hikehasse ploki numbri ja Merkle hashi. Nutileping genereerib s\u00fcndmuse ploki eduka lisamise kohta. Tehingud eemaldatakse punktist. <\/p>\n<p><b>4. <\/b>Node'id, mis said tagasi s\u00fcndmuse blokki saatmisest, hakkavad rakendama tehinguid, mis on lisatud blokki.<\/p>\n<p><b>5. <\/b>M\u00f5nes etapis tahab tokeni omanik (v\u00f5i mitteomanik) selle Plasma Cash'ist v\u00e4lja v\u00f5tta. Selleks kutsub ta \u00fcles funktsiooni `startExit`, edastades sellele kaks viimast tehingut tokeni kohta, mis t\u00f5endavad, et just tema on tokeni omanik. Nutikas leping kontrollib, kasutades Merkle'i rippu, tehingute olemasolu blokkides ja saadab tokeni v\u00e4ljav\u00f5tmiseks, mis toimub kahe n\u00e4dala jooksul.<\/p>\n<p><b>6. <\/b>Kui tokeni v\u00e4ljav\u00f5tmise operatsioon toimus rikkumistega (tokeni kulutamine p\u00e4rast v\u00e4ljav\u00f5tmisprotsessi algust v\u00f5i token enne v\u00e4ljav\u00f5tmist juba oli kellegi teise k\u00e4es), v\u00f5ib tokeni omanik v\u00e4ljav\u00f5tmise kahe n\u00e4dala jooksul vaidlustada.<\/p>\n<p><img decoding=\"async\" alt=\"Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Privaatsus saavutatakse kahel viisil.<\/h2>\n<p>\n<b>1. <\/b>P\u00f5hikahel ei tea tehingutest, mis genereeritakse ja edastatakse t\u00fctarkahelas. Avalikuks j\u00e4\u00e4b teave selle kohta, kes on sisse viinud ja v\u00e4lja v\u00f5tnud ETH Plasma Cash'ist.<\/p>\n<p><b>2. <\/b>T\u00fctarkahel v\u00f5imaldab korraldada anon\u00fc\u00fcmsed tehingud, kasutades zk-SNARKs.<\/p>\n<h2>Tehnoloogiakogum<\/h2>\n<p><\/p>\n<ul>\n<li>Far manager<\/li>\n<li>Redis<\/li>\n<li>Etherium<\/li>\n<li>Soild<\/li>\n<\/ul>\n<p><\/p>\n<h2>Testimine <\/h2>\n<p>\nPlasma Cash'i arendamisel testisime s\u00fcsteemi t\u00f6\u00f6kiirus ja saime j\u00e4rgmised tulemused:<\/p>\n<ul>\n<li>kuni 35 000 tehingut sekundis lisatakse puuli;<\/li>\n<li>kuni 1 000 000 tehingut v\u00f5ib hoida blokis.<\/li>\n<\/ul>\n<p>\nTestid viidi l\u00e4bi j\u00e4rgmiste kolme serveriga:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake koos NVMe SSD \u2014 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n K\u00e4ivitati 3 valideerivat Plasma Cash node'i.<\/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 K\u00e4ivitati Ropsten testnet ETH node.<br \/>\n K\u00e4ivitati 3 valideerivat Plasma Cash node'i.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core koos NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n K\u00e4ivitati 1 Plasma Cash node'i, mis toob kokku.<br \/>\n K\u00e4ivitati 3 valideerivat Plasma Cash node'i.<br \/>\n Tehti test tehingute lisamiseks Plasma Cash'i v\u00f5rku.<\/p>\n<p><b>Kokkuv\u00f5tteks: <\/b>10 Plasma Cash node'i privaatv\u00f5rgus.<\/p>\n<h3>Test 1<\/h3>\n<p>\nBlokis on piirang 1 miljon tehingut. Seet\u00f5ttu satuvad 1 miljon tehingut 2 blokkidesse (sest s\u00fcsteem suudab osa tehingutest v\u00f5tta ja need edastada, kuni need saadetakse).<\/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=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nAlgne seisund: viimase blokk #7; andmebaasis on salvestatud 1 miljon tehingut ja tokenit.<\/p>\n<p>00:00 \u2014 skripti k\u00e4ivitamine tehingute genereerimiseks<br \/>\n01:37 \u2014 loodud 1 miljon tehingut ja saadetud node'isse<br \/>\n01:46 \u2014 submit node v\u00f5ttis puul 240k tehingut ja genereerib blokk #8. Samuti n\u00e4eme, et puusse lisatakse 320k tehingut 10 sekundi jooksul.<br \/>\n01:58 \u2014 blokk #8 allkirjastatakse ja saadetakse valideerimiseks.<br \/>\n02:03 \u2014 plokk #8 on valideeritud ja kutsuti esile smartrakenduse `submitBlock` funktsioon, millel on Merkle'i hash ja ploki number<br \/>\n02:10 \u2014 l\u00f5ppes demo-skripti t\u00f6\u00f6, mis saatis 1 miljon tehingut 32 sekundiga<br \/>\n02:33 \u2014 s\u00f5lmed hakkasid saama teavet selle kohta, et plokk #8 on lisatud p\u00f5hiv\u00f5rku ja hakkasid tegema 240k tehingut<br \/>\n02:40 \u2014 240k tehingut eemaldati basseinist, mis juba on plokis #8<br \/>\n02:56 \u2014 submit s\u00f5lm v\u00f5ttis basseinist \u00fclej\u00e4\u00e4nud 760k tehingut ja hakkas arvutama Merkle'i hash'i ja allkirjastama ploki #9<br \/>\n03:20 \u2014 k\u00f5ik s\u00f5lmed sisaldavad 1 miljon 240k tehingut ja tokeneid<br \/>\n03:35 \u2014 plokk #9 on allkirjastatud ja saadetud valideerimiseks teistele s\u00f5lmedele <br \/>\n03:41 \u2014 v\u00f5rgus ilmnes viga<br \/>\n04:40 \u2014 ajan\u00e4itaja l\u00f5ppes, ploki #9 valideerimise ootamine l\u00f5petati<br \/>\n04:54 \u2014 submit s\u00f5lm v\u00f5ttis basseinist \u00fclej\u00e4\u00e4nud 760k tehingut ja hakkas arvutama Merkle'i hash'i ja allkirjastama ploki #9<br \/>\n05:32 \u2014 plokk #9 on allkirjastatud ja saadetud valideerimiseks teistele s\u00f5lmedele<br \/>\n05:53 \u2014 plokk #9 on valideeritud ja saadetud p\u00f5hiv\u00f5rku<br \/>\n06:17 \u2014 s\u00f5lmed hakkasid saama teavet selle kohta, et plokk #9 on lisatud p\u00f5hiv\u00f5rku ja hakkasid tegema 760k tehingut<br \/>\n06:47 \u2014 bassein on puhastatud tehingutest, mis on plokis #9<br \/>\n09:06 \u2014 k\u00f5ik s\u00f5lmed sisaldavad 2 miljonit tehingut ja tokeneid<\/p>\n<h3>Test 2<\/h3>\n<p>\nPloki limit on 350k. Tulemuseks on 3 plokki.<\/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=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nAlgne seisund: viimane plokk #9; andmebaasis on salvestatud 2 miljonit tehingut ja tokeneid<\/p>\n<p>00:00 \u2014 tehingute genereerimise skript on juba k\u00e4ivitatud<br \/>\n00:44 \u2014 on loodud 1 miljon tehingut ja alustatud saatmist s\u00f5lme<br \/>\n00:56 \u2014 submit s\u00f5lm v\u00f5ttis basseinist 320k tehingut ja koostab ploki #10. Samuti n\u00e4eme, et basseini lisandub 320k tehingut 10 sekundiga<br \/>\n01:12 \u2014 plokk #10 on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n01:18 \u2014 l\u00f5ppes demo-skripti t\u00f6\u00f6, mis saatis 1 miljon tehingut 34 sekundiga<br \/>\n01:20 \u2014 plokk #10 on valideeritud ja saadetud p\u00f5hiv\u00f5rku <br \/>\n01:51 \u2014 k\u00f5ik s\u00f5lmed said p\u00f5hiv\u00f5rgust teavet selle kohta, et plokk #10 on lisatud, ja hakkavad rakendama 320k tehingut<br \/>\n02:01 \u2014 bassein on puhastatud 320k tehingutest, mis lisati plokki #10<br \/>\n02:15 \u2014 submit s\u00f5lm v\u00f5ttis basseinist 350k tehingut ja koostab ploki #11<br \/>\n02:34 \u2014 plokk #11 on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n02:51 \u2014 plokk #11 on valideeritud ja saadetud p\u00f5hiv\u00f5rku <br \/>\n02:55 \u2014 viimane s\u00f5lm t\u00e4itis ploki #10 tehingud<br \/>\n10:59 \u2014 juureketis toimus v\u00e4ga pikaajaline tehing blokk #9 esitamisega, kuid see viidi l\u00f5pule ja k\u00f5ik s\u00f5lmed said sellest teavet ning alustasid 350k tehingu t\u00f6\u00f6tlemist<br \/>\n11:05 \u2014 bassein puhastati 320k tehingust, mis lisati blokk #11<br \/>\n12:10 \u2014 k\u00f5ik s\u00f5lmed sisaldavad 1 miljon 670k tehingut ja tokenit<br \/>\n12:17 \u2014 esituss\u00f5lm v\u00f5ttis basseinist 330k tehingut ja vormib blokk #12<br \/>\n12:32 \u2014 blokk #12 on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n12:39 \u2014 blokk #12 on valideeritud ja saadetud juureketti <br \/>\n13:44 \u2014 k\u00f5ik s\u00f5lmed said juureketist teavet, et blokk #12 on lisatud, ja alustavad 330k tehingu rakendamist<br \/>\n14:50 \u2014 k\u00f5ik s\u00f5lmed sisaldavad 2 miljonit tehingut ja tokenit<\/p>\n<h3>Test 3<\/h3>\n<p>\nEsimeses ja teises serveris asendati \u00fcks valideeriv s\u00f5lm esituss\u00f5lmiga. <\/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=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nAlgne seis: viimane blokk #84; andmebaasis on salvestatud 0 tehingut ja tokenit<\/p>\n<p>00:00 \u2014 K\u00e4ivitatud 3 skripti, mis genereerivad ja saadavad 1 miljon tehingut<br \/>\n01:38 \u2014 loodud 1 miljon tehingut ja saadeti esituss\u00f5lmele #3<br \/>\n01:50 \u2014 esituss\u00f5lm #3 v\u00f5ttis basseinist 330k tehingut ja vormib blokk #85 (f21). Samuti n\u00e4eme, et basseinile lisatakse 350k tehingut 10 sekundi jooksul<br \/>\n01:53 \u2014 loodud 1 miljon tehingut ja saadeti esituss\u00f5lmele #1<br \/>\n01:50 \u2014 esituss\u00f5lm #3 v\u00f5ttis basseinist 330k tehingut ja vormib blokk #85 (f21). Samuti n\u00e4eme, et basseinile lisatakse 350k tehingut 10 sekundi jooksul<br \/>\n02:01 \u2014 esituss\u00f5lm #1 v\u00f5ttis basseinist 250k tehingut ja vormib blokk #85 (65e)<br \/>\n02:06 \u2014 blokk #85 (f21) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n02:08 \u2014 l\u00f5petas t\u00f6\u00f6 demo-skript serveris #3, mis saatis 1 miljon tehingut 30 sekundi jooksul<br \/>\n02:14 \u2014 blokk #85 (f21) on valideeritud ja saadetud juureketti <br \/>\n02:19 \u2014 blokk #85 (65e) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n02:22 \u2014 loodud 1 miljon tehingut ja saadeti esituss\u00f5lmele #2<br \/>\n02:27 \u2014 blokk #85 (65e) on valideeritud ja saadetud juureketti <br \/>\n02:29 \u2014 esituss\u00f5lm #2 v\u00f5ttis basseinist 111855 tehingut ja vormib blokk #85 (256).<br \/>\n02:36 \u2014 blokk #85 (256) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n02:36 \u2014 l\u00f5petas t\u00f6\u00f6 demo-skript serveris #1, mis saatis 1 miljon tehingut 42,5 sekundi jooksul<br \/>\n02:38 \u2014 blokk #85 (256) on valideeritud ja saadetud juureketti<br \/>\n03:08 \u2014 l\u00f5petas t\u00f6\u00f6 demo-skript serveris #2, mis saatis 1 miljon tehingut 47 sekundi jooksul <br \/>\n03:38 \u2014 k\u00f5ik s\u00f5lmed said juureketist teavet, et blokid #85 (f21), #86 (65e), #87 (256) on lisatud ja alustavad 330k, 250k, 111855 tehingu rakendamist<br \/>\n03:49 \u2014 bassein puhastati 330k, 250k, 111855 tehinguga, mis lisati blokki #85 (f21), #86(65e), #87(256)<br \/>\n03:59 \u2014 submit node #1 v\u00f5ttis basseinist 888145 tehingut ja loob bloki #88 (214), submit node #2 v\u00f5ttis basseinist 750k tehingut ja loob bloki #88 (50a), submit node #3 v\u00f5ttis basseinist 670k tehingut ja loob bloki #88 (d3b)<br \/>\n04:44 \u2014 blokk #88 (d3b) on allkirjastatud ja saadetud teistele node'idele valideerimiseks<br \/>\n04:58 \u2014 blokk #88 (214) on allkirjastatud ja saadetud teistele node'idele valideerimiseks<br \/>\n05:11 \u2014 blokk #88 (50a) on allkirjastatud ja saadetud teistele node'idele valideerimiseks<br \/>\n05:11 \u2014 blokk #85 (d3b) on valideeritud ja saadetud juureketti <br \/>\n05:36 \u2014 blokk #85 (214) on valideeritud ja saadetud juureketti <br \/>\n05:43 \u2014 k\u00f5ik node'id said juureketist teavet, et blokk #88 (d3b), #89(214) on lisatud ja hakkavad rakendama 670k, 750k tehingut<br \/>\n06:50 \u2014 seoses \u00fchenduse katkeemisega blokk #85 (50a) ei olnud valideeritud<br \/>\n06:55 \u2014 submit node #2 v\u00f5ttis basseinist 888145 tehingut ja loob bloki #90 (50a)<br \/>\n08:14 \u2014 blokk #90 (50a) on allkirjastatud ja saadetud teistele node'idele valideerimiseks<br \/>\n09:04 \u2014 blokk #90 (50a) on valideeritud ja saadetud juureketti <br \/>\n11:23 \u2014 k\u00f5ik node'id said juureketist teavet, et blokk #90 (50a) on lisatud ja hakkavad rakendama 888145 tehingut. Samal ajal on server #3 juba ammu rakendanud tehingud blokidest #88 (d3b), #89(214)<br \/>\n12:11 \u2014 k\u00f5ik basseinid on t\u00fchjad<br \/>\n13:41 \u2014 k\u00f5ik serveri #3 node'id sisaldavad 3 miljonit tehingut ja tokenit<br \/>\n14:35 \u2014 k\u00f5ik serveri #1 node'id sisaldavad 3 miljonit tehingut ja tokenit<br \/>\n19:24 \u2014 k\u00f5ik serveri #2 node'id sisaldavad 3 miljonit tehingut ja tokenit <\/p>\n<h2>Takistused<\/h2>\n<p>\nPlasma Cash arendamise ajal kohtusime j\u00e4rgmiste probleemidega, mida oleme j\u00e4rk-j\u00e4rgult lahendanud ja lahendame:<\/p>\n<p><b>1.<\/b> S\u00fcsteemi erinevate funktsioonide vastastikuse m\u00f5ju konflikt. N\u00e4iteks tehingute lisamise funktsioon basseinidesse takistas submit'i ja bloki valideerimise t\u00f6\u00f6d ja vastupidi, mis p\u00f5hjustas kiiruslanguse.<\/p>\n<p><b>2. <\/b>Polnud kohe selge, kuidas saata tohutul hulgal tehinguid ja samal ajal andmeedastuskulusid minimaalsetena hoida.<\/p>\n<p><b>3. <\/b>Polnud selge, kuidas ja kus andmeid hoida, et saavutada k\u00f5rgeid tulemusi.<\/p>\n<p><b>4. <\/b>Polnud selge, kuidas korraldada v\u00f5rku node'ide vahel, kuna 1 miljoni tehinguga blokk v\u00f5tab umbes 100 MB.<\/p>\n<p><b>5.<\/b> \u00dcksike t\u00f6\u00f6 re\u017eiim katkestab \u00fchenduse node'ide vahel, kui toimuvad pikaajalised arvutused (nt Merkle puu ehitamine ja selle r\u00fchma hash'i arvutamine).<\/p>\n<h2>Kuidas me k\u00f5igi nende v\u00e4ljakutsetega hakkama saime?<\/h2>\n<p>\nEsimene versioon Plasma Cash node'ist oli mingi kombo, mis suutis teha k\u00f5ike korraga: vastu v\u00f5tta tehinguid, esitada ja valideerida plokke, pakkuda API-d andmetele juurdep\u00e4\u00e4suks. Kuna NodeJS on algselt \u00fchetasandiline, siis koormav Merkle puu arvutamise funktsioon takistas tehingute lisamise funktsiooni. Me n\u00e4gime kahte varianti selle probleemi lahendamiseks:<\/p>\n<p><b>1. <\/b>K\u00e4ivitada mitu NodeJS protsessi, kus iga\u00fchel on oma kindlad funktsioonid.<\/p>\n<p><b>2. <\/b>Kasutada worker_threads, et viia osa koodist eraldi niitidesse.<\/p>\n<p>L\u00f5puks kasutasime m\u00f5lemaid variante korraga: loogiliselt jagasime \u00fche node kolmeks osaks, mis v\u00f5ivad t\u00f6\u00f6tada eraldi, kuid samas ka s\u00fcnkroonselt.<\/p>\n<p><b>1.<\/b> Tehingute vastuv\u00f5tmise node, mis haldab tehingute puulis ja n\u00f5ustab plokkide loomist.<\/p>\n<p><b>2.<\/b> Valideerimise node, mis kontrollib node'ide kehtivust.<\/p>\n<p><b>3. <\/b>API node \u2014 pakub API-d andmete juurdep\u00e4\u00e4suks.<\/p>\n<p>Samuti saab igale node'ile \u00fchenduda l\u00e4bi unix socketi CLI kaudu.<\/p>\n<p>Koormavad operatsioonid, nagu Merkle puu arvutamine, viidi eraldi niiti.<\/p>\n<p>Nii saavutasime Plasma Cash k\u00f5ikide funktsioonide sujuva toimimise samal ajal ja ilma t\u00f5rgeteta.<\/p>\n<p>Kuna s\u00fcsteem hakkas funktsionaalselt t\u00f6\u00f6le, alustasime kiiruseteste ja, kahjuks, saime rahuldavaid tulemusi: 5000 tehingut sekundis ja kuni 50 000 tehingut plokis. Pidin v\u00e4lja selgitama, mis oli valesti rakendatud.<\/p>\n<p>Esiteks alustasime Plasma Cashiga suhtlemise mehhanismi testimist, et teada saada s\u00fcsteemi tipv\u00f5imekust. Varem kirjutasime, et Plasma Cash node pakub unix socketi liidest. See oli algselt tekstip\u00f5hine. JSON objektid edastati, kasutades `JSON.parse()` ja `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>\nM\u00f5\u00f5tsime selliste objektide edastamise kiirust ja saime ~ 130k sekundis. Proovisime asendada standardseid JSON t\u00f6\u00f6tlemisfunktsioone, kuid j\u00f5udlust see ei parandanud. T\u00f5en\u00e4oliselt on V8 mootor selliste operatsioonide jaoks h\u00e4sti optimeeritud.<\/p>\n<p>Tehingute, tokenite ja plokkidega t\u00f6\u00f6tamine toimus meil l\u00e4bi klasside. Selliste klasside loomisel langes j\u00f5udlus kahekordselt, mis n\u00e4itab, et OOP ei sobi meile. Pidi kirjutama k\u00f5ik \u00fcmber puhtale funktsionaalsele l\u00e4henemisele.<\/p>\n<h2>Kirjutamine andmebaasi<\/h2>\n<p>\nAlguses valiti andmete salvestamiseks Redis kui \u00fcks k\u00f5ige j\u00f5udlusest pakkuv lahendus, mis vastas meie n\u00f5udmistele: key-value salvestus, t\u00f6\u00f6tamine hash-tabelitega, hulgad. K\u00e4ivitasime redis-benchmarki ja saime ~80k operatsiooni sekundis 1 pipelining re\u017eiimis.<\/p>\n<p>K\u00f5rge j\u00f5udluse saavutamiseks h\u00e4\u00e4lestasime Redis\u2019e peenemalt: <\/p>\n<ul>\n<li>Seadsime unix socket \u00fchenduse.<\/li>\n<li>L\u00fclitasime v\u00e4lja oleku salvestamise kettale (usaldusv\u00e4\u00e4rsuse tagamiseks v\u00f5ib seadistada replikatsiooni ja juba eraldi Redis\u2019is teha salvestamise kettale).<\/li>\n<\/ul>\n<p>\nRedis'es on bassein \u2014 see on hash-tabel, kuna meil on vaja saada k\u00f5ik tehingud \u00fche p\u00e4ringuga ja eemaldada tehingud \u00fckshaaval. Proovisime kasutada tavalist nimekirja, kuid see toimis nimekirja laadimisel aeglasemalt. <\/p>\n<p>Kasutades standardset NodeJS Redis teeki, saime j\u00f5udluse 18k tehingut sekundis. Kiirus langes 9 korda. <\/p>\n<p>Kuna benchmark n\u00e4itas meile selgelt 5 korda suuremaid v\u00f5imalusi, alustasime optimeerimist. Muutsime teeki iorediseks ja saime j\u00f5udluse juba 25k sekundis. Tehingud lisasime \u00fckshaaval, kasutades k\u00e4sku `hset`. Sel viisil genereerisime palju p\u00e4ringuid Redis\u2019ile. Tekkinud idee oli koguda tehingud partiidena ja saata need \u00fche k\u00e4suga `hmset`. Tulemuseks oli 32k sekundis. <\/p>\n<p>\u041f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0438\u0436\u0435, \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f `Buffer` \u0438, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442 (`buffer.toString(&#8216;hex&#8217;)`) \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0434\u043e 35\u043a \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>Pidime minema \u00fcle binaarsesse protokolli, kuna:<\/p>\n<p><b>1. <\/b>S\u00fcsteem arvutab sageli h\u00e4sse, allkirju jne, ja selleks on tal vaja andmeid `Buffer\u2019ina.<\/p>\n<p><b>2.<\/b> Teenuste vahel edastades kaaluvad binaarsed andmed v\u00e4hem kui tekst. N\u00e4iteks, kui saata blokk 1 miljoni tehinguga, v\u00f5ivad andmed tekstina v\u00f5tta rohkem kui 300 megabaidi.<\/p>\n<p><b>3.<\/b> Andmete pidev konverteerimine m\u00f5jutab j\u00f5udlust.<\/p>\n<p>Seet\u00f5ttu p\u00f5hinesime omaenda binaarsel protokollil andmete salvestamiseks ja edastamiseks, mis on v\u00e4lja t\u00f6\u00f6tatud suurep\u00e4rase `binary-data` teegi baasil.<\/p>\n<p>Tulemuseks on j\u00e4rgmised andmestruktuurid:<\/p>\n<h3> \u2014 Tehing<\/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 Plokk<\/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>\nTavaliste k\u00e4skudega `BD.encode(block, Protocol).slice();` ja ` BD.decode(buffer, Protocol)` muundame andmed `Buffer` formaati, et salvestada need Redis-sse v\u00f5i edastada teisele s\u00f5lmele ja andmed uuesti v\u00e4lja v\u00f5tta.<\/p>\n<p>Meil on ka 2 binaarset protokolli andmete edastamiseks teenuste vahel:<\/p>\n<p><i> \u2014 Protokoll Plasma Noode suhtlemiseks unix-soketiga<\/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 kus:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 tegu, mida tuleb sooritada, n\u00e4iteks 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 andmed, mis tuleb edastada vastavale funktsioonile;<\/li>\n<li> <b>`messageId`<\/b> \u2014 s\u00f5numi ID, et saaks tuvastada vastuse. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protokoll s\u00f5lmede vahel<\/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 kus:<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 s\u00f5numi kood, n\u00e4iteks 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 protokolli versioon, kuna v\u00f5rgus v\u00f5ivad olla erinevate versioonidega s\u00f5lmed, mis v\u00f5ivad t\u00f6\u00f6tada erinevalt;<\/li>\n<li> <b>`seq`<\/b> \u2014 s\u00f5numi identifikaator;<\/li>\n<li> <b>`countChunk`<\/b> ja <b>`chunkNumber`<\/b> on vajalikud suurte s\u00f5numite osadeks jagamiseks;<\/li>\n<li> <b>`length`<\/b> ja <b>`payload`<\/b> pikkus ja andmed.<\/li>\n<\/ul>\n<p>\nKuna oleme andmed eelnevalt t\u00fc\u00fcbinud, t\u00f6\u00f6tab l\u00f5pp-s\u00fcsteem palju kiiremini kui Ethereumi `rlp` teek. Kahjuks ei ole me veel suutnud sellest loobuda, kuna smart-leping vajab t\u00e4iendavat arendust, mida plaanime tulevikus teha.<\/p>\n<p>Kui suutsime saavutada kiirus <b>35 000<\/b> tehingut sekundis, peame neid ka t\u00f6\u00f6tlema optimaalse aja jooksul. Kuna ploki moodustamise ligikaudne aeg on 30 sekundit, peame plokki lisama <b>1 000 000<\/b> tehingut, mis t\u00e4hendab enam kui <b>100<\/b> mb andmeid. <\/p>\n<p>Alguses kasutasime `ethereumjs-devp2p` teeki s\u00f5lmede \u00fchendamiseks, kuid see ei suutnud nii palju andmeid hallata. Selle tulemusel kasutasime `ws` teeki ja seadistasime binaarsete andmete edastamise websocketi kaudu. Loomulikult kohtasime ka probleeme suurte andmepakettide edastamisel, kuid jagasime need chunkideks ja n\u00fc\u00fcd pole meil enam neid probleeme.<\/p>\n<p>Samuti kulub Merkle puu koostamiseks ja r\u00e4simise arvutamiseks umbes <b>1 000 000<\/b> sekundit pidevat arvutust. Selle aja jooksul katkeb \u00fchendus k\u00f5igi s\u00f5lmedega. Otsustati kanda see arvutus eraldi t\u00f5\u00f5le.<b> 10<\/b> Tegelikult ei ole meie j\u00e4reldused uudsed, kuid mingil p\u00f5hjusel unustavad paljud spetsialistid need arendamisel.<\/p>\n<h2>Kokkuv\u00f5tted:<\/h2>\n<p>\nFunktsionaalse programmeerimise kasutamine objektorienteeritud programmeerimise asemel t\u00f5stab j\u00f5udlust. <\/p>\n<ul>\n<li>Monoliitne arhitektuur on halvem kui teenuse arhitektuur produktiivses NodeJS s\u00fcsteemis.<\/li>\n<li>T\u00f6\u00f6tajate l\u00f5ime (`worker_threads`) kasutamine raskete arvutuste jaoks parandab s\u00fcsteemi reageerimisv\u00f5imet, eriti i\/o operatsioonide teostamisel.<\/li>\n<li>Unix socket on stabiilsem ja kiirem kui http p\u00e4ringud.<\/li>\n<li>Kui on vaja kiiresti edastada suuri andmeid \u00fcle v\u00f5rgu, on parem kasutada websocket'e ja saata binaarsete andmete choke'id, mida saab edastada, kui need ei j\u00f5u, ja seej\u00e4rel \u00fchendada \u00fcheks s\u00f5numiks.<\/li>\n<li>Plokiahel on innovaatiline tehnoloogia, mis lubab parandada paljusid inimelu valdkondi.<\/li>\n<\/ul>\n<p>\nKutsume teid k\u00fclastama <b>GitHub<\/b> projekti: <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>Artikkel on kirjutatud koost\u00f6\u00f6s <i>Aleksandr Na\u0161ivaniga<\/i>, vanem arendaja <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis | ProHoster","description":"\ud83e\udd47Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis | ProHoster","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}