跳到主要内容

Initializeable Proxy

Summary

如今,大部分的代理合约都是可初始化的,使用Proxy的好处之一就是,只需要部署一次逻辑合约,就可以部署很多指向他的代理合约。 但是随之而来的缺点就是,无法在已经部署的逻辑合约中使用构造函数。

所以我们使用initialize()函数来设置初始存储值。

uint8 private _initialized;

function initializer() external {
require(msg.sender == owner);
require(_initialized < 1);
_initialized = 1;

// set some state vars
// do initialization stuff
}

The role of initialize()

OpenZeppelin's initializable package plays a significant role in Solana smart contract creation. It makes it possible to construct complex contracts that are easily managed and upgradable. It is imperative to understand its functionality and how it interacts with other elements in the smart contract.

在可升级合约中 ,存储是在代理合约上的,而实现逻辑是放在逻辑合约中的,所以使用构造函数来初始化存储变量是不适用的。所以我们使用initialized()函数来初始化带有存储的代理。

这样一来,我们就可以在部署新代理的时候初始化存储。

Vuln

  • uninitialized proxies Attack

Example

...