メインコンテンツまでスキップ

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();
}
}

Reference