Transparent Proxy (TPP)
Summary
和可升级代理类似,但是不同的是,代理会进行判断,如果caller是代理的amdin,那么代理合约将不会进行任何的委托调用,如果caller是任意其他地址,那么代理将始终委托调用,即使函数的sig和代理的函数sig匹配,通 常使用modifier来实现,例如Openzeppelin中:
modifier ifAdmin() {
if (msg.sender == _getAdmin()) {
_;
} else {
_fallback(); // redirects call to proxy
}
}
并且在fallback()中检查:
require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
- 逻辑合约地址-存储在代理合约中的指定的slot中
- 升级逻辑-代理合约中,并且规定了只有admin可以调用
- 合约验证
TPP解决了函数冲突的问题,因为他们用不会被指向到逻辑合约中,并且由于升级的逻辑代码在代理商,所以即使代理合约未初始化活着合约被自会,仍然可以将逻辑合约设置为新地址。
但是也有一些问题:
- 每次调用不光收取delegatecall的Gas费用,同时还有因为检查是否是admin而产生的SLOAD成本
- 升级的逻辑代码在代理合约上,因此bytecode会更多,部署成本会更多