L'un des défis d'Ethereum est que par défaut, toute la boursouflure et la complexité du protocole de la blockchain augmentent avec le temps. Cela se produit à deux endroits :
Pour qu'Ethereum puisse se maintenir à long terme, nous avons besoin d'une forte contre-pression contre ces deux tendances, réduisant la complexité et le gonflement au fil du temps. Mais en même temps, nous devons préserver l'une des principales propriétés qui rendent les blockchains formidables : leur permanence. Vous pouvez mettre un NFT, une note d'amour dans les données de transaction, ou un contrat intelligent contenant un million de dollars onchain, aller dans une grotte pendant dix ans, en ressortir et le trouver toujours là, en attente que vous le lisiez et interagissiez avec. Pour que les dapps se sentent à l'aise pour devenir entièrement décentralisées et supprimer leurs clés de mise à niveau, elles doivent être convaincues que leurs dépendances ne vont pas être mises à niveau de manière à les casser - en particulier la L1 elle-même.
La Purge, feuille de route 2023.
Il est tout à fait possible de concilier ces deux besoins, de réduire ou d'inverser l'enflure, la complexité et la dégradation tout en préservant la continuité, si nous nous y mettons vraiment. Les organismes vivants peuvent le faire : alors que la plupart vieillissent avec le temps,quelques chanceux ne le font pas. Même les systèmes sociaux peuvent avoir une longévité extrême. À plusieurs reprises, Ethereum a déjà montré des succès : la preuve de travail a disparu, l'opcode SELFDESTRUCT a en grande partie disparu, et les nœuds de la chaîne de balises stockent déjà d'anciennes données jusqu'à seulement six mois. Trouver cette voie pour Ethereum de manière plus généralisée, et avancer vers un résultat final stable à long terme, est le défi ultime de la scalabilité à long terme, de la durabilité technique et même de la sécurité d'Ethereum.
Au moment de la rédaction de cet article, un nœud Ethereum entièrement synchronisé nécessiteenviron 1,1 téraoctetsd'espace disque pour leclient d'exécution, plus quelques centaines de gigaoctets supplémentaires pour le client de consensus. La grande majorité de cela est de l'histoire : des données sur les blocs historiques, les transactions et les reçus, la majeure partie étant vieille de plusieurs années. Cela signifie que la taille d'un nœud ne cesse d'augmenter de plusieurs centaines de gigaoctets chaque année, même si la limite de gaz n'augmente pas du tout.
Une caractéristique clé simplifiant le problème de stockage de l'historique est que chaque bloc pointe vers le bloc précédent via un lien de hachage (et autre structures),avoir consensus sur le présent suffit à avoir consensus sur l'histoire. Tant que le réseau a consensus sur le dernier bloc, tout bloc, transaction ou état historique (solde du compte, nonce, code, stockage) peut être fourni par n'importe quel acteur unique avec une preuve de Merkle, et la preuve permet à quiconque d'en vérifier la justesse. Alors que le consensus est un modèle de confiance N/2-sur-N, l'histoire est un Modèle de confiance 1-sur-N.
Cela ouvre de nombreuses options pour la façon dont nous pouvons stocker l'historique. Une option naturelle est un réseau où chaque nœud ne stocke qu'un petit pourcentage des données. C'est ainsi que les réseaux de torrents ont fonctionné pendant des décennies : alors que le réseau stocke et distribue des millions de fichiers, chaque participant n'en stocke et n'en distribue que quelques-uns. Peut-être de manière contre-intuitive, cette approche ne diminue même pas nécessairement la robustesse des données. Si, en rendant le fonctionnement des nœuds plus abordable, nous pouvons arriver à un réseau de 100 000 nœuds, où chaque nœud stocke au hasard 10 % de l'historique, alors chaque pièce de données serait répliquée 10 000 fois - exactement le même facteur de réplication qu'un réseau de 10 000 nœuds où chaque nœud stocke tout.
Aujourd'hui, Ethereum a déjà commencé à s'éloigner du modèle où tous les nœuds stockent toute l'histoire pour toujours. Les blocs de consensus (c'est-à-dire les parties liées au consensus de preuve d'enjeu) ne sont stockés que pendant environ 6 mois. Les blobs ne sont stockés que pendant environ 18 jours.EIP-4444vise à introduire une période de stockage d'un an pour les blocs et les reçus historiques. L'objectif à long terme est d'avoir une période harmonisée (qui pourrait être d'environ 18 jours) pendant laquelle chaque nœud est responsable de tout stocker, puis d'avoir un réseau pair à pair composé de nœuds Ethereum stockant les données plus anciennes de manière distribuée.
Les codes d'effacement peuvent être utilisés pour augmenter la robustesse tout en maintenant le même facteur de réplication. En fait, les blocs sont déjà codés en effacement afin de prendre en charge l'échantillonnage de disponibilité des données. La solution la plus simple pourrait bien être de réutiliser ce codage en effacement et de placer également les données de bloc d'exécution et de consensus dans des blocs.
Le principal travail restant consiste à construire et à intégrer une solution distribuée concrète pour le stockage de l’historique - au moins l’historique d’exécution, mais finalement aussi le consensus et les blobs. Les solutions les plus simples pour cela sont (i) d’introduire simplement une bibliothèque torrent existante, et (ii) une solution native d’Ethereum appelée le réseau Portal. Une fois que l'un de ceux-ci est introduit, nous pouvons activer EIP-4444. EIP-4444 lui-même ne nécessite pas de hard fork, mais il nécessite une nouvelle version de protocole réseau. Pour cette raison, il est utile de l'activer pour tous les clients en même temps, sinon il y a des risques de dysfonctionnement des clients en se connectant à d'autres nœuds s'attendant à télécharger l'historique complet mais ne le recevant pas réellement.
Le principal compromis concerne la façon dont nous nous efforçons de rendre les données historiques "anciennes" disponibles. La solution la plus simple serait de cesser simplement de stocker l'histoire ancienne demain et de compter sur les nœuds d'archive 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. Le chemin le plus difficile, mais plus sûr, consiste d'abord à développer et à intégrer le réseau torrent pour stocker l'histoire de manière distribuée. Ici, il y a deux dimensions de "la difficulté de notre effort":
Une approche maximale paranoïaque pour (1) impliqueraitpreuve de gardeen fait, exigeant que chaque validateur de preuve d'enjeu stocke un certain pourcentage d'historique et vérifie régulièrement de manière cryptographique qu'ils le font. Une approche plus modérée consiste à établir une norme volontaire pour le pourcentage d'historique que chaque client stocke.
Pour (2), une implémentation de base consiste simplement à prendre le travail qui est déjà fait aujourd'hui: Portal stocke déjà des fichiers ERA contenant toute l'histoire d'Ethereum. Une implémentation plus approfondie consisterait à réellement connecter cela au processus de synchronisation, de sorte que si quelqu'un voulait synchroniser un nœud stockant l'historique complet ou un nœud d'archive, il pourrait le faire même s'il n'y avait pas d'autres nœuds d'archive en ligne, en se synchronisant directement depuis le réseau Portal.
Réduire les besoins de stockage de l'historique est sans doute encore plus important que l'absence d'état si nous voulons faciliter au maximum l'exécution ou la mise en service d'un nœud : sur les 1,1 To nécessaires à un nœud, environ 300 Go sont dédiés à l'état et les 800 Go restants à l'historique. La vision d'un nœud Ethereum fonctionnant sur une montre connectée et se configurant en quelques minutes seulement est réalisable uniquement si l'absence d'état et l'EIP-4444 sont mis en œuvre.
La limitation du stockage de l'historique le rend également plus viable pour les nouvelles implémentations de nœuds Ethereum qui ne prennent en charge que les versions récentes du protocole, ce qui les rend beaucoup plus simples. Par exemple, de nombreuses lignes de code peuvent être supprimées en toute sécurité maintenant que tous les emplacements de stockage vides créés lors des attaques DoS de 2016 ont été supprimés.supprimé. Maintenant que le passage à la preuve d'enjeu est de l'histoire ancienne, les clients peuvent en toute sécurité supprimer tout code lié à la preuve de travail.
Même si nous supprimons le besoin pour les clients de stocker l'historique, les besoins en stockage d'un client continueront de croître, d'environ 50 Go par an, en raison de la croissance continue de l'état : soldes des comptes et nonces, code de contrat et stockage de contrat. Les utilisateurs sont en mesure de payer un coût unique pour imposer une charge aux clients Ethereum présents et futurs pour toujours.
L'État est beaucoup plus difficile à « expirer » que l'histoire, car l'EVM est fondamentalement conçue autour de l'hypothèse qu'une fois qu'un objet d'état est créé, il sera toujours là et pourra être lu par n'importe quelle transaction à tout moment. Si nous introduisons la non-statalité, il y a un argument selon lequel peut-être ce problème n'est pas si grave : seule une classe spécialisée de constructeurs de blocs aurait besoin de stocker réellement l'état, et tous les autres nœuds (mêmeliste d'inclusion production!) peut fonctionner de manière étatique. Cependant, il y a un argument selon lequel nous ne voulons pas trop compter sur l'état de non-état, et éventuellement nous voudrons peut-être expirer l'état afin de maintenir Ethereum décentralisé.
Aujourd'hui, lorsque vous créez un nouvel objet d'état (ce qui peut se produire de trois manières : (i) envoyer de l'ETH à un nouveau compte, (ii) créer un nouveau compte avec un code, (iii) définir un emplacement de stockage précédemment inutilisé), cet objet d'état reste en état pour toujours. Ce que nous voulons plutôt, c'est que les objets expirent automatiquement avec le temps. Le défi clé est de le faire d'une manière qui réalise trois objectifs :
Il est facile de résoudre le problème sans atteindre ces objectifs. Par exemple, vous pouvez faire en sorte que chaque objet d’état stocke également un compteur pour sa date d’expiration (qui peut être prolongée en brûlant de l’ETH, ce qui peut se produire automatiquement chaque fois qu’il est lu ou écrit), et avoir un processus qui parcourt l’état pour supprimer les objets d’état expirés. Cependant, cela introduit des calculs supplémentaires (et même des exigences de stockage), et cela ne répond certainement pas à l’exigence de convivialité. Les développeurs auraient également du mal à raisonner sur les cas limites impliquant des valeurs de stockage parfois réinitialisées à zéro. Si vous fixez le délai d’expiration à l’ensemble du contrat, cela facilite techniquement la vie des développeurs, mais cela rend l’économie plus difficile : les développeurs devraient réfléchir à la manière de « répercuter » les coûts permanents du stockage sur leurs utilisateurs.
Ce sont des problèmes auxquels la communauté de développement de base d'Ethereum a lutté pendant de nombreuses années, y compris des propositions comme “location de la chaîne de blocsetregenesis« Finalement, nous avons combiné les meilleures parties des propositions et convergé vers deux catégories de « solutions connues les moins mauvaises » :
Toutes les propositions d'expiration d'état partiel fonctionnent sur le même principe. Nous divisons l'état en morceaux. Tout le monde stocke de manière permanente la "carte de niveau supérieur" des morceaux vides ou non vides. Les données à l'intérieur de chaque morceau sont stockées uniquement si ces données ont été récemment consultées. Il existe un mécanisme de "résurrection" où si un morceau n'est plus stocké, n'importe qui peut ramener ces données en fournissant une preuve de ce que les données étaient.
Les principales distinctions entre ces propositions sont : (i) comment définissons-nous "récemment", et (ii) comment définissons-nous "chunk" ? Une proposition concrète est EIP-7736, qui s'appuie sur la conception « tige-et-feuille » introduit pour les arbres Verkle (bien qu'il soit compatible avec toutes les formes de non-état, par exemple les arbres binaires). Dans cette conception, les en-têtes, les codes et les emplacements de stockage qui se trouvent à côté les uns des autres sont stockés sous la même « branche ». Les données stockées sous une branche peuvent être au maximum de 256 * 31 = 7 936 octets. Dans de nombreux cas, l'intégralité de l'en-tête et du code, ainsi que de nombreux emplacements de stockage clés, d'un compte seront tous stockés sous la même branche. Si les données sous une branche donnée ne sont pas lues ou écrites pendant 6 mois, les données ne sont plus stockées et seule une attestation de 32 octets (« ébauche ») des données est stockée. Les transactions futures qui accèdent à ces données devraient « ressusciter » les données, avec une preuve qui serait vérifiée par rapport à l'ébauche.
Il existe d'autres moyens de mettre en œuvre une idée similaire. Par exemple, si la granularité au niveau du compte n'est pas suffisante, nous pourrions mettre en place un système où chaque fraction 1/232 de l'arbre est régi par un mécanisme similaire de tige et de feuille.
C'est plus délicat en raison des incitations : un attaquant pourrait forcer les clients à stocker en permanence une très grande quantité d'état en mettant une très grande quantité de données dans un seul sous-arbre et en envoyant une seule transaction chaque année pour 'renouveler l'arbre'. Si vous faites en sorte que le coût de renouvellement soit proportionnel (ou la durée de renouvellement inversement proportionnelle) à la taille de l'arbre, alors quelqu'un pourrait nuire à un autre utilisateur en mettant une très grande quantité de données dans le même sous-arbre qu'eux. On pourrait essayer de limiter ces deux problèmes en rendant la granularité dynamique en fonction de la taille du sous-arbre : par exemple, chaque groupe de 216 = 65536 objets d'état consécutifs pourrait être traité comme un 'groupe'. Cependant, ces idées sont plus complexes ; l'approche basée sur la tige est simple et elle aligne les incitations, car généralement toutes les données sous une tige sont liées à la même application ou au même utilisateur.
Et si nous voulions éviter toute croissance permanente de l'état, même les pointeurs de 32 octets ? C'est un problème difficile en raison de...@vbuterin/state_size_management#Resurrection-conflicts">conflits de résurrection : que se passe-t-il si un objet d’état est supprimé, l’exécution ultérieure d’EVM met un autre objet d’état exactement dans la même position, mais qu’après cela, quelqu’un qui se soucie de l’objet d’état d’origine revient et essaie de le récupérer ? En cas d’expiration partielle de l’état, le « stub » empêche la création de nouvelles données. Avec l’expiration complète de l’État, nous ne pouvons pas nous permettre de stocker même le talon.
La conception basée sur la période d’adresse est l’idée la plus connue pour résoudre ce problème. Au lieu d’avoir un arbre d’état stockant l’ensemble de l’état, nous avons une liste d’arbres d’état qui ne cesse de s’allonger, et tout état qui est lu ou écrit est enregistré dans l’arbre d’état le plus récent. Un nouvel arbre d’état vide est ajouté une fois par période (pensez : 1 an). Les arbres d’état plus anciens sont gelés. Les nœuds complets ne sont censés stocker que les deux arbres les plus récents. Si un objet d’état n’a pas été touché pendant deux périodes et tombe donc dans une arborescence expirée, il peut toujours être lu ou écrit, mais la transaction devra prouver une preuve de Merkle pour cela - et une fois qu’elle l’aura fait, une copie sera à nouveau enregistrée dans la dernière arborescence.
Une idée clé pour rendre tout cela convivial pour les utilisateurs et les développeurs est le concept de périodes d'adresse. Une période d'adresse est un nombre faisant partie d'une adresse. Une règle clé est qu'une adresse avec une période d'adresse N ne peut être lue ou écrite qu'au cours ou après la période N (c'est-à-dire lorsque la liste d'arbre d'état atteint la longueur N). Si vous enregistrez un nouvel objet d'état (par exemple, un nouveau contrat, ou un nouveau solde ERC20), si vous vous assurez de mettre l'objet d'état dans un contrat dont la période d'adresse est soit N soit N-1, alors vous pouvez l'enregistrer immédiatement, sans avoir besoin de fournir des preuves qu'il n'y avait rien avant. Toute addition ou modification de l'état dans des périodes d'adresse plus anciennes, en revanche, nécessite une preuve.
Ce design préserve la plupart des propriétés actuelles d'Ethereum, est très léger en calculs supplémentaires, permet aux applications d'être écrites presque comme elles le sont aujourd'hui (les ERC20 devront être réécrits, pour garantir que les soldes des adresses avec la période d'adresse N sont stockés dans un contrat enfant qui a lui-même la période d'adresse N), et résout le problème de la "cave pour cinq ans". Cependant, il a un gros problème : les adresses doivent être étendues au-delà de 20 octets pour s'adapter aux périodes d'adresse.
Une proposition consiste à introduire un nouveau format d'adresse de 32 octets, qui comprend un numéro de version, un numéro de période d'adresse et un hash étendu.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
Le rouge est un numéro de version. Les quatre zéros colorés en orange ici sont destinés à représenter un espace vide, qui pourrait contenir un numéro de fragment à l'avenir. Le vert est un numéro de période d'adresse. Le bleu est un hachage de 26 octets.
Le défi clé ici est la compatibilité ascendante. Les contrats existants sont conçus autour d'adresses de 20 octets et utilisent souvent des techniques serrées d'empaquetage d'octets qui supposent explicitement que les adresses font exactement 20 octets de long.@ipsilon/address-space-extension-exploration">Une idée pour résoudre ce problème implique une carte de traduction, où les contrats de l’ancien style interagissant avec des adresses de nouveau style verraient un hachage de 20 octets de l’adresse du nouveau style. Cependant, il existe des complexités importantes pour rendre cela sûr.
Une autre approche va dans la direction opposée : nous interdisons immédiatement une sous-plage de taille 2128 (par exemple toutes les adresses commençant par 0xffffffff), puis utilisons cette plage pour introduire des adresses avec des périodes d'adresses et des hachages de 14 octets.
0xfffffff000169125d5dFcb7B8C2659029395bdF
Le principal sacrifice que fait cette approche, c’est qu’elle introduit des risques de sécurité pour les adresses contrefaites: les adresses qui détiennent des actifs ou des autorisations, mais dont le code n'a pas encore été publié sur la chaîne. Le risque consiste en ce que quelqu'un crée une adresse qui prétend avoir un morceau de code (pas encore publié), mais qui a également un autre morceau de code valide qui a la même empreinte que l'adresse. Calculer une telle collision nécessite 280hachages aujourd'hui; la contraction de l'espace d'adressage réduirait ce nombre à un 2 très accessible56hachages.
La zone de risque clé, les adresses contrefactuelles qui ne sont pas des portefeuilles détenus par un seul propriétaire, est un cas relativement rare aujourd'hui, mais il est probable qu'il deviendra plus courant à mesure que nous entrerons dans un monde multi-L2. La seule solution est d'accepter simplement ce risque, mais d'identifier tous les cas d'utilisation courants où cela pourrait poser un problème et de trouver des solutions de contournement efficaces.
Je vois quatre voies viables pour l'avenir :
Un point important est que les problèmes difficiles liés à l'expansion et à la contraction de l'espace d'adressage devront finalement être abordés, que les schémas d'expiration de l'état qui dépendent des changements de format d'adresse soient ou non mis en œuvre. Aujourd'hui, cela prend environ 280hachages pour générer une collision d'adresse, une charge computationnelle déjà réalisable pour des acteurs extrêmement bien dotés : un GPU peut faire environ 227hachages, donc en le faisant fonctionner pendant un an, il peut calculer 252, donc tout ~2^30 GPU dans le mondepourrait calculer une collision en ~1/4 d'année, et les FPGAs et les ASICs pourraient accélérer cela davantage. À l'avenir, de telles attaques seront accessibles à de plus en plus de personnes. Par conséquent, le coût réel de la mise en œuvre de l'expiration complète de l'état peut ne pas être aussi élevé qu'il semble, car nous devons résoudre ce problème d'adresse très difficile quoi qu'il en soit.
La réalisation de l'expiration de l'état rend potentiellement les transitions d'un format d'arbre d'état à un autre plus faciles, car il n'y aura pas besoin de procédure de transition : vous pourriez simplement commencer à créer de nouveaux arbres en utilisant un nouveau format, puis effectuer ultérieurement une bifurcation dure pour convertir les anciens arbres. Ainsi, bien que l'expiration de l'état soit complexe, elle présente des avantages en simplifiant d'autres aspects de la feuille de route.
L'une des conditions préalables clés de la sécurité, de l'accessibilité et neutralité crédibleC'est la simplicité. Si un protocole est beau et simple, cela réduit les chances qu'il y ait des bugs. Cela augmente la possibilité que de nouveaux développeurs puissent intervenir et travailler avec n'importe quelle partie. Il est plus probable d'être juste et plus facile à défendre contre les intérêts spéciaux. Malheureusement, les protocoles, comme tout système social, deviennent par défaut de plus en plus complexes avec le temps. Si nous ne voulons pas qu'Ethereum tombe dans un trou noir de complexité croissante, nous devons faire l'une des deux choses suivantes : (i) arrêter de faire des changements et ossifier le protocole, (ii) être capable de réellement supprimer des fonctionnalités et réduire la complexité. Une voie intermédiaire, consistant à apporter moins de modifications au protocole et à supprimer au moins un peu de complexité avec le temps, est également possible. Cette section expliquera comment nous pouvons réduire ou supprimer la complexité.
Il n'y a pas de solution unique qui puisse réduire la complexité du protocole; la nature inhérente du problème est qu'il y a de nombreuses petites solutions.
Un exemple qui est déjà presque terminé et peut servir de modèle pour gérer les autres, est le @vbuterin/selfdestruct">suppression de l’opcode SELFDESTRUCT. L’opcode SELFDESTRUCT était le seul opcode capable de modifier un nombre illimité d’emplacements de stockage au sein d’un seul bloc, ce qui obligeait les clients à implémenter beaucoup plus de complexité pour éviter les attaques par déni de service. L’objectif initial de l’opcode était de permettre l’effacement volontaire de l’État, permettant à la taille de l’État de diminuer au fil du temps. Dans la pratique, très peu ont fini par l’utiliser. Le l'opcode a été affaiblipour permettre uniquement des comptes auto-destructeurs créés dans la même transaction dans le hardfork Dencun. Cela résout le problème de DoS et permet une simplification significative du code client. À l'avenir, il est probablement judicieux de supprimer complètement l'opcode.
Voici quelques exemples clés d'opportunités de simplification du protocole qui ont été identifiées jusqu'à présent. Tout d'abord, quelques exemples qui se trouvent en dehors de l'EVM; ceux-ci sont relativement non invasifs, et donc plus faciles à obtenir un consensus et à mettre en œuvre dans un délai plus court.
Maintenant, quelques exemples qui sont à l'intérieur de l'EVM :
Le principal compromis dans la réalisation de ce type de simplification des fonctionnalités est (i) dans quelle mesure nous simplifions et à quelle vitesse par rapport à (ii) la compatibilité ascendante. La valeur d'Ethereum en tant que chaîne provient du fait qu'il s'agit d'une plateforme sur laquelle vous pouvez déployer une application en étant certain qu'elle fonctionnera encore de nombreuses années à partir de maintenant. En même temps, il est possible d'aller trop loin dans cet idéal et,pour paraphraser William Jennings Bryan, "crucifier Ethereum sur une croix de compatibilité arrière". S'il n'y a que deux applications dans tout Ethereum qui utilisent une fonctionnalité donnée, et que l'une n'a eu aucun utilisateur depuis des années et que l'autre est presque complètement inutilisée et sécurise un total de 57 $ de valeur, alors nous devrions simplement supprimer la fonctionnalité, et si nécessaire, dédommager les victimes de 57 $ de notre poche.
Le problème social plus large réside dans la création d'un pipeline standardisé pour apporter des modifications non urgentes qui rompent la compatibilité ascendante. Une façon d'aborder cela est d'examiner et d'étendre les précédents existants, tels que le processus SELFDESTRUCT. Le pipeline ressemble à ce qui suit :
Il devrait y avoir un pipeline de plusieurs années entre l'étape 1 et l'étape 4, avec des informations claires sur les articles qui se trouvent à quelle étape. À ce stade, il y a un compromis entre la vigueur et la rapidité du pipeline de suppression des fonctionnalités, d'une part, et la prudence et l'investissement de plus de ressources dans d'autres domaines du développement du protocole, d'autre part, mais nous sommes encore loin de la frontière de Pareto.
Un ensemble majeur de modifications proposées pour l'EVM est le Format d'objet EVM (EOF). EOF introduit un grand nombre de changements, tels que l'interdiction de l'observabilité du gaz, l'observabilité du code (c'est-à-dire pas de CODECOPY), permettant uniquement des sauts statiques. Le but est de permettre à l'EVM d'être améliorée davantage, d'une manière qui a des propriétés plus fortes, tout en préservant la compatibilité ascendante (car l'EVM pré-EOF existera toujours).
Cela a l'avantage de créer un chemin naturel pour l'ajout de nouvelles fonctionnalités EVM et d'encourager la migration vers un EVM plus restrictif avec des garanties plus solides. Cela a l'inconvénient d'augmenter significativement la complexité du protocole, à moins que nous ne trouvions un moyen de rendre obsolète et de supprimer l'ancien EVM. Une question majeure est : quel rôle joue l'EOF dans les propositions de simplification de l'EVM, surtout si l'objectif est de réduire la complexité de l'EVM dans son ensemble ?
De nombreuses propositions d'"amélioration" dans le reste de la feuille de route sont également des occasions de simplifier d'anciennes fonctionnalités. Pour reprendre quelques exemples ci-dessus :
Une stratégie de simplification plus radicale d'Ethereum consiste à conserver le protocole tel quel, mais à déplacer une grande partie de ses fonctionnalités de protocole vers du code de contrat.
La version la plus extrême de ceci serait de faire en sorte que la L1 Ethereum soit «techniquement» juste la chaîne de balises, et d'introduire une VM minimale (par exemple.RISC-V, Le Caire, ou quelque chose de encore plus minimal spécialisé pour les systèmes de preuve) qui permet à n'importe qui d'en créer son propre rollup. L'EVM se transformerait ensuite en le premier de ces rollups. C'est ironiquement exactement le même résultat que le propositions d'environnements d'exécution de 2019-20, bien que les SNARK rendent sa mise en œuvre beaucoup plus viable en réalité.
Une approche plus modérée consisterait à maintenir la relation entre la chaîne de balises et l'environnement d'exécution Ethereum actuel tel quel, mais à effectuer un remplacement sur place de l'EVM. Nous pourrions choisir RISC-V, Cairo ou une autre machine virtuelle pour être la nouvelle "machine virtuelle Ethereum officielle", puis convertir de force tous les contrats EVM en code de nouvelle machine virtuelle qui interprète la logique du code original (en le compilant ou en l'interprétant). Théoriquement, cela pourrait même être fait avec la "machine virtuelle cible" étant une version de EOF.
L'un des défis d'Ethereum est que par défaut, toute la boursouflure et la complexité du protocole de la blockchain augmentent avec le temps. Cela se produit à deux endroits :
Pour qu'Ethereum puisse se maintenir à long terme, nous avons besoin d'une forte contre-pression contre ces deux tendances, réduisant la complexité et le gonflement au fil du temps. Mais en même temps, nous devons préserver l'une des principales propriétés qui rendent les blockchains formidables : leur permanence. Vous pouvez mettre un NFT, une note d'amour dans les données de transaction, ou un contrat intelligent contenant un million de dollars onchain, aller dans une grotte pendant dix ans, en ressortir et le trouver toujours là, en attente que vous le lisiez et interagissiez avec. Pour que les dapps se sentent à l'aise pour devenir entièrement décentralisées et supprimer leurs clés de mise à niveau, elles doivent être convaincues que leurs dépendances ne vont pas être mises à niveau de manière à les casser - en particulier la L1 elle-même.
La Purge, feuille de route 2023.
Il est tout à fait possible de concilier ces deux besoins, de réduire ou d'inverser l'enflure, la complexité et la dégradation tout en préservant la continuité, si nous nous y mettons vraiment. Les organismes vivants peuvent le faire : alors que la plupart vieillissent avec le temps,quelques chanceux ne le font pas. Même les systèmes sociaux peuvent avoir une longévité extrême. À plusieurs reprises, Ethereum a déjà montré des succès : la preuve de travail a disparu, l'opcode SELFDESTRUCT a en grande partie disparu, et les nœuds de la chaîne de balises stockent déjà d'anciennes données jusqu'à seulement six mois. Trouver cette voie pour Ethereum de manière plus généralisée, et avancer vers un résultat final stable à long terme, est le défi ultime de la scalabilité à long terme, de la durabilité technique et même de la sécurité d'Ethereum.
Au moment de la rédaction de cet article, un nœud Ethereum entièrement synchronisé nécessiteenviron 1,1 téraoctetsd'espace disque pour leclient d'exécution, plus quelques centaines de gigaoctets supplémentaires pour le client de consensus. La grande majorité de cela est de l'histoire : des données sur les blocs historiques, les transactions et les reçus, la majeure partie étant vieille de plusieurs années. Cela signifie que la taille d'un nœud ne cesse d'augmenter de plusieurs centaines de gigaoctets chaque année, même si la limite de gaz n'augmente pas du tout.
Une caractéristique clé simplifiant le problème de stockage de l'historique est que chaque bloc pointe vers le bloc précédent via un lien de hachage (et autre structures),avoir consensus sur le présent suffit à avoir consensus sur l'histoire. Tant que le réseau a consensus sur le dernier bloc, tout bloc, transaction ou état historique (solde du compte, nonce, code, stockage) peut être fourni par n'importe quel acteur unique avec une preuve de Merkle, et la preuve permet à quiconque d'en vérifier la justesse. Alors que le consensus est un modèle de confiance N/2-sur-N, l'histoire est un Modèle de confiance 1-sur-N.
Cela ouvre de nombreuses options pour la façon dont nous pouvons stocker l'historique. Une option naturelle est un réseau où chaque nœud ne stocke qu'un petit pourcentage des données. C'est ainsi que les réseaux de torrents ont fonctionné pendant des décennies : alors que le réseau stocke et distribue des millions de fichiers, chaque participant n'en stocke et n'en distribue que quelques-uns. Peut-être de manière contre-intuitive, cette approche ne diminue même pas nécessairement la robustesse des données. Si, en rendant le fonctionnement des nœuds plus abordable, nous pouvons arriver à un réseau de 100 000 nœuds, où chaque nœud stocke au hasard 10 % de l'historique, alors chaque pièce de données serait répliquée 10 000 fois - exactement le même facteur de réplication qu'un réseau de 10 000 nœuds où chaque nœud stocke tout.
Aujourd'hui, Ethereum a déjà commencé à s'éloigner du modèle où tous les nœuds stockent toute l'histoire pour toujours. Les blocs de consensus (c'est-à-dire les parties liées au consensus de preuve d'enjeu) ne sont stockés que pendant environ 6 mois. Les blobs ne sont stockés que pendant environ 18 jours.EIP-4444vise à introduire une période de stockage d'un an pour les blocs et les reçus historiques. L'objectif à long terme est d'avoir une période harmonisée (qui pourrait être d'environ 18 jours) pendant laquelle chaque nœud est responsable de tout stocker, puis d'avoir un réseau pair à pair composé de nœuds Ethereum stockant les données plus anciennes de manière distribuée.
Les codes d'effacement peuvent être utilisés pour augmenter la robustesse tout en maintenant le même facteur de réplication. En fait, les blocs sont déjà codés en effacement afin de prendre en charge l'échantillonnage de disponibilité des données. La solution la plus simple pourrait bien être de réutiliser ce codage en effacement et de placer également les données de bloc d'exécution et de consensus dans des blocs.
Le principal travail restant consiste à construire et à intégrer une solution distribuée concrète pour le stockage de l’historique - au moins l’historique d’exécution, mais finalement aussi le consensus et les blobs. Les solutions les plus simples pour cela sont (i) d’introduire simplement une bibliothèque torrent existante, et (ii) une solution native d’Ethereum appelée le réseau Portal. Une fois que l'un de ceux-ci est introduit, nous pouvons activer EIP-4444. EIP-4444 lui-même ne nécessite pas de hard fork, mais il nécessite une nouvelle version de protocole réseau. Pour cette raison, il est utile de l'activer pour tous les clients en même temps, sinon il y a des risques de dysfonctionnement des clients en se connectant à d'autres nœuds s'attendant à télécharger l'historique complet mais ne le recevant pas réellement.
Le principal compromis concerne la façon dont nous nous efforçons de rendre les données historiques "anciennes" disponibles. La solution la plus simple serait de cesser simplement de stocker l'histoire ancienne demain et de compter sur les nœuds d'archive 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. Le chemin le plus difficile, mais plus sûr, consiste d'abord à développer et à intégrer le réseau torrent pour stocker l'histoire de manière distribuée. Ici, il y a deux dimensions de "la difficulté de notre effort":
Une approche maximale paranoïaque pour (1) impliqueraitpreuve de gardeen fait, exigeant que chaque validateur de preuve d'enjeu stocke un certain pourcentage d'historique et vérifie régulièrement de manière cryptographique qu'ils le font. Une approche plus modérée consiste à établir une norme volontaire pour le pourcentage d'historique que chaque client stocke.
Pour (2), une implémentation de base consiste simplement à prendre le travail qui est déjà fait aujourd'hui: Portal stocke déjà des fichiers ERA contenant toute l'histoire d'Ethereum. Une implémentation plus approfondie consisterait à réellement connecter cela au processus de synchronisation, de sorte que si quelqu'un voulait synchroniser un nœud stockant l'historique complet ou un nœud d'archive, il pourrait le faire même s'il n'y avait pas d'autres nœuds d'archive en ligne, en se synchronisant directement depuis le réseau Portal.
Réduire les besoins de stockage de l'historique est sans doute encore plus important que l'absence d'état si nous voulons faciliter au maximum l'exécution ou la mise en service d'un nœud : sur les 1,1 To nécessaires à un nœud, environ 300 Go sont dédiés à l'état et les 800 Go restants à l'historique. La vision d'un nœud Ethereum fonctionnant sur une montre connectée et se configurant en quelques minutes seulement est réalisable uniquement si l'absence d'état et l'EIP-4444 sont mis en œuvre.
La limitation du stockage de l'historique le rend également plus viable pour les nouvelles implémentations de nœuds Ethereum qui ne prennent en charge que les versions récentes du protocole, ce qui les rend beaucoup plus simples. Par exemple, de nombreuses lignes de code peuvent être supprimées en toute sécurité maintenant que tous les emplacements de stockage vides créés lors des attaques DoS de 2016 ont été supprimés.supprimé. Maintenant que le passage à la preuve d'enjeu est de l'histoire ancienne, les clients peuvent en toute sécurité supprimer tout code lié à la preuve de travail.
Même si nous supprimons le besoin pour les clients de stocker l'historique, les besoins en stockage d'un client continueront de croître, d'environ 50 Go par an, en raison de la croissance continue de l'état : soldes des comptes et nonces, code de contrat et stockage de contrat. Les utilisateurs sont en mesure de payer un coût unique pour imposer une charge aux clients Ethereum présents et futurs pour toujours.
L'État est beaucoup plus difficile à « expirer » que l'histoire, car l'EVM est fondamentalement conçue autour de l'hypothèse qu'une fois qu'un objet d'état est créé, il sera toujours là et pourra être lu par n'importe quelle transaction à tout moment. Si nous introduisons la non-statalité, il y a un argument selon lequel peut-être ce problème n'est pas si grave : seule une classe spécialisée de constructeurs de blocs aurait besoin de stocker réellement l'état, et tous les autres nœuds (mêmeliste d'inclusion production!) peut fonctionner de manière étatique. Cependant, il y a un argument selon lequel nous ne voulons pas trop compter sur l'état de non-état, et éventuellement nous voudrons peut-être expirer l'état afin de maintenir Ethereum décentralisé.
Aujourd'hui, lorsque vous créez un nouvel objet d'état (ce qui peut se produire de trois manières : (i) envoyer de l'ETH à un nouveau compte, (ii) créer un nouveau compte avec un code, (iii) définir un emplacement de stockage précédemment inutilisé), cet objet d'état reste en état pour toujours. Ce que nous voulons plutôt, c'est que les objets expirent automatiquement avec le temps. Le défi clé est de le faire d'une manière qui réalise trois objectifs :
Il est facile de résoudre le problème sans atteindre ces objectifs. Par exemple, vous pouvez faire en sorte que chaque objet d’état stocke également un compteur pour sa date d’expiration (qui peut être prolongée en brûlant de l’ETH, ce qui peut se produire automatiquement chaque fois qu’il est lu ou écrit), et avoir un processus qui parcourt l’état pour supprimer les objets d’état expirés. Cependant, cela introduit des calculs supplémentaires (et même des exigences de stockage), et cela ne répond certainement pas à l’exigence de convivialité. Les développeurs auraient également du mal à raisonner sur les cas limites impliquant des valeurs de stockage parfois réinitialisées à zéro. Si vous fixez le délai d’expiration à l’ensemble du contrat, cela facilite techniquement la vie des développeurs, mais cela rend l’économie plus difficile : les développeurs devraient réfléchir à la manière de « répercuter » les coûts permanents du stockage sur leurs utilisateurs.
Ce sont des problèmes auxquels la communauté de développement de base d'Ethereum a lutté pendant de nombreuses années, y compris des propositions comme “location de la chaîne de blocsetregenesis« Finalement, nous avons combiné les meilleures parties des propositions et convergé vers deux catégories de « solutions connues les moins mauvaises » :
Toutes les propositions d'expiration d'état partiel fonctionnent sur le même principe. Nous divisons l'état en morceaux. Tout le monde stocke de manière permanente la "carte de niveau supérieur" des morceaux vides ou non vides. Les données à l'intérieur de chaque morceau sont stockées uniquement si ces données ont été récemment consultées. Il existe un mécanisme de "résurrection" où si un morceau n'est plus stocké, n'importe qui peut ramener ces données en fournissant une preuve de ce que les données étaient.
Les principales distinctions entre ces propositions sont : (i) comment définissons-nous "récemment", et (ii) comment définissons-nous "chunk" ? Une proposition concrète est EIP-7736, qui s'appuie sur la conception « tige-et-feuille » introduit pour les arbres Verkle (bien qu'il soit compatible avec toutes les formes de non-état, par exemple les arbres binaires). Dans cette conception, les en-têtes, les codes et les emplacements de stockage qui se trouvent à côté les uns des autres sont stockés sous la même « branche ». Les données stockées sous une branche peuvent être au maximum de 256 * 31 = 7 936 octets. Dans de nombreux cas, l'intégralité de l'en-tête et du code, ainsi que de nombreux emplacements de stockage clés, d'un compte seront tous stockés sous la même branche. Si les données sous une branche donnée ne sont pas lues ou écrites pendant 6 mois, les données ne sont plus stockées et seule une attestation de 32 octets (« ébauche ») des données est stockée. Les transactions futures qui accèdent à ces données devraient « ressusciter » les données, avec une preuve qui serait vérifiée par rapport à l'ébauche.
Il existe d'autres moyens de mettre en œuvre une idée similaire. Par exemple, si la granularité au niveau du compte n'est pas suffisante, nous pourrions mettre en place un système où chaque fraction 1/232 de l'arbre est régi par un mécanisme similaire de tige et de feuille.
C'est plus délicat en raison des incitations : un attaquant pourrait forcer les clients à stocker en permanence une très grande quantité d'état en mettant une très grande quantité de données dans un seul sous-arbre et en envoyant une seule transaction chaque année pour 'renouveler l'arbre'. Si vous faites en sorte que le coût de renouvellement soit proportionnel (ou la durée de renouvellement inversement proportionnelle) à la taille de l'arbre, alors quelqu'un pourrait nuire à un autre utilisateur en mettant une très grande quantité de données dans le même sous-arbre qu'eux. On pourrait essayer de limiter ces deux problèmes en rendant la granularité dynamique en fonction de la taille du sous-arbre : par exemple, chaque groupe de 216 = 65536 objets d'état consécutifs pourrait être traité comme un 'groupe'. Cependant, ces idées sont plus complexes ; l'approche basée sur la tige est simple et elle aligne les incitations, car généralement toutes les données sous une tige sont liées à la même application ou au même utilisateur.
Et si nous voulions éviter toute croissance permanente de l'état, même les pointeurs de 32 octets ? C'est un problème difficile en raison de...@vbuterin/state_size_management#Resurrection-conflicts">conflits de résurrection : que se passe-t-il si un objet d’état est supprimé, l’exécution ultérieure d’EVM met un autre objet d’état exactement dans la même position, mais qu’après cela, quelqu’un qui se soucie de l’objet d’état d’origine revient et essaie de le récupérer ? En cas d’expiration partielle de l’état, le « stub » empêche la création de nouvelles données. Avec l’expiration complète de l’État, nous ne pouvons pas nous permettre de stocker même le talon.
La conception basée sur la période d’adresse est l’idée la plus connue pour résoudre ce problème. Au lieu d’avoir un arbre d’état stockant l’ensemble de l’état, nous avons une liste d’arbres d’état qui ne cesse de s’allonger, et tout état qui est lu ou écrit est enregistré dans l’arbre d’état le plus récent. Un nouvel arbre d’état vide est ajouté une fois par période (pensez : 1 an). Les arbres d’état plus anciens sont gelés. Les nœuds complets ne sont censés stocker que les deux arbres les plus récents. Si un objet d’état n’a pas été touché pendant deux périodes et tombe donc dans une arborescence expirée, il peut toujours être lu ou écrit, mais la transaction devra prouver une preuve de Merkle pour cela - et une fois qu’elle l’aura fait, une copie sera à nouveau enregistrée dans la dernière arborescence.
Une idée clé pour rendre tout cela convivial pour les utilisateurs et les développeurs est le concept de périodes d'adresse. Une période d'adresse est un nombre faisant partie d'une adresse. Une règle clé est qu'une adresse avec une période d'adresse N ne peut être lue ou écrite qu'au cours ou après la période N (c'est-à-dire lorsque la liste d'arbre d'état atteint la longueur N). Si vous enregistrez un nouvel objet d'état (par exemple, un nouveau contrat, ou un nouveau solde ERC20), si vous vous assurez de mettre l'objet d'état dans un contrat dont la période d'adresse est soit N soit N-1, alors vous pouvez l'enregistrer immédiatement, sans avoir besoin de fournir des preuves qu'il n'y avait rien avant. Toute addition ou modification de l'état dans des périodes d'adresse plus anciennes, en revanche, nécessite une preuve.
Ce design préserve la plupart des propriétés actuelles d'Ethereum, est très léger en calculs supplémentaires, permet aux applications d'être écrites presque comme elles le sont aujourd'hui (les ERC20 devront être réécrits, pour garantir que les soldes des adresses avec la période d'adresse N sont stockés dans un contrat enfant qui a lui-même la période d'adresse N), et résout le problème de la "cave pour cinq ans". Cependant, il a un gros problème : les adresses doivent être étendues au-delà de 20 octets pour s'adapter aux périodes d'adresse.
Une proposition consiste à introduire un nouveau format d'adresse de 32 octets, qui comprend un numéro de version, un numéro de période d'adresse et un hash étendu.
0x01000000000157aE408398dF7E5f4552091A69125d5dFcb7B8C2659029395bdF
Le rouge est un numéro de version. Les quatre zéros colorés en orange ici sont destinés à représenter un espace vide, qui pourrait contenir un numéro de fragment à l'avenir. Le vert est un numéro de période d'adresse. Le bleu est un hachage de 26 octets.
Le défi clé ici est la compatibilité ascendante. Les contrats existants sont conçus autour d'adresses de 20 octets et utilisent souvent des techniques serrées d'empaquetage d'octets qui supposent explicitement que les adresses font exactement 20 octets de long.@ipsilon/address-space-extension-exploration">Une idée pour résoudre ce problème implique une carte de traduction, où les contrats de l’ancien style interagissant avec des adresses de nouveau style verraient un hachage de 20 octets de l’adresse du nouveau style. Cependant, il existe des complexités importantes pour rendre cela sûr.
Une autre approche va dans la direction opposée : nous interdisons immédiatement une sous-plage de taille 2128 (par exemple toutes les adresses commençant par 0xffffffff), puis utilisons cette plage pour introduire des adresses avec des périodes d'adresses et des hachages de 14 octets.
0xfffffff000169125d5dFcb7B8C2659029395bdF
Le principal sacrifice que fait cette approche, c’est qu’elle introduit des risques de sécurité pour les adresses contrefaites: les adresses qui détiennent des actifs ou des autorisations, mais dont le code n'a pas encore été publié sur la chaîne. Le risque consiste en ce que quelqu'un crée une adresse qui prétend avoir un morceau de code (pas encore publié), mais qui a également un autre morceau de code valide qui a la même empreinte que l'adresse. Calculer une telle collision nécessite 280hachages aujourd'hui; la contraction de l'espace d'adressage réduirait ce nombre à un 2 très accessible56hachages.
La zone de risque clé, les adresses contrefactuelles qui ne sont pas des portefeuilles détenus par un seul propriétaire, est un cas relativement rare aujourd'hui, mais il est probable qu'il deviendra plus courant à mesure que nous entrerons dans un monde multi-L2. La seule solution est d'accepter simplement ce risque, mais d'identifier tous les cas d'utilisation courants où cela pourrait poser un problème et de trouver des solutions de contournement efficaces.
Je vois quatre voies viables pour l'avenir :
Un point important est que les problèmes difficiles liés à l'expansion et à la contraction de l'espace d'adressage devront finalement être abordés, que les schémas d'expiration de l'état qui dépendent des changements de format d'adresse soient ou non mis en œuvre. Aujourd'hui, cela prend environ 280hachages pour générer une collision d'adresse, une charge computationnelle déjà réalisable pour des acteurs extrêmement bien dotés : un GPU peut faire environ 227hachages, donc en le faisant fonctionner pendant un an, il peut calculer 252, donc tout ~2^30 GPU dans le mondepourrait calculer une collision en ~1/4 d'année, et les FPGAs et les ASICs pourraient accélérer cela davantage. À l'avenir, de telles attaques seront accessibles à de plus en plus de personnes. Par conséquent, le coût réel de la mise en œuvre de l'expiration complète de l'état peut ne pas être aussi élevé qu'il semble, car nous devons résoudre ce problème d'adresse très difficile quoi qu'il en soit.
La réalisation de l'expiration de l'état rend potentiellement les transitions d'un format d'arbre d'état à un autre plus faciles, car il n'y aura pas besoin de procédure de transition : vous pourriez simplement commencer à créer de nouveaux arbres en utilisant un nouveau format, puis effectuer ultérieurement une bifurcation dure pour convertir les anciens arbres. Ainsi, bien que l'expiration de l'état soit complexe, elle présente des avantages en simplifiant d'autres aspects de la feuille de route.
L'une des conditions préalables clés de la sécurité, de l'accessibilité et neutralité crédibleC'est la simplicité. Si un protocole est beau et simple, cela réduit les chances qu'il y ait des bugs. Cela augmente la possibilité que de nouveaux développeurs puissent intervenir et travailler avec n'importe quelle partie. Il est plus probable d'être juste et plus facile à défendre contre les intérêts spéciaux. Malheureusement, les protocoles, comme tout système social, deviennent par défaut de plus en plus complexes avec le temps. Si nous ne voulons pas qu'Ethereum tombe dans un trou noir de complexité croissante, nous devons faire l'une des deux choses suivantes : (i) arrêter de faire des changements et ossifier le protocole, (ii) être capable de réellement supprimer des fonctionnalités et réduire la complexité. Une voie intermédiaire, consistant à apporter moins de modifications au protocole et à supprimer au moins un peu de complexité avec le temps, est également possible. Cette section expliquera comment nous pouvons réduire ou supprimer la complexité.
Il n'y a pas de solution unique qui puisse réduire la complexité du protocole; la nature inhérente du problème est qu'il y a de nombreuses petites solutions.
Un exemple qui est déjà presque terminé et peut servir de modèle pour gérer les autres, est le @vbuterin/selfdestruct">suppression de l’opcode SELFDESTRUCT. L’opcode SELFDESTRUCT était le seul opcode capable de modifier un nombre illimité d’emplacements de stockage au sein d’un seul bloc, ce qui obligeait les clients à implémenter beaucoup plus de complexité pour éviter les attaques par déni de service. L’objectif initial de l’opcode était de permettre l’effacement volontaire de l’État, permettant à la taille de l’État de diminuer au fil du temps. Dans la pratique, très peu ont fini par l’utiliser. Le l'opcode a été affaiblipour permettre uniquement des comptes auto-destructeurs créés dans la même transaction dans le hardfork Dencun. Cela résout le problème de DoS et permet une simplification significative du code client. À l'avenir, il est probablement judicieux de supprimer complètement l'opcode.
Voici quelques exemples clés d'opportunités de simplification du protocole qui ont été identifiées jusqu'à présent. Tout d'abord, quelques exemples qui se trouvent en dehors de l'EVM; ceux-ci sont relativement non invasifs, et donc plus faciles à obtenir un consensus et à mettre en œuvre dans un délai plus court.
Maintenant, quelques exemples qui sont à l'intérieur de l'EVM :
Le principal compromis dans la réalisation de ce type de simplification des fonctionnalités est (i) dans quelle mesure nous simplifions et à quelle vitesse par rapport à (ii) la compatibilité ascendante. La valeur d'Ethereum en tant que chaîne provient du fait qu'il s'agit d'une plateforme sur laquelle vous pouvez déployer une application en étant certain qu'elle fonctionnera encore de nombreuses années à partir de maintenant. En même temps, il est possible d'aller trop loin dans cet idéal et,pour paraphraser William Jennings Bryan, "crucifier Ethereum sur une croix de compatibilité arrière". S'il n'y a que deux applications dans tout Ethereum qui utilisent une fonctionnalité donnée, et que l'une n'a eu aucun utilisateur depuis des années et que l'autre est presque complètement inutilisée et sécurise un total de 57 $ de valeur, alors nous devrions simplement supprimer la fonctionnalité, et si nécessaire, dédommager les victimes de 57 $ de notre poche.
Le problème social plus large réside dans la création d'un pipeline standardisé pour apporter des modifications non urgentes qui rompent la compatibilité ascendante. Une façon d'aborder cela est d'examiner et d'étendre les précédents existants, tels que le processus SELFDESTRUCT. Le pipeline ressemble à ce qui suit :
Il devrait y avoir un pipeline de plusieurs années entre l'étape 1 et l'étape 4, avec des informations claires sur les articles qui se trouvent à quelle étape. À ce stade, il y a un compromis entre la vigueur et la rapidité du pipeline de suppression des fonctionnalités, d'une part, et la prudence et l'investissement de plus de ressources dans d'autres domaines du développement du protocole, d'autre part, mais nous sommes encore loin de la frontière de Pareto.
Un ensemble majeur de modifications proposées pour l'EVM est le Format d'objet EVM (EOF). EOF introduit un grand nombre de changements, tels que l'interdiction de l'observabilité du gaz, l'observabilité du code (c'est-à-dire pas de CODECOPY), permettant uniquement des sauts statiques. Le but est de permettre à l'EVM d'être améliorée davantage, d'une manière qui a des propriétés plus fortes, tout en préservant la compatibilité ascendante (car l'EVM pré-EOF existera toujours).
Cela a l'avantage de créer un chemin naturel pour l'ajout de nouvelles fonctionnalités EVM et d'encourager la migration vers un EVM plus restrictif avec des garanties plus solides. Cela a l'inconvénient d'augmenter significativement la complexité du protocole, à moins que nous ne trouvions un moyen de rendre obsolète et de supprimer l'ancien EVM. Une question majeure est : quel rôle joue l'EOF dans les propositions de simplification de l'EVM, surtout si l'objectif est de réduire la complexité de l'EVM dans son ensemble ?
De nombreuses propositions d'"amélioration" dans le reste de la feuille de route sont également des occasions de simplifier d'anciennes fonctionnalités. Pour reprendre quelques exemples ci-dessus :
Une stratégie de simplification plus radicale d'Ethereum consiste à conserver le protocole tel quel, mais à déplacer une grande partie de ses fonctionnalités de protocole vers du code de contrat.
La version la plus extrême de ceci serait de faire en sorte que la L1 Ethereum soit «techniquement» juste la chaîne de balises, et d'introduire une VM minimale (par exemple.RISC-V, Le Caire, ou quelque chose de encore plus minimal spécialisé pour les systèmes de preuve) qui permet à n'importe qui d'en créer son propre rollup. L'EVM se transformerait ensuite en le premier de ces rollups. C'est ironiquement exactement le même résultat que le propositions d'environnements d'exécution de 2019-20, bien que les SNARK rendent sa mise en œuvre beaucoup plus viable en réalité.
Une approche plus modérée consisterait à maintenir la relation entre la chaîne de balises et l'environnement d'exécution Ethereum actuel tel quel, mais à effectuer un remplacement sur place de l'EVM. Nous pourrions choisir RISC-V, Cairo ou une autre machine virtuelle pour être la nouvelle "machine virtuelle Ethereum officielle", puis convertir de force tous les contrats EVM en code de nouvelle machine virtuelle qui interprète la logique du code original (en le compilant ou en l'interprétant). Théoriquement, cela pourrait même être fait avec la "machine virtuelle cible" étant une version de EOF.