{"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 tagamiseks 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 reaalprotsessid ja -tooted digitaalruumi, tagab finantstehingute kiirus ja usaldusv\u00e4\u00e4rsus, v\u00e4hendab nende kulusid ning v\u00f5imaldab luua kaasaegseid DAPP rakendusi nutikate lepingute abil detsentraliseeritud v\u00f5rgustikes.<\/p>\n<p>Arvestades blokeeringu arvukate eeliste ja rakendusvaldkondadega, v\u00f5ib tunduda kummaline, et see paljut\u00f5otav tehnoloogia pole veel tunginud k\u00f5ikidesse t\u00f6\u00f6stusharudesse. Probleem on selles, et kaasaegsetel detsentraliseeritud plokiahelatel puudub skaleeritavus. Ethereum t\u00f6\u00f6tleb umbes 20 tehingut sekundis, mis ei ole piisav kaasaegse d\u00fcnaamilise \u00e4ri vajaduste rahuldamiseks. Samal ajal ei julge plokiahela tehnoloogiat kasutavad ettev\u00f5tted loobuda Ethereumi oma k\u00f5rge h\u00e4kkerite ja v\u00f5rgukatkestuste kaitse t\u00f5ttu.<\/p>\n<p>Kuna tagada detsentraliseerimine, turvalisus ja skaleeritavus plokiahelas, lahendades niiviisi Skaleeritavuse Trilemma, arendajate meeskond <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> loomis Plasma Cash \u2014 t\u00fctaraken, mis koosneb nutikas lepingust ja Node.js p\u00f5hisel privaatv\u00f5rgust, mis edastab perioodiliselt oma oleku p\u00f5hiringile (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Avalik test: lahendus privaatsuse ja skaleeritavuse tagamiseks 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>Peamised protsessid Plasma Cashis<\/h2>\n<p>\n<b>1. <\/b>Kasutaja kutsub nutika lepingu funktsiooni `deposit`, edastades sellele ETH koguse, mille ta soovib Plasma Cashi tokenisse paigutada. Nutika lepingu funktsioon loob tokeni ja genereerib selle kohta s\u00fcndmuse.<\/p>\n<p><b>2. <\/b>Plasma Cashi s\u00f5lmed, mis on allkirjastanud nutika lepingu s\u00fcndmused, saavad deposiidi loomise s\u00fcndmuse ja lisavad tokeni loomise tehingu j\u00e4rjekorda.<\/p>\n<p><b>3. <\/b>Aeg-ajalt saavad Plasma Cash erisolvurid k\u00f5ik tehingud basseinist (kuni 1 miljon) ja koostavad neist ploki, arvutavad Merkle puu ja seega ka r\u00e4simise. See plokk saadetakse teistele solvudele kinnitamiseks. Solvud kontrollivad, kas Merkle r\u00e4simine on kehtiv ja kas tehingud on kehtivad (n\u00e4iteks, kas tokeni saatja on selle omanik). P\u00e4rast ploki kinnitamist kutsub solv funktsiooni `submitBlock` nutilepingus, mis salvestab ketisse ploki numbri ja Merkle r\u00e4simise. Nutileping genereerib s\u00fcndmuse ploki eduka lisamise kohta. Tehingud kustutatakse basseinist. <\/p>\n<p><b>4. <\/b>Solvud, kes said teate ploki esitamise kohta, hakkavad rakendama tehinguid, mis olid lisatud plokki.<\/p>\n<p><b>5. <\/b>Mingil hetkel soovib tokeni omanik (v\u00f5i mitte-omanik) selle Plasma Cash-ist v\u00e4lja v\u00f5tta. Selleks kutsub ta funktsiooni `startExit`, edastades sellele teabe kahe viimase tehingu kohta tokeni osas, mis kinnitavad, et just tema on tokeni omanik. Nutileping kontrollib Merkle r\u00e4simise abil tehingute asukohta plokkides ja saadab tokeni v\u00e4ljav\u00f5tmiseks, mis toimub kahe n\u00e4dala p\u00e4rast.<\/p>\n<p><b>6. <\/b>Kui tokeni v\u00e4ljamakse toimus rikkumistega (tokeni kasutamine p\u00e4rast v\u00e4ljamakseprotseduuri algust v\u00f5i token oli enne v\u00e4ljamaksmist juba kellegi teise oma), saab tokeni omanik kahe n\u00e4dala jooksul v\u00e4ljamakset vaidlustada.<\/p>\n<p><img decoding=\"async\" alt=\"Avalik test: lahendus privaatsuse ja skaleeritavuse tagamiseks Ethereumis\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Privaatsus saavutatakse kaheviisi<\/h2>\n<p>\n<b>1. <\/b>P\u00f5hiketash ei tea tehingutest, mis genereeritakse ja edastatakse alamketas. Avalikuks j\u00e4\u00e4b info selle kohta, kes sisestas ja v\u00f5ttis ETH Plasma Cashist.<\/p>\n<p><b>2. <\/b>Alamketas v\u00f5imaldab korraldada anon\u00fc\u00fcmsed tehingud, kasutades zk-SNARK-e.<\/p>\n<h2>Tehnoloogiline 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>Testimine <\/h2>\n<p>\nPlasma Cashi 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 saab salvestada plokki.<\/li>\n<\/ul>\n<p>\nTestid viidi l\u00e4bi kolmel j\u00e4rgmistel serveritel:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake, sealhulgas NVMe SSD \u2014 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n K\u00e4ivitatud on 3 valideerivat Plasma Cashi s\u00f5lme.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \u00abSummit Ridge\u00bb (Zen), SATA SSD \u2014 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n K\u00e4ivitatud on Ropsten testnet ETH s\u00f5lm.<br \/>\n K\u00e4ivitatud on 3 valideerivat Plasma Cashi s\u00f5lme.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core, sealhulgas NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n K\u00e4ivitatud on 1 submit Plasma Cashi s\u00f5lm.<br \/>\n K\u00e4ivitatud on 3 valideerivat Plasma Cashi s\u00f5lme.<br \/>\n Plasma Cash v\u00f5rku lisanduvate tehingute test k\u00e4ivitus.<\/p>\n<p><b>Kokku: <\/b>10 Plasma Cash s\u00f5lme privaatv\u00f5rgus.<\/p>\n<h3>Test 1<\/h3>\n<p>\nTehingute piir on 1 miljon plokis. Seet\u00f5ttu satuvad 1 miljon tehingut 2 plokki (sest s\u00fcsteem suudab osa tehingutest v\u00f5tta ja esitada, samal ajal kui 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=\"Vaata 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 #7; andmebaasis on salvestatud 1 miljon tehingut ja tokenit.<\/p>\n<p>00:00 \u2014 tehingute genereerimise skripti k\u00e4ivitamine<br \/>\n01:37 \u2014 loodud 1 miljon tehingut ja k\u00e4ivitati edastamine s\u00f5lme<br \/>\n01:46 \u2014 s\u00f5lm v\u00f5ttis 240k tehingut jooksvalt ja koostab ploki #8. Samuti n\u00e4eme, et 10 sekundi jooksul lisandub 320k tehingut puul.<br \/>\n01:58 \u2014 plokk #8 on allkirjastatud ja saadetud valideerimiseks<br \/>\n02:03 \u2014 plokk #8 on valideeritud ja kutsutud v\u00e4lja `submitBlock` funktsioon nutilepingus koos Merkle'i hash'iga ja ploki numbriga<br \/>\n02:10 \u2014 demo-skript l\u00f5petas t\u00f6\u00f6d, edastades 1 miljon tehingut 32 sekundi jooksul<br \/>\n02:33 \u2014 s\u00f5lmed hakkasid saama teavet, et plokk #8 on lisatud juureahelasse, ning hakkasid t\u00e4itma 240k tehingut<br \/>\n02:40 \u2014 puult eemaldati 240k tehingut, mis juba on plokis #8<br \/>\n02:56 \u2014 submit node took the remaining 760k transactions from the pool and began calculating the Merkle hash and signing block #9<br \/>\n03:20 \u2014 all nodes contain 1 million 240k transactions and tokens<br \/>\n03:35 \u2014 block #9 has been signed and is being sent for validation to other nodes <br \/>\n03:41 \u2014 a network error occurred<br \/>\n04:40 \u2014 waiting for validation of block #9 timed out<br \/>\n04:54 \u2014 submit node took the remaining 760k transactions from the pool and began calculating the Merkle hash and signing block #9<br \/>\n05:32 \u2014 block #9 has been signed and is being sent for validation to other nodes<br \/>\n05:53 \u2014 block #9 has been validated and sent to the root chain<br \/>\n06:17 \u2014 nodes began receiving information that block #9 has been added to the root chain and started processing 760k transactions<br \/>\n06:47 \u2014 the pool has been cleared of transactions included in block #9<br \/>\n09:06 \u2014 all nodes contain 2 million transactions and tokens<\/p>\n<h3>Test 2<\/h3>\n<p>\nThere is a limit of 350k per block. As a result, we have 3 blocks.<\/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=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nInitial state: last block #9; 2 million transactions and tokens are saved in the database<\/p>\n<p>00:00 \u2014 the transaction generation script has already started<br \/>\n00:44 \u2014 1 million transactions have been created and sending to the node has begun<br \/>\n00:56 \u2014 nod t\u00e4itis 320k tehingut puul ja vormib ploki #10. Samuti n\u00e4eme, et puule lisatakse 320k tehingut 10 sekundi jooksul<br \/>\n01:12 \u2014 plokk #10 on allkirjastatud ja saadetud teistele nodadele valideerimiseks<br \/>\n01:18 \u2014 demo skript l\u00f5petas t\u00f6\u00f6, mis saatis 1 miljon tehingut 34 sekundi jooksul<br \/>\n01:20 \u2014 plokk #10 on valideeritud ja saadetud juure ahelasse <br \/>\n01:51 \u2014 k\u00f5ik nodad said juure ahelast teavet, et plokk #10 on lisatud, ja hakkavad rakendama 320k tehingut<br \/>\n02:01 \u2014 puu on puhastatud 320k tehingutest, mis lisati plokki #10<br \/>\n02:15 \u2014 nod t\u00e4itis 350k tehingut puust ja vormib ploki #11<br \/>\n02:34 \u2014 plokk #11 on allkirjastatud ja saadetud teistele nodadele valideerimiseks<br \/>\n02:51 \u2014 plokk #11 on valideeritud ja saadetud juure ahelasse <br \/>\n02:55 \u2014 viimane nod t\u00e4itis tehingud plokist #10<br \/>\n10:59 \u2014 juure ahelas kestis v\u00e4ga kaua tehing ploki #9 esitamises, kuid see toimus ning k\u00f5ik nodad said teavet ja hakkasid t\u00e4itma 350k tehingut<br \/>\n11:05 \u2014 puu on puhastatud 320k tehingutest, mis lisati plokki #11<br \/>\n12:10 \u2014 k\u00f5ik nodad sisaldavad 1 miljon 670k tehingut ja tokenit<br \/>\n12:17 \u2014 submitt node v\u00f5ttis poolist 330k tehingut ja vormib ploki #12<br \/>\n12:32 \u2014 plokk #12 on allkirjastatud ja saadetud teistele nodedele valideerimiseks<br \/>\n12:39 \u2014 plokk #12 on valideeritud ja saadetud juurekettasse <br \/>\n13:44 \u2014 k\u00f5ik nodid said juureketta kaudu teavet, et plokk #12 on lisatud, ja alustavad 330k tehingu rakendamist<br \/>\n14:50 \u2014 k\u00f5ik nodid sisaldavad 2 miljonit tehingut ja tokenit<\/p>\n<h3>Test 3<\/h3>\n<p>\nEsimeses ja teises serveris asendati \u00fcks valideeriv node submitt nodiga. <\/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=\"Vaata 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 plokk #84; andmebaasis on salvestatud 0 tehingut ja tokenit<\/p>\n<p>00:00 \u2014 K\u00e4ivitatud on 3 skripti, mis genereerivad ja saadavad 1 miljoni tehingu<br \/>\n01:38 \u2014 loodud 1 miljon tehingut ja saadeti submitt node #3<br \/>\n01:50 \u2014 submitt node #3 v\u00f5ttis poolist 330k tehingut ja vormib ploki #85 (f21). Samuti n\u00e4eme, et 10 sekundi jooksul lisatakse puule veel 350k tehingut<br \/>\n01:53 \u2014 loodud 1 miljon tehingut ja saadeti submitt node #1<br \/>\n01:50 \u2014 submitt node #3 v\u00f5ttis poolist 330k tehingut ja vormib ploki #85 (f21). Samuti n\u00e4eme, et 10 sekundi jooksul lisatakse puule veel 350k tehingut<br \/>\n02:01 \u2014 submitt node #1 v\u00f5ttis poolist 250k tehingut ja vormib ploki #85 (65e)<br \/>\n02:06 \u2014 plokk #85 (f21) on allkirjastatud ja saadetud teistele nodedele valideerimiseks<br \/>\n02:08 \u2014 serveri #3 demo skript on l\u00f5petanud t\u00f6\u00f6, saates 1 miljon tehingut 30 sekundi jooksul<br \/>\n02:14 \u2014 plokk #85 (f21) on valideeritud ja saadetud juureketti <br \/>\n02:19 \u2014 plokk #85 (65e) allkirjastatud ja saadetakse teistele s\u00f5lmedele valideerimiseks<br \/>\n02:22 \u2014 loodud 1 miljon tehingut ja alustatud saatmine esitamisse s\u00f5lmele #2<br \/>\n02:27 \u2014 plokk #85 (65e) on valideeritud ja saadetud juureketti <br \/>\n02:29 \u2014 esituss\u00f5lm #2 v\u00f5ttis 111855 tehingut basseinist ja vormib plokki #85 (256).<br \/>\n02:36 \u2014 plokk #85 (256) allkirjastatud ja saadetakse teistele s\u00f5lmedele valideerimiseks<br \/>\n02:36 \u2014 serveri #1 demo-skripti t\u00f6\u00f6 l\u00f5ppes, mis saatis 1 miljon tehingut 42,5 sekundi jooksul<br \/>\n02:38 \u2014 plokk #85 (256) on valideeritud ja saadetud juureketti<br \/>\n03:08 \u2014 serveri #2 skripti t\u00f6\u00f6 l\u00f5ppes, mis saatis 1 miljon tehingut 47 sekundi jooksul <br \/>\n03:38 \u2014 k\u00f5ik s\u00f5lmed said juureketist teabe, et plokid #85 (f21), #86 (65e), #87 (256) on lisatud ja hakkavad rakendama 330k, 250k, 111855 tehingut<br \/>\n03:49 \u2014 bassein puhastati 330k, 250k, 111855 tehingust, mis lisati plokkidesse #85 (f21), #86 (65e), #87 (256)<br \/>\n03:59 \u2014 esituss\u00f5lm #1 v\u00f5ttis basseinist 888145 tehingut ja vormib plokki #88 (214), esituss\u00f5lm #2 v\u00f5ttis basseinist 750k tehingut ja vormib plokki #88 (50a), esituss\u00f5lm #3 v\u00f5ttis basseinist 670k tehingut ja vormib plokki #88 (d3b)<br \/>\n04:44 \u2014 plokk #88 (d3b) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n04:58 \u2014 plokk #88 (214) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n05:11 \u2014 plokk #88 (50a) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n05:11 \u2014 plokk #85 (d3b) on valideeritud ja saadetud juureahelasse <br \/>\n05:36 \u2014 plokk #85 (214) on valideeritud ja saadetud juureahelasse <br \/>\n05:43 \u2014 k\u00f5ik s\u00f5lmed said juureahelast teavet, et plokid #88 (d3b), #89 (214) on lisatud ja hakkavad rakendama 670k, 750k tehinguid<br \/>\n06:50 \u2014 \u00fchenduse katkestamise t\u00f5ttu ei ole plokk #85 (50a) saanud valideeritud<br \/>\n06:55 \u2014 s\u00f5lm #2 v\u00f5ttis punasest 888145 tehingut ja loob ploki #90 (50a)<br \/>\n08:14 \u2014 plokk #90 (50a) on allkirjastatud ja saadetud teistele s\u00f5lmedele valideerimiseks<br \/>\n09:04 \u2014 plokk #90 (50a) on valideeritud ja saadetud juureahelasse <br \/>\n11:23 \u2014 k\u00f5ik s\u00f5lmed said juureahelast teavet, et plokk #90 (50a) on lisatud ning hakkavad rakendama 888145 tehingut. Samal ajal oli server #3 juba ammu rakendanud tehingud plokkidest #88 (d3b), #89 (214)<br \/>\n12:11 \u2014 k\u00f5ik basseinid on t\u00fchjad<br \/>\n13:41 \u2014 k\u00f5ik serveri #3 s\u00f5lmed sisaldavad 3 miljonit tehingut ja tokenit<br \/>\n14:35 \u2014 k\u00f5ik serveri #1 s\u00f5lmed sisaldavad 3 miljonit tehingut ja tokenit<br \/>\n19:24 \u2014 k\u00f5ik serveri #2 s\u00f5lmed sisaldavad 3 miljonit tehingut ja tokenit <\/p>\n<h2>T\u00f5kked<\/h2>\n<p>\nPlasma Cash'i arendamise k\u00e4igus kohtasime j\u00e4rgmisi probleeme, mida lahendasime j\u00e4rk-j\u00e4rgult:<\/p>\n<p><b>1.<\/b> S\u00fcsteemi erinevate funktsioonide omavaheline konflikt. N\u00e4iteks blokeeris tehingute lisamise funktsioon submittimise ja plokkide valideerimise toimimise ning vastupidi, mis viis kiiruslanguseni.<\/p>\n<p><b>2. <\/b>Ei olnud kohe selge, kuidas saata tohutult tehinguid ja samal ajal andmeedastuskulusid minimeerida.<\/p>\n<p><b>3. <\/b>Ei olnud selge, kuidas ja kus andmeid salvestada, et saavutada k\u00f5rgeid tulemusi.<\/p>\n<p><b>4. <\/b>Ei olnud selge, kuidas korraldada suhtlust s\u00f5lmede vahel, sest miljoni tehingu kogumahu plokk v\u00f5tab umbes 100 MB.<\/p>\n<p><b>5.<\/b> \u00dche toimes\u00fcsteemi t\u00f6\u00f6 katkestab s\u00f5lmede vaheline \u00fchendus, kui toimuvad pikad arvutused (nt Merkle puu ehitamine ja selle r\u00e4simise arvutamine).<\/p>\n<h2>Kuidas me k\u00f5igega hakkama saime?<\/h2>\n<p>\nPlasma Cash node'i esimene versioon oli kombinatsioon, mis suutis k\u00f5ike korraga teha: vastu v\u00f5tta tehinguid, esitama ja valideerima plokke ning pakkuma API-d andmetele juurdep\u00e4\u00e4suks. Kuna NodeJS on algselt \u00fchetahuline, siis keeruline Merkle puu arvutus takistas tehingu lisamise funktsiooni. Me n\u00e4gime kahte v\u00f5imalust selle probleemi lahendamiseks:<\/p>\n<p><b>1. <\/b>K\u00e4ivitada mitu NodeJS protsessi, millest iga\u00fcks t\u00e4idab kindlaid funktsioone.<\/p>\n<p><b>2. <\/b>Kasutada worker_threads ja viia osa koodist silmustesse.<\/p>\n<p>Kokkuv\u00f5ttes kasutasime m\u00f5lemat varianti \u00fcheaegselt: loogiliselt jagasime \u00fche nodi kolme osaks, mis saavad t\u00f6\u00f6tada iseseisvalt, kuid samas ka s\u00fcnkroonselt.<\/p>\n<p><b>1.<\/b> Esitamisnod, mis v\u00f5tab tehingud j\u00e4rjekorda ja loob plokke.<\/p>\n<p><b>2.<\/b> Valideerimisnode, mis kontrollib nodide kehtivust.<\/p>\n<p><b>3. <\/b>API node \u2014 pakub API-d andmetele juurdep\u00e4\u00e4suks.<\/p>\n<p>Iga nodiga saab \u00fchenduda unix socketi kaudu cli kaudu.<\/p>\n<p>Raskete operatsioonide, nagu Merkle puu arvutamine, viime eraldi silmusesse.<\/p>\n<p>Nii saavutasime, et k\u00f5ik Plasma Cash funktsioonid t\u00f6\u00f6tavad korraga ja probleemideta.<\/p>\n<p>Kui s\u00fcsteem oli funktsionaalselt t\u00f6\u00f6korras, alustasime kiiruseteste ja kahjuks saime rahuldavad tulemused: 5000 tehingut sekundis ja kuni 50 000 tehingut plokis. Pidi v\u00e4lja selgitama, mis oli valesti teostatud.<\/p>\n<p>Alguses hakkasime katsetama suhtlemismehhanismi Plasma Cashiga, et teada saada s\u00fcsteemi tippv\u00f5imekust. Oleme varem kirjutanud, et Plasma Cash'i s\u00f5lm pakub unix socketi liidese. Esialgu oli see tekstiline, json objektid edastati, kasutades `JSON.parse()` ja `JSON.stringify()`. <\/p>\n<pre><code class=\"plaintext\">```json\n{\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```\n<\/code><\/pre>\n<p>\nMe m\u00f5\u00f5tsime selliste objektide edastamise kiirus ja saime ~ 130k sekundis. Proovisime asendada standardseid json-funktsioone, aga j\u00f5udlus ei paranenud. Tundub, et V8 mootor on nende operatsioonide jaoks h\u00e4sti optimeeritud.<\/p>\n<p>Meie s\u00fcsteemis toimusid tehingute, tokenite ja plokkide t\u00f6\u00f6tlemine klasside kaudu. Selliste klasside loomisel v\u00e4henes j\u00f5udlus kahekordselt, mis t\u00f5endab, et OOP ei sobi meile. Pidi kogu asja \u00fcmber kirjutama puhta funktsionaalse l\u00e4henemisega.<\/p>\n<h2>Salvestamine andmebaasi<\/h2>\n<p>\nAlguses valisime andmete salvestamiseks Redis, kuna see on \u00fcks k\u00f5ige efektiivsemaid lahendusi, mis vastab meie n\u00f5uetele: key-value salvestus, t\u00f6\u00f6tamine hash-tabelitega, kogud. K\u00e4ivitasime redis-benchmarki ja saime ~80k operatsiooni sekundis 1 pipelining re\u017eiimis.<\/p>\n<p>K\u00f5rge t\u00e4psuse saavutamiseks s\u00e4ttisime Redisit veel t\u00e4iendavalt: <\/p>\n<ul>\n<li>Seadsime unix socket'i \u00fchenduse.<\/li>\n<li>Keelasime oleku salvestamise kettale (usaldusv\u00e4\u00e4rsuse tagamiseks saab seadistada replika ja salvestada kettale eraldi Redis's).<\/li>\n<\/ul>\n<p>\nRedis'is on bassein - see on hash-tabel, kuna meil on vaja v\u00f5imalust saada k\u00f5ik tehingud \u00fche p\u00e4ringuga ja eemaldada tehingud \u00fckshaaval. Proovisime kasutada tavalist loendit, kuid see t\u00f6\u00f6tab tervete loendite v\u00e4ljav\u00f5tmisel aeglasemalt. <\/p>\n<p>Standardse NodeJS Redis'i teegi kasutamisel saime j\u00f5udluse 18k tehingut sekundis. Kiirus langes 9 korda. <\/p>\n<p>Kuna benchmark n\u00e4itas meile selgelt viielist suuremat v\u00f5imekust, alustasime optimeerimisega. Vahetasime raamatukogu ioredise vastu ja saime tootlikkuse 25 000 sekundis. Transaktsioone lisasime \u00fckshaaval, kasutades k\u00e4sku `hset`. Nii genereerisime palju p\u00e4ringuid Redisese. Tekkis idee \u00fchendada transaktsioonid paketiks ja saata need \u00fches k\u00e4sus `hmset`. Tulemuseks oli 32 000 sekundis. <\/p>\n<p>Mitme p\u00f5hjuse t\u00f5ttu, mida allpool arutame, t\u00f6\u00f6tame andmetega, kasutades `Buffer`, ja selgus, et kui see enne salvestamist tekstiks t\u00f5lkida (`buffer.toString('hex')`), saab saavutada t\u00e4iendavat j\u00f5udlust. Nii \u00f5nnestus kiirus t\u00f5sta 35 000-ni sekundis. Praegu otsustasime edasise optimeerimise peatada.<\/p>\n<p>Pidime minema \u00fcle binaarprotokollile, kuna:<\/p>\n<p><b>1. <\/b>S\u00fcsteem arvutab sageli r\u00e4sim\u00e4rke, allkirju jne, ja selleks on tal vaja andmeid `Buffer`is.<\/p>\n<p><b>2.<\/b> Teenuste vahel edastamisel on binaarsed andmed kergemad kui tekst. N\u00e4iteks, kui saata plokk 1 miljoni transaktsiooniga, v\u00f5ivad tekstina andmed h\u00f5ivata rohkem kui 300 megabaiti.<\/p>\n<p><b>3.<\/b> Pidev andmete konverteerimine m\u00f5jutab tootlikkust.<\/p>\n<p>Seet\u00f5ttu p\u00f5hinesime oma andmete salvestamise ja edastamise protokolli loomisel suurep\u00e4rasel `binary-data` teegil.<\/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`-iks, et salvestada neid Redis-sse v\u00f5i edastada teisele noodile ning andmeid tagasi hankida.<\/p>\n<p>Kasutame ka kahte binaarset protokolli andmete edastamiseks teenuste vahel:<\/p>\n<p><i> \u2014 Protokoll Plasma Node'iga suhtlemiseks unix socketi kaudu<\/i><\/p>\n<pre><code class=\"plaintext\">  {\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<\/code><\/pre>\n<p>\n kus:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 tegevus, mida on vaja teha, n\u00e4iteks 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 andmed, mida on vaja vastavasse funktsiooni edastada;<\/li>\n<li> <b>`messageId`<\/b> \u2014 s\u00f5numi ID, et saaks tuvastada vastuse. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protokoll, mille kaudu s\u00f5lmed omavahel suhtlevad<\/i><\/p>\n<pre><code class=\"plaintext\">  {\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<\/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 erineva versiooni s\u00f5lmed ja need v\u00f5ivad toimida erinevalt;<\/li>\n<li> <b>`seq`<\/b> \u2014 s\u00f5numi identifikaator;<\/li>\n<li> <b>`countChunk`<\/b> ja <b>`chunkNumber`<\/b> vajalikud suurte s\u00f5numite jagamiseks;<\/li>\n<li> <b>`length`<\/b> ja <b>`payload`<\/b> pikkus ja andmed.<\/li>\n<\/ul>\n<p>\nKuna me t\u00fc\u00fcbisime andmed eelnevalt, t\u00f6\u00f6tab l\u00f5pp-s\u00fcsteem palju kiiremini kui Ethereumist p\u00e4rinev `rlp` teek. Kahjuks ei ole me veel suutnud sellest loobuda, kuna on vajalik t\u00e4iustada nutilepingut, mida me plaanime tulevikus teha.<\/p>\n<p>Kui suudame saavutada kiirus <b>35 000<\/b> tehingute sekundis, peame neid ka t\u00f6\u00f6tlema optimaalse aja jooksul. Kuna ploki loomise eeldatav aeg on 30 sekundit, peame plokki lisama <b>1 000 000<\/b> tehingut, mis t\u00e4hendab enam kui <b>100<\/b> mb andmete edastamist. <\/p>\n<p>Alguses kasutasime `ethereumjs-devp2p` teeki nodede omavaheliseks suhtlemiseks, kuid see ei suutnud nii palju andmeid t\u00f6\u00f6delda. Seet\u00f5ttu kasutasime `ws` teeki ja seadistasime binaarsete andmete edastamise websocketide kaudu. Loomulikult kohtasime ka probleeme suurte andmepakettide edastamisel, kuid jagasime need osadeks ning n\u00fc\u00fcd neid probleeme enam ei esine.<\/p>\n<p>Samuti n\u00f5uab Merkle puu loomine ja tehingute hashi arvutamine umbes <b>1 000 000<\/b> sekundit pidevat arvutamist. Selle aja jooksul katkeb \u00fchendus k\u00f5igi nodede k\u00fclge. Otsustasime selle arvutamise viia eraldi l\u00f5ime.<b> 10<\/b> sekundit pidea arvutust. Selle aja jooksul katkeb \u00fchendus k\u00f5igi nodidega. Otsustati viia see arvutus eraldi l\u00f5ime.<\/p>\n<h2>J\u00e4reldused:<\/h2>\n<p>\nTegelikult pole meie j\u00e4reldused uudsed, aga mingil p\u00f5hjusel unustavad paljud spetsialistid neid arendamisel. <\/p>\n<ul>\n<li>Funktsionaalse programmeerimise kasutamine objekti-orienteeritud programmeerimise asemel suurendab t\u00f6\u00f6tlust\u00f5husust.<\/li>\n<li>Monoliit on halvem kui teenusaarhitektuur tootlikule NodeJS s\u00fcsteemile.<\/li>\n<li>T\u00f6\u00f6tajate l\u00f5ime (`worker_threads`) kasutamine raskete arvutuste jaoks parandab s\u00fcsteemi vastupidavust, eriti i\/o operatsioonide k\u00e4itamisel.<\/li>\n<li>Unix socket on stabiilsem ja kiirem kui http p\u00e4ringud.<\/li>\n<li>Kui peate kiiresti edastama suuri andmeid \u00fcle v\u00f5rgu, on parem kasutada websocket'e ja saata binaarseid andmeid, jagatuna t\u00fckkideks, mida saab vajadusel edastada ja hiljem \u00fchte s\u00f5numisse taastada.<\/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 kirjutati 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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 tagamiseks Ethereumi | ProHoster","description":"Blokechain on innovaatiline tehnoloogia, mis lubab parandada paljusid inimelu valdkondi. See toob reaalsed protsessid ja tooted digitaalsesse ruumi, tagab finantstehingute kiirus ja usaldusv\u00e4\u00e4rsus, v\u00e4hendab nende hindu ning v\u00f5imaldab luua kaasaegseid DAPP rakendusi, kasutades intelligentseid lepinguid detsentraliseeritud v\u00f5rkudes. V\u00f5ttes arvesse blokechaini mitmeid eeliseid ja kasutusv\u00f5imalusi, v\u00f5ib tunduda kummaline, et see","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. \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","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"},"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}]}}