ERC1976
この記事では、このコミット時点でのERC1976の記載を参照しています。
この段階ではステータスがreviewなので仕様が変更される可能性はあります。
ERC1976の説明
ERC1976とはProxy Patternのコントラクトを実装する際に、Storage Contractの中でLogic Contractの中で定義されているslotと衝突しないように、特定のアドレスを保持するためのslotを定義する規格です。
Proxy Patternについての記事は別途作成予定です。
ドキュメント上では下記のアドレスについて言及されています。
- Logic contract address
- Beacon contract address
- Admin address
Logic contract
実際のロジックが実装されているコントラクトです。Storage ContractはProxyはこのLogic Contractにdelegatecallを行うように実装します。
Logic contractのslotは下記のように定義されています。
// bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1))
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
Beacon contract
ProxyのLogic Contractをまとめて管理するためのコントラクトです。一回のトランザクションでまとめてProxyのアップグレードを行いたい時に使用します。
Beacon contractのslotは下記のように定義されています。
// bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)
0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50
Admin address
Proxyのアップグレードを行う権限を持ったアドレスです。
Admin addressのslotは下記のように定義されています。
// bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
ERC1976の具体的な実装
OpenZeppelinの実装です。
実際にデプロイしたコントラクト
こちらの記事で実際にデプロイしたコントラクトを確認できます。