ERC1167
ERC1167について学習します
ERC1167はMinimal Proxyとも呼ばれていて、コントラクトを安価にデプロイできるのが特徴です
原理
既知のテンプレートコントラクトがあり、すべての処理をテンプレートにdelegatecallすることで、新たにデプロイしたコントラクトは「すべての処理をテンプレートにdelegatecallする」という命令のバイトコードと「テンプレートコントラクトのアドレス」のみを持つだけでよくなる
メリット
結果として生成されるプロキシコ ントラクトのサイズはテンプレートアドレス含めて45バイトであり、テンプレートコントラクトのサイズに依存しない
決まったアドレスのクローンを、格安で、少なくとも呼び出すまで不正がないことを保証できる
実装
OpenZeppelinのClonesを利用することで簡単にMinimal Proxyをデプロイできる
import "@openzeppelin/contracts/proxy/Clones.sol";
// dummy deployed address 0xabc...xyz
contract Template {
uint a;
function setNum(uint x) {
a = x;
}
}
contract Factory is Clones {
function cloneTemplate() {
// create new contract 0x123...890
address newAddress = clone(0xabc...xyz);
}
}
initialize
Minimal Proxyによってデプロイされたコントラクトはconstructorを使えない
そのため初期化はinitialize関数を独自に定義してデプロイ後に呼び出す必要がある
import "@openzeppelin/contracts/proxy/Clones.sol";
// dummy deployed address 0xabc...xyz
contract Template {
bool initialized;
uint a;
function initialize() {
require(!initialized);
initialized = true;
a = 1;
}
function setNum(uint x) {
a = x;
}
}
contract Factory is Clones {
function cloneTemplate() {
// create new contract 0x123...890
address newAddress = clone(0xabc...xyz);
ITemplate(newAddress).initialize();
}
}