Un des défis auxquels Ethereum est confronté est que, par défaut, l'expansion et la complexité de tout protocole de blockchain augmentent avec le temps. Cela se produit de deux manières :
Données historiques : Toute transaction effectuée et tout compte créé à tout moment dans le passé doivent être stockés de manière permanente par tous les clients et téléchargés par tout nouveau client afin d'être complètement synchronisés avec le réseau. Cela entraînera une augmentation continue de la charge du client et du temps de synchronisation au fil du temps, même si la capacité de la chaîne reste inchangée.
Fonctionnalité du protocole : Ajouter de nouvelles fonctionnalités est beaucoup plus facile que de supprimer d'anciennes fonctionnalités, ce qui entraîne une complexité du code qui augmente avec le temps.
Pour que l'Ethereum puisse se maintenir à long terme, nous devons exercer une forte pression inverse sur ces deux tendances, réduire la complexité et l'expansion au fil du temps. Mais en même temps, nous devons conserver l'une des propriétés clés qui rendent la blockchain grande : la durabilité. Vous pouvez mettre un NFT, une lettre d'amour dans les données d'un appel de transaction, ou un contrat intelligent contenant 1 million de dollars sur la chaîne, entrer dans une grotte pendant dix ans, et en sortant, découvrir qu'il est toujours là, attendant que vous le lisiez et interagissiez. Pour que les DApps puissent se décentraliser complètement en toute confiance et supprimer la clé de mise à jour, ils doivent être certains que leurs dépendances ne seront pas mises à niveau de manière à les détruire - en particulier L1 lui-même.
Si nous nous engageons à trouver un équilibre entre ces deux besoins et à minimiser ou inverser l'encombrement, la complexité et le déclin tout en maintenant la continuité, c'est absolument possible. Les organismes vivants peuvent le faire : bien que la plupart des organismes vieillissent avec le temps, quelques chanceux échappent à ce sort. Même les systèmes sociaux peuvent avoir une durée de vie très longue. Dans certains cas, Ethereum a déjà réussi : la preuve de travail a disparu, l'opcode SELFDESTRUCT a en grande partie disparu, et les nœuds de la chaîne de balise ont stocké des données anciennes pendant jusqu'à six mois. Trouver ce chemin pour Ethereum de manière plus générale et se diriger vers un résultat final stable à long terme est le défi ultime pour la scalabilité à long terme d'Ethereum, la durabilité technique et même la sécurité.
The Purge: Objectif principal.
Réduire les exigences de stockage des clients en diminuant ou en éliminant la nécessité pour chaque nœud de conserver de manière permanente tous les historiques, voire l'état final.
Réduire la complexité du protocole en éliminant les fonctionnalités inutiles.
Table des matières :
Historique d'expiration
État d'expiration(状态到期)
Feature cleanup(特征清理)
Expiration de l'historique
résout quel problème ?
Au moment de la rédaction de cet article, un nœud Ethereum complètement synchronisé nécessite environ 1,1 To d'espace disque pour exécuter le client, et il faut également plusieurs centaines de Go d'espace disque pour le client de consensus. La plus grande partie de cela est historique : des données sur les blocs historiques, les transactions et les reçus, dont la plupart ont plusieurs années. Cela signifie que même si la limite de Gas n'augmente pas du tout, la taille des nœuds continuera d'augmenter de plusieurs centaines de Go chaque année.
Qu'est-ce que c'est et comment ça fonctionne ?
Une caractéristique clé de la simplification des problèmes de stockage historique est que, parce que chaque bloc pointe vers le bloc précédent par un lien de hachage (et d'autres structures), il suffit d'atteindre un consensus sur l'état actuel pour parvenir à un consensus sur l'historique. Tant que le réseau parvient à un consensus sur le dernier bloc, n'importe quel bloc historique, transaction ou état (solde de compte, nombre aléatoire, code, stockage) peut être fourni par un participant unique ainsi qu'une preuve de Merkle, et cette preuve permet à quiconque d'en vérifier la validité. Le consensus est un modèle de confiance N/2-of-N, tandis que l'historique est un modèle de confiance N-of-N.
Cela nous offre de nombreuses options pour la manière de stocker l'historique. Un choix naturel est un réseau où chaque nœud ne stocke qu'une petite partie des données. C'est ainsi que fonctionnent les réseaux de graines depuis des décennies : bien que le réseau stocke et distribue des millions de fichiers au total, chaque participant ne stocke et ne distribue que quelques fichiers parmi eux. Peut-être contre-intuitivement, cette approche ne réduit même pas nécessairement la robustesse des données. Si nous pouvons établir un réseau de 100 000 nœuds, où chaque nœud stocke aléatoirement 10 % de l'historique, alors chaque donnée sera copiée 10 000 fois - exactement le même facteur de duplication que dans un réseau de 10 000 nœuds où chaque nœud stocke tout.
Aujourd'hui, Ethereum commence à se débarrasser du modèle où tous les nœuds stockent en permanence toute l'historique. Les blocs de consensus (c'est-à-dire la partie liée au consensus de preuve d'enjeu) ne stockent que pendant environ 6 mois. Les Blob ne sont stockés que pendant environ 18 jours. L'EIP-4444 vise à introduire une période de stockage d'un an pour les blocs historiques et les reçus. L'objectif à long terme est d'établir une période unifiée (peut-être d'environ 18 jours) pendant laquelle chaque nœud est responsable du stockage de tout, puis de créer un réseau pair-à-pair composé de nœuds Ethereum, stockant les anciennes données de manière distribuée.
Les codes d'effacement peuvent être utilisés pour améliorer la robustesse tout en maintenant le même facteur de réplication. En fait, le Blob a déjà été codé en erreur pour soutenir l'échantillonnage de la disponibilité des données. La solution la plus simple est probablement de réutiliser ces codes d'effacement et d'inclure également les données d'exécution et de consensus dans le blob.
est en relation avec les recherches existantes ?
EIP-4444;
Torrents et EIP-4444;
Portail réseau;
Portail réseau et EIP-4444 ;
Stockage et récupération distribués des objets SSZ dans Portal ;
Comment augmenter la limite de gas (Paradigm).
Que faut-il encore faire et quels sont les compromis à considérer ?
Le travail principal restant consiste à construire et à intégrer une solution distribuée concrète pour stocker les historiques ------ au moins l'historique des exécutions, mais finalement aussi le consensus et les blobs. La solution la plus simple est (i) d'introduire simplement des bibliothèques torrent existantes, ainsi que (ii) une solution native d'Ethereum appelée réseau Portal. Une fois l'une ou l'autre introduite, nous pouvons activer l'EIP-4444. L'EIP-4444 lui-même ne nécessite pas de hard fork, mais il nécessite en effet une nouvelle version de protocole réseau. Il est donc utile de l'activer simultanément pour tous les clients, sinon il existe un risque que les clients échouent en raison de la connexion à d'autres nœuds en s'attendant à télécharger un historique complet mais ne l'obtenant en réalité pas.
Les principaux compromis concernent nos efforts pour fournir des données historiques "anciennes". La solution la plus simple consiste à arrêter demain le stockage des anciennes données et à s'appuyer sur les nœuds d'archivage existants et divers fournisseurs centralisés pour la réplication. C'est facile, mais cela affaiblit la position d'Ethereum en tant que lieu d'enregistrement permanent. Une approche plus difficile mais plus sûre consiste à d'abord construire et intégrer un réseau torrent pour stocker l'historique de manière distribuée. Ici, "combien nous nous efforçons" a deux dimensions :
Comment nous efforçons-nous de garantir que le plus grand ensemble de nœuds stocke effectivement toutes les données ?
Quelle est la profondeur de l'intégration du stockage historique dans le protocole ?
Une approche extrêmement paranoïaque pour (1) impliquerait une preuve de garde : en réalité, exiger que chaque validateur de preuve d'enjeu stocke une certaine proportion de l'historique et vérifie régulièrement de manière cryptographique s'il le fait. Une méthode plus douce consiste à établir une norme volontaire pour le pourcentage de l'historique stocké par chaque client.
Pour (2), l'implémentation de base ne concerne que le travail déjà accompli aujourd'hui : le Portal a déjà stocké un fichier ERA contenant toute l'histoire d'Ethereum. Une implémentation plus complète impliquerait de le connecter réellement au processus de synchronisation, de sorte que si quelqu'un souhaite synchroniser un nœud de stockage d'historique complet ou un nœud d'archives, même sans d'autres nœuds d'archives en ligne, il puisse le faire en synchronisant directement depuis le réseau Portal.
Comment interagit-il avec les autres parties de la feuille de route ?
Si nous voulons rendre l'exécution ou le démarrage des nœuds extrêmement facile, alors réduire les besoins de stockage historique peut être considéré comme plus important que la non-état : sur les 1,1 To nécessaires pour le nœud, environ 300 Go sont l'état, le reste, soit environ 800 Go, est devenu historique. Ce n'est qu'en réalisant la non-état et l'EIP-4444 que l'on pourra réaliser la vision de faire fonctionner un nœud Ethereum sur une montre intelligente et de le configurer en seulement quelques minutes.
La limitation du stockage historique rend également la mise en œuvre de nouveaux nœuds Ethereum plus viable, ne prenant en charge que la dernière version du protocole, ce qui les rend plus simples. Par exemple, il est maintenant possible de supprimer en toute sécurité de nombreuses lignes de code, car tous les emplacements de stockage vides créés lors de l'attaque par déni de service (DoS) de 2016 ont été supprimés. Maintenant que le passage à la preuve de participation est devenu historique, les clients peuvent supprimer en toute sécurité tout code lié à la preuve de travail.
Expiration de l'état
résout quel problème ?
Même si nous éliminons le besoin de stockage de l'historique par le client, les besoins de stockage du client continueront à croître, d'environ 50 Go par an, car l'état continue de croître : les soldes des comptes et les nombres aléatoires, le code des contrats et le stockage des contrats. Les utilisateurs peuvent payer des frais uniques, ce qui imposera un fardeau aux clients Ethereum présents et futurs.
L'état est plus difficile à "expirer" que l'historique, car l'EVM est fondamentalement conçu autour de cette hypothèse : une fois qu'un objet d'état est créé, il existera toujours et pourra être lu à tout moment par toute transaction. Si nous introduisons l'absence d'état, certains pensent que ce problème n'est peut-être pas si grave : seuls les constructeurs de blocs spécialisés auraient besoin de stocker réellement l'état, tandis que tous les autres nœuds (même ceux qui incluent la génération de listes !) pourraient fonctionner sans état. Cependant, il y a un point de vue selon lequel nous ne voulons pas trop dépendre de l'absence d'état, et finalement, nous pourrions souhaiter faire expirer l'état pour maintenir la décentralisation d'Ethereum.
Qu'est-ce que c'est, comment ça marche
Aujourd'hui, lorsque vous créez un nouvel objet d'état (ce qui peut se produire de l'une des trois manières suivantes : (i) en envoyant de l'ETH à un nouveau compte, (ii) en créant un nouveau compte avec du code, (iii) en configurant un emplacement de stockage qui n'a pas été touché auparavant), cet objet d'état reste dans cet état pour toujours. En revanche, ce que nous voulons, c'est que l'objet expire automatiquement au fil du temps. Le défi clé est de parvenir à cela d'une manière qui réalise trois objectifs :
Efficacité : aucun besoin d'un grand nombre de calculs supplémentaires pour exécuter le processus d'échéance.
Facilité d'utilisation : Si quelqu'un entre dans une grotte pendant cinq ans et revient, il ne devrait pas perdre l'accès à ses positions en Éther, ERC20, NFT, CDP...
Amicabilité des développeurs : les développeurs n'ont pas besoin de passer à un modèle de pensée complètement inconnu. De plus, les applications qui sont actuellement rigides et non mises à jour devraient pouvoir continuer à fonctionner normalement.
Il est facile de résoudre des problèmes si ces objectifs ne sont pas atteints. Par exemple, vous pouvez faire en sorte que chaque objet d'état stocke également un compteur de date d'expiration (qui peut être prolongé en brûlant de l'ETH, ce qui peut se produire automatiquement à tout moment lors de la lecture ou de l'écriture), et avoir un processus qui parcourt les états pour supprimer les objets d'état dont la date d'expiration est dépassée. Cependant, cela introduit des calculs supplémentaires (voire des besoins de stockage), et cela ne peut certainement pas satisfaire aux exigences de convivialité. Il est également difficile pour les développeurs de raisonner sur les cas limites où les valeurs de stockage sont parfois réinitialisées à zéro. Si vous définissez un minuteur d'expiration dans le contrat, cela facilitera techniquement la vie des développeurs, mais cela compliquera les aspects économiques : les développeurs doivent réfléchir à la manière de "transférer" le coût de stockage continu aux utilisateurs.
Ces problèmes sont ceux que la communauté de développement central d'Ethereum s'efforce de résoudre depuis des années, y compris des propositions telles que "loyer de blockchain" et "régénération". Finalement, nous avons combiné les meilleures parties des propositions et nous nous sommes concentrés sur deux catégories de "solutions connues comme étant les moins mauvaises" :
Solution pour les états expirés partiels
Suggestions de péremption d'état basées sur le cycle d'adresse.
Expiration partielle de l'état
Certaines propositions d'état expirées suivent les mêmes principes. Nous divisons l'état en blocs. Chacun stocke de manière permanente la "carte de niveau supérieur", où les blocs sont vides ou non vides. Les données dans chaque bloc ne sont stockées que si elles ont été récemment consultées. Il existe un mécanisme de "résurrection" qui s'active si elles ne sont plus stockées.

Feature cleanup(特征清理)
Expiration de l'historique
résout quel problème ?
Au moment de la rédaction de cet article, un nœud Ethereum complètement synchronisé nécessite environ 1,1 To d'espace disque pour exécuter le client, et il faut également plusieurs centaines de Go d'espace disque pour le client de consensus. La plus grande partie de cela est historique : des données sur les blocs historiques, les transactions et les reçus, dont la plupart ont plusieurs années. Cela signifie que même si la limite de Gas n'augmente pas du tout, la taille des nœuds continuera d'augmenter de plusieurs centaines de Go chaque année.
Qu'est-ce que c'est et comment ça fonctionne ?
Une caractéristique clé de la simplification des problèmes de stockage historique est que, parce que chaque bloc pointe vers le bloc précédent par un lien de hachage (et d'autres structures), il suffit d'atteindre un consensus sur l'état actuel pour parvenir à un consensus sur l'historique. Tant que le réseau parvient à un consensus sur le dernier bloc, n'importe quel bloc historique, transaction ou état (solde de compte, nombre aléatoire, code, stockage) peut être fourni par un participant unique ainsi qu'une preuve de Merkle, et cette preuve permet à quiconque d'en vérifier la validité. Le consensus est un modèle de confiance N/2-of-N, tandis que l'historique est un modèle de confiance N-of-N.
Cela nous offre de nombreuses options pour la manière de stocker l'historique. Un choix naturel est un réseau où chaque nœud ne stocke qu'une petite partie des données. C'est ainsi que fonctionnent les réseaux de graines depuis des décennies : bien que le réseau stocke et distribue des millions de fichiers au total, chaque participant ne stocke et ne distribue que quelques fichiers parmi eux. Peut-être contre-intuitivement, cette approche ne réduit même pas nécessairement la robustesse des données. Si nous pouvons établir un réseau de 100 000 nœuds, où chaque nœud stocke aléatoirement 10 % de l'historique, alors chaque donnée sera copiée 10 000 fois - exactement le même facteur de duplication que dans un réseau de 10 000 nœuds où chaque nœud stocke tout.
Aujourd'hui, Ethereum commence à se débarrasser du modèle où tous les nœuds stockent en permanence toute l'historique. Les blocs de consensus (c'est-à-dire la partie liée au consensus de preuve d'enjeu) ne stockent que pendant environ 6 mois. Les Blob ne sont stockés que pendant environ 18 jours. L'EIP-4444 vise à introduire une période de stockage d'un an pour les blocs historiques et les reçus. L'objectif à long terme est d'établir une période unifiée (peut-être d'environ 18 jours) pendant laquelle chaque nœud est responsable du stockage de tout, puis de créer un réseau pair-à-pair composé de nœuds Ethereum, stockant les anciennes données de manière distribuée.
Les codes d'effacement peuvent être utilisés pour améliorer la robustesse tout en maintenant le même facteur de réplication. En fait, le Blob a déjà été codé en erreur pour soutenir l'échantillonnage de la disponibilité des données. La solution la plus simple est probablement de réutiliser ces codes d'effacement et d'inclure également les données d'exécution et de consensus dans le blob.
est en relation avec les recherches existantes ?
EIP-4444;
Torrents et EIP-4444;
Portail réseau;
Portail réseau et EIP-4444 ;
Stockage et récupération distribués des objets SSZ dans Portal ;
Comment augmenter la limite de gas (Paradigm).
Que faut-il encore faire et quels sont les compromis à considérer ?
Le travail principal restant consiste à construire et à intégrer une solution distribuée concrète pour stocker les historiques ------ au moins l'historique des exécutions, mais finalement aussi le consensus et les blobs. La solution la plus simple est (i) d'introduire simplement des bibliothèques torrent existantes, ainsi que (ii) une solution native d'Ethereum appelée réseau Portal. Une fois l'une ou l'autre introduite, nous pouvons activer l'EIP-4444. L'EIP-4444 lui-même ne nécessite pas de hard fork, mais il nécessite en effet une nouvelle version de protocole réseau. Il est donc utile de l'activer simultanément pour tous les clients, sinon il existe un risque que les clients échouent en raison de la connexion à d'autres nœuds en s'attendant à télécharger un historique complet mais ne l'obtenant en réalité pas.
Les principaux compromis concernent nos efforts pour fournir des données historiques "anciennes". La solution la plus simple consiste à arrêter demain le stockage des anciennes données et à s'appuyer sur les nœuds d'archivage existants et divers fournisseurs centralisés pour la réplication. C'est facile, mais cela affaiblit la position d'Ethereum en tant que lieu d'enregistrement permanent. Une approche plus difficile mais plus sûre consiste à d'abord construire et intégrer un réseau torrent pour stocker l'historique de manière distribuée. Ici, "combien nous nous efforçons" a deux dimensions :
Comment nous efforçons-nous de garantir que le plus grand ensemble de nœuds stocke effectivement toutes les données ?
Quelle est la profondeur de l'intégration du stockage historique dans le protocole ?
Une approche extrêmement paranoïaque pour (1) impliquerait une preuve de garde : en réalité, exiger que chaque validateur de preuve d'enjeu stocke une certaine proportion de l'historique et vérifie régulièrement de manière cryptographique s'il le fait. Une méthode plus douce consiste à établir une norme volontaire pour le pourcentage de l'historique stocké par chaque client.
Pour (2), l'implémentation de base ne concerne que le travail déjà accompli aujourd'hui : le Portal a déjà stocké un fichier ERA contenant toute l'histoire d'Ethereum. Une implémentation plus complète impliquerait de le connecter réellement au processus de synchronisation, de sorte que si quelqu'un souhaite synchroniser un nœud de stockage d'historique complet ou un nœud d'archives, même sans d'autres nœuds d'archives en ligne, il puisse le faire en synchronisant directement depuis le réseau Portal.
Comment interagit-il avec les autres parties de la feuille de route ?
Si nous voulons rendre l'exécution ou le démarrage des nœuds extrêmement facile, alors réduire les besoins de stockage historique peut être considéré comme plus important que la non-état : sur les 1,1 To nécessaires pour le nœud, environ 300 Go sont l'état, le reste, soit environ 800 Go, est devenu historique. Ce n'est qu'en réalisant la non-état et l'EIP-4444 que l'on pourra réaliser la vision de faire fonctionner un nœud Ethereum sur une montre intelligente et de le configurer en seulement quelques minutes.
La limitation du stockage historique rend également la mise en œuvre de nouveaux nœuds Ethereum plus viable, ne prenant en charge que la dernière version du protocole, ce qui les rend plus simples. Par exemple, il est maintenant possible de supprimer en toute sécurité de nombreuses lignes de code, car tous les emplacements de stockage vides créés lors de l'attaque par déni de service (DoS) de 2016 ont été supprimés. Maintenant que le passage à la preuve de participation est devenu historique, les clients peuvent supprimer en toute sécurité tout code lié à la preuve de travail.
Expiration de l'état
résout quel problème ?
Même si nous éliminons le besoin de stockage de l'historique par le client, les besoins de stockage du client continueront à croître, d'environ 50 Go par an, car l'état continue de croître : les soldes des comptes et les nombres aléatoires, le code des contrats et le stockage des contrats. Les utilisateurs peuvent payer des frais uniques, ce qui imposera un fardeau aux clients Ethereum présents et futurs.
L'état est plus difficile à "expirer" que l'historique, car l'EVM est fondamentalement conçu autour de cette hypothèse : une fois qu'un objet d'état est créé, il existera toujours et pourra être lu à tout moment par toute transaction. Si nous introduisons l'absence d'état, certains pensent que ce problème n'est peut-être pas si grave : seuls les constructeurs de blocs spécialisés auraient besoin de stocker réellement l'état, tandis que tous les autres nœuds (même ceux qui incluent la génération de listes !) pourraient fonctionner sans état. Cependant, il y a un point de vue selon lequel nous ne voulons pas trop dépendre de l'absence d'état, et finalement, nous pourrions souhaiter faire expirer l'état pour maintenir la décentralisation d'Ethereum.
Qu'est-ce que c'est, comment ça marche
Aujourd'hui, lorsque vous créez un nouvel objet d'état (ce qui peut se produire de l'une des trois manières suivantes : (i) en envoyant de l'ETH à un nouveau compte, (ii) en créant un nouveau compte avec du code, (iii) en configurant un emplacement de stockage qui n'a pas été touché auparavant), cet objet d'état reste dans cet état pour toujours. En revanche, ce que nous voulons, c'est que l'objet expire automatiquement au fil du temps. Le défi clé est de parvenir à cela d'une manière qui réalise trois objectifs :
Efficacité : aucun besoin d'un grand nombre de calculs supplémentaires pour exécuter le processus d'échéance.
Facilité d'utilisation : Si quelqu'un entre dans une grotte pendant cinq ans et revient, il ne devrait pas perdre l'accès à ses positions en Éther, ERC20, NFT, CDP...
Amicabilité des développeurs : les développeurs n'ont pas besoin de passer à un modèle de pensée complètement inconnu. De plus, les applications qui sont actuellement rigides et non mises à jour devraient pouvoir continuer à fonctionner normalement.
Il est facile de résoudre des problèmes si ces objectifs ne sont pas atteints. Par exemple, vous pouvez faire en sorte que chaque objet d'état stocke également un compteur de date d'expiration (qui peut être prolongé en brûlant de l'ETH, ce qui peut se produire automatiquement à tout moment lors de la lecture ou de l'écriture), et avoir un processus qui parcourt les états pour supprimer les objets d'état dont la date d'expiration est dépassée. Cependant, cela introduit des calculs supplémentaires (voire des besoins de stockage), et cela ne peut certainement pas satisfaire aux exigences de convivialité. Il est également difficile pour les développeurs de raisonner sur les cas limites où les valeurs de stockage sont parfois réinitialisées à zéro. Si vous définissez un minuteur d'expiration dans le contrat, cela facilitera techniquement la vie des développeurs, mais cela compliquera les aspects économiques : les développeurs doivent réfléchir à la manière de "transférer" le coût de stockage continu aux utilisateurs.
Ces problèmes sont ceux que la communauté de développement central d'Ethereum s'efforce de résoudre depuis des années, y compris des propositions telles que "loyer de blockchain" et "régénération". Finalement, nous avons combiné les meilleures parties des propositions et nous nous sommes concentrés sur deux catégories de "solutions connues comme étant les moins mauvaises" :
Expiration partielle de l'état
Certaines propositions d'état expirées suivent les mêmes principes. Nous divisons l'état en blocs. Chacun stocke de manière permanente la "carte de niveau supérieur", où les blocs sont vides ou non vides. Les données dans chaque bloc ne sont stockées que si elles ont été récemment consultées. Il existe un mécanisme de "résurrection" qui s'active si elles ne sont plus stockées.
![Vitalik : l'avenir potentiel d'Ethereum, The Purge](https://