Initialize
Initializeについて学習します
initializeはProxyコントラクトを初期化する、コンストラクタの代わりとなる関数です
原理
コンストラクタはデプロイされたコントラクトの変数・定数を設定するために用いられる
UUPSではプロキシコントラクトと実装コントラクトに分かれているため、実装コントラクトのコンストラクタに初期化処理を書いてもその値は実装コントラクトにしか格納されない
またプロキシコントラクトのコンストラクタに初期化処理を書いても変数のストレージレイアウトは実装コントラクトしか知らないため正しく初期化できない
そこで、実装コントラクトに初期化関数を用意し、プロキシコントラクトから初期化関数を呼び出すことで、プロキシコントラクトに初期値を書き込むことが可能になる
また初期化関数は一度しか呼び出せないようにすることで上書きを防止する
Initializable
initializeに用いる関数を定義し、initializerモディファイアを付与することで初期化関数として定義できる
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
contract MyContract is Initializable {
uint256 public x;
function initialize(uint256 _x) public initializer {
x = _x;
}
}