
Smart contract maxis, Su compilador de Solidity podría haber eliminado silenciosamente un almacenamiento que necesitaba, y nunca lo habría visto en su código fuente. Solidity 0.8.38 se lanzó el jueves pasado. Corrige un error en el optimizador Yul que estuvo presente en todas las versiones desde la 0.8.19 hasta la 0.8.37. El optimizador lleva un registro de lo que hay en memoria y en almacenamiento. Utiliza esos registros para reemplazar una carga con un valor que ya conoce, y para omitir un almacenamiento que escribe lo que ya está allí. Para determinar si dos direcciones pueden superponerse, describe cada una como una variable base más un desplazamiento. Misma base, desplazamiento diferente, por lo tanto deben ser diferentes ranuras. Esas descripciones se almacenaban en caché. Luego, alguien vuelve a asignar la variable base. El optimizador no siempre lo nota. Ahora compara una dirección construida con el valor antiguo con otra construida con el valor nuevo, como si compartieran la misma base. Decide que son diferentes, pero en tiempo de ejecución apuntan al mismo lugar. El resultado es un registro obsoleto. Una carga posterior puede devolver un valor antiguo. Un almacenamiento que necesitaba puede eliminarse. Un keccak256 sobre esa ubicación puede hashear datos desactualizados. Solo el código compilado con el optimizador activado está expuesto. Con via-IR, cualquier código puede afectarlo, incluso sin ensamblaje en línea. Con la canalización heredada predeterminada, solo algunos ensamblajes en línea y funciones auxiliares generadas por el compilador. Las compilaciones sin optimizar son seguras. El equipo lo clasifica como baja gravedad, y hicieron algo que desearía que todos los equipos de compiladores hicieran: Volvieron a compilar todos los contratos verificados en la base de datos de Sourcify con y sin la corrección, y el bytecode fue idéntico en todos ellos. Por lo tanto, es raro. Raro no es lo mismo que nunca, especialmente si su código es reciente y aún no se ha desplegado. El error se descubrió a través del programa de recompensas por errores de la Ethereum Foundation, y un segundo informe mostró que Solidity simple sin ensamblaje también puede activarlo.
