Messages
avatar

Smart contract maxis, Votre compilateur Solidity a peut-être silencieusement supprimé un stockage dont vous aviez besoin, sans que vous le voyiez jamais dans votre code source. Solidity 0.8.38 est sortie jeudi dernier. Elle corrige un bug dans l’optimiseur Yul présent dans toutes les versions de 0.8.19 à 0.8.37. L’optimiseur garde une trace de ce qui se trouve en mémoire et en stockage. Il utilise ces informations pour remplacer un chargement par une valeur qu’il connaît déjà, et pour ignorer un stockage qui écrit une donnée déjà présente. Pour déterminer si deux adresses peuvent se chevaucher, il décrit chaque adresse comme une variable de base plus un décalage. Même base, décalage différent : elles doivent donc se trouver dans des emplacements différents. Ces descriptions étaient mises en cache. Puis quelqu’un réaffecte la variable de base. L’optimiseur ne le détecte pas toujours. Il compare maintenant une adresse construite à partir de l’ancienne valeur avec une autre construite à partir de la nouvelle valeur, comme si elles partageaient la même base. Il conclut qu’elles sont différentes, mais à l’exécution, elles pointent vers le même emplacement. Le résultat est une note périmée. Un chargement ultérieur peut renvoyer une ancienne valeur. Un stockage dont vous aviez besoin peut être supprimé. Un keccak256 sur cet emplacement peut hacher des données obsolètes. Seul le code compilé avec l’optimiseur activé est concerné. Avec via-IR, tout code peut être affecté, même sans assembly inline. Avec le pipeline legacy par défaut, uniquement certains fragments d’assembly inline et les fonctions auxiliaires générées par le compilateur. Les builds non optimisés sont sûrs. L’équipe classe ce bug comme de faible gravité, et ils ont fait quelque chose que je souhaite à chaque équipe de compilateur : Ils ont recompilé tous les contrats vérifiés dans la base de données Sourcify avec et sans la correction, et le bytecode était identique pour tous. Ainsi, ce bug est rare. Rare ne signifie pas inexistant, surtout si votre code est récent et non encore déployé. Ce bug a été découvert via le programme de récompense de l’Ethereum Foundation, et un second rapport a montré qu’il peut être déclenché avec du Solidity pur, sans assembly.

Ce contenu est uniquement fourni à titre informatif et éducatif. Il peut inclure des analyses de tiers, du contenu sponsorisé ou du matériel promotionnel pour lequel le créateur peut recevoir une compensation. Rien dans ce fil d’actualité ne constitue un conseil en investissement ni une garantie de rendement. Vous êtes seul responsable de vos décisions d’investissement. Effectuez toujours vos propres recherches et faites preuve de prudence avant de trader. Nous ne garantissons pas l’exactitude des informations de tiers et ne sommes pas responsables des pertes éventuelles. Les performances passées ne préjugent pas des résultats futurs. Veuillez consulter les Conditions de la communauté et notre Déclaration de divulgation des risques pour plus de détails.

avatarPubliez votre réponse

Commentaire