{"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\/ro\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Test public: solu\u021bia pentru confiden\u021bialitate \u0219i scalabilitate \u00een Ethereum","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> \u2014 o tehnologie inovatoare care promite s\u0103 \u00eembun\u0103t\u0103\u021beasc\u0103 multe domenii ale vie\u021bii umane. Aceasta transfer\u0103 procesele \u0219i produsele reale \u00een spa\u021biul digital, asigur\u00e2nd rapiditate \u0219i fiabilitate \u00een opera\u021biunile financiare, reduc\u00e2nd costurile acestora \u0219i permi\u021b\u00e2nd totodat\u0103 crearea de aplica\u021bii DAPP moderne utiliz\u00e2nd contracte inteligente \u00een re\u021bele descentralizate.<\/p>\n<p>Av\u00e2nd \u00een vedere numeroasele avantaje \u0219i diversele domenii de aplicare ale blockchain-ului, poate p\u0103rea ciudat c\u0103 aceast\u0103 tehnologie promi\u021b\u0103toare nu a p\u0103truns \u00een toate industriile. Problema este c\u0103 blockchain-urile descentralizate moderne \u00eei lipsesc scalabilitatea. Ethereum proceseaz\u0103 aproximativ 20 de tranzac\u021bii pe secund\u0103, ceea ce nu este suficient pentru a satisface cerin\u021bele unui business dinamic \u0219i modern. \u00cen acela\u0219i timp, companiile care utilizeaz\u0103 tehnologia blockchain nu se hot\u0103r\u0103sc s\u0103 renun\u021be la Ethereum din cauza protec\u021biei ridicate \u00eempotriva hacking-ului \u0219i a defectelor de re\u021bea.<\/p>\n<p>Pentru a asigura descentralizarea, securitatea \u0219i scalabilitatea \u00een blockchain, abord\u00e2nd astfel Trilema Scalabilit\u0103\u021bii, echipa de dezvoltatori <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> a creat Plasma Cash \u2014 un lan\u021b secundar format dintr-un contract inteligent \u0219i o re\u021bea privat\u0103 bazat\u0103 pe Node.js, care \u00ee\u0219i transmite periodic starea c\u0103tre lan\u021bul principal (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Test public: solu\u021bia pentru confiden\u021bialitate \u0219i scalabilitate \u00een 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>Procesele cheie \u00een Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>Utilizatorul apeleaz\u0103 func\u021bia contractului inteligent `deposit`, transmi\u021b\u00e2nd suma \u00een ETH pe care dore\u0219te s\u0103 o depun\u0103 \u00een tokenul Plasma Cash. Func\u021bia contractului inteligent creeaz\u0103 tokenul \u0219i genereaz\u0103 un eveniment despre aceasta.<\/p>\n<p><b>2. <\/b>Nodurile Plasma Cash, abona\u021bi la evenimentele contractului inteligent, primesc evenimentul de creare a depozitului \u0219i adaug\u0103 \u00een pool tranzac\u021bia de creare a tokenului.<\/p>\n<p><b>3. <\/b>Periodic, nodurile speciale Plasma Cash preiau toate tranzac\u021biile din pool (p\u00e2n\u0103 la 1 milion) \u0219i formeaz\u0103 un bloc din acestea, calcul\u00e2nd arborele Merkle \u0219i, prin urmare, hash-ul. Acest bloc este trimis altor noduri pentru verificare. Nodurile verific\u0103 dac\u0103 hash-ul Merkle este valid, dac\u0103 tranzac\u021biile sunt valide (de exemplu, dac\u0103 expeditorul tokenului este proprietarul acestuia). Dup\u0103 verificarea blocului, nodul apeleaz\u0103 func\u021bia `submitBlock` a contractului inteligent, care salveaz\u0103 \u00een lan\u021bul principal num\u0103rul \u0219i hash-ul Merkle al blocului. Contractul inteligent genereaz\u0103 un eveniment de ad\u0103ugare reu\u0219it\u0103 a blocului. Tranzac\u021biile sunt eliminate din pool. <\/p>\n<p><b>4. <\/b>Nodurile care primesc evenimentul de submit al blocului \u00eencep s\u0103 aplice tranzac\u021biile care au fost ad\u0103ugate \u00een bloc.<\/p>\n<p><b>5. <\/b>La un moment dat, de\u021bin\u0103torul (sau non-de\u021bin\u0103torul) token-ului dore\u0219te s\u0103-l retrag\u0103 din Plasma Cash. Pentru aceasta, el apeleaz\u0103 func\u021bia `startExit`, trimi\u021b\u00e2nd informa\u021biile despre ultimele 2 tranzac\u021bii pentru token, care confirm\u0103 c\u0103 el este, de fapt, de\u021bin\u0103torul token-ului. Contractul inteligent, folosind hash-ul Merkle, verific\u0103 existen\u021ba tranzac\u021biilor \u00een blocuri \u0219i trimite token-ul pentru retragere, care va avea loc \u00een dou\u0103 s\u0103pt\u0103m\u00e2ni.<\/p>\n<p><b>6. <\/b>Dac\u0103 opera\u021biunea de retragere a token-ului a avut loc cu \u00eenc\u0103lc\u0103ri (token-ul a fost cheltuit dup\u0103 \u00eenceperea procedurii de retragere sau token-ul era deja str\u0103in \u00eenainte de retragere), de\u021bin\u0103torul token-ului poate contesta retragerea \u00een termen de dou\u0103 s\u0103pt\u0103m\u00e2ni.<\/p>\n<p><img decoding=\"async\" alt=\"Test public: solu\u021bia pentru confiden\u021bialitate \u0219i scalabilitate \u00een Ethereum\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Confiden\u021bialitatea este atins\u0103 prin dou\u0103 metode<\/h2>\n<p>\n<b>1. <\/b>Lan\u021bul principal nu \u0219tie nimic despre tranzac\u021biile care sunt formate \u0219i trimise \u00een interiorul lan\u021bului adjunc. Informa\u021biile despre cine a introdus \u0219i a retras ETH \u00een\/sau din Plasma Cash r\u0103m\u00e2n publice.<\/p>\n<p><b>2. <\/b>Lan\u021bul adjunc permite organizarea tranzac\u021biilor anonime, utiliz\u00e2nd zk-SNARKs.<\/p>\n<h2>Stiva tehnologic\u0103<\/h2>\n<p><\/p>\n<ul>\n<li>NodeJS<\/li>\n<li>Redis<\/li>\n<li>Ethereum<\/li>\n<li>Solidity<\/li>\n<\/ul>\n<p><\/p>\n<h2>Testare <\/h2>\n<p>\n\u00cen dezvoltarea Plasma Cash, am testat viteza de func\u021bionare a sistemului \u0219i am ob\u021binut urm\u0103toarele rezultate:<\/p>\n<ul>\n<li>p\u00e2n\u0103 la 35,000 de tranzac\u021bii pe secund\u0103 sunt ad\u0103ugate \u00een pool;<\/li>\n<li>p\u00e2n\u0103 la 1,000,000 de tranzac\u021bii pot fi stocate \u00eentr-un bloc.<\/li>\n<\/ul>\n<p>\nTestele au fost efectuate pe urm\u0103toarele 3 servere:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD \u2014 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n Au fost ridicate 3 noduri de validare Plasma Cash.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \u201eSummit Ridge\u201d (Zen), SATA SSD \u2014 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n A fost ridicat un nod ETH pe testnet Ropsten.<br \/>\n Au fost ridicate 3 noduri de validare Plasma Cash.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core incl. NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n A fost ridicat 1 nod de submit al Plasma Cash.<br \/>\n Au fost ridicate 3 noduri de validare Plasma Cash.<br \/>\n A fost rulat un test pentru ad\u0103ugarea tranzac\u021biilor \u00een re\u021beaua Plasma Cash.<\/p>\n<p><b>\u00cen total: <\/b>10 noduri Plasma Cash \u00eentr-o re\u021bea privat\u0103.<\/p>\n<h3>Test 1<\/h3>\n<p>\nExist\u0103 o limit\u0103 de 1 milion de tranzac\u021bii \u00eentr-un bloc. Prin urmare, 1 milion de tranzac\u021bii ajung \u00een 2 blocuri (deoarece sistemul reu\u0219e\u0219te s\u0103 prind\u0103 o parte din tranzac\u021bii \u0219i s\u0103 le submit\u0103 \u00een timp ce sunt trimise).<\/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=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nStarea ini\u021bial\u0103: ultimul bloc #7; \u00een baza de date sunt p\u0103strate 1 milion de tranzac\u021bii \u0219i token-uri.<\/p>\n<p>00:00 \u2014 \u00eenceperea scriptului de generare a tranzac\u021biilor<br \/>\n01:37 \u2014 au fost create 1 milion de tranzac\u021bii \u0219i a \u00eenceput trimiterea c\u0103tre nod<br \/>\n01:46 \u2014 nodul de submit a preluat 240k tranzac\u021bii din pool \u0219i formeaz\u0103 blocul #8. De asemenea, observ\u0103m c\u0103 \u00een pool sunt ad\u0103ugate 320k tranzac\u021bii \u00een 10 secunde<br \/>\n01:58 \u2014 blocul #8 a fost semnat \u0219i trimis pentru validare<br \/>\n02:03 \u2014 blocul #8 a fost validat \u0219i a fost apelat\u0103 func\u021bia `submitBlock` a contractului inteligent cu hash-ul Merkle \u0219i num\u0103rul blocului<br \/>\n02:10 \u2014 s-a \u00eencheiat executarea scriptului demo, care a trimis 1 milion de tranzac\u021bii \u00een 32 de secunde<br \/>\n02:33 \u2014 nodurile au \u00eenceput s\u0103 primeasc\u0103 informa\u021bii c\u0103 blocul #8 a fost ad\u0103ugat \u00een lan\u021bul r\u0103d\u0103cin\u0103 \u0219i au \u00eenceput s\u0103 execute 240k tranzac\u021bii<br \/>\n02:40 \u2014 din pool a fost eliminat 240k tranzac\u021bii, care sunt deja \u00een blocul #8<br \/>\n02:56 \u2014 nodul de submit a luat din pool restul de 760k tranzac\u021bii \u0219i a \u00eenceput s\u0103 calculeze hash-ul Merkle \u0219i s\u0103 semneze blocul #9<br \/>\n03:20 \u2014 toate nodurile con\u021bin 1 milion 240k tranzac\u021bii \u0219i token-uri<br \/>\n03:35 \u2014 blocul #9 a fost semnat \u0219i trimis pentru validare altor noduri <br \/>\n03:41 \u2014 a ap\u0103rut o eroare de re\u021bea<br \/>\n04:40 \u2014 a expirat timpul de a\u0219teptare pentru validarea blocului #9<br \/>\n04:54 \u2014 nodul de submit a luat din pool restul de 760k tranzac\u021bii \u0219i a \u00eenceput s\u0103 calculeze hash-ul Merkle \u0219i s\u0103 semneze blocul #9<br \/>\n05:32 \u2014 blocul #9 a fost semnat \u0219i trimis pentru validare altor noduri<br \/>\n05:53 \u2014 blocul #9 a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103<br \/>\n06:17 \u2014 nodurile au \u00eenceput s\u0103 primeasc\u0103 informa\u021bii c\u0103 blocul #9 a fost ad\u0103ugat \u00een lan\u021bul r\u0103d\u0103cin\u0103 \u0219i au \u00eenceput s\u0103 execute 760k tranzac\u021bii<br \/>\n06:47 \u2014 pool-ul s-a cur\u0103\u021bat de tranzac\u021biile care se afl\u0103 \u00een blocul #9<br \/>\n09:06 \u2014 toate nodurile con\u021bin 2 milioane de tranzac\u021bii \u0219i token-uri<\/p>\n<h3>Test 2<\/h3>\n<p>\nExist\u0103 o limit\u0103 de 350k pe bloc. Ca rezultat, avem 3 blocuri.<\/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=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nStarea ini\u021bial\u0103: ultimul bloc #9; \u00een baza de date sunt salvate 2 milioane de tranzac\u021bii \u0219i token-uri<\/p>\n<p>00:00 \u2014 script-ul de generare a tranzac\u021biilor este deja pornit<br \/>\n00:44 \u2014 au fost create 1 milion de tranzac\u021bii \u0219i a \u00eenceput trimiterea \u00een nod<br \/>\n00:56 \u2014 nodul de submit a luat din pool 320k tranzac\u021bii \u0219i formeaz\u0103 blocul #10. De asemenea, observ\u0103m c\u0103 \u00een pool se adaug\u0103 320k tranzac\u021bii \u00een 10 secunde<br \/>\n01:12 \u2014 blocul #10 a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n01:18 \u2014 s-a \u00eencheiat executarea scriptului demo, care a trimis 1 milion de tranzac\u021bii \u00een 34 de secunde<br \/>\n01:20 \u2014 blocul #10 a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103 <br \/>\n01:51 \u2014 toate nodurile au primit din lan\u021bul r\u0103d\u0103cin\u0103 informa\u021bii c\u0103 blocul #10 a fost ad\u0103ugat \u0219i \u00eencep s\u0103 aplice 320k tranzac\u021bii<br \/>\n02:01 \u2014 pool-ul s-a cur\u0103\u021bat de 320k tranzac\u021bii, care au fost ad\u0103ugate \u00een blocul #10<br \/>\n02:15 \u2014 nodul de submit a luat din pool 350k tranzac\u021bii \u0219i formeaz\u0103 blocul #11<br \/>\n02:34 \u2014 blocul #11 a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n02:51 \u2014 blocul #11 a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103 <br \/>\n02:55 \u2014 ultimul nod a executat tranzac\u021biile din blocul #10<br \/>\n10:59 \u2014 a avut loc o \u00eent\u00e2rziere semnificativ\u0103 \u00een executarea tranzac\u021biei cu trimiterea blocului #9, dar aceasta a fost realizat\u0103 \u0219i toate nodurile au primit informa\u021bii despre aceasta \u0219i au \u00eenceput s\u0103 execute 350k tranzac\u021bii<br \/>\n11:05 \u2014 pool-ul s-a cur\u0103\u021bat de 320k tranzac\u021bii, care au fost ad\u0103ugate \u00een blocul #11<br \/>\n12:10 \u2014 toate nodurile con\u021bin 1 milion 670k tranzac\u021bii \u0219i tokenuri<br \/>\n12:17 \u2014 nodul de trimitere a preluat din pool 330k tranzac\u021bii \u0219i formeaz\u0103 blocul #12<br \/>\n12:32 \u2014 blocul #12 a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n12:39 \u2014 blocul #12 a fost validat \u0219i trimis \u00een lan\u021bul principal <br \/>\n13:44 \u2014 toate nodurile au primit informa\u021bia din lan\u021bul principal c\u0103 blocul #12 a fost ad\u0103ugat \u0219i \u00eencep s\u0103 aplice 330k tranzac\u021bii<br \/>\n14:50 \u2014 toate nodurile con\u021bin 2 milioane tranzac\u021bii \u0219i tokenuri<\/p>\n<h3>Test 3<\/h3>\n<p>\nPe primele dou\u0103 servere, un nod de validare a fost \u00eenlocuit cu un nod de trimitere. <\/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=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nStarea ini\u021bial\u0103: ultimul bloc #84; \u00een baz\u0103 sunt salvate 0 tranzac\u021bii \u0219i tokenuri<\/p>\n<p>00:00 \u2014 Au fost lansate 3 scripturi care genereaz\u0103 \u0219i trimit c\u00e2te 1 milion de tranzac\u021bii<br \/>\n01:38 \u2014 au fost create 1 milion de tranzac\u021bii \u0219i a \u00eenceput trimiterea c\u0103tre nodul de trimitere #3<br \/>\n01:50 \u2014 nodul de trimitere #3 a preluat din pool 330k tranzac\u021bii \u0219i formeaz\u0103 blocul #85 (f21). De asemenea, vedem c\u0103 \u00een pool se adaug\u0103 350k tranzac\u021bii \u00een 10 secunde<br \/>\n01:53 \u2014 au fost create 1 milion de tranzac\u021bii \u0219i a \u00eenceput trimiterea c\u0103tre nodul de trimitere #1<br \/>\n01:50 \u2014 nodul de trimitere #3 a preluat din pool 330k tranzac\u021bii \u0219i formeaz\u0103 blocul #85 (f21). De asemenea, vedem c\u0103 \u00een pool se adaug\u0103 350k tranzac\u021bii \u00een 10 secunde<br \/>\n02:01 \u2014 nodul de trimitere #1 a preluat din pool 250k tranzac\u021bii \u0219i formeaz\u0103 blocul #85 (65e)<br \/>\n02:06 \u2014 blocul #85 (f21) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n02:08 \u2014 a terminat de func\u021bionat scriptul demo al serverului #3, care a trimis 1 milion de tranzac\u021bii \u00een 30 de secunde<br \/>\n02:14 \u2014 blocul #85 (f21) a fost validat \u0219i trimis \u00een lan\u021bul principal <br \/>\n02:19 \u2014 blocul #85 (65e) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n02:22 \u2014 au fost create 1 milion de tranzac\u021bii \u0219i a \u00eenceput trimiterea c\u0103tre nodul de trimitere #2<br \/>\n02:27 \u2014 blocul #85 (65e) a fost validat \u0219i trimis \u00een lan\u021bul principal <br \/>\n02:29 \u2014 nodul de trimitere #2 a preluat din pool 111855 tranzac\u021bii \u0219i formeaz\u0103 blocul #85 (256).<br \/>\n02:36 \u2014 blocul #85 (256) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n02:36 \u2014 a terminat de func\u021bionat scriptul demo al serverului #1, care a trimis 1 milion de tranzac\u021bii \u00een 42.5 secunde<br \/>\n02:38 \u2014 blocul #85 (256) a fost validat \u0219i trimis \u00een lan\u021bul principal<br \/>\n03:08 \u2014 a terminat de func\u021bionat scriptul demo al serverului #2, care a trimis 1 milion de tranzac\u021bii \u00een 47 secunde <br \/>\n03:38 \u2014 toate nodurile au primit informa\u021bia din lan\u021bul principal c\u0103 blocurile #85 (f21), #86(65e), #87(256) au fost ad\u0103ugate \u0219i \u00eencep s\u0103 aplice 330k, 250k, 111855 tranzac\u021bii<br \/>\n03:49 \u2014 pool-ul s-a cur\u0103\u021bat de 330k, 250k, 111855 tranzac\u021bii, care au fost ad\u0103ugate \u00een blocurile #85 (f21), #86(65e), #87(256)<br \/>\n03:59 \u2014 submit node #1 a preluat din pool 888145 tranzac\u021bii \u0219i formeaz\u0103 blocul #88 (214), submit node #2 a preluat din pool 750k tranzac\u021bii \u0219i formeaz\u0103 blocul #88 (50a), submit node #3 a preluat din pool 670k tranzac\u021bii \u0219i formeaz\u0103 blocul #88 (d3b)<br \/>\n04:44 \u2014 blocul #88 (d3b) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n04:58 \u2014 blocul #88 (214) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n05:11 \u2014 blocul #88 (50a) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n05:11 \u2014 blocul #85 (d3b) a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103 <br \/>\n05:36 \u2014 blocul #85 (214) a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103 <br \/>\n05:43 \u2014 toate nodurile au primit din lan\u021bul r\u0103d\u0103cin\u0103 informa\u021bia c\u0103 blocurile #88 (d3b), #89(214) au fost ad\u0103ugate \u0219i \u00eencep s\u0103 aplice 670k, 750k tranzac\u021bii<br \/>\n06:50 \u2014 din cauza pierderii conexiunii, blocul #85 (50a) nu a fost validat<br \/>\n06:55 \u2014 submit node #2 a preluat din pool 888145 tranzac\u021bii \u0219i formeaz\u0103 blocul #90 (50a)<br \/>\n08:14 \u2014 blocul #90 (50a) a fost semnat \u0219i trimis altor noduri pentru validare<br \/>\n09:04 \u2014 blocul #90 (50a) a fost validat \u0219i trimis \u00een lan\u021bul r\u0103d\u0103cin\u0103 <br \/>\n11:23 \u2014 toate nodurile au primit din lan\u021bul r\u0103d\u0103cin\u0103 informa\u021bia c\u0103 blocul #90 (50a) a fost ad\u0103ugat \u0219i \u00eencep s\u0103 aplice 888145 tranzac\u021bii. \u00centre timp, serverul #3 a aplicat deja tranzac\u021biile din blocurile #88 (d3b), #89(214)<br \/>\n12:11 \u2014 toate pool-urile sunt goale<br \/>\n13:41 \u2014 toate nodurile serverului #3 con\u021bin 3 milioane de tranzac\u021bii \u0219i token-uri<br \/>\n14:35 \u2014 toate nodurile serverului #1 con\u021bin 3 milioane de tranzac\u021bii \u0219i token-uri<br \/>\n19:24 \u2014 toate nodurile serverului #2 con\u021bin 3 milioane de tranzac\u021bii \u0219i token-uri <\/p>\n<h2>Obstacole<\/h2>\n<p>\n\u00cen timpul dezvolt\u0103rii Plasma Cash ne-am confruntat cu urm\u0103toarele probleme, pe care le-am rezolvat treptat:<\/p>\n<p><b>1.<\/b> Conflictul de interac\u021biune \u00eentre diferitele func\u021bii ale sistemului. De exemplu, func\u021bia de ad\u0103ugare a tranzac\u021biilor \u00een pool bloca activitatea de submit \u0219i validare a blocurilor, \u0219i invers, ceea ce a dus la sc\u0103derea vitezei.<\/p>\n<p><b>2. <\/b>Nu a fost clar cum s\u0103 trimitem un num\u0103r at\u00e2t de mare de tranzac\u021bii \u0219i \u00een acela\u0219i timp s\u0103 minimiz\u0103m costurile de transfer de date.<\/p>\n<p><b>3. <\/b>Nu a fost clar cum \u0219i unde s\u0103 stoc\u0103m datele pentru a ob\u021bine rezultate de \u00eenalt\u0103 performan\u021b\u0103.<\/p>\n<p><b>4. <\/b>Nu a fost clar cum s\u0103 organiz\u0103m re\u021beaua \u00eentre noduri, deoarece dimensiunea blocului cu 1 milion de tranzac\u021bii ocup\u0103 aproximativ 100 MB.<\/p>\n<p><b>5.<\/b> Func\u021bionarea \u00een modul pe un singur fir de execu\u021bie rupe conexiunea \u00eentre noduri c\u00e2nd au loc calcule lungi (de exemplu, construirea arborelui Merkle \u0219i calcularea hash-ului s\u0103u).<\/p>\n<h2>Cum am reu\u0219it s\u0103 facem fa\u021b\u0103 tuturor acestea?<\/h2>\n<p>\nPrima versiune a nodului Plasma Cash a reprezentat un fel de combinat care putea face totul simultan: primea tranzac\u021bii, trimitea \u0219i valida blocuri, oferea un API pentru accesul la date. Deoarece NodeJS este ini\u021bial un sistem pe un singur fir, func\u021bia grea de calcul a arborelui Merkle bloca func\u021bia de ad\u0103ugare a tranzac\u021biei. Am constatat dou\u0103 variante de solu\u021bionare a acestei probleme:<\/p>\n<p><b>1. <\/b>S\u0103 lans\u0103m mai multe procese NodeJS, fiecare execut\u00e2nd func\u021bii specifice.<\/p>\n<p><b>2. <\/b>S\u0103 folosim worker_threads \u0219i s\u0103 mut\u0103m execu\u021bia unei p\u0103r\u021bi din cod \u00een fire.<\/p>\n<p>\u00cen final, am utilizat ambele variante simultan: am \u00eemp\u0103r\u021bit logic un nod \u00een 3 p\u0103r\u021bi care pot func\u021biona separat, dar \u00een acela\u0219i timp sincronizat<\/p>\n<p><b>1.<\/b> Nodul de predare care prime\u0219te tranzac\u021bii \u00een pool \u0219i se ocup\u0103 de crearea blocurilor.<\/p>\n<p><b>2.<\/b> Nodul de validare care verific\u0103 validitatea nodurilor.<\/p>\n<p><b>3. <\/b>Nodul API - ofer\u0103 API pentru accesul la date.<\/p>\n<p>Fiecare nod poate fi conectat prin socket unix prin intermediul cli.<\/p>\n<p>Opera\u021biile grele, cum ar fi calculul arborelui Merkle, le-am externalizat \u00eentr-un fir separat.<\/p>\n<p>Astfel, am reu\u0219it s\u0103 asigur\u0103m func\u021bionarea normal\u0103 a tuturor func\u021biilor Plasma Cash simultan \u0219i f\u0103r\u0103 \u00eentreruperi.<\/p>\n<p>Odat\u0103 ce sistemul a \u00eenceput s\u0103 func\u021bioneze func\u021bional, am \u00eenceput s\u0103 test\u0103m viteza \u0219i, din p\u0103cate, am ob\u021binut rezultate nesatisf\u0103c\u0103toare: 5.000 de tranzac\u021bii pe secund\u0103 \u0219i p\u00e2n\u0103 la 50.000 de tranzac\u021bii \u00een bloc. A fost nevoie s\u0103 investig\u0103m ce a fost implementat gre\u0219it.<\/p>\n<p>La \u00eenceput, am \u00eenceput s\u0103 test\u0103m mecanismul de comunicare cu Plasma Cash pentru a descoperi capacitatea maxim\u0103 a sistemului. Anterior am men\u021bionat c\u0103 nodul Plasma Cash ofer\u0103 o interfa\u021b\u0103 de socket unix. Ini\u021bial, aceasta era text. Obiectele json erau trimise folosind `JSON.parse()` \u0219i `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>\nAm m\u0103surat viteza de transmitere a acestor obiecte \u0219i am ob\u021binut aproximativ 130k pe secund\u0103. Am \u00eencercat s\u0103 \u00eenlocuim func\u021biile standard pentru lucrul cu json, dar performan\u021ba nu a crescut. Probabil c\u0103 motorul V8 este bine optimizat pentru aceste opera\u021bii.<\/p>\n<p>Gestionarea tranzac\u021biilor, token-urilor \u0219i blocurilor s-a realizat prin intermediul claselor. La crearea acestor clase, performan\u021ba a sc\u0103zut de dou\u0103 ori, ceea ce indic\u0103 faptul c\u0103 OOP nu este potrivit pentru noi. A fost necesar s\u0103 rescriem totul folosind o abordare pur func\u021bional\u0103.<\/p>\n<h2>Scriere \u00een baza de date<\/h2>\n<p>\nIni\u021bial, pentru stocarea datelor, am ales Redis ca una dintre cele mai performante solu\u021bii care \u00eendepline\u0219te cerin\u021bele noastre: stocare key-value, lucru cu tabele hash, mul\u021bimi. Am rulat redis-benchmark \u0219i am ob\u021binut ~80k opera\u021bii pe secund\u0103 \u00een modul 1 pipelining.<\/p>\n<p>Pentru o performan\u021b\u0103 ridicat\u0103, am configurat Redis mai fin: <\/p>\n<ul>\n<li>Am configurat o conexiune prin socket unix.<\/li>\n<li>Am dezactivat salvarea st\u0103rii pe disc (pentru fiabilitate, putem configura o replic\u0103 \u0219i deja \u00een Redis separat s\u0103 facem salvarea pe disc).<\/li>\n<\/ul>\n<p>\n\u00cen Redis, un pool este o tabel\u0103 hash, deoarece avem nevoie de posibilitatea de a ob\u021bine toate tranzac\u021biile cu o singur\u0103 interogare \u0219i de a \u0219terge tranzac\u021biile pe r\u00e2nd. Am \u00eencercat s\u0103 folosim o list\u0103 obi\u0219nuit\u0103, dar aceasta func\u021bioneaz\u0103 mai lent la desc\u0103rcarea \u00eentregii liste. <\/p>\n<p>Folosind biblioteca standard NodeJS pentru Redis, am ob\u021binut o performan\u021b\u0103 de 18k tranzac\u021bii pe secund\u0103. Viteza a sc\u0103zut de 9 ori. <\/p>\n<p>Deoarece benchmark-ul ne ar\u0103ta c\u0103 performan\u021bele sunt evident de 5 ori mai mari, am \u00eenceput s\u0103 optimiz\u0103m. Am schimbat biblioteca \u00een ioredis \u0219i am ob\u021binut o performan\u021b\u0103 deja de 25k pe secund\u0103. Am ad\u0103ugat tranzac\u021biile pe r\u00e2nd, folosind comanda `hset`. Astfel, am generat multe interog\u0103ri \u00een Redis. A ap\u0103rut ideea de a grupa tranzac\u021biile \u00een pachete \u0219i de a le trimite cu o singur\u0103 comand\u0103 `hmset`. Rezultatul \u2014 32k pe secund\u0103. <\/p>\n<p>Din mai multe motive, pe care le vom descrie mai jos, lucr\u0103m cu datele folosind `Buffer` \u0219i, a\u0219a cum s-a dovedit, dac\u0103 \u00eel transform\u0103m \u00een text (`buffer.toString('hex')`) \u00eenainte de a-l scrie, putem ob\u021bine o performan\u021b\u0103 suplimentar\u0103. Astfel, am reu\u0219it s\u0103 cre\u0219tem viteza p\u00e2n\u0103 la 35k pe secund\u0103. \u00cen prezent, am decis s\u0103 suspend\u0103m optimizarea ulterioar\u0103.<\/p>\n<p>A trebuit s\u0103 trecem la protocolul binar deoarece:<\/p>\n<p><b>1. <\/b>Sistemul calculeaz\u0103 frecvent hash-uri, semn\u0103turi etc., iar pentru aceasta are nevoie de date \u00een `Buffer`.<\/p>\n<p><b>2.<\/b> La transmiterea \u00eentre servicii, datele binare ocup\u0103 mai pu\u021bin dec\u00e2t textul. De exemplu, la trimiterea unui bloc cu 1 milion de tranzac\u021bii, datele \u00een format text pot ocupa mai mult de 300 megabytes.<\/p>\n<p><b>3.<\/b> Conversia constant\u0103 a datelor afecteaz\u0103 performan\u021ba.<\/p>\n<p>Prin urmare, am folosit propriul nostru protocol binar de stocare \u0219i transmitere a datelor, dezvoltat pe baza excelentului biblioteci `binary-data`.<\/p>\n<p>Ca rezultat, am ob\u021binut urm\u0103toarele structuri de date:<\/p>\n<h3> \u2014 Transaction<\/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 Block<\/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>\nCu comenzile obi\u0219nuite `BD.encode(block, Protocol).slice();` \u0219i ` BD.decode(buffer, Protocol)` transform\u0103m datele \u00een `Buffer` pentru a fi salvate \u00een Redis sau trimise c\u0103tre un alt nod \u0219i extrase \u00eenapoi.<\/p>\n<p>Avem de asemenea 2 protocoale binare pentru transmiterea datelor \u00eentre servicii:<\/p>\n<p><i> \u2014 Protocol pentru interac\u021biunea cu Plasma Node prin socket unix<\/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 unde:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 ac\u021biunea care trebuie efectuat\u0103, de exemplu, 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 datele care trebuie transmise func\u021biei corespunz\u0103toare;<\/li>\n<li> <b>`messageId`<\/b> \u2014 id-ul mesajului, pentru a putea identifica r\u0103spunsul. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protocol de interac\u021biune \u00eentre noduri<\/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 unde:<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 codul mesajului, de exemplu 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 versiunea protocolului, deoarece \u00een re\u021bea pot exista noduri cu versiuni diferite care pot func\u021biona diferit;<\/li>\n<li> <b>`seq`<\/b> \u2014 identificatorul mesajului;<\/li>\n<li> <b>`countChunk`<\/b> \u0219i <b>`chunkNumber`<\/b> necesare pentru fragmentarea mesajelor mari;<\/li>\n<li> <b>`length`<\/b> \u0219i <b>`payload`<\/b> lungimea \u0219i datele propriu-zise.<\/li>\n<\/ul>\n<p>\nDeoarece am tipizat datele dinainte, sistemul final func\u021bioneaz\u0103 mult mai repede dec\u00e2t biblioteca `rlp` de la Ethereum. Din p\u0103cate, nu am reu\u0219it \u00eenc\u0103 s\u0103 renun\u021b\u0103m la ea, deoarece este necesar\u0103 \u00eembun\u0103t\u0103\u021birea contractului inteligent, ceea ce inten\u021bion\u0103m s\u0103 facem \u00een viitor.<\/p>\n<p>Dac\u0103 am reu\u0219it s\u0103 atingem viteza <b>35 000<\/b> transac\u021bii pe secund\u0103, trebuie de asemenea s\u0103 le proces\u0103m \u00eentr-un timp optim. Deoarece timpul de formare a unui bloc dureaz\u0103 aproximativ 30 de secunde, trebuie s\u0103 includem \u00een bloc <b>1 000 000<\/b> transac\u021bii, ceea ce \u00eenseamn\u0103 transferul a mai mult de <b>100<\/b> MB de date. <\/p>\n<p>Ini\u021bial am folosit biblioteca `ethereumjs-devp2p` pentru comunicarea \u00eentre noduri, dar nu f\u0103cea fa\u021b\u0103 unui volum at\u00e2t de mare de date. Ca urmare, am utilizat biblioteca `ws` \u0219i am configurat transferul de date binare prin websocket. Desigur, ne-am confruntat \u0219i cu probleme la transferul unor pachete mari de date, dar le-am \u00eemp\u0103r\u021bit \u00een buc\u0103\u021bi \u0219i acum aceste probleme nu mai exist\u0103.<\/p>\n<p>De asemenea, formarea arborelui Merkle \u0219i calculul hash-ului <b>1 000 000<\/b> transac\u021biilor necesit\u0103 \u00een jur de<b> 10<\/b> secunde de calcul continuu. \u00cen acest timp, conexiunea cu toate nodurile risc\u0103 s\u0103 se \u00eentrerup\u0103. S-a decis s\u0103 mut\u0103m acest calcul \u00eentr-un thread separat.<\/p>\n<h2>Concluzii:<\/h2>\n<p>\nDe fapt, concluziile noastre nu sunt noi, dar din vreun motiv mul\u021bi speciali\u0219ti le uit\u0103 \u00een timpul dezvolt\u0103rii. <\/p>\n<ul>\n<li>Utilizarea Program\u0103rii Func\u021bionale \u00een loc de Programarea Orientat\u0103 pe Obiect cre\u0219te performan\u021ba.<\/li>\n<li>Monolitul este mai slab dec\u00e2t arhitectura bazat\u0103 pe servicii pentru un sistem performant pe NodeJS.<\/li>\n<li>Utilizarea `worker_threads` pentru calcule intense \u00eembun\u0103t\u0103\u021be\u0219te reac\u021bia sistemului, \u00een special atunci c\u00e2nd se lucreaz\u0103 cu opera\u021biuni i\/o.<\/li>\n<li>socket-urile unix sunt mai stabile \u0219i mai rapide dec\u00e2t cererile http.<\/li>\n<li>Dac\u0103 trebuie s\u0103 transferi rapid date mari prin re\u021bea, este mai bine s\u0103 folose\u0219ti websocket-uri \u0219i s\u0103 trimiti date binare, \u00eemp\u0103r\u021bite \u00een buc\u0103\u021bi, care pot fi retransmise dac\u0103 nu ajung, apoi reunite \u00eentr-un singur mesaj.<\/li>\n<\/ul>\n<p>\nV\u0103 invit\u0103m s\u0103 vizita\u021bi <b>GitHub<\/b> proiectul: <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>Articolul a fost scris \u00een colaborare cu <i>Alexandru Na\u0219ivan<\/i>, dezvoltator senior <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Test public: solu\u021bie pentru confiden\u021bialitate \u0219i scalabilitate \u00een Ethereum | ProHoster","description":"Blockchain-ul este o tehnologie inovatoare, promi\u021b\u0103toare s\u0103 \u00eembun\u0103t\u0103\u021beasc\u0103 multe domenii ale vie\u021bii umane.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}