•Last updated: 2025-4-24
Initialized problems
#solidity#security
1. 缺少 _disableInitializers() 标识符
未初始化的合约可以被攻击者接管。这适用于代理及其 implementation contract,这可能会影响代理。但是影响并不会特别大,因为开发者会注意到并且重新部署一份新的合约。
soliditycontract xxx { constructor() { _disableInitializers(); // ...logic code } function initializer() public onlyRole(ADMIN_ROLE) { // ...logic code } }
2. 重复的标记initializer()
initializer() 适用于标记合约的初始化函数,确保仅调用一次
onlyInitializing() 用于父合约的初始化函数,允许可升级合约中被调用数次
错误或重复的使用 Initializer 会导致子合约无法正确初始化,导致 revert
modifier onlyInitializing() {require(_initializing, “Contract is not initializing”) _;}
solidity// ❌Error examples // Father contract Parent { function initialize() public initializer { Child.initialize(); // revert } } // Children contract Child is Parent { function initialize() public initializer { } }
solidity// ✔correct examples // Father contract Parent { function initialize() public initializer { Child.initialize(); } } // Children contract Child is Parent { function initialize() public onlyInitializing { } }
3. 可升级合约中继承同样需要实现正确的可升级处理
帮助合约在未来免受底层库潜在变化的影响
如果合约继承了 OwnableUpgradeable、ReetrancyGuardUpgradeable、PausableUpgradeable等库,那么初始化中需要对这些继承做处理
solidityfunction initialize() public initializer { __Ownable_init(); __Pausable_init(); }