Qiita BlockChain Advent Calendar 2018 6日目の記事です。今回はスマートコントラクトに関する小ネタとして「スマートコントラクトを作るスマートコントラクト」について書こうと思います。
スマートコントラクトを作るスマートコントラクト
不特定多数の人が似たようなコントラクトを作りたいケースがあります。例えば「募金」のコントラクトなどは、募金によって必要となる property や function に大きな違いはなさそうです。
そのような場合、募金のコントラクトを作るコントラクトを用意しておけば、募金コントラクトを作りたい人は募金名・募金可能期間・関連URLなどその募金特有の情報だけを入力すれば、誰でも同様の情報・機能をもつコントラクトを同じ仕組みで作ることができます。
スマートコントラクトを作るスマートコントラクトの書き方
ここでは「スマートコントラクトを作るスマートコントラクト」のことをFactoryコントラクトと呼ぶことにします。
Factoryコントラクトの中でnew [作成するコントラクト名]
することでコントラクトを作成できます。
pragma solidity ^0.4.25;
contract [Factoryコントラクト名] {
// コントラクト作成function
function createContract(/* 引数がある場合は引数を書く */) public returns (address) {
address newContract = new [作成するコントラクト名](/* 引数がある場合は引数を書く */);
return newContract;
}
}
contract [作成するコントラクト名] {
// do something...
}
備考
作成したコントラクトのオーナーについて
コントラクトのオーナーアドレスを設定する際、コントラクト内でowner = msg.sender
すると思います。上記の[作成するコントラクト]内でowner = msg.sender
とすると、作成したコントラクトのオーナーアドレスはFactoryコントラクトのアドレスになります。
createContract を実行したアドレスをオーナーアドレスとしたい場合は、createContract の中でmsg.sender
を取得しておいて、new する際に引数に渡しましょう。
contract [Factoryコントラクト名] {
// コントラクト作成function
function createContract(/* 引数がある場合は引数を書く */) public returns (address) {
address ownerAddress = msg.sender;
address newContract = new [作成するコントラクト名](ownerAddress);
return newContract;
}
}
contract [作成するコントラクト名] {
constructor(address _ownerAddress) public {
owner = _ownerAddress;
}
// do something...
}
Style Guide
Solidityの綺麗な書き方については以下のStyle Guideを参考に。