複数担保型DAIのCDPライフサイクルを1周してみよう

複数担保型DAIのCDPライフサイクルを1周してみよう

Libraの登場で関心を集めているステーブルコイン。その1つであるMakerDAOの「DAI」について、安定化や発行のメカニズムをICOVO社のエンジニア 三野泰佑氏がわかりやすく解説します。今回は、mcd-cliというコマンドラインツールを使って複数担保型DAIのCDPのライフサイクルを1周してみることで理解を深めます。

 

関連記事:MakerDAOのステーブルコイン「DAI」 はなぜ安定するのか? そのメカニズムを詳解

はじめに

MakerDAOは2016年12月に「SAI」をαバージョンとしてリリースし、2017年12月に「DAI」をβバージョンとしてリリースしました。現在のDAIは単一担保型で、一種類の資産しか担保として使うことができず、サポートされている資産はETH(正確にいうとPETH)のみですが、将来的には2つ以上の担保を使える複数担保型に移行します(ちなみにPETHは除外され、ETHが他の資産と一緒に担保として使われるようになります)。ERC20トークン、NFT、またその他のERC777標準に則ったトークンなどがまずは担保として使われることになると思います。例えば、Digixという金によって裏付けられているトークンが担保の候補として挙げられています。

 

このアップグレードによって、担保をロックするときの選択肢が増え、DAIを発行することは容易になります。また、担保を分散化することで過少担保のリスクも減らせます。ETHしか担保資産がないと、ETHの価格のみにCDPの担保率が影響を受けてしまいますが、担保を増やせば1つの資産に依存せずにリスクを分散させることができます。

 

単一担保型の仕組みがまだよくわからないという方は、前回の記事を読んでみてください。

 

すでにKovanテストネットでは、複数担保型DAIのスマートコントラクトがリリースされています。また、ポータルサイトコマンドラインツールDai.jsライブラリなど、複数担保型DAIのシステムとやりとりするツールもいくつか公開されています。今回の記事ではmcd-cliというコマンドラインツールを使ってCDPのライフサイクルを1周してみます。

 

なお、この記事はmcd-cliの公式ガイドを元にして書かれていますが、わかりにくい部分や省かれている部分があったため、セットアップも含めて説明を付け足しています。また、Linuxでも問題なく動作するかの検証まではしておりませんので、Macで作業することをお勧めします。

 

では、早速はじめましょう!

セットアップ

まずはセットアップを済ませます。スマートコントラクトとやりとりするための新しいEthereumのアカウントを作り、mcd-cliをインストールし、ETHとCOL1トークンを入手していきます。COL1トークンというのは、テスト目的で作られた複数担保型DAIの担保トークンです。価値は大体1USDに対して10COL1になっています。以下が、より具体的なステップになります。1つ1つ順番にセットアップしていきます。

 

1)parityのインストール
2)アカウントの作成
3)dapps toolsのインストール
4)mcdパッケージのインストール
5).sethrcファイルの設定
6)Kovan ETHの入手
7)COL1 tokensの入手

1)parityのインストール

※gethもサポートされていますが、未テストのためparityの使用をお勧めします。

2)アカウントの作成

以下のコマンドでアカウントをリストできます。

3)dapps toolsのインストール

以下のコマンドですぐにインストールできます(GNU/LinuxもしくはmacOSのみ)。

dapp.toolsは、ブロックチェーン上の開発で使えるかなりイケてるコマンドラインツールです! LinuxのNixOSで使われているnixパッケージマネージャーを使っています。このスクリプトはnixパッケージマネージャーをダウンロードし、Cachixでバイナリのキャッシュをセットアップして、dapp、seth、solc、hevm、ethsignなどのツールを一緒にインストールしてくれます。

4)mcdパッケージのインストール

v0.2.6 を使っています。

他のバージョンでは動かない可能性があるので、必ずv0.2.6をインストールしてください。

5).sethrcファイルの設定

mcd-cliはEthereumの万能ツールであるsethがベースになっています。スマートコントラクトの関数の呼び出しをcurl、post、rpcメソッドなどを使って行う必要がなく、簡潔なコマンドで呼べるようになります。

 

ホームディレクトリにある.sethrcファイルの編集

キーファイルの場所をデフォルトではなくカスタムで指定したい場合は、 ETH_KEYSTORE変数を使ってください。

6)Kovan ETHを入手

こちらのfaucetにいき、自分のアドレスにKovanETHを送ってください。GitHubアカウントでログインし、ETHのアドレスをフォームに記入してリクエストを送るだけです。また、GitterチャンネルでKovanETHをもらうこともできます。知り合いからもらえる方は0.2KovanETHはもらっておいてください。KovanETHが入手できたかは、Etherscanで確認することができます()。

7) COL1 tokensを入手

次にCOL1トークンを入手しましょう。こちらはスマートコントラクトから入手することができます。

 

COL1のアドレスを環境変数に設定

Faucetのアドレスを環境変数に設定

gulp(address)関数を呼んで、COL1トークンを入手

コマンドを走らせるとパスワードの入力を求められます。sethはキーとパスワードをgethとparityのデフォルトのダイレクトリから探し、トランズアクションを送ります。

 

コマンドラインを使ってトークンの残高を確認できます。

また、コマンドのアウトプットにあるトランズアクションのハッシュ値から、Etherscanで残高を確認することも可能です()。自分のアカウントに飛ぶと、COL1トークンが入手できたことがわかるはずです。

※Etherscan上ではTOK1という表記になっていますが、気にしなくて大丈夫です。

コマンドラインツールでCDPライフサイクルを1周する

では、これからCOL1トークンを担保として、CDPのライフサイクルを1周してみます! 大きく分けて、以下のような6つのステップで進めます。

 

1)CDPを開く
2)COL1トークンをデポジットする
3)DAIを引き出す
4)DAIを返済する
5)担保を除く
6)CDPを閉じる

 

コマンドの性質上、1つ1つのステップに分けづらいので、まずは最初の3つのステップをカバーします。

1)CDPを開く / 2)COL1トークンをデポジットする / 3)DAIを引き出す

まず、以下のコマンドを走らせてください。

すると、以下のようなアウトプットが表示されます。

COL1トークンが担保としてvatという内部レジストリに追加されました。上のアウトプットでvat内の担保の残高が30になっていることがわかると思います。ただ、実はまだCDPにロックされているわけではありません。inkというのがCDPにロックされている残高を示しています。見てのとおり、まだどのCDPにも割り当てられていないのでinkは現在0になっています。extというのはMakerDAOのシステム外のトークンの残高です。30トークンをvatに移したため、現在は20になっています。

 

gemコマンドを見てみましょう。

joinサブコマンドは送り手のアカウントからvatに担保を追加することができます。ilk=COL1-Aというフラグで担保の種類を指定しています。30というのは送るトークンの量です。

 

次にCOL1トークンをCDPにロックして、DAIを引き出します。

 

以下のコマンドを走らせてください。

以下のようなアウトプットが表示されます。

inkにCOL1トークンの残高が移り、CDPにCOL1トークンがロックされました。

urnというのは特定のCDPのことです。

また、DAIが発行されたこともわかります(art)。

 

frobコマンドを使ってvatからトークンをロックするコマンドを走らせたことで、トークンがurnにロックされてDAIが生成されました。

 

frobコマンドは 担保の種類をilk=COL1-Aフラグで、30という数字でロックしたいトークンの量を、そして末尾の1という数字で生成したいDAIの量を指定しています。

DAIはまだvatにあるため、これからDAIを引き出し、Ethereumのアカウントに送ります。

 

以下のコマンドを走らせてください。

これでDAIがvatからextに移ります。

daiコマンドのexitサブコマンドは、引き出したいDAIの量を指定できます。

 

以下のbalanceサブコマンドでDAIのバランスをチェックすることもできます。

ここまでで、CDPを開き、COL1トークンを担保としてCDPにロックし、発行したDAIを引き出しました。

 

では、今度は逆にDAIを返済し、担保をCDPから取り出して、CDPを閉じてみましょう。

4)DAIを返済する / 5)担保を除く / 6)CDPを閉じる

まず以下のコマンドを走らせてください。

これでDAIがextから内部レジストリであるvatに移動しました。

またbalanceサブコマンドで残高を確認できます。

daiコマンドのjoinサブコマンドはurnに返済したいDAIの量を指定することができます。

次にDAIを焼却して、担保であるCOL1トークンをinkから取り出します。

前にfrobコマンドを使った時のアウトプットを見ると、担保をinkにロックしてDAIをartに生成しましたことがわかります。

では今回のアウトプットを見てみましょう。

今回は逆にinkにあったロックされていた担保とartにあったDAIがなくなっているのがわかります。

 

今回はilk=フラグで担保の種類を指定し30という数字でinkから取り除くトークンの量を指定し、末尾の1という数字で焼却したいDAIの量を指定しています。

COL1トークンがvatにあるのがわかります。

最後にvatからCOL1トークンを取り除きます。

トークンがvatからextに移りました。

parityアカウントを確認すると、COL1トークンが戻っているはずです。これでCDPのライフサイクルを1周できました!

 

複数担保型と単一担保型の違いはいくつもあるのでまた記事にする予定です。自分で学びたいという方は、MakerDAOの用語集スマートコントラクトも参考にしてみてください。

 

 

関連記事:MakerDAOのステーブルコイン「DAI」 はなぜ安定するのか? そのメカニズムを詳解

 

 

Profile

解説:三野泰佑
ICOVOエンジニア
2013年頃からブロックチェーンに関わり、スマートコントラクトのベストプラクティスを閲覧できるサイトやSolidityの監査をするサービスを開発。現在はICOVOのエンジニアとして開発や執筆をしながら、ステーブルコインに特化したモバイルウォレットも開発している。