はじめに
第4回 最新技術動向にて、ERC20トークンの解説をしました。そこで、MiniMeトークンにての概要を説明しました。
今回はMiniMeトークンについて具体的に以下の事項を説明します。
- MiniMeトークンとは
- 今回やることの概要
- 親トークンの作成
- クローントークンの作成
- キャンペーンコントラクト
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
MiniMeトークンとは
MiniMeトークンとは「クローン可能なERC20トークン」を作成できるライブラリ的な扱いをされるコントラクトであり、それを使用して作成されたトークンそのものの呼び方でもあります。MiniMeトークンはGivethにより提案されました。
通常、トークンなどのスマートコントラクトは一度デプロイしてしまうとメソッドの追加や修正が不可能です。しかし、元のトークンの保有量などの状態を引き継ぐ「独立したクローントークン」を作成することで、トークンに新機能を追加したり、一時的な役割を与えたりすることが出来ます。MiniMeトークンを導入することで、そういったクローントークンを作成できるようになります。
MiniMeトークンの応用例として以下のようなものが紹介されています:
- 投票後に無効となる投票権トークン
- 使用後に償却されるクーポントークン
- スピンオフするDAO用のトークン
- 参加者限定のトークンセールなどのイベントに参加する入場券トークン
MiniMeトークンでは任意の過去ブロックの親トークンの状態からクローントークンを作成できます。クローントークンを作成したアドレスがトークンの管理者となり、クローントークンの発行、破棄、移動、凍結、管理者の変更が行えます。
後からの説明となってしまいましたが当記事では、クローン元のトークンを親トークン、親トークンから生まれたトークンをクローントークンと呼びます。
今回やることの概要
- 親トークンとなるMy Token(MYT)を作成します。
- 次に、My TokenからクローンされたCloned My Token(CMYT)を作成します。
- そして最後にCloned My Tokenを使用したキャンペーンを作成します。
以下は2のクローントークン作成のイメージです。まだ出てきていない用語等もありまますが、この図の内容をを実現する手順をこれから詳しく説明していきます。
親トークンの作成
まずは親トークンを作成していきます。親トークンはMiniMeTokenコントラクトというコントラクト継承します。
MiniMeTokenコントラクトにはERC20メソッドに加えて、クローントークンを作成、管理するための各種メソッドが含まれています。つまり、このコントラクトを継承するだけで「ERC20に準拠したクローン可能なトークン(親トークン)」を作成できるということです。
逆に言えば、親トークンがMiniMeTokenコントラクトを継承していないとクローントークンを作成することが出来ません。
親トークン作成の手順は以下に沿って説明します。
- MiniMeTokenFactoryコントラクトをデプロイする
- 親トークンを作成、デプロイする
1.MiniMeTokenFactoryコントラクトをデプロイする
MiniMeTokenFactoryコントラクトはMiniMeトークンをクローンして新たなMiniMeトークンを作成する機能を持ったコントラクトです。createCloneToken()というメソッドのみを持ち、クローントークンを作成してそのアドレスを返します。
親トークンをデプロイする際に、既にデプロイされたMiniMeTokenFactoryのアドレスが必要なため、以下のMiniMeToken.solをダウンロードしてMiniMeTokenFactoryコントラクトを先にデプロイしておきます。
MiniMeTokenFactoryコントラクト(562行目から)
https://github.com/Giveth/minime/blob/2b61f1c0faf4401140abad3f0639733f3142b65e/contracts/MiniMeToken.sol#L562
contract MiniMeTokenFactory {
function createCloneToken(
address _parentToken,
uint _snapshotBlock,
string _tokenName,
uint8 _decimalUnits,
string _tokenSymbol,
bool _transfersEnabled
) returns (MiniMeToken) {
// 新規MiniMeトークンをデプロイ
MiniMeToken newToken = new MiniMeToken(
this,
_parentToken,
_snapshotBlock,
_tokenName,
_decimalUnits,
_tokenSymbol,
_transfersEnabled
);
newToken.changeController(msg.sender);
return newToken;
}
}
2. 親トークンを作成、デプロイする
先ほど述べたように、親トークンのコントラクトはMiniMeTokenコントラクトを継承します。MiniMeTokenコントラクトが含まれるSolidityファイルは前述したMiniMeTokenFactoryと同じものです。
MiniMeTokenコントラクト(77行目から)
https://github.com/Giveth/minime/blob/2b61f1c0faf4401140abad3f0639733f3142b65e/contracts/MiniMeToken.sol#L77
上記ファイルをimportしてMiniMeTokenコントラクトを継承した親トークンコントラクトを作成します。コンストラクタで親トークンの各種パラメータを設定します。
MyToken.sol
pragma solidity ^0.4.11;
import "./MiniMeToken.sol"; //ファイル配置によって適宜変更してください。
// 親トークンのコントラクト。MiniMeTokenを継承。
contract MyToken is MiniMeToken {
function MyToken(address _tokenFactory)
MiniMeToken(
_tokenFactory, // 先にデプロイしたMiniMeTokenFactoryのアドレス
0x0, // 親トークンはないので0
0, // 親トークンから引き継ぐ特定ブロック。無いので0
"My Token", // トークン名
18, // 小数第何位まで有効か
"MYT", // トークンシンボル
true // トークンの移動を許可
) {}
}
このコントラクトに先程デプロイしたMiniMeTokenFactoryのアドレスを渡してデプロイすると、クローン可能な親トークン、MYTが作成できたことになります。
クローントークンの作成
親トークンがデプロイされると、いつでも、どのアドレスからでもクローントークンを作成することが出来ます。
クローントークンを作成するには親トークンのcreateCloneToken()メソッドを呼びます。こちらはSolidityのコードではなくgethなどのクライアントで実行されるJavaScriptのコードです。
MYT.createCloneToken(
“Cloned My Toknen”, // クローントークン名
18, // 小数第何位まで有効か
“CMYT”, // トークンシンボル
web3.eth.blockNumber, // 引き継ぐブロック。ここでは現在のブロックを指定
true // トークンの移動を許可
)
上記を実行すると内部でMiniMeTokenFactory.createCloneToken()が呼ばれ、以下が実行されます。
new MiniMeToken(
this, // MiniMeTokenFactory自身のアドレス
0xaaa, // 親トークンのアドレス。自動で設定。
XXXXXXXX, // web3.eth.blockNumber
“Cloned My Toknen",
18,
“CMYT”,
true
);
これでMYTのクローントークン、CMYTの作成が完了しました。CMYTはMYTの残高を引き継ぎますが、それぞれ独立したトークンとして存在することになります。つまりCMYTを消費してもCMTが減るといったことはありません。
ちなみに、クローントークンはいくつでも作成できます。クローントークンもまたMiniMeトークンであるのでさらにそこから孫トークンを作成することもできます。
キャンペーンコントラクト
クローントークンが作成できたらそのクローンを使ったキャンペーンなどを展開できます。
以下は非常にシンプルな資金集めキャンペーンコントラクト重要部分を記載したものです。(完全なものではありません)
キャンペーンでMiniMeトークンを使用するためには先程のMiniMeToken.solをimportしておく必要があります。
Campaign.sol
import "MiniMeToken.sol";
contract Campaign is TokenController, Owned {
・・・省略
MiniMeToken tokenContract;
function Campaign(
uint _startFundingTime, // キャンペーン期間の設定
uint _endFundingTime,
address _vaultAddress, // 集めたEtherを送るアドレス
address _tokenAddress // キャンペーンで使用するトークンのアドレス
) {
tokenContract = MiniMeToken(_tokenAddress); // MiniMeトークンの設定
・・・省略
}
・・・省略
}
完全なキャンペーンコントラクトのコードはこちら
_tokenAddressをクローントークンであるCMYTのアドレスにしてこのコントラクトのデプロイするとキャンペーンの準備が完了します。
参考資料:
- GitHub – Giveth/minime: Minimi Token. ERC20 compatible clonable token
https://github.com/Giveth/minime/