LoginSignup
1
1

More than 5 years have passed since last update.

「スマートコントラクトを作るスマートコントラクト」の書き方

Posted at

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を参考に。
- Style Guide

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1