Ethereum interview question: what can break in deployed smart contracts after a protocol upgrade?
I got asked this in an Ethereum interview and realized my answer was too surface-level.
When an Ethereum protocol upgrade or hard fork happens, deployed smart contracts don’t change because the bytecode is immutable. But I keep hearing that contracts can still break in production after upgrades. So I’m trying to understand the real-world impact, not just the theory.
What’s the practical difference between “deployed smart contracts keep running after protocol upgrades” and “they keep running but assumptions break”? I’ve heard examples around opcode repricing, gas schedule changes, and even subtle EVM behavior changes causing failures.
Specifically, I’m curious about things like Istanbul-style opcode repricing, Berlin warm vs cold state access gas changes, contracts relying on fixed gas or stipend-based calls like transfer or send, and newer changes that affect SELFDESTRUCT semantics. In production systems, what actually goes wrong and why?
If you’re shipping DeFi, NFT, or protocol-level contracts, what does your mainnet hard fork regression testing process look like? Do you fork test every critical flow, or are there specific patterns you always stress test first?
If you’ve lived through a protocol upgrade that changed how you design contracts, I’d love to hear what broke and what you changed afterward.