{"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\/de\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"\u00d6ffentliche Pr\u00fcfung: L\u00f6sung f\u00fcr Datenschutz und Skalierbarkeit im Ethereum","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> \u2014 eine innovative Technologie, die verspricht, viele Bereiche des menschlichen Lebens zu verbessern. Sie \u00fcbertr\u00e4gt reale Prozesse und Produkte in den digitalen Raum, gew\u00e4hrleistet Schnelligkeit und Zuverl\u00e4ssigkeit finanzieller Transaktionen, senkt deren Kosten und erm\u00f6glicht die Erstellung moderner DAPP-Anwendungen unter Verwendung von Smart Contracts in dezentralen Netzwerken.<\/p>\n<p>Angesichts der zahlreichen Vorteile und der vielf\u00e4ltigen Anwendungsbereiche k\u00f6nnte es merkw\u00fcrdig erscheinen, dass diese vielversprechende Technologie noch nicht in alle Branchen vorgedrungen ist. Das Problem ist, dass modernen dezentralen Blockchains die Skalierbarkeit fehlt. Ethereum verarbeitet etwa 20 Transaktionen pro Sekunde, was nicht ausreicht, um die Bed\u00fcrfnisse des dynamischen modernen Gesch\u00e4fts zu befriedigen. Gleichzeitig z\u00f6gern Unternehmen, die Blockchain-Technologie nutzen, Ethereum aufzugeben, aufgrund seines hohen Schutzes vor Hacks und Netzwerkst\u00f6rungen.<\/p>\n<p>Um Dezentralisierung, Sicherheit und Skalierbarkeit in der Blockchain zu gew\u00e4hrleisten und damit die Skalierbarkeits-Trilemma zu l\u00f6sen, hat das Entwicklerteam <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> Plasma Cash geschaffen \u2013 eine Sidechain, die aus einem Smart Contract und einem privaten Netzwerk basierend auf Node.js besteht, das regelm\u00e4\u00dfig ihren Zustand in die Haupt-Chain (Ethereum) \u00fcbertr\u00e4gt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00d6ffentliche Pr\u00fcfung: L\u00f6sung f\u00fcr Datenschutz und Skalierbarkeit im 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>Wichtige Prozesse in Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>Der Benutzer ruft die Funktion des Smart Contracts `deposit` auf und \u00fcbertr\u00e4gt den Betrag in ETH, den er in das Plasma Cash Token einzahlen m\u00f6chte. Die Funktion des Smart Contracts erstellt das Token und generiert ein Ereignis dar\u00fcber.<\/p>\n<p><b>2. <\/b>Plasma Cash Nodes, die auf die Ereignisse des Smart Contracts subscribiert sind, erhalten das Ereignis zur Erstellung der Einzahlung und f\u00fcgen die Transaktion zur Erstellung des Tokens zum Pool hinzu.<\/p>\n<p><b>3. <\/b>Gelegentlich nehmen spezielle Plasma Cash-Knoten alle Transaktionen aus dem Pool (bis zu 1 Million) und erstellen daraus einen Block, berechnen den Merkle-Baum und somit den Hash. Dieser Block wird an andere Knoten zur Verifizierung gesendet. Die Knoten pr\u00fcfen, ob der Merkle-Hash g\u00fcltig ist und ob die Transaktionen g\u00fcltig sind (zum Beispiel, ob der Absender des Tokens dessen Eigent\u00fcmer ist). Nach der Verifizierung des Blocks ruft der Knoten die Funktion `submitBlock` des Smart Contracts auf, die die Nummer und den Merkle-Hash des Blocks in die Hauptkette speichert. Der Smart Contract erzeugt ein Ereignis \u00fcber die erfolgreiche Hinzuf\u00fcgung des Blocks. Transaktionen werden aus dem Pool entfernt. <\/p>\n<p><b>4. <\/b>Die Knoten, die das Ereignis \u00fcber das Absenden des Blocks erhalten haben, beginnen, die Transaktionen anzuwenden, die dem Block hinzugef\u00fcgt wurden.<\/p>\n<p><b>5. <\/b>Irgendwann m\u00f6chte der Eigent\u00fcmer (oder Nicht-Eigent\u00fcmer) des Tokens ihn aus Plasma Cash abheben. Dazu ruft er die Funktion `startExit` auf und \u00fcbergibt Informationen \u00fcber die letzten 2 Transaktionen des Tokens, die best\u00e4tigen, dass er tats\u00e4chlich der Eigent\u00fcmer des Tokens ist. Der Smart Contract \u00fcberpr\u00fcft mithilfe des Merkle-Hashes, ob sich die Transaktionen in den Bl\u00f6cken befinden, und leitet den Token zur Abhebung weiter, die in zwei Wochen stattfinden wird.<\/p>\n<p><b>6. <\/b>Wenn der Token-Withdraw-Vorgang gegen die Regeln verst\u00f6\u00dft (der Token wurde nach Beginn des Auszahlungsvorgangs ausgegeben oder der Token geh\u00f6rte vor der Auszahlung bereits jemand anderem), kann der Eigent\u00fcmer des Tokens den Withdraw innerhalb von zwei Wochen anfechten.<\/p>\n<p><img decoding=\"async\" alt=\"\u00d6ffentliche Pr\u00fcfung: L\u00f6sung f\u00fcr Datenschutz und Skalierbarkeit im Ethereum\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Privatsph\u00e4re wird auf zwei Arten erreicht.<\/h2>\n<p>\n<b>1. <\/b>Die Root-Chain wei\u00df nichts \u00fcber die Transaktionen, die innerhalb der Child-Chain erzeugt und gesendet werden. \u00d6ffentlich bleibt die Information, wer ETH in\/aus Plasma Cash eingezahlt und ausgezahlt hat.<\/p>\n<p><b>2. <\/b>Die Child-Chain erm\u00f6glicht es, anonyme Transaktionen mithilfe von zk-SNARKs zu organisieren.<\/p>\n<h2>Technologischer 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>Testen <\/h2>\n<p>\nBei der Entwicklung von Plasma Cash haben wir die Systemgeschwindigkeit getestet und folgende Ergebnisse erzielt:<\/p>\n<ul>\n<li>bis zu 35.000 Transaktionen pro Sekunde werden dem Pool hinzugef\u00fcgt;<\/li>\n<li>bis zu 1.000.000 Transaktionen k\u00f6nnen in einem Block gespeichert werden.<\/li>\n<\/ul>\n<p>\nDie Tests wurden auf den folgenden 3 Servern durchgef\u00fchrt:<\/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 Es wurden 3 validierende Plasma Cash Knoten gestartet.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \u201eSummit Ridge\u201c (Zen), SATA SSD \u2014 500 GB, 64 GB DDR4 RAM<\/i><br \/>\n Es wurde ein Ropsten-Testnet ETH-Knoten gestartet.<br \/>\n Es wurden 3 validierende Plasma Cash Knoten gestartet.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core incl. NVMe SSD \u2014 1 TB, 64 GB DDR4 RAM<\/i><br \/>\n Es wurde ein Submit Plasma Cash Knoten gestartet.<br \/>\n Es wurden 3 validierende Plasma Cash Knoten gestartet.<br \/>\n Der Test zum Hinzuf\u00fcgen von Transaktionen zum Plasma Cash Netzwerk wurde gestartet.<\/p>\n<p><b>Insgesamt: <\/b>10 Plasma Cash Knoten im privaten Netzwerk.<\/p>\n<h3>Test 1<\/h3>\n<p>\nEs gibt ein Limit von 1 Million Transaktionen pro Block. Daher gelangen 1 Million Transaktionen in 2 Bl\u00f6cke (da das System in der Lage ist, einen Teil der Transaktionen zu erfassen und zu \u00fcbermitteln, w\u00e4hrend sie gesendet werden).<\/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=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrspr\u00fcnglicher Zustand: letzter Block #7; in der Datenbank sind 1 Million Transaktionen und Token gespeichert.<\/p>\n<p>00:00 \u2014 Starten des Transaktionsgenerierungsskripts<br \/>\n01:37 \u2014 1 Million Transaktionen erstellt und die \u00dcbermittlung an den Knoten begonnen<br \/>\n01:46 \u2014 Der Knoten hat 240k Transaktionen aus dem Pool entnommen und block #8 wird erstellt. Au\u00dferdem sehen wir, dass 320k Transaktionen in 10 Sekunden zum Pool hinzugef\u00fcgt werden.<br \/>\n01:58 \u2014 Block #8 signiert und zur Validierung gesendet<br \/>\n02:03 \u2014 Block #8 validiert und die Funktion `submitBlock` des Smart Contracts mit dem Merkle-Hash und der Blocknummer aufgerufen<br \/>\n02:10 \u2014 Das Dem Skript hat seine Arbeit beendet, das 1 Million Transaktionen in 32 Sekunden gesendet hat<br \/>\n02:33 \u2014 Die Knoten haben begonnen, Informationen zu erhalten, dass Block #8 zur Wurzelkette hinzugef\u00fcgt wurde, und haben begonnen, 240k Transaktionen auszuf\u00fchren<br \/>\n02:40 \u2014 Aus dem Pool wurden 240k Transaktionen entfernt, die bereits in Block #8 sind<br \/>\n02:56 \u2014 Der Knoten hat die verbleibenden 760k Transaktionen aus dem Pool \u00fcbernommen und begonnen, den Merkle-Hash zu berechnen und Block #9 zu signieren<br \/>\n03:20 \u2014 Alle Knoten enthalten 1 Million 240k Transaktionen und Token<br \/>\n03:35 \u2014 Block #9 wurde signiert und wird zur Validierung an andere Nodes gesendet <br \/>\n03:41 \u2014 Ein Netzwerkfehler ist aufgetreten<br \/>\n04:40 \u2014 Die Wartung f\u00fcr die Validierung von Block #9 wurde aufgrund eines Timeouts beendet<br \/>\n04:54 \u2014 Der Submit-Node hat 760.000 Transaktionen aus dem Pool entnommen und beginnt mit der Berechnung des Merkle-Hashes und der Signierung von Block #9<br \/>\n05:32 \u2014 Block #9 wurde signiert und wird zur Validierung an andere Nodes gesendet<br \/>\n05:53 \u2014 Block #9 wurde validiert und in die Root-Chain gesendet<br \/>\n06:17 \u2014 Die Nodes haben begonnen, Informationen dar\u00fcber zu erhalten, dass Block #9 zur Root-Chain hinzugef\u00fcgt wurde und haben 760.000 Transaktionen ausgef\u00fchrt<br \/>\n06:47 \u2014 Der Pool wurde von den Transaktionen, die in Block #9 enthalten sind, bereinigt<br \/>\n09:06 \u2014 Alle Nodes enthalten 2 Millionen Transaktionen und Tokens<\/p>\n<h3>Test 2<\/h3>\n<p>\nEs gibt ein Limit von 350.000 pro Block. Infolgedessen haben wir 3 Bl\u00f6cke.<\/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=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrspr\u00fcnglicher Zustand: letzter Block #9; in der Datenbank sind 2 Millionen Transaktionen und Tokens gespeichert<\/p>\n<p>00:00 \u2014 Das Transaktionsgenerierungsskript l\u00e4uft bereits<br \/>\n00:44 \u2014 1 Million Transaktionen wurden erstellt und der Versand an den Node hat begonnen<br \/>\n00:56 \u2014 Der Submit-Node hat 320.000 Transaktionen aus dem Pool entnommen und erstellt Block #10. Zudem sehen wir, dass 320.000 Transaktionen in 10 Sekunden zum Pool hinzugef\u00fcgt werden<br \/>\n01:12 \u2014 Block #10 wurde signiert und wird zur Validierung an andere Nodes gesendet<br \/>\n01:18 \u2014 das Dem Skript, das 1 Million Transaktionen in 34 Sekunden gesendet hat, ist fertig.<br \/>\n01:20 \u2014 Block #10 wurde validiert und in die Hauptkette gesendet. <br \/>\n01:51 \u2014 alle Knoten haben aus der Hauptkette die Information erhalten, dass Block #10 hinzugef\u00fcgt wurde, und beginnen, 320k Transaktionen anzuwenden.<br \/>\n02:01 \u2014 der Pool wurde von 320k Transaktionen bereinigt, die in Block #10 hinzugef\u00fcgt wurden.<br \/>\n02:15 \u2014 der Submit-Knoten hat 350k Transaktionen aus dem Pool entnommen und erstellt Block #11.<br \/>\n02:34 \u2014 Block #11 ist signiert und wird zur Validierung an andere Knoten gesendet.<br \/>\n02:51 \u2014 Block #11 wurde validiert und in die Hauptkette gesendet. <br \/>\n02:55 \u2014 der letzte Knoten hat die Transaktionen aus Block #10 ausgef\u00fchrt.<br \/>\n10:59 \u2014 die Transaktion mit dem Submit von Block #9 hat sehr lange in der Hauptkette gedauert, aber sie wurde ausgef\u00fchrt und alle Knoten haben dar\u00fcber informiert und begannen, 350k Transaktionen auszuf\u00fchren.<br \/>\n11:05 \u2014 der Pool wurde von 320k Transaktionen bereinigt, die in Block #11 hinzugef\u00fcgt wurden.<br \/>\n12:10 \u2014 alle Knoten enthalten 1 Million 670k Transaktionen und Token.<br \/>\n12:17 \u2014 der Submit-Knoten hat 330k Transaktionen aus dem Pool entnommen und erstellt Block #12.<br \/>\n12:32 \u2014 Block #12 ist signiert und wird zur Validierung an andere Knoten gesendet.<br \/>\n12:39 \u2014 Block #12 wurde validiert und in die Hauptkette gesendet. <br \/>\n13:44 \u2014 Alle Nodes haben aus der Root-Kette Informationen erhalten, dass Block #12 hinzugef\u00fcgt wurde und nun 330k Transaktionen anwenden.<br \/>\n14:50 \u2014 Alle Nodes enthalten 2 Millionen Transaktionen und Tokens.<\/p>\n<h3>Test 3<\/h3>\n<p>\nIn den ersten beiden Servern wurde ein Validierungs-Node durch einen Submit-Node ersetzt. <\/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=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUrspr\u00fcnglicher Zustand: letzter Block #84; in der Datenbank sind 0 Transaktionen und Tokens gespeichert.<\/p>\n<p>00:00 \u2014 3 Skripte wurden gestartet, die jeweils 1 Million Transaktionen generieren und senden.<br \/>\n01:38 \u2014 1 Million Transaktionen erstellt und der Versand an Submit-Node #3 begonnen.<br \/>\n01:50 \u2014 Submit-Node #3 hat aus dem Pool 330k Transaktionen entnommen und formt Block #85 (f21). Au\u00dferdem sehen wir, dass in den Pool in 10 Sekunden 350k Transaktionen hinzugef\u00fcgt werden.<br \/>\n01:53 \u2014 1 Million Transaktionen erstellt und der Versand an Submit-Node #1 begonnen.<br \/>\n01:50 \u2014 Submit-Node #3 hat aus dem Pool 330k Transaktionen entnommen und formt Block #85 (f21). Au\u00dferdem sehen wir, dass in den Pool in 10 Sekunden 350k Transaktionen hinzugef\u00fcgt werden.<br \/>\n02:01 \u2014 Submit-Node #1 hat aus dem Pool 250k Transaktionen entnommen und formt Block #85 (65e).<br \/>\n02:06 \u2014 Block #85 (f21) wurde signiert und wird an andere Nodes zur Validierung gesendet.<br \/>\n02:08 \u2014 Das Demo-Skript des Servers #3 hat die Arbeit beendet, welches 1 Million Transaktionen in 30 Sekunden gesendet hat.<br \/>\n02:14 \u2014 Block #85 (f21) wurde validiert und in die Root-Kette gesendet. <br \/>\n02:19 \u2014 Block #85 (65e) wurde signiert und wird an andere Nodes zur Validierung gesendet.<br \/>\n02:22 \u2014 1 Million Transaktionen wurden erstellt und die \u00dcbertragung an Node #2 begann.<br \/>\n02:27 \u2014 Block #85 (65e) wurde validiert und in die Hauptkette gesendet. <br \/>\n02:29 \u2014 Node #2 hat 111855 Transaktionen aus dem Pool \u00fcbernommen und formt Block #85 (256).<br \/>\n02:36 \u2014 Block #85 (256) wurde signiert und wird zur Validierung an andere Nodes gesendet.<br \/>\n02:36 \u2014 Das Demo-Skript des Servers #1 hat 1 Million Transaktionen in 42,5 Sekunden gesendet.<br \/>\n02:38 \u2014 Block #85 (256) wurde validiert und in die Hauptkette gesendet.<br \/>\n03:08 \u2014 Das Skript des Servers #2 hat 1 Million Transaktionen in 47 Sekunden gesendet. <br \/>\n03:38 \u2014 Alle Nodes haben aus der Hauptkette Informationen erhalten, dass die Bl\u00f6cke #85 (f21), #86 (65e) und #87 (256) hinzugef\u00fcgt wurden und beginnen, 330k, 250k, 111855 Transaktionen anzuwenden.<br \/>\n03:49 \u2014 Der Pool hat sich um 330k, 250k und 111855 Transaktionen geleert, die in die Bl\u00f6cke #85 (f21), #86 (65e) und #87 (256) aufgenommen wurden.<br \/>\n03:59 \u2014 Node #1 hat 888145 Transaktionen aus dem Pool \u00fcbernommen und bildet Block #88 (214), Node #2 hat 750k Transaktionen aus dem Pool \u00fcbernommen und bildet Block #88 (50a), Node #3 hat 670k Transaktionen aus dem Pool \u00fcbernommen und bildet Block #88 (d3b).<br \/>\n04:44 \u2014 Block #88 (d3b) wurde signiert und wird zur Validierung an andere Nodes gesendet.<br \/>\n04:58 \u2014 Block #88 (214) wurde signiert und wird zur Validierung an andere Nodes gesendet.<br \/>\n05:11 \u2014 Block #88 (50a) wurde signiert und an andere Knoten zur Validierung gesendet<br \/>\n05:11 \u2014 Block #85 (d3b) wurde validiert und in die Hauptkette gesendet <br \/>\n05:36 \u2014 Block #85 (214) wurde validiert und in die Hauptkette gesendet <br \/>\n05:43 \u2014 Alle Knoten erhielten aus der Hauptkette die Information, dass die Bl\u00f6cke #88 (d3b) und #89 (214) hinzugef\u00fcgt wurden und beginnen, 670k und 750k Transaktionen anzuwenden<br \/>\n06:50 \u2014 Aufgrund eines Verbindungsabbruchs wurde Block #85 (50a) nicht validiert<br \/>\n06:55 \u2014 Der Submit-Knoten #2 nahm 888145 Transaktionen aus dem Pool und bildet Block #90 (50a)<br \/>\n08:14 \u2014 Block #90 (50a) wurde signiert und an andere Knoten zur Validierung gesendet<br \/>\n09:04 \u2014 Block #90 (50a) wurde validiert und in die Hauptkette gesendet <br \/>\n11:23 \u2014 Alle Knoten erhielten aus der Hauptkette die Information, dass Block #90 (50a) hinzugef\u00fcgt wurde und beginnen, 888145 Transaktionen anzuwenden. Dabei hatte der Server #3 bereits Transaktionen aus den Bl\u00f6cken #88 (d3b) und #89 (214) angewendet<br \/>\n12:11 \u2014 Alle Pools sind leer<br \/>\n13:41 \u2014 Alle Knoten des Servers #3 enthalten 3 Millionen Transaktionen und Tokens<br \/>\n14:35 \u2014 Alle Knoten des Servers #1 enthalten 3 Millionen Transaktionen und Tokens<br \/>\n19:24 \u2014 Alle Knoten des Servers #2 enthalten 3 Millionen Transaktionen und Tokens <\/p>\n<h2>Hindernisse<\/h2>\n<p>\nW\u00e4hrend der Entwicklung von Plasma Cash sind wir auf folgende Probleme gesto\u00dfen, die wir schrittweise gel\u00f6st haben und weiterhin l\u00f6sen:<\/p>\n<p><b>1.<\/b> Konflikt zwischen verschiedenen Systemfunktionen. Zum Beispiel hat die Funktion zum Hinzuf\u00fcgen von Transaktionen den Betrieb des Submits und der Validierung von Bl\u00f6cken blockiert und umgekehrt, was zu einer Verlangsamung der Geschwindigkeit f\u00fchrte.<\/p>\n<p><b>2. <\/b>Es war nicht sofort klar, wie man eine gro\u00dfe Anzahl von Transaktionen senden und gleichzeitig die Daten\u00fcbertragungskosten minimieren kann.<\/p>\n<p><b>3. <\/b>Es war unklar, wie und wo die Daten gespeichert werden sollten, um optimale Ergebnisse zu erzielen.<\/p>\n<p><b>4. <\/b>Es war nicht klar, wie man das Netzwerk zwischen den Knoten organisieren sollte, da die Gr\u00f6\u00dfe eines Blocks mit 1 Million Transaktionen etwa 100 MB betr\u00e4gt.<\/p>\n<p><b>5.<\/b> Der Betrieb im Ein-Thread-Modus unterbricht die Verbindung zwischen den Knoten, wenn lange Berechnungen stattfinden (zum Beispiel beim Erstellen des Merkle-Baums und Berechnen seines Hashs).<\/p>\n<h2>Wie haben wir all dies gemeistert?<\/h2>\n<p>\nDie erste Version des Plasma Cash Nodes war eine Art Kombinationsger\u00e4t, das alles gleichzeitig erledigen konnte: Transaktionen annehmen, Bl\u00f6cke submitten und validieren und eine API f\u00fcr den Datenzugriff bereitstellen. Da NodeJS urspr\u00fcnglich ein-Threadig ist, hat die rechenintensive Funktion zur Berechnung des Merkle-Baums die Funktion zum Hinzuf\u00fcgen von Transaktionen blockiert. Wir haben zwei L\u00f6sungsans\u00e4tze f\u00fcr dieses Problem gesehen:<\/p>\n<p><b>1. <\/b>Mehrere NodeJS-Prozesse starten, von denen jeder bestimmte Funktionen ausf\u00fchrt.<\/p>\n<p><b>2. <\/b>worker_threads verwenden und Teile des Codes in Threads auslagern.<\/p>\n<p>Letztlich haben wir beide Optionen gleichzeitig genutzt: Eine Logiknode in 3 Teile unterteilt, die unabh\u00e4ngig, aber auch synchron arbeiten k\u00f6nnen.<\/p>\n<p><b>1.<\/b> Die Submit-Node, die Transaktionen in den Pool aufnimmt und Bl\u00f6cke erstellt.<\/p>\n<p><b>2.<\/b> Die Validierungs-Node, die die G\u00fcltigkeit der Nodes \u00fcberpr\u00fcft.<\/p>\n<p><b>3. <\/b>API-Node \u2014 bietet eine API f\u00fcr den Zugriff auf Daten.<\/p>\n<p>Dabei kann jede Node \u00fcber einen Unix-Socket mittels CLI verbunden werden.<\/p>\n<p>Schwere Operationen, wie die Berechnung des Merkle-Baums, haben wir in einen separaten Thread ausgelagert.<\/p>\n<p>So haben wir sichergestellt, dass alle Funktionen von Plasma Cash gleichzeitig und ohne St\u00f6rungen arbeiten.<\/p>\n<p>Sobald das System funktional war, begannen wir mit Tests der Geschwindigkeit und erhielten leider unzufriedenstellende Ergebnisse: 5.000 Transaktionen pro Sekunde und bis zu 50.000 Transaktionen pro Block. Wir mussten herausfinden, was falsch implementiert war.<\/p>\n<p>Zu Beginn haben wir den Kommunikationsmechanismus mit Plasma Cash getestet, um die maximale Leistungsf\u00e4higkeit des Systems zu ermitteln. Zuvor haben wir berichtet, dass der Plasma Cash-Knoten eine Unix-Socket-Schnittstelle bietet. Urspr\u00fcnglich war diese textbasiert. JSON-Objekte wurden mit `JSON.parse()` und `JSON.stringify()` \u00fcbertragen. <\/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>\nWir haben die \u00dcbertragungsgeschwindigkeit dieser Objekte gemessen und erhalten ~ 130.000 pro Sekunde. Wir haben versucht, die Standardfunktionen zur Bearbeitung von JSON zu ersetzen, aber die Leistung hat sich nicht verbessert. Offenbar ist der V8-Engine gut f\u00fcr diese Operationen optimiert.<\/p>\n<p>Der Umgang mit Transaktionen, Token und Bl\u00f6cken erfolgte \u00fcber Klassen. Bei der Erstellung solcher Klassen sank die Leistung um das Zweifache, was darauf hindeutet: OOP ist f\u00fcr uns nicht geeignet. Wir mussten alles auf einen rein funktionalen Ansatz umschreiben.<\/p>\n<h2>Datenbankeintrag<\/h2>\n<p>\nUrspr\u00fcnglich wurde Redis als eine der leistungsst\u00e4rksten L\u00f6sungen f\u00fcr die Datenspeicherung ausgew\u00e4hlt, da es unseren Anforderungen entspricht: ein Key-Value-Speicher, der mit Hash-Tabellen und Mengen arbeitet. Wir haben redis-benchmark ausgef\u00fchrt und ~80k Operationen pro Sekunde im 1 Pipelining-Modus erhalten.<\/p>\n<p>F\u00fcr hohe Leistung haben wir Redis feiner abgestimmt: <\/p>\n<ul>\n<li>Wir haben eine Unix-Socket-Verbindung eingerichtet.<\/li>\n<li>Wir haben die Speicherung des Zustands auf die Festplatte deaktiviert (zur Gew\u00e4hrleistung der Zuverl\u00e4ssigkeit kann eine Replik eingerichtet werden, die dann in einem separaten Redis die Speicherung auf der Festplatte vornimmt).<\/li>\n<\/ul>\n<p>\nIn Redis ist ein Pool eine Hash-Tabelle, da wir die M\u00f6glichkeit ben\u00f6tigen, alle Transaktionen mit einer Abfrage abzurufen und Transaktionen einzeln zu l\u00f6schen. Wir haben versucht, eine normale Liste zu verwenden, aber diese arbeitet langsamer beim Abrufen der gesamten Liste. <\/p>\n<p>Bei der Verwendung der Standard-NodeJS-Bibliothek f\u00fcr Redis haben wir eine Leistung von 18k Transaktionen pro Sekunde erreicht. Die Geschwindigkeit ist um das 9-fache gesunken. <\/p>\n<p>Da der Benchmark uns M\u00f6glichkeiten zeigte, die deutlich f\u00fcnffach gr\u00f6\u00dfer waren, haben wir mit der Optimierung begonnen. Wir wechselten die Bibliothek zu ioredis und erreichten bereits eine Leistung von 25.000 pro Sekunde. Die Transaktionen haben wir einzeln hinzugef\u00fcgt, indem wir den Befehl `hset` verwendeten. Dadurch generierten wir viele Anfragen an Redis. Die Idee entstand, Transaktionen in B\u00fcndeln zu kombinieren und sie mit einem einzigen Befehl `hmset` zu versenden. Das Ergebnis \u2014 32.000 pro Sekunde. <\/p>\n<p>Aus mehreren Gr\u00fcnden, die wir im Folgenden erl\u00e4utern, arbeiten wir mit den Daten unter Verwendung von `Buffer`. Es hat sich herausgestellt, dass wir durch die Umwandlung in Text (`buffer.toString('hex')`) vor dem Schreiben zus\u00e4tzliche Leistung erzielen k\u00f6nnen. Dadurch konnte die Geschwindigkeit auf 35.000 pro Sekunde erh\u00f6ht werden. Derzeit haben wir beschlossen, die weitere Optimierung auszusetzen.<\/p>\n<p>Wir mussten auf ein bin\u00e4res Protokoll umsteigen, da:<\/p>\n<p><b>1. <\/b>Das System berechnet h\u00e4ufig Hashes, digitale Signaturen usw., und daf\u00fcr ben\u00f6tigt es die Daten im `Buffer`.<\/p>\n<p><b>2.<\/b> Beim Versand zwischen den Diensten wiegen bin\u00e4re Daten weniger als Text. Zum Beispiel k\u00f6nnen die Daten eines Blocks mit 1 Million Transaktionen im Text mehr als 300 Megabyte einnehmen.<\/p>\n<p><b>3.<\/b> Die st\u00e4ndige Umwandlung von Daten hat Auswirkungen auf die Leistung.<\/p>\n<p>Deshalb haben wir unser eigenes bin\u00e4res Protokoll zur Speicherung und Daten\u00fcbertragung auf Basis der gro\u00dfartigen Bibliothek `binary-data` entwickelt.<\/p>\n<p>Daraus ergeben sich die folgenden Datenstrukturen:<\/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>\nMit den \u00fcblichen Befehlen `BD.encode(block, Protocol).slice();` und ` BD.decode(buffer, Protocol)` wandeln wir die Daten in ein `Buffer` um, um sie in Redis zu speichern oder an einen anderen Knoten zu senden und die Daten zur\u00fcckzugewinnen.<\/p>\n<p>Au\u00dferdem haben wir zwei bin\u00e4re Protokolle zur Daten\u00fcbertragung zwischen den Diensten:<\/p>\n<p><i> \u2014 Protokoll f\u00fcr die Interaktion mit Plasma Node \u00fcber 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 wo:<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 die auszuf\u00fchrende Aktion, zum Beispiel 1 \u2014 sendTransaction, 2 \u2014 getTransaction;<\/li>\n<li> <b>`payload`<\/b> \u2014 die Daten, die an die entsprechende Funktion \u00fcbergeben werden m\u00fcssen;<\/li>\n<li> <b>`messageId`<\/b> \u2014 die ID der Nachricht, um die Antwort identifizieren zu k\u00f6nnen. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Das Interaktionsprotokoll zwischen den Knoten<\/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 wo:<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 der Nachrichten-Code, zum Beispiel 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 die Protokollversion, da im Netzwerk Knoten mit unterschiedlichen Versionen aktiv sein k\u00f6nnen, die unterschiedlich arbeiten k\u00f6nnen;<\/li>\n<li> <b>`seq`<\/b> \u2014 die Nachrichten-ID;<\/li>\n<li> <b>`countChunk`<\/b> und <b>`chunkNumber`<\/b> werden ben\u00f6tigt, um gro\u00dfe Nachrichten zu splitten;<\/li>\n<li> <b>`length`<\/b> und <b>`payload`<\/b> die L\u00e4nge und die Daten selbst.<\/li>\n<\/ul>\n<p>\nDa wir die Daten im Voraus typisiert haben, arbeitet das gesamte System viel schneller als die `rlp` Bibliothek von Ethereum. Leider ist es uns bisher nicht gelungen, darauf zu verzichten, da der Smart Contract \u00fcberarbeitet werden muss, was wir in Zukunft planen.<\/p>\n<p>Wenn wir es geschafft haben, Geschwindigkeiten von <b>35 000<\/b> Transaktionen pro Sekunde zu erreichen, m\u00fcssen wir diese auch in optimaler Zeit verarbeiten. Da die ungef\u00e4hre Zeit zur Blockbildung 30 Sekunden betr\u00e4gt, m\u00fcssen wir in den Block <b>1 000 000<\/b> Transaktionen einf\u00fcgen, was bedeutet, dass wir mehr als <b>100<\/b> MB Daten \u00fcbertragen m\u00fcssen. <\/p>\n<p>Urspr\u00fcnglich haben wir die `ethereumjs-devp2p`-Bibliothek zur Kommunikation zwischen den Knoten verwendet, aber sie konnte mit der Menge an Daten nicht umgehen. Daher haben wir die `ws`-Bibliothek verwendet und die \u00dcbertragung bin\u00e4rer Daten \u00fcber Websocket eingerichtet. Nat\u00fcrlich hatten wir auch Probleme beim Versand gro\u00dfer Datenpakete, aber wir haben sie in Chunks aufgeteilt, und jetzt gibt es diese Probleme nicht mehr.<\/p>\n<p>Die Erstellung des Merkle-Baums und die Berechnung des Hashs <b>1 000 000<\/b> von Transaktionen erfordert etwa<b> 10<\/b> Sekunden kontinuierlicher Berechnungen. W\u00e4hrend dieser Zeit kann die Verbindung zu allen Knoten abbrechen. Daher wurde beschlossen, diese Berechnung in einen separaten Thread zu verlagern.<\/p>\n<h2>Fazit:<\/h2>\n<p>\nTats\u00e4chlich sind unsere Erkenntnisse nicht neu, aber aus irgendeinem Grund vergessen viele Fachleute sie bei der Entwicklung. <\/p>\n<ul>\n<li>Die Verwendung von funktionaler Programmierung anstelle von objektorientierter Programmierung erh\u00f6ht die Leistung.<\/li>\n<li>Monolithen ist schlechter als eine serviceorientierte Architektur f\u00fcr leistungsstarke Systeme auf NodeJS.<\/li>\n<li>Die Nutzung von `worker_threads` f\u00fcr rechenintensive Aufgaben verbessert die Systemreaktionsf\u00e4higkeit, insbesondere bei I\/O-Operationen.<\/li>\n<li>Unix-Sockets sind stabiler und schneller als HTTP-Anfragen.<\/li>\n<li>Wenn gro\u00dfe Datenmengen schnell \u00fcber das Netzwerk \u00fcbertragen werden m\u00fcssen, sollten WebSockets genutzt und bin\u00e4re Daten in Chunks gesendet werden, die im Falle eines Ausfalls erneut \u00fcbertragen und dann zu einer Nachricht zusammengef\u00fcgt werden k\u00f6nnen.<\/li>\n<\/ul>\n<p>\nWir laden Sie ein, <b>GitHub<\/b> Projekt: <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>Der Artikel wurde in Zusammenarbeit mit <i>Alexander Nashivan<\/i>, Senior-Entwickler bei <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47\u00d6ffentliche Testversion: L\u00f6sung f\u00fcr Privatsph\u00e4re und Skalierbarkeit in Ethereum | ProHoster","description":"Blockchain ist eine innovative Technologie, die verspricht, viele Bereiche des menschlichen Lebens zu verbessern. Sie transferiert reale Prozesse und Produkte in den digitalen Raum, sorgt f\u00fcr Geschwindigkeit und Zuverl\u00e4ssigkeit finanzieller Transaktionen, senkt deren Kosten und erm\u00f6glicht au\u00dferdem die Erstellung moderner DAPP-Anwendungen unter Verwendung von Smart Contracts in dezentralen Netzwerken. Angesichts der zahlreichen Vorteile und Anwendungsm\u00f6glichkeiten von Blockchain mag es seltsam erscheinen, dass dies","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}