這變得更加複雜: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 博客關於代理支持: - 前跑交易示例:
40.99K