关于openzepplin智能合约可升级代理的安全问题与防御措施。
最新的合约升级方式,主要有两种:透明代理(Transparent Proxy)和UUPS(EIP1822)
题外话:不可升级代理(“最小代理”)可以参考EIP1167,不可升级代理是为了减少部署成本。
透明代理解决了这一冲突。通过区分Admin管理员和普通用户,来实现代理合约和实际逻辑合约的调用隔离。
解决方案:模仿Solidity如何处理映射和动态大小的数组,使用非结构化存储模式。
一般来说,构造函数在合约部署成功后便被丢弃。那么Proxy合约在设置impl合约时无法通过常规方式进行合约初始化。
解决方案:OpenZeppelin合约包含一个基础可初始化合约提供实现此模式的initializer修饰符。使用initializer函数来进行初始化,同时需要确保initializer函数只被调用一次。
delegatecall在调用合约时,如果目标合约地址不存在,也会顺利调用返回。
因此需要警惕合约地址不存在的情况。
impl合约应该禁止使用自毁函数。如果impl合约被通过selfdestruct指令清除,在Proxy合约层面delegatecall会继续顺利调用,但是合约已经被销毁。另外如果用于管理升级的逻辑位于impl合约中而不位于proxy合约中(如使用了UUPS代理模式),则实际上会导致再也无法使用代理。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!