{"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\/fr\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","title":{"rendered":"Test public : une solution pour la confidentialit\u00e9 et la scalabilit\u00e9 sur Ethereum","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b>Blockchain<\/b> est une technologie innovante qui promet d'am\u00e9liorer de nombreux aspects de la vie humaine. Elle transf\u00e8re des processus et des produits r\u00e9els dans l'espace num\u00e9rique, assurant la rapidit\u00e9 et la fiabilit\u00e9 des transactions financi\u00e8res, r\u00e9duisant leur co\u00fbt, et permettant \u00e9galement de cr\u00e9er des applications DAPP modernes utilisant des contrats intelligents dans des r\u00e9seaux d\u00e9centralis\u00e9s.<\/p>\n<p>\u00c9tant donn\u00e9 les nombreux avantages et les diff\u00e9rentes applications de la blockchain, il peut sembler \u00e9trange que cette technologie prometteuse ne soit pas encore pr\u00e9sente dans tous les secteurs. Le probl\u00e8me est que les blockchains d\u00e9centralis\u00e9es modernes manquent d'\u00e9volutivit\u00e9. Ethereum traite environ 20 transactions par seconde, ce qui est insuffisant pour r\u00e9pondre aux besoins du business dynamique moderne. Dans le m\u00eame temps, les entreprises utilisant la technologie blockchain n'osent pas abandonner Ethereum en raison de sa haute r\u00e9sistance au piratage et aux pannes de r\u00e9seau.<\/p>\n<p>Pour assurer la d\u00e9centralisation, la s\u00e9curit\u00e9 et la scalabilit\u00e9 dans la blockchain, r\u00e9pondant ainsi \u00e0 la Trillemme de la Scalabilit\u00e9, l'\u00e9quipe de d\u00e9veloppeurs <noindex><a rel=\"nofollow\" href=\"https:\/\/opporty.com\/\">Opporty<\/a><\/noindex> a cr\u00e9\u00e9 Plasma Cash \u2014 une cha\u00eene lat\u00e9rale, compos\u00e9e d'un contrat intelligent et d'un r\u00e9seau priv\u00e9 bas\u00e9 sur Node.js, transmettant p\u00e9riodiquement son \u00e9tat \u00e0 la cha\u00eene principale (Ethereum).<\/p>\n<p><img decoding=\"async\" alt=\"Test public : une solution pour la confidentialit\u00e9 et la scalabilit\u00e9 sur 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>Les processus cl\u00e9s dans Plasma Cash<\/h2>\n<p>\n<b>1. <\/b>L'utilisateur appelle la fonction du contrat intelligent `deposit`, lui transmettant le montant en ETH qu'il souhaite d\u00e9poser dans le token Plasma Cash. La fonction du contrat intelligent cr\u00e9e le token et g\u00e9n\u00e8re un \u00e9v\u00e9nement \u00e0 ce sujet.<\/p>\n<p><b>2. <\/b>Les n\u0153uds Plasma Cash, abonn\u00e9s aux \u00e9v\u00e9nements du contrat intelligent, re\u00e7oivent l'\u00e9v\u00e9nement de cr\u00e9ation du d\u00e9p\u00f4t et ajoutent \u00e0 la pool la transaction de cr\u00e9ation du token.<\/p>\n<p><b>3. <\/b>P\u00e9riodiquement, des n\u0153uds sp\u00e9ciaux Plasma Cash prennent toutes les transactions du pool (jusqu'\u00e0 1 million) et en forment un bloc, calculent l'arbre de Merkle et, par cons\u00e9quent, le hash. Ce bloc est envoy\u00e9 \u00e0 d'autres n\u0153uds pour v\u00e9rification. Les n\u0153uds v\u00e9rifient si le hash Merkle est valide, si les transactions sont valides (par exemple, si l'exp\u00e9diteur du jeton est bien le propri\u00e9taire). Apr\u00e8s la v\u00e9rification du bloc, le n\u0153ud appelle la fonction `submitBlock` du smart contract, qui enregistre dans la cha\u00eene principale le num\u00e9ro et le hash Merkle du bloc. Le smart contract g\u00e9n\u00e8re un \u00e9v\u00e9nement sur l'ajout r\u00e9ussi d'un bloc. Les transactions sont supprim\u00e9es du pool. <\/p>\n<p><b>4. <\/b>Les n\u0153uds ayant re\u00e7u l'\u00e9v\u00e9nement de soumission de bloc commencent \u00e0 appliquer les transactions qui ont \u00e9t\u00e9 ajout\u00e9es au bloc.<\/p>\n<p><b>5. <\/b>\u00c0 un moment donn\u00e9, le propri\u00e9taire (ou non-propri\u00e9taire) du jeton souhaite le retirer de Plasma Cash. Pour cela, il appelle la fonction `startExit`, en fournissant les informations sur les deux derni\u00e8res transactions concernant le jeton, qui prouvent qu'il est le propri\u00e9taire du jeton. Le smart contract, utilisant le hash Merkle, v\u00e9rifie la pr\u00e9sence des transactions dans les blocs et envoie le jeton pour retrait, qui aura lieu dans deux semaines.<\/p>\n<p><b>6. <\/b>Si l'op\u00e9ration de retrait du jeton a \u00e9t\u00e9 effectu\u00e9e de mani\u00e8re irr\u00e9guli\u00e8re (le jeton a \u00e9t\u00e9 d\u00e9pens\u00e9 apr\u00e8s le d\u00e9but de la proc\u00e9dure de retrait ou le jeton avait d\u00e9j\u00e0 \u00e9t\u00e9 pris par un tiers avant le retrait), le propri\u00e9taire du jeton peut contester le retrait dans un d\u00e9lai de deux semaines.<\/p>\n<p><img decoding=\"async\" alt=\"Test public : une solution pour la confidentialit\u00e9 et la scalabilit\u00e9 sur Ethereum\" src=\"\/wp-content\/uploads\/2019\/10\/0626ca6b010eb847175dbfb0b6d7b357.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>La confidentialit\u00e9 est atteinte de deux mani\u00e8res.<\/h2>\n<p>\n<b>1. <\/b>La cha\u00eene principale ne sait rien des transactions qui se forment et se transmettent \u00e0 l'int\u00e9rieur de la cha\u00eene secondaire. L'information concernant qui a d\u00e9pos\u00e9 et retir\u00e9 de l'ETH dans\/sout Plasma Cash reste publique.<\/p>\n<p><b>2. <\/b>La cha\u00eene secondaire permet d'organiser des transactions anonymes en utilisant des zk-SNARKs.<\/p>\n<h2>Environnement technologique<\/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>Test <\/h2>\n<p>\nEn d\u00e9veloppant Plasma Cash, nous avons test\u00e9 la vitesse du syst\u00e8me et obtenu les r\u00e9sultats suivants :<\/p>\n<ul>\n<li>jusqu'\u00e0 35 000 transactions par seconde ajout\u00e9es au pool ;<\/li>\n<li>jusqu'\u00e0 1 000 000 transactions peuvent \u00eatre stock\u00e9es dans un bloc.<\/li>\n<\/ul>\n<p>\nLes tests ont \u00e9t\u00e9 r\u00e9alis\u00e9s sur 3 serveurs suivants :<\/p>\n<p><i>1. Intel Core i7-6700 Quad-Core Skylake avec NVMe SSD \u2014 512 Go, 64 Go DDR4 RAM<\/i><br \/>\n 3 n\u0153uds valides Plasma Cash ont \u00e9t\u00e9 mis en place.<\/p>\n<p><i>2. AMD Ryzen 7 1700X Octa-Core \u00ab Summit Ridge \u00bb (Zen), SATA SSD \u2014 500 Go, 64 Go DDR4 RAM<\/i><br \/>\n Un n\u0153ud ETH de testnet Ropsten a \u00e9t\u00e9 mis en place.<br \/>\n 3 n\u0153uds valides Plasma Cash ont \u00e9t\u00e9 mis en place.<\/p>\n<p><i>3. Intel Core i9-9900K Octa-Core avec NVMe SSD \u2014 1 To, 64 Go DDR4 RAM<\/i><br \/>\n Un n\u0153ud de soumission Plasma Cash a \u00e9t\u00e9 mis en place.<br \/>\n 3 n\u0153uds valides Plasma Cash ont \u00e9t\u00e9 mis en place.<br \/>\n Un test a \u00e9t\u00e9 lanc\u00e9 pour ajouter des transactions dans le r\u00e9seau Plasma Cash.<\/p>\n<p><b>Total : <\/b>10 n\u0153uds Plasma Cash dans un r\u00e9seau priv\u00e9.<\/p>\n<h3>Test 1<\/h3>\n<p>\nLa limite est de 1 million de transactions par bloc. Ainsi, 1 million de transactions se retrouvent dans 2 blocs (puisque le syst\u00e8me parvient \u00e0 traiter une partie des transactions et \u00e0 les soumettre pendant qu'elles sont envoy\u00e9es).<\/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=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n\u00c9tat initial : dernier bloc #7 ; 1 million de transactions et de jetons sont enregistr\u00e9s dans la base.<\/p>\n<p>00:00 \u2014 lancement du script de g\u00e9n\u00e9ration de transactions<br \/>\n01:37 \u2014 1 million de transactions cr\u00e9\u00e9es et l'envoi vers le n\u0153ud a commenc\u00e9<br \/>\n01:46 \u2014 le n\u0153ud de soumission a pris 240k transactions du pool et commence \u00e0 former le bloc #8. Nous voyons \u00e9galement que 320k transactions sont ajout\u00e9es au pool en 10 secondes<br \/>\n01:58 \u2014 le bloc #8 a \u00e9t\u00e9 sign\u00e9 et envoy\u00e9 pour validation<br \/>\n02:03 \u2014 le bloc #8 a \u00e9t\u00e9 valid\u00e9 et la fonction `submitBlock` du contrat intelligent avec le hachage Merkle et le num\u00e9ro du bloc a \u00e9t\u00e9 appel\u00e9e<br \/>\n02:10 \u2014 le script de d\u00e9monstration a termin\u00e9 son travail, ayant envoy\u00e9 1 million de transactions en 32 secondes<br \/>\n02:33 \u2014 les n\u0153uds ont commenc\u00e9 \u00e0 recevoir des informations indiquant que le bloc #8 a \u00e9t\u00e9 ajout\u00e9 \u00e0 la cha\u00eene principale et ont commenc\u00e9 \u00e0 traiter 240k transactions<br \/>\n02:40 \u2014 240k transactions ont \u00e9t\u00e9 retir\u00e9es du pool, qui sont d\u00e9j\u00e0 dans le bloc #8<br \/>\n02:56 \u2014 le n\u0153ud de soumission a pris les 760k transactions restantes du pool et a commenc\u00e9 \u00e0 calculer le hachage Merkle et \u00e0 signer le bloc #9<br \/>\n03:20 \u2014 tous les n\u0153uds contiennent 1 million 240k transactions et jetons<br \/>\n03:35 \u2014 le bloc #9 a \u00e9t\u00e9 sign\u00e9 et est envoy\u00e9 pour validation \u00e0 d'autres n\u0153uds <br \/>\n03:41 \u2014 erreur r\u00e9seau survenue<br \/>\n04:40 \u2014 l'attente de validation du bloc #9 a \u00e9t\u00e9 interrompue par un timeout<br \/>\n04:54 \u2014 le n\u0153ud de soumission a pris les 760k transactions restantes du pool et a commenc\u00e9 \u00e0 calculer le hachage Merkle et \u00e0 signer le bloc #9<br \/>\n05:32 \u2014 le bloc #9 a \u00e9t\u00e9 sign\u00e9 et envoy\u00e9 pour validation \u00e0 d'autres n\u0153uds<br \/>\n05:53 \u2014 le bloc #9 a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene principale<br \/>\n06:17 \u2014 les n\u0153uds ont commenc\u00e9 \u00e0 recevoir des informations indiquant que le bloc #9 a \u00e9t\u00e9 ajout\u00e9 \u00e0 la cha\u00eene principale et ont commenc\u00e9 \u00e0 traiter 760k transactions<br \/>\n06:47 \u2014 le pool a \u00e9t\u00e9 nettoy\u00e9 des transactions contenues dans le bloc #9<br \/>\n09:06 \u2014 tous les n\u0153uds contiennent 2 millions de transactions et jetons<\/p>\n<h3>Test 2<\/h3>\n<p>\nLa limite est de 350k par bloc. Nous avons donc 3 blocs.<\/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=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n\u00c9tat initial : dernier bloc #9 ; 2 millions de transactions et jetons sont enregistr\u00e9s dans la base<\/p>\n<p>00:00 \u2014 le script de g\u00e9n\u00e9ration de transactions est d\u00e9j\u00e0 en cours d'ex\u00e9cution<br \/>\n00:44 \u2014 1 million de transactions cr\u00e9\u00e9es et l'envoi vers le n\u0153ud a commenc\u00e9<br \/>\n00:56 \u2014 le n\u0153ud de soumission a pris 320k transactions du pool et commence \u00e0 former le bloc #10. Nous voyons \u00e9galement que 320k transactions sont ajout\u00e9es au pool en 10 secondes<br \/>\n01:12 \u2014 le bloc #10 a \u00e9t\u00e9 sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation<br \/>\n01:18 \u2014 le script de d\u00e9monstration a termin\u00e9 son travail, ayant envoy\u00e9 1 million de transactions en 34 secondes<br \/>\n01:20 \u2014 le bloc #10 a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene racine <br \/>\n01:51 \u2014 tous les n\u0153uds ont re\u00e7u de la cha\u00eene racine l'information que le bloc #10 a \u00e9t\u00e9 ajout\u00e9, et commencent \u00e0 appliquer 320k transactions<br \/>\n02:01 \u2014 le pool s'est vid\u00e9 de 320k transactions qui ont \u00e9t\u00e9 ajout\u00e9es au bloc #10<br \/>\n02:15 \u2014 le n\u0153ud de soumission a pris 350k transactions du pool et forme le bloc #11<br \/>\n02:34 \u2014 le bloc #11 est sign\u00e9 et envoy\u00e9 aux autres n\u0153uds pour validation<br \/>\n02:51 \u2014 le bloc #11 a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene racine <br \/>\n02:55 \u2014 le dernier n\u0153ud a ex\u00e9cut\u00e9 les transactions du bloc #10<br \/>\n10:59 \u2014 une transaction avec la soumission du bloc #9 a pris beaucoup de temps dans la cha\u00eene racine, mais elle a \u00e9t\u00e9 ex\u00e9cut\u00e9e et tous les n\u0153uds ont re\u00e7u l'information et ont commenc\u00e9 \u00e0 ex\u00e9cuter 350k transactions<br \/>\n11:05 \u2014 le pool s'est vid\u00e9 de 320k transactions qui ont \u00e9t\u00e9 ajout\u00e9es au bloc #11<br \/>\n12:10 \u2014 tous les n\u0153uds contiennent 1 million 670k transactions et tokens<br \/>\n12:17 \u2014 le n\u0153ud de soumission a pris 330k transactions du pool et forme le bloc #12<br \/>\n12:32 \u2014 le bloc #12 est sign\u00e9 et envoy\u00e9 aux autres n\u0153uds pour validation<br \/>\n12:39 \u2014 le bloc #12 a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene racine <br \/>\n13:44 \u2014 tous les n\u0153uds ont re\u00e7u de la cha\u00eene racine l'information que le bloc #12 a \u00e9t\u00e9 ajout\u00e9 et commencent \u00e0 appliquer 330k transactions<br \/>\n14:50 \u2014 tous les n\u0153uds contiennent 2 millions de transactions et tokens<\/p>\n<h3>Test 3<\/h3>\n<p>\nDans le premier et le deuxi\u00e8me serveurs, un n\u0153ud validant a \u00e9t\u00e9 remplac\u00e9 par un n\u0153ud de soumission. <\/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=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n\u00c9tat initial : dernier bloc #84 ; 0 transactions et tokens sont conserv\u00e9s dans la base<\/p>\n<p>00:00 \u2014 3 scripts ont \u00e9t\u00e9 lanc\u00e9s, g\u00e9n\u00e9rant et envoyant chacun 1 million de transactions<br \/>\n01:38 \u2014 1 million de transactions a \u00e9t\u00e9 cr\u00e9\u00e9 et l'envoi vers le n\u0153ud de soumission #3 a commenc\u00e9<br \/>\n01:50 \u2014 le n\u0153ud de soumission #3 a pris 330k transactions du pool et forme le bloc #85 (f21). Nous voyons aussi que 350k transactions sont ajout\u00e9es au pool en 10 secondes<br \/>\n01:53 \u2014 1 million de transactions a \u00e9t\u00e9 cr\u00e9\u00e9 et l'envoi vers le n\u0153ud de soumission #1 a commenc\u00e9<br \/>\n01:50 \u2014 le n\u0153ud de soumission #3 a pris 330k transactions du pool et forme le bloc #85 (f21). Nous voyons aussi que 350k transactions sont ajout\u00e9es au pool en 10 secondes<br \/>\n02:01 \u2014 le n\u0153ud de soumission #1 a pris 250k transactions du pool et forme le bloc #85 (65e)<br \/>\n02:06 \u2014 le bloc #85 (f21) est sign\u00e9 et envoy\u00e9 aux autres n\u0153uds pour validation<br \/>\n02:08 \u2014 le script de d\u00e9monstration du serveur #3 a termin\u00e9 son travail, ayant envoy\u00e9 1 million de transactions en 30 secondes<br \/>\n02:14 \u2014 le bloc #85 (f21) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene racine <br \/>\n02:19 \u2014 le bloc #85 (65e) est sign\u00e9 et envoy\u00e9 aux autres n\u0153uds pour validation<br \/>\n02:22 \u2014 1 million de transactions a \u00e9t\u00e9 cr\u00e9\u00e9 et l'envoi vers le n\u0153ud de soumission #2 a commenc\u00e9<br \/>\n02:27 \u2014 le bloc #85 (65e) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 dans la cha\u00eene racine <br \/>\n02:29 \u2014 le n\u0153ud de soumission #2 a pris 111855 transactions du pool et forme le bloc #85 (256).<br \/>\n02:36 \u2014 le bloc #85 (256) est sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation.<br \/>\n02:36 \u2014 le script de d\u00e9mon du serveur #1 a termin\u00e9 son travail, ayant envoy\u00e9 1 million de transactions en 42,5 secondes.<br \/>\n02:38 \u2014 le bloc #85 (256) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 \u00e0 la cha\u00eene racine.<br \/>\n03:08 \u2014 le script de d\u00e9mon du serveur #2 a termin\u00e9 son travail, ayant envoy\u00e9 1 million de transactions en 47 secondes. <br \/>\n03:38 \u2014 tous les n\u0153uds ont re\u00e7u de la cha\u00eene racine l'information que les blocs #85 (f21), #86(65e), #87(256) ont \u00e9t\u00e9 ajout\u00e9s et commencent \u00e0 appliquer 330k, 250k, 111855 transactions.<br \/>\n03:49 \u2014 le pool a \u00e9t\u00e9 vid\u00e9 de 330k, 250k, 111855 transactions, qui ont \u00e9t\u00e9 ajout\u00e9es aux blocs #85 (f21), #86(65e), #87(256).<br \/>\n03:59 \u2014 le n\u0153ud de soumission #1 a pris 888145 transactions du pool et forme le bloc #88 (214), le n\u0153ud de soumission #2 a pris 750k transactions du pool et forme le bloc #88 (50a), le n\u0153ud de soumission #3 a pris 670k transactions du pool et forme le bloc #88 (d3b).<br \/>\n04:44 \u2014 le bloc #88 (d3b) est sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation.<br \/>\n04:58 \u2014 le bloc #88 (214) est sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation.<br \/>\n05:11 \u2014 le bloc #88 (50a) est sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation.<br \/>\n05:11 \u2014 le bloc #85 (d3b) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 \u00e0 la cha\u00eene racine. <br \/>\n05:36 \u2014 le bloc #85 (214) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 \u00e0 la cha\u00eene racine. <br \/>\n05:43 \u2014 tous les n\u0153uds ont re\u00e7u de la cha\u00eene racine l'information que les blocs #88 (d3b), #89(214) ont \u00e9t\u00e9 ajout\u00e9s et commencent \u00e0 appliquer 670k, 750k transactions.<br \/>\n06:50 \u2014 en raison de la perte de connexion, le bloc #85 (50a) n'a pas \u00e9t\u00e9 valid\u00e9.<br \/>\n06:55 \u2014 le n\u0153ud de soumission #2 a pris 888145 transactions du pool et forme le bloc #90 (50a).<br \/>\n08:14 \u2014 le bloc #90 (50a) est sign\u00e9 et envoy\u00e9 \u00e0 d'autres n\u0153uds pour validation.<br \/>\n09:04 \u2014 le bloc #90 (50a) a \u00e9t\u00e9 valid\u00e9 et envoy\u00e9 \u00e0 la cha\u00eene racine. <br \/>\n11:23 \u2014 tous les n\u0153uds du serveur #3 ont re\u00e7u de la cha\u00eene racine l'information que le bloc #90 (50a) a \u00e9t\u00e9 ajout\u00e9, et commencent \u00e0 appliquer 888145 transactions. Pendant ce temps, le serveur #3 a d\u00e9j\u00e0 appliqu\u00e9 les transactions des blocs #88 (d3b), #89(214).<br \/>\n12:11 \u2014 tous les pools sont vides.<br \/>\n13:41 \u2014 tous les n\u0153uds du serveur #3 contiennent 3 millions de transactions et de jetons.<br \/>\n14:35 \u2014 tous les n\u0153uds du serveur #1 contiennent 3 millions de transactions et de jetons.<br \/>\n19:24 \u2014 tous les n\u0153uds du serveur #2 contiennent 3 millions de transactions et de jetons. <\/p>\n<h2>Obstacles<\/h2>\n<p>\nLors du d\u00e9veloppement de Plasma Cash, nous avons rencontr\u00e9 les probl\u00e8mes suivants, que nous avons r\u00e9solus et continuons de r\u00e9soudre :<\/p>\n<p><b>1.<\/b> Conflit d'interaction entre diff\u00e9rentes fonctions du syst\u00e8me. Par exemple, la fonctionnalit\u00e9 d'ajout de transactions dans le pool bloquait le fonctionnement du soumission et de la validation des blocs, et vice versa, ce qui entra\u00eenait une baisse de la vitesse.<\/p>\n<p><b>2. <\/b>Il n'\u00e9tait pas clair comment envoyer un grand nombre de transactions tout en minimisant les co\u00fbts de transmission des donn\u00e9es.<\/p>\n<p><b>3. <\/b>On ne savait pas comment et o\u00f9 stocker les donn\u00e9es pour obtenir de bons r\u00e9sultats.<\/p>\n<p><b>4. <\/b>Il n'\u00e9tait pas clair comment organiser le r\u00e9seau entre les n\u0153uds, car la taille d'un bloc avec 1 million de transactions occupe environ 100 Mo.<\/p>\n<p><b>5.<\/b> Le fonctionnement en mode monothread interrompt la connexion entre les n\u0153uds lorsque des calculs longs se produisent (par exemple, la construction de l'arbre de Merkle et le calcul de son hachage).<\/p>\n<h2>Comment avons-nous g\u00e9r\u00e9 tout cela ?<\/h2>\n<p>\nLa premi\u00e8re version du n\u0153ud Plasma Cash \u00e9tait une sorte de combine qui pouvait tout faire en m\u00eame temps : accepter des transactions, soumettre et valider des blocs, fournir une API pour acc\u00e9der aux donn\u00e9es. \u00c9tant donn\u00e9 que NodeJS est initialement monothread, la lourde fonction de calcul de l'arbre de Merkle bloquait la fonction d'ajout de transactions. Nous avons vu deux options pour r\u00e9soudre ce probl\u00e8me :<\/p>\n<p><b>1. <\/b>Lancer plusieurs processus NodeJS, chacun ex\u00e9cutant certaines fonctions.<\/p>\n<p><b>2. <\/b>Utiliser worker_threads et d\u00e9placer l'ex\u00e9cution d'une partie du code dans des threads.<\/p>\n<p>En fin de compte, nous avons utilis\u00e9 les deux options en m\u00eame temps : nous avons logiquement s\u00e9par\u00e9 un n\u0153ud en 3 parties, qui peuvent fonctionner s\u00e9par\u00e9ment, mais en m\u00eame temps de mani\u00e8re synchronis\u00e9e.<\/p>\n<p><b>1.<\/b> N\u0153ud de soumission, qui accepte les transactions dans le pool et s'occupe de la cr\u00e9ation de blocs.<\/p>\n<p><b>2.<\/b> N\u0153ud de validation, qui v\u00e9rifie la validit\u00e9 des n\u0153uds.<\/p>\n<p><b>3. <\/b>N\u0153ud API \u2014 fournit une API pour acc\u00e9der aux donn\u00e9es.<\/p>\n<p>Chaque n\u0153ud peut \u00eatre connect\u00e9 via un socket unix par le biais de cli.<\/p>\n<p>Les op\u00e9rations lourdes, telles que le calcul de l'arbre de Merkle, ont \u00e9t\u00e9 transf\u00e9r\u00e9es dans un thread s\u00e9par\u00e9.<\/p>\n<p>Ainsi, nous avons r\u00e9ussi \u00e0 faire fonctionner toutes les fonctions de Plasma Cash en m\u00eame temps et sans pannes.<\/p>\n<p>Une fois que le syst\u00e8me a fonctionn\u00e9 fonctionnellement, nous avons commenc\u00e9 \u00e0 tester la vitesse et, malheureusement, nous avons obtenu des r\u00e9sultats insatisfaisants : 5 000 transactions par seconde et jusqu'\u00e0 50 000 transactions dans un bloc. Il a fallu comprendre ce qui avait \u00e9t\u00e9 mal mis en \u0153uvre.<\/p>\n<p>Pour commencer, nous avons commenc\u00e9 \u00e0 tester le m\u00e9canisme de communication avec Plasma Cash pour conna\u00eetre la capacit\u00e9 maximale du syst\u00e8me. Auparavant, nous avons \u00e9crit que le n\u0153ud Plasma Cash fournit une interface de socket Unix. Initialement, il \u00e9tait textuel. Les objets JSON \u00e9taient transf\u00e9r\u00e9s en utilisant `JSON.parse()` et `JSON.stringify()`. <\/p>\n<pre><code class=\"plaintext\">```json\n{\n  \"action\": \"sendTransaction\",\n  \"payload\":{\n    \"prevHash\": \"0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0\",\n    \"prevBlock\": 41,\n    \"tokenId\": \"57570139642005649136210751546585740989890521125187435281313126554130572876445\",\n    \"newOwner\": \"0x200eabe5b26e547446ae5821622892291632d4f4\",\n    \"type\": \"pay\",\n    \"data\": \"\",\n    \"signature\": \"0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c\"\n  }\n}\n```\n<\/code><\/pre>\n<p>\nNous avons mesur\u00e9 la vitesse de transfert de tels objets et avons obtenu environ 130 000 par seconde. Nous avons essay\u00e9 de remplacer les fonctions standard travaillant avec JSON, mais la performance ne s'est pas am\u00e9lior\u00e9e. Le moteur V8 doit \u00eatre bien optimis\u00e9 pour ces op\u00e9rations.<\/p>\n<p>La gestion des transactions, des jetons et des blocs se faisait via des classes. Lors de la cr\u00e9ation de telles classes, la performance a chut\u00e9 de moiti\u00e9, ce qui indique que la POO ne nous convient pas. Nous avons d\u00fb tout r\u00e9\u00e9crire en utilisant une approche fonctionnelle.<\/p>\n<h2>\u00c9criture dans la base de donn\u00e9es<\/h2>\n<p>\nAu d\u00e9part, Redis a \u00e9t\u00e9 choisi pour le stockage des donn\u00e9es comme l'une des solutions les plus performantes r\u00e9pondant \u00e0 nos exigences : stockage cl\u00e9-valeur, travail avec des tables de hachage, ensembles. Nous avons lanc\u00e9 redis-benchmark et obtenu environ 80 000 op\u00e9rations par seconde en mode de 1 pipelining.<\/p>\n<p>Pour une performance \u00e9lev\u00e9e, nous avons configur\u00e9 Redis de mani\u00e8re plus fine : <\/p>\n<ul>\n<li>Nous avons \u00e9tabli une connexion de socket Unix.<\/li>\n<li>Nous avons d\u00e9sactiv\u00e9 la sauvegarde d'\u00e9tat sur disque (pour la fiabilit\u00e9, il est possible de configurer une r\u00e9plique et de faire des sauvegardes sur disque dans un autre Redis).<\/li>\n<\/ul>\n<p>\nDans Redis, un pool est une table de hachage, car nous avons besoin de la possibilit\u00e9 d'obtenir toutes les transactions en une seule requ\u00eate et de supprimer les transactions une par une. Nous avons essay\u00e9 d'utiliser une liste ordinaire, mais elle fonctionne plus lentement lors du d\u00e9chargement de la liste enti\u00e8re. <\/p>\n<p>Lors de l'utilisation de la biblioth\u00e8que Redis standard de NodeJS, nous avons obtenu une performance de 18 000 transactions par seconde. La vitesse a chut\u00e9 de 9 fois. <\/p>\n<p>\u00c9tant donn\u00e9 que le benchmark nous a montr\u00e9 des capacit\u00e9s clairement cinq fois sup\u00e9rieures, nous avons commenc\u00e9 \u00e0 optimiser. Nous avons chang\u00e9 la biblioth\u00e8que pour ioredis et avons obtenu des performances de 25k par seconde. Nous ajoutions des transactions individuellement, en utilisant la commande `hset`. Ainsi, nous g\u00e9n\u00e9rions de nombreuses requ\u00eates vers Redis. L'id\u00e9e est n\u00e9e de regrouper les transactions en lots et de les envoyer avec une seule commande `hmset`. Le r\u00e9sultat \u2014 32k par seconde. <\/p>\n<p>Pour plusieurs raisons que nous d\u00e9crirons ci-dessous, nous travaillons avec les donn\u00e9es en utilisant `Buffer` et, comme il s'est av\u00e9r\u00e9, si nous le convertissons en texte (`buffer.toString('hex')`) avant l'\u00e9criture, nous pouvons obtenir une performance suppl\u00e9mentaire. Ainsi, la vitesse a pu \u00eatre augment\u00e9e jusqu'\u00e0 35 000 par seconde. Pour l'instant, nous avons d\u00e9cid\u00e9 de suspendre l'optimisation suppl\u00e9mentaire.<\/p>\n<p>Nous avons d\u00fb passer \u00e0 un protocole binaire car :<\/p>\n<p><b>1. <\/b>Le syst\u00e8me calcule souvent des hachages, des signatures, etc., et pour cela, il a besoin de donn\u00e9es sous forme de `Buffer`.<\/p>\n<p><b>2.<\/b> Lors de la transmission entre services, les donn\u00e9es binaires p\u00e8sent moins que les donn\u00e9es textuelles. Par exemple, lors de l'envoi d'un bloc de 1 million de transactions, les donn\u00e9es en texte peuvent occuper plus de 300 m\u00e9gaoctets.<\/p>\n<p><b>3.<\/b> La conversion constante des donn\u00e9es affecte la performance.<\/p>\n<p>C'est pourquoi nous avons bas\u00e9 notre propre protocole binaire de stockage et de transmission de donn\u00e9es, d\u00e9velopp\u00e9 sur la base de la biblioth\u00e8que remarquable `binary-data`.<\/p>\n<p>En cons\u00e9quence, nous avons obtenu les structures de donn\u00e9es suivantes :<\/p>\n<h3> \u2014 Transaction<\/h3>\n<p><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    prevHash: BD.types.buffer(20),\n    prevBlock: BD.types.uint24le,\n    tokenId: BD.types.string(null),\n    type: BD.types.uint8,\n    newOwner: BD.types.buffer(20),\n    dataLength: BD.types.uint24le,\n    data: BD.types.buffer(({current}) =&gt; current.dataLength),\n    signature: BD.types.buffer(65),\n    hash: BD.types.buffer(32),\n    blockNumber: BD.types.uint24le,\n    timestamp: BD.types.uint48le,\n  }\n  ```\n<\/code><\/pre>\n<p><\/p>\n<h3> \u2014 Token<\/h3>\n<p><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    id: BD.types.string(null),\n    owner: BD.types.buffer(20),\n    block: BD.types.uint24le,\n    amount: BD.types.string(null),\n  }\n  ```\n<\/code><\/pre>\n<p><\/p>\n<h3> \u2014 Bloc<\/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>\nAvec les commandes habituelles `BD.encode(block, Protocol).slice();` et ` BD.decode(buffer, Protocol)`, nous convertissons les donn\u00e9es en `Buffer` pour les stocker dans Redis ou les transmettre \u00e0 un autre n\u0153ud et r\u00e9cup\u00e9rer les donn\u00e9es.<\/p>\n<p>Nous avons \u00e9galement 2 protocoles binaires pour la transmission de donn\u00e9es entre services :<\/p>\n<p><i> \u2014 Protocole pour l'interaction avec le Plasma Node via un socket unix<\/i><\/p>\n<pre><code class=\"plaintext\">  ```json\n  {\n    type: BD.types.uint8,\n    messageId: BD.types.uint24le,\n    error: BD.types.uint8,\n    length: BD.types.uint24le,\n    payload: BD.types.buffer(({node}) =&gt; node.length)\n  }\n  ```\n<\/code><\/pre>\n<p>\n o\u00f9 :<\/p>\n<ul>\n<li> <b>`type`<\/b> \u2014 une action \u00e0 ex\u00e9cuter, par exemple 1 \u2014 sendTransaction, 2 \u2014 getTransaction ;<\/li>\n<li> <b>`payload`<\/b> \u2014 les donn\u00e9es \u00e0 transmettre \u00e0 la fonction correspondante ;<\/li>\n<li> <b>`messageId`<\/b> \u2014 l'identifiant du message, permettant d'identifier la r\u00e9ponse. <\/li>\n<\/ul>\n<p>\n<i> \u2014 Le protocole d'interaction entre les n\u0153uds<\/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 o\u00f9 :<\/p>\n<ul>\n<li> <b>`code`<\/b> \u2014 le code du message, par exemple 6 \u2014 PREPARE_NEW_BLOCK, 7 \u2014 BLOCK_VALID, 8 \u2014 BLOCK_COMMIT ;<\/li>\n<li> <b>`versionProtocol`<\/b> \u2014 la version du protocole, car il peut y avoir des n\u0153uds dans le r\u00e9seau avec diff\u00e9rentes versions qui peuvent fonctionner diff\u00e9remment ;<\/li>\n<li> <b>`seq`<\/b> \u2014 identifiant du message ;<\/li>\n<li> <b>`countChunk`<\/b> et <b>`chunkNumber`<\/b> n\u00e9cessaires pour diviser les gros messages ;<\/li>\n<li> <b>`length`<\/b> et <b>`payload`<\/b> la longueur et les donn\u00e9es elles-m\u00eames.<\/li>\n<\/ul>\n<p>\n\u00c9tant donn\u00e9 que nous avons pr\u00e9alablement typ\u00e9 les donn\u00e9es, le syst\u00e8me final fonctionne beaucoup plus rapidement que la biblioth\u00e8que `rlp` d'Ethereum. Malheureusement, nous n'avons pas encore pu nous en passer, car il est n\u00e9cessaire de retravailler le contrat intelligent, ce que nous pr\u00e9voyons de faire \u00e0 l'avenir.<\/p>\n<p>Si nous avons r\u00e9ussi \u00e0 atteindre la vitesse <b>35 000<\/b> des transactions par seconde, nous devons \u00e9galement les traiter dans un d\u00e9lai optimal. Comme le temps moyen de formation d'un bloc est d'environ 30 secondes, nous devons inclure dans le bloc <b>1 000 000<\/b> des transactions, ce qui signifie transf\u00e9rer plus de <b>100<\/b> Mo de donn\u00e9es. <\/p>\n<p>Au d\u00e9part, nous avons utilis\u00e9 la biblioth\u00e8que `ethereumjs-devp2p` pour la communication entre les n\u0153uds, mais elle ne g\u00e9rait pas une telle quantit\u00e9 de donn\u00e9es. En cons\u00e9quence, nous avons utilis\u00e9 la biblioth\u00e8que `ws` et configur\u00e9 le transfert de donn\u00e9es binaires via websocket. Bien s\u00fbr, nous avons \u00e9galement rencontr\u00e9 des probl\u00e8mes lors du transfert de gros paquets de donn\u00e9es, mais nous les avons divis\u00e9s en chunks et ces probl\u00e8mes n'existent plus maintenant.<\/p>\n<p>La formation de l'arbre de Merkle et le calcul du hachage <b>1 000 000<\/b> des transactions prend environ<b> 10<\/b> secondes de calcul continu. Pendant ce temps, la connexion avec tous les n\u0153uds peut \u00eatre interrompue. Il a \u00e9t\u00e9 d\u00e9cid\u00e9 de d\u00e9placer ce calcul dans un thread s\u00e9par\u00e9.<\/p>\n<h2>Conclusions :<\/h2>\n<p>\nEn r\u00e9alit\u00e9, nos conclusions ne sont pas nouvelles, mais pour une raison quelconque, de nombreux sp\u00e9cialistes les oublient lors du d\u00e9veloppement. <\/p>\n<ul>\n<li>L'utilisation de la programmation fonctionnelle plut\u00f4t que de la programmation orient\u00e9e objet augmente les performances.<\/li>\n<li>Le monolithe est moins performant qu'une architecture de services pour un syst\u00e8me performant sur NodeJS.<\/li>\n<li>L'utilisation de `worker_threads` pour les calculs lourds am\u00e9liore la r\u00e9activit\u00e9 du syst\u00e8me, en particulier lors des op\u00e9rations i\/o.<\/li>\n<li>Les sockets UNIX sont plus stables et plus rapides que les requ\u00eates HTTP.<\/li>\n<li>Si vous devez transmettre rapidement de grandes quantit\u00e9s de donn\u00e9es sur le r\u00e9seau, il est pr\u00e9f\u00e9rable d'utiliser des websockets et d'envoyer des donn\u00e9es binaires divis\u00e9es en morceaux, qui peuvent \u00eatre retransmises si elles ne r\u00e9ussissent pas \u00e0 arriver, puis regroup\u00e9es en un seul message.<\/li>\n<\/ul>\n<p>\nNous vous invitons \u00e0 visiter <b>GitHub<\/b> le projet : <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>Cet article a \u00e9t\u00e9 co\u00e9crit avec <i>Alexandre Nashivan<\/i>, d\u00e9veloppeur senior <noindex><a rel=\"nofollow\" href=\"https:\/\/clever-solution.com\/\">Clever Solution Inc<\/a><\/noindex>.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/471096\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041e\u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0432 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0438\u0445 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 DAPP \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0432 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38856","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d \u2014 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0444\u0435\u0440\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:26:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:26:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Test public : une solution pour la confidentialit\u00e9 et l'\u00e9volutivit\u00e9 sur Ethereum | ProHoster","description":"La blockchain est une technologie innovante qui promet d'am\u00e9liorer de nombreux aspects de la vie humaine.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/publichnyj-test-reshenie-dlya-privatnosti-i-masshtabiruemosti-v-efiriume","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/38856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=38856"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/38856\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/29146"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=38856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=38856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=38856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}