{"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\/sv\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Offentlig test: l\u00f6sning f\u00f6r privatliv och skalbarhet i Ethereum","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> \u2014 en innovativ teknologi som lovar att f\u00f6rb\u00e4ttra m\u00e5nga aspekter av m\u00e4nniskors liv. Den flyttar verkliga processer och produkter till det digitala rummet, s\u00e4kerst\u00e4ller snabbhet och tillf\u00f6rlitlighet i finansiella transaktioner, s\u00e4nker kostnaderna och m\u00f6jligg\u00f6r skapandet av moderna DAPP-applikationer med smarta kontrakt i decentraliserade n\u00e4tverk.<\/p>\n<p>Med tanke p\u00e5 de m\u00e5nga f\u00f6rdelarna och olika till\u00e4mpningar av blockchain kan det verka konstigt att denna lovande teknik \u00e4nnu inte har tr\u00e4ngt in i alla branscher. Problemet \u00e4r att dagens decentraliserade blockchainl\u00f6sningar saknar skalbarhet. Ethereum hanterar cirka 20 transaktioner per sekund, vilket \u00e4r otillr\u00e4ckligt f\u00f6r att m\u00f6ta behoven hos en modern, dynamisk verksamhet. Samtidigt tvekar f\u00f6retag som anv\u00e4nder blockchainteknik att \u00f6verge Ethereum p\u00e5 grund av dess h\u00f6ga s\u00e4kerhet mot intr\u00e5ng och n\u00e4tverksproblem.<\/p>\n<p>F\u00f6r att s\u00e4kerst\u00e4lla decentralisering, s\u00e4kerhet och skalbarhet i blockchain, och d\u00e4rmed l\u00f6sa Skalbarhetsparadoxen, har utvecklarteamet <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> skapat Plasma Cash \u2014 en sidokedja best\u00e5ende av ett smart kontrakt och ett privat n\u00e4tverk baserat p\u00e5 Node.js, som periodiskt \u00f6verf\u00f6r sitt tillst\u00e5nd till huvudkedjan (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Offentlig test: l\u00f6sning f\u00f6r privatliv och skalbarhet i 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>Nyckelprocesser i Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>Anv\u00e4ndaren anropar funktionen f\u00f6r det smarta kontraktet `deposit`, och \u00f6verf\u00f6r det belopp i ETH som han vill placera i Plasma Cash-token. Den smarta kontraktfunktionen skapar token och genererar ett event om detta.<\/p>\n<p><b>2. <\/b>Plasma Cash-noder som \u00e4r prenumererade p\u00e5 h\u00e4ndelser fr\u00e5n det smarta kontraktet f\u00e5r meddelandet om skapandet av en ins\u00e4ttning och l\u00e4gger till transaktionen om skapandet av token i poolen.<\/p>\n<p><b>3. <\/b>Periodiskt tar speciella Plasma Cash-noder alla transaktioner fr\u00e5n poolen (upp till 1 miljon) och bildar en block, ber\u00e4knar Merkle-tr\u00e4det och d\u00e4rmed hash. Denna block skickas till andra noder f\u00f6r verifiering. Noderna kontrollerar om Merkle-hashen \u00e4r giltig och om transaktionerna \u00e4r giltiga (t.ex. om avs\u00e4ndaren av token \u00e4r dess \u00e4gare). Efter verifiering av blocket anropar noden funktionen `submitBlock` i det smarta kontraktet, som sparar blockets nummer och Merkle-hash i huvudkedjan. Det smarta kontraktet genererar ett event om att blocket har lagts till framg\u00e5ngsrikt. Transaktionerna tas bort fr\u00e5n poolen. <\/p>\n<p><b>4. <\/b>Noder som har f\u00e5tt en h\u00e4ndelse om blocksubmittering b\u00f6rjar till\u00e4mpa transaktioner som har lagts till i blocket.<\/p>\n<p><b>5. <\/b>Vid n\u00e5got tillf\u00e4lle vill \u00e4garen (eller icke-\u00e4garen) av tokenen ta ut den fr\u00e5n Plasma Cash. F\u00f6r detta anropar han funktionen `startExit` och skickar information om de senaste 2 transaktionerna f\u00f6r tokenen, som bekr\u00e4ftar att han verkligen \u00e4r \u00e4garen av tokenen. Smartkontraktet kontrollerar med hj\u00e4lp av Merkle-hashen att transaktionerna finns i blocken och skickar tokenen f\u00f6r uttag, vilket kommer att ske om tv\u00e5 veckor.<\/p>\n<p><b>6. <\/b>Om uttaget av tokenen skedde felaktigt (tokenen anv\u00e4ndes efter att uttagsf\u00f6rfarandet b\u00f6rjat eller tokenen redan tillh\u00f6rde n\u00e5gon annan f\u00f6re uttaget), kan token\u00e4garna bestrida uttaget inom tv\u00e5 veckor.<\/p>\n<p><img decoding=\"async\" alt=\"Offentlig test: l\u00f6sning f\u00f6r privatliv och skalbarhet i Ethereum\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Integritet uppn\u00e5s p\u00e5 tv\u00e5 s\u00e4tt<\/h2>\n<p>\n<b>1. <\/b>Rotkedjan vet ingenting om transaktionerna som bildas och skickas inom underkedjan. Det f\u00f6rblir offentlig information om vem som satt in och tagit ut ETH till\/fr\u00e5n Plasma Cash.<\/p>\n<p><b>2. <\/b>Underkedjan m\u00f6jligg\u00f6r anonyma transaktioner med hj\u00e4lp av zk-SNARKs.<\/p>\n<h2>Teknikstack<\/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>Testning <\/h2>\n<p>\nN\u00e4r vi utvecklade Plasma Cash testade vi systemets hastighet och fick f\u00f6ljande resultat:<\/p>\n<ul>\n<li>upp till 35 000 transaktioner per sekund l\u00e4ggs till i poolen;<\/li>\n<li>upp till 1 000 000 transaktioner kan lagras i ett block.<\/li>\n<\/ul>\n<p>\nTesterna genomf\u00f6rdes p\u00e5 f\u00f6ljande tre servrar:<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake inkl. NVMe SSD \u2013 512 GB, 64 GB DDR4 RAM<\/i><br \/>\n Tre validerande Plasma Cash-noder startades.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \"Summit Ridge\" (Zen), SATA SSD \u2013 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n En Ropsten testnet ETH-nod startades.<br \/>\n Tre validerande Plasma Cash-noder startades.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core inkl. NVMe SSD \u2013 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n En submit Plasma Cash-nod startades.<br \/>\n Tre validerande Plasma Cash-noder startades.<br \/>\n Ett test f\u00f6r att l\u00e4gga till transaktioner i Plasma Cash-n\u00e4tverket k\u00f6rdes.<\/p>\n<p><b>Totalt: <\/b>10 Plasma Cash-noder i ett privat n\u00e4tverk.<\/p>\n<h3>Test 1<\/h3>\n<p>\nDet finns en gr\u00e4ns p\u00e5 1 miljon transaktioner per block. D\u00e4rf\u00f6r hamnar 1 miljon transaktioner i 2 block (eftersom systemet hinner ta en del av transaktionerna och skicka dem innan de skickas).<\/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=\"Spela video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrsprungligt tillst\u00e5nd: sista blocket #7; 1 miljon transaktioner och tokenen \u00e4r sparad i databasen.<\/p>\n<p>00:00 \u2014 skriptet f\u00f6r att generera transaktioner startar<br \/>\n01:37 \u2014 1 miljon transaktioner skapade och b\u00f6rjade skickas till noden<br \/>\n01:46 \u2014 submitnodet tog 240k transaktioner fr\u00e5n poolen och bildar block #8. Vi ser ocks\u00e5 att 320k transaktioner l\u00e4ggs till i poolen p\u00e5 10 sekunder.<br \/>\n01:58 \u2014 block #8 har signerats och skickats f\u00f6r validering.<br \/>\n02:03 \u2014 block #8 har validerats och funktionen `submitBlock` i smartkontraktet har kallats med Merklehash och blocknummer<br \/>\n02:10 \u2014 demoskrypten har slutat arbeta, som skickade 1 miljon transaktioner p\u00e5 32 sekunder<br \/>\n02:33 \u2014 noderna b\u00f6rjade f\u00e5 information om att block #8 har lagts till i huvudkedjan och b\u00f6rjade utf\u00f6ra 240k transaktioner<br \/>\n02:40 \u2014 240k transaktioner har tagits bort fr\u00e5n poolen, som redan finns i block #8<br \/>\n02:56 \u2014 submitnodet tog fr\u00e5n poolen de kvarst\u00e5ende 760k transaktionerna och b\u00f6rjade ber\u00e4kna Merklehash och signera block #9<br \/>\n03:20 \u2014 alla noder inneh\u00e5ller 1 miljon 240k transaktioner och tokens<br \/>\n03:35 \u2014 block #9 har signerats och skickas f\u00f6r validering till andra noder <br \/>\n03:41 \u2014 ett n\u00e4tverksfel intr\u00e4ffade<br \/>\n04:40 \u2014 valideringen av block #9 stoppades p\u00e5 grund av timeout<br \/>\n04:54 \u2014 submitnodet tog fr\u00e5n poolen de kvarst\u00e5ende 760k transaktionerna och b\u00f6rjade ber\u00e4kna Merklehash och signera block #9<br \/>\n05:32 \u2014 block #9 har signerats och skickas f\u00f6r validering till andra noder<br \/>\n05:53 \u2014 block #9 har validerats och skickats till huvudkedjan<br \/>\n06:17 \u2014 noderna b\u00f6rjade f\u00e5 information om att block #9 har lagts till i huvudkedjan och b\u00f6rjade utf\u00f6ra 760k transaktioner<br \/>\n06:47 \u2014 poolen har rensats fr\u00e5n transaktioner som finns i block #9<br \/>\n09:06 \u2014 alla noder inneh\u00e5ller 2 miljoner transaktioner och tokens<\/p>\n<h3>Test 2<\/h3>\n<p>\nDet finns en gr\u00e4ns p\u00e5 350k per block. Vi har d\u00e4rf\u00f6r 3 block.<\/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=\"Spela video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrsprungligt tillst\u00e5nd: senaste block #9; det finns 2 miljoner transaktioner och tokens sparade i databasen<\/p>\n<p>00:00 \u2014 skriptet f\u00f6r transaktionsgenerering har redan startats<br \/>\n00:44 \u2014 1 miljon transaktioner har skapats och s\u00e4ndningen till noden har b\u00f6rjat<br \/>\n00:56 \u2014 submitnodet tog fr\u00e5n poolen 320k transaktioner och formar block #10. Vi ser ocks\u00e5 att 320k transaktioner l\u00e4ggs till poolen p\u00e5 10 sekunder<br \/>\n01:12 \u2014 block #10 har signerats och skickas till andra noder f\u00f6r validering<br \/>\n01:18 \u2014 demoskrypten har slutat arbeta, som skickade 1 miljon transaktioner p\u00e5 34 sekunder<br \/>\n01:20 \u2014 block #10 har validerats och skickats till huvudkedjan <br \/>\n01:51 \u2014 alla noder har f\u00e5tt information fr\u00e5n huvudkedjan om att block #10 har lagts till och b\u00f6rjar applicera 320k transaktioner<br \/>\n02:01 \u2014 poolen har rensats p\u00e5 320k transaktioner, som har lagts till i block #10<br \/>\n02:15 \u2014 submitnodet tog fr\u00e5n poolen 350k transaktioner och formar block #11<br \/>\n02:34 \u2014 block #11 har signerats och skickas till andra noder f\u00f6r validering<br \/>\n02:51 \u2014 block #11 har validerats och skickats till huvudkedjan <br \/>\n02:55 \u2014 den sista noden har utf\u00f6rt transaktioner fr\u00e5n block #10<br \/>\n10:59 - mycket l\u00e4nge h\u00f6gkvalitativa transaktioner med submission av block #9 utf\u00f6rdes i den centrala kedjan, men den blev slutf\u00f6rd och alla noder fick information om detta och b\u00f6rjade utf\u00f6ra 350k transaktioner.<br \/>\n11:05 - poolen rensades p\u00e5 320k transaktioner som lades till i block #11.<br \/>\n12:10 - alla noder inneh\u00e5ller 1 miljon 670k transaktioner och tokens.<br \/>\n12:17 - submissionsnod tog 330k transaktioner fr\u00e5n poolen och formar block #12.<br \/>\n12:32 - block #12 har signerats och skickas till andra noder f\u00f6r validering.<br \/>\n12:39 - block #12 har validerats och skickats till den centrala kedjan. <br \/>\n13:44 - alla noder har f\u00e5tt information fr\u00e5n den centrala kedjan om att block #12 har lagts till och b\u00f6rjar till\u00e4mpa 330k transaktioner.<br \/>\n14:50 - alla noder inneh\u00e5ller 2 miljoner transaktioner och tokens.<\/p>\n<h3>Test 3<\/h3>\n<p>\nP\u00e5 den f\u00f6rsta och andra servern har en validerande nod ersatts med en submissionsnod. <\/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=\"Spela video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrsprungligt tillst\u00e5nd: senaste block #84; 0 transaktioner och tokens sparades i databasen.<\/p>\n<p>00:00 - Tre skript har startats som genererar och skickar 1 miljon transaktioner vardera.<br \/>\n01:38 - 1 miljon transaktioner har skapats och b\u00f6rjade skickas till submissionsnod #3.<br \/>\n01:50 - submissionsnod #3 tog 330k transaktioner fr\u00e5n poolen och formar block #85 (f21). Vi ser ocks\u00e5 att 350k transaktioner tillkommer i poolen p\u00e5 10 sek.<br \/>\n01:53 - 1 miljon transaktioner har skapats och b\u00f6rjade skickas till submissionsnod #1.<br \/>\n01:50 - submissionsnod #3 tog 330k transaktioner fr\u00e5n poolen och formar block #85 (f21). Vi ser ocks\u00e5 att 350k transaktioner tillkommer i poolen p\u00e5 10 sek.<br \/>\n02:01 - submissionsnod #1 tog 250k transaktioner fr\u00e5n poolen och formar block #85 (65e).<br \/>\n02:06 - block #85 (f21) har signerats och skickas till andra noder f\u00f6r validering.<br \/>\n02:08 - demo-skriptet f\u00f6r server #3 har avslutats och skickade 1 miljon transaktioner p\u00e5 30 sekunder.<br \/>\n02:14 - block #85 (f21) har validerats och skickats till den centrala kedjan. <br \/>\n02:19 - block #85 (65e) har signerats och skickas till andra noder f\u00f6r validering.<br \/>\n02:22 - 1 miljon transaktioner har skapats och b\u00f6rjar skickas till submissionsnod #2.<br \/>\n02:27 - block #85 (65e) har validerats och skickats till den centrala kedjan. <br \/>\n02:29 - submissionsnod #2 tog 111855 transaktioner fr\u00e5n poolen och formar block #85 (256).<br \/>\n02:36 - block #85 (256) har signerats och skickas till andra noder f\u00f6r validering.<br \/>\n02:36 - demo-skriptet f\u00f6r server #1 har avslutats och skickade 1 miljon transaktioner p\u00e5 42,5 sekunder.<br \/>\n02:38 - block #85 (256) har validerats och skickats till den centrala kedjan.<br \/>\n03:08 - demo-skriptet f\u00f6r server #2 har avslutats och skickade 1 miljon transaktioner p\u00e5 47 sekunder. <br \/>\n03:38 - alla noder har f\u00e5tt information fr\u00e5n den centrala kedjan om att block #85 (f21), #86 (65e), #87 (256) har lagts till och b\u00f6rjar till\u00e4mpa 330k, 250k, 111855 transaktioner.<br \/>\n03:49 \u2014 poolen har rensats p\u00e5 330k, 250k, 111855 transaktioner som har lagts till i block #85 (f21), #86(65e), #87(256)<br \/>\n03:59 \u2014 submit node #1 tog 888145 transaktioner fr\u00e5n poolen och formar block #88 (214), submit node #2 tog 750k transaktioner fr\u00e5n poolen och formar block #88 (50a), submit node #3 tog 670k transaktioner fr\u00e5n poolen och formar block #88 (d3b)<br \/>\n04:44 \u2014 block #88 (d3b) har signerats och skickas till andra noder f\u00f6r validering<br \/>\n04:58 \u2014 block #88 (214) har signerats och skickas till andra noder f\u00f6r validering<br \/>\n05:11 \u2014 block #88 (50a) har signerats och skickas till andra noder f\u00f6r validering<br \/>\n05:11 \u2014 block #85 (d3b) har validerats och skickats till huvudkedjan <br \/>\n05:36 \u2014 block #85 (214) har validerats och skickats till huvudkedjan <br \/>\n05:43 \u2014 alla noder har f\u00e5tt information fr\u00e5n huvudkedjan om att block #88 (d3b), #89(214) har lagts till och b\u00f6rjar applicera 670k, 750k transaktioner<br \/>\n06:50 \u2014 p\u00e5 grund av f\u00f6rbindelseavbrott har block #85 (50a) inte validerats<br \/>\n06:55 \u2014 submit node #2 tog 888145 transaktioner fr\u00e5n pool och formar block #90 (50a)<br \/>\n08:14 \u2014 block #90 (50a) har signerats och skickas till andra noder f\u00f6r validering<br \/>\n09:04 \u2014 block #90 (50a) har validerats och skickats till huvudkedjan <br \/>\n11:23 \u2014 alla noder har f\u00e5tt information fr\u00e5n huvudkedjan om att block #90 (50a) har lagts till och b\u00f6rjar applicera 888145 transaktioner. Vid detta tillf\u00e4lle har server #3 l\u00e4nge applicerat transaktioner fr\u00e5n block #88 (d3b), #89(214)<br \/>\n12:11 \u2014 alla pooler \u00e4r tomma<br \/>\n13:41 \u2014 alla noder p\u00e5 server #3 inneh\u00e5ller 3 miljoner transaktioner och tokens<br \/>\n14:35 \u2014 alla noder p\u00e5 server #1 inneh\u00e5ller 3 miljoner transaktioner och tokens<br \/>\n19:24 \u2014 alla noder p\u00e5 server #2 inneh\u00e5ller 3 miljoner transaktioner och tokens <\/p>\n<h2>Hinder<\/h2>\n<p>\nUnder utvecklingen av Plasma Cash st\u00f6tte vi p\u00e5 f\u00f6ljande problem som vi gradvis har l\u00f6st och fortfarande l\u00f6ser:<\/p>\n<p><b>1.<\/b> Konflikt i interaktionen mellan olika funktioner i systemet. Till exempel, funktionen f\u00f6r att l\u00e4gga till transaktioner i poolen blockerade arbetet med submit och validering av block, och vice versa, vilket ledde till en f\u00f6rs\u00e4mring av hastigheten.<\/p>\n<p><b>2. <\/b>Det var inte klart hur man skulle skicka en stor m\u00e4ngd transaktioner och samtidigt minska kostnaderna f\u00f6r datatransmission.<\/p>\n<p><b>3. <\/b>Det var oklart hur och var man skulle lagra data f\u00f6r att uppn\u00e5 h\u00f6ga resultat.<\/p>\n<p><b>4. <\/b>Det var oklart hur man skulle organisera n\u00e4tverket mellan noderna, eftersom storleken p\u00e5 ett block med 1 miljon transaktioner tar upp ungef\u00e4r 100 MB.<\/p>\n<p><b>5.<\/b> Arbete i en enda tr\u00e5d bryter anslutningen mellan noderna n\u00e4r det sker l\u00e5nga ber\u00e4kningar (till exempel, konstruktionen av Merkle-tr\u00e4det och ber\u00e4kningen av dess hash).<\/p>\n<h2>Hur hanterade vi allt detta?<\/h2>\n<p>\nDen f\u00f6rsta versionen av Plasma Cash-noden var en kombination som kunde g\u00f6ra allt p\u00e5 en g\u00e5ng: ta emot transaktioner, skicka och validera block, och erbjuda ett API f\u00f6r att f\u00e5 \u00e5tkomst till data. Eftersom NodeJS fr\u00e5n b\u00f6rjan \u00e4r enstaka tr\u00e5dar, blockerade den tunga funktionen f\u00f6r att ber\u00e4kna Merkle-tr\u00e4d funktionen f\u00f6r att l\u00e4gga till transaktioner. Vi s\u00e5g tv\u00e5 l\u00f6sningar p\u00e5 detta problem:<\/p>\n<p><b>1. <\/b>Att k\u00f6ra flera NodeJS-processer, d\u00e4r varje process utf\u00f6r specifika funktioner.<\/p>\n<p><b>2. <\/b>Anv\u00e4nda worker_threads och flytta delar av koden till tr\u00e5dar.<\/p>\n<p>Till slut anv\u00e4nde vi b\u00e5da alternativen samtidigt: vi delade logiskt upp en nod i tre delar, som kan arbeta oberoende, men samtidigt synkront.<\/p>\n<p><b>1.<\/b> En submit-nod, som tar emot transaktioner i poolen och skapar block.<\/p>\n<p><b>2.<\/b> En validerande nod, som kontrollerar nodernas giltighet.<\/p>\n<p><b>3. <\/b>API-nod \u2014 tillhandah\u00e5ller ett API f\u00f6r att f\u00e5 tillg\u00e5ng till data.<\/p>\n<p>Varje nod kan anslutas via unix-socket genom cli.<\/p>\n<p>Tunga operationer, s\u00e5 som ber\u00e4kning av Merkle-tr\u00e4d, flyttade vi till en separat tr\u00e5d.<\/p>\n<p>S\u00e5ledes lyckades vi f\u00e5 alla funktioner i Plasma Cash att fungera samtidigt och utan avbrott.<\/p>\n<p>S\u00e5 snart systemet fungerade testade vi hastigheten och, tyv\u00e4rr, fick vi otillfredsst\u00e4llande resultat: 5 000 transaktioner per sekund och upp till 50 000 transaktioner i blocket. Vi var tvungna att ta reda p\u00e5 vad som var implementerat felaktigt.<\/p>\n<p>F\u00f6rst b\u00f6rjade vi testa kommunikationsmekanismen med Plasma Cash, f\u00f6r att hitta systemets maximala kapacitet. Tidigare n\u00e4mnde vi att Plasma Cash-noden tillhandah\u00e5ller en unix-socketgr\u00e4nssnitt. Den var ursprungligen textbaserad. JSON-objekt skickades med hj\u00e4lp av `JSON.parse()` och `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>\nVi m\u00e4tte hastigheten p\u00e5 \u00f6verf\u00f6ring av s\u00e5dana objekt och fick ~ 130k per sekund. Vi f\u00f6rs\u00f6kte byta ut standardfunktionerna f\u00f6r JSON-hantering, men prestandan f\u00f6rb\u00e4ttrades inte. V8-motorn verkar vara v\u00e4l optimerad f\u00f6r dessa operationer.<\/p>\n<p>Arbetet med transaktioner, tokens och block genomf\u00f6rdes via klasser. N\u00e4r s\u00e5dana klasser skapades f\u00f6rs\u00e4mrades prestandan med 50 %, vilket indikerar att OOP inte passar oss. Vi var tvungna att skriva om allt till en ren funktionell metod.<\/p>\n<h2>Skrivning till databasen<\/h2>\n<p>\nInledningsvis valdes Redis som en av de mest prestanda-effektiva l\u00f6sningarna, som uppfyllde v\u00e5ra krav: en key-value lagring, arbete med hash-tabeller och m\u00e4ngder. Vi k\u00f6rde redis-benchmark och fick ~80 000 operationer per sekund med 1 pipelining.<\/p>\n<p>F\u00f6r h\u00f6g prestanda optimerade vi Redis ytterligare: <\/p>\n<ul>\n<li>Vi installerade en unix socket-anslutning.<\/li>\n<li>Vi st\u00e4ngde av lagring av tillst\u00e5nd p\u00e5 disk (f\u00f6r tillf\u00f6rlitlighet kan en replika konfigureras och lagring p\u00e5 disk g\u00f6ras i en separat Redis).<\/li>\n<\/ul>\n<p>\nI Redis \u00e4r en pool en hash-tabell, eftersom vi beh\u00f6ver m\u00f6jligheten att f\u00e5 alla transaktioner med en beg\u00e4ran och ta bort transaktioner individuellt. Vi f\u00f6rs\u00f6kte anv\u00e4nda en vanlig lista, men den var l\u00e5ngsammare vid utvinning av hela listan. <\/p>\n<p>Vid anv\u00e4ndning av standard NodeJS-biblioteket Redis fick vi en prestanda p\u00e5 18 000 transaktioner per sekund. Hastigheten minskade med 9 g\u00e5nger. <\/p>\n<p>Eftersom benchmarken visade att vi har potential att klara av upp till 5 g\u00e5nger mer, b\u00f6rjade vi optimera. Vi bytte bibliotek till ioredis och fick en prestanda p\u00e5 25 000 per sekund. Vi lade till transaktioner individuellt med kommandot `hset`. P\u00e5 s\u00e5 s\u00e4tt genererade vi m\u00e5nga beg\u00e4rningar till Redis. Id\u00e9n uppstod att gruppera transaktioner i buntar och skicka dem med ett kommando `hmset`. Resultatet blev 32 000 per sekund. <\/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>Vi var tvungna att g\u00e5 \u00f6ver till ett bin\u00e4rt protokoll eftersom:<\/p>\n<p><b>1. <\/b>Systemet ber\u00e4knar ofta hash, signaturer osv., och f\u00f6r detta beh\u00f6ver det data i `Buffer.<\/p>\n<p><b>2.<\/b> N\u00e4r data skickas mellan tj\u00e4nster v\u00e4ger bin\u00e4ra data mindre \u00e4n text. Till exempel, n\u00e4r vi skickar ett block med 1 miljon transaktioner, kan datan i textform ta upp mer \u00e4n 300 megabyte.<\/p>\n<p><b>3.<\/b> St\u00e4ndiga datakonverteringar p\u00e5verkar prestandan.<\/p>\n<p>D\u00e4rf\u00f6r har vi baserat oss p\u00e5 v\u00e5rt eget bin\u00e4ra protokoll f\u00f6r lagring och \u00f6verf\u00f6ring av data, utvecklat med den fantastiska biblioteken `binary-data`.<\/p>\n<p>Som ett resultat har vi f\u00e5tt f\u00f6ljande datatyper:<\/p>\n<h3> \u2014 Transaktion<\/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>\nGenom vanliga kommandon `BD.encode(block, Protocol).slice();` och ` BD.decode(buffer, Protocol)` konverterar vi data till `Buffer` f\u00f6r lagring i Redis eller f\u00f6r att skicka till en annan nod och extrahera data tillbaka.<\/p>\n<p>Vi har ocks\u00e5 2 bin\u00e4ra protokoll f\u00f6r data\u00f6verf\u00f6ring mellan tj\u00e4nster:<\/p>\n<p><i> \u2014 Protokoll f\u00f6r interaktion med Plasma Nod via unix socket<\/i><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    type: BD.types.uint8,\n    messageId: BD.types.uint24le,\n    error: BD.types.uint8,\n    length: BD.types.uint24le,\n    payload: BD.types.buffer(({node}) =&gt; node.length)\n  }\n  ```\n<\/code><\/pre>\n<p>\n d\u00e4r:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 \u00e5tg\u00e4rden som ska utf\u00f6ras, till exempel 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 data som m\u00e5ste skickas till motsvarande funktion;<\/li>\n<li> <b>`messageId`<\/b> \u2014 meddelande-id f\u00f6r att kunna identifiera svaret. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Protokoll f\u00f6r interaktion mellan noder<\/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 d\u00e4r:<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 meddelandekod, till exempel 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 version av protokollet, d\u00e5 det kan finnas noder med olika versioner i n\u00e4tverket som kan fungera olika;<\/li>\n<li> <b>`seq`<\/b> \u2014 meddelandeidentifierare;<\/li>\n<li> <b>`countChunk`<\/b> och <b>`chunkNumber`<\/b> \u00e4r n\u00f6dv\u00e4ndiga f\u00f6r att dela upp stora meddelanden;<\/li>\n<li> <b>`length`<\/b> och <b>`payload`<\/b> l\u00e4ngd och sj\u00e4lva data.<\/li>\n<\/ul>\n<p>\nEftersom vi har typat datan i f\u00f6rv\u00e4g fungerar det slutliga systemet mycket snabbare \u00e4n `rlp`-biblioteket fr\u00e5n Ethereum. Tyv\u00e4rr har vi \u00e4nnu inte kunnat avst\u00e5 fr\u00e5n det, eftersom smartkontraktet beh\u00f6ver f\u00f6rb\u00e4ttras, vilket vi planerar att g\u00f6ra i framtiden.<\/p>\n<p>Om vi har lyckats n\u00e5 hastigheten <b>35 000<\/b> transaktioner per sekund, vi beh\u00f6ver ocks\u00e5 bearbeta dem inom en optimal tid. Eftersom den ungef\u00e4rliga tiden f\u00f6r blockgenerering \u00e4r 30 sekunder, beh\u00f6ver vi inkludera i blocket <b>1 000 000<\/b> transaktioner, vilket betyder \u00f6verf\u00f6ring av mer \u00e4n <b>100<\/b> MB data. <\/p>\n<p>Till en b\u00f6rjan anv\u00e4nde vi `ethereumjs-devp2p`-biblioteket f\u00f6r att ansluta noder, men det klarade inte av den m\u00e4ngden data. D\u00e4rf\u00f6r anv\u00e4nde vi `ws`-biblioteket och st\u00e4llde in \u00f6verf\u00f6ringen av bin\u00e4ra data \u00f6ver websocket. Sj\u00e4lvklart st\u00f6tte vi ocks\u00e5 p\u00e5 problem med att \u00f6verf\u00f6ra stora datapaket, men vi delade upp dem i bitar och nu finns det inga s\u00e5dana problem.<\/p>\n<p>Dessutom tar skapandet av Merkle-tr\u00e4det och ber\u00e4kningen av hash <b>1 000 000<\/b> transaktioner omkring<b> 10<\/b> sekunders oavbruten ber\u00e4kning. Under denna tid hinner kopplingen till alla noder bryta. Det beslutades att flytta denna ber\u00e4kning till en separat tr\u00e5d.<\/p>\n<h2>Slutsatser:<\/h2>\n<p>\nFaktum \u00e4r att v\u00e5ra insikter inte \u00e4r nya, men av n\u00e5gon anledning gl\u00f6mmer m\u00e5nga specialister dem vid utveckling. <\/p>\n<ul>\n<li>Att anv\u00e4nda funktionell programmering ist\u00e4llet f\u00f6r objektorienterad programmering \u00f6kar prestandan.<\/li>\n<li>Monolit \u00e4r s\u00e4mre \u00e4n en tj\u00e4nsteorienterad arkitektur f\u00f6r ett h\u00f6gpresterande system p\u00e5 NodeJS.<\/li>\n<li>Att anv\u00e4nda `worker_threads` f\u00f6r tunga ber\u00e4kningar f\u00f6rb\u00e4ttrar systemets responsivitet, s\u00e4rskilt vid arbete med i\/o-operationer.<\/li>\n<li>Unix-socket \u00e4r mer stabil \u00e4n http-f\u00f6rfr\u00e5gningar.<\/li>\n<li>Om du snabbt beh\u00f6ver \u00f6verf\u00f6ra stora datam\u00e4ngder \u00f6ver n\u00e4tet, \u00e4r det b\u00e4ttre att anv\u00e4nda websockets och skicka bin\u00e4ra data uppdelade i bitar, som kan skickas om de inte n\u00e5r fram, och sedan kombineras till ett meddelande.<\/li>\n<\/ul>\n<p>\nVi inbjuder dig att bes\u00f6ka <b>GitHub<\/b> projektet: <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>Artikeln skrevs i samarbete med <i>Alexander Nashivan<\/i>, seniorutvecklare <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/471096\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041e\u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0432 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0438\u0445 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 DAPP \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0432 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38856","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Offentlig testning: l\u00f6sning f\u00f6r integritet och skalbarhet i Ethereum | ProHoster","description":"Blockchain \u00e4r en innovativ teknologi som lovar att f\u00f6rb\u00e4ttra m\u00e5nga omr\u00e5den av m\u00e4nniskors liv.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}