事情变得更加复杂:Etherscan 被欺骗显示错误的实现合约的方式是基于在同一个前置交易中设置两个不同的代理槽。因此,Etherscan 使用某种启发式方法,结合不同的存储槽来检索实现合约。 有一个旧的 OpenZeppelin 代理使用了以下槽:`keccak256("org.zeppelinos.proxy.implementation")` = `0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3` 我们现在还有标准的 EIP-1967 槽 `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)` = `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` 所以发生的事情是,旧的 OpenZeppelin 代理槽被写入了良性的实现地址 _和_ 标准的 EIP-1967 槽也被写入了恶意的实现地址。由于 Etherscan 首先查询旧的代理槽,因此它首先检索到了看起来良好的那个,从而显示了它。
- 旧的OZ代理插槽: - 旧的Etherscan关于代理支持的博客: - 前跑交易示例:
41.03K