跳到主要内容

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会更多,部署成本会更多

Vuln

Refer

TPP Pattern