Solidity
為什麼限制管理員訪問透明代理中的回退功能?
在透明可升級代理合約中,有一個部分阻止管理員訪問回退功能:
/** * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}. */ function _beforeFallback() internal virtual override { require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target"); super._beforeFallback(); }
為什麼要限制管理員訪問回退功能?這樣做有什麼特別的原因嗎?
這是因為代理合約函式和目標合約函式之間可能存在歧義。如果代理和實現中都存在一個函式,並且管理員在代理上呼叫它,你會怎麼做?在代理中處理它是有效的,但將它轉發給實現也是有效的……這可能導致帶有隱藏函式標識符衝突的離散後門漏洞,如here所述。管理員可以使用它們來離散地修改代理,或禁止使用者訪問實現功能……
因此,為了消除所有歧義並保護每個人:
所有非管理員呼叫都將被轉發,所有管理員呼叫都將作用於代理本身,並且永遠不會通過此修飾符轉發:
/** * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. */ modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } }
您添加的程式碼只是一個額外的安全措施,確保即使管理員從代理實現中呼叫未知函式,它也不會被轉發:管理員僅作用於代理,沒有歧義。
openzeppelin 部落格文章在這方面也提供了相當豐富的資訊。