
Smart contract maxis, Seu compilador Solidity pode ter excluído silenciosamente um armazenamento que você precisava, e você nunca o veria em seu código-fonte. O Solidity 0.8.38 foi lançado na quinta-feira passada. Ele corrige um bug no otimizador Yul que estava presente em todas as versões de 0.8.19 a 0.8.37. O otimizador mantém anotações sobre o que está na memória e no armazenamento. Ele usa essas anotações para substituir uma carga por um valor que já conhece e para pular um armazenamento que escreve o que já está lá. Para decidir se dois endereços podem se sobrepor, ele descreve cada um como uma variável base mais um deslocamento. Mesma base, deslocamento diferente, então devem ser slots diferentes. Essas descrições eram armazenadas em cache. Depois, alguém reatribui a variável base. O otimizador nem sempre percebe. Agora ele compara um endereço construído com o valor antigo com outro construído com o valor novo, como se compartilhassem a mesma base. Ele decide que são diferentes, mas em tempo de execução apontam para o mesmo local. O resultado é uma anotação desatualizada. Uma carga posterior pode retornar um valor antigo. Um armazenamento que você precisava pode ser removido. Um keccak256 nesse local pode gerar hash de dados desatualizados. Apenas código compilado com o otimizador ativado está exposto. Com via-IR, qualquer código pode atingi-lo, mesmo sem assembly embutido. Com o pipeline legado padrão, apenas alguns trechos de assembly embutido e funções auxiliares geradas pelo compilador. Builds não otimizados são seguros. A equipe classifica como baixa gravidade, e fizeram algo que desejo que toda equipe de compiladores fizesse: Recompilaram todos os contratos verificados no banco de dados do Sourcify com e sem a correção, e o bytecode foi idêntico para todos eles. Portanto, é raro. Raro não é o mesmo que nunca, especialmente se seu código for novo e ainda não implantado. O bug foi descoberto através do programa de recompensa de falhas da Ethereum Foundation, e um segundo relatório mostrou que Solidity simples, sem assembly, também pode acioná-lo.
