Railsでコントラクトコードを実行して、独自トークンを発行する

前回のDApps学習ではRailsからスマートコントラクトを動作させるサンプルアプリを作成しました。

超簡単!!RailsでEthereum上のコントラクトコードを実行する

2018年4月30日

その際OpenZeppelinのようなライブラリの使い方がわからなかったため、今回はOpenZeppelinを利用して独自トークンを発行し、送金が行えるサンプルアプリをRailsで作ってみました!

OpenZeppelinとは

基本的なスマートコントラクトのフォーマットを提供するライブラリ群。導入する事で少ない作業量で実装ができるようになります。

今回作ったコードはこちらにおいています。

サンプルアプリでは独自トークンを自動で発行して、別のアドレスに送金する。までができます。

まつしん

やっていることはとてもシンプルだけど色々ハマった・・。その代わり、その分学びがあったはず。

本記事の前提

RailsSolidityでサンプルアプリを作っているため、両方の基礎知識がない方は理解が難しいかもしれません。 

動作環境

動作させた環境は以下になります。

  • Rails v5.1.6
  • ethreum.rb v2.2
  • npm v5.6.0
  • OpenZeppelin v1.9.0
  • truffle v4.1.7
  • Ganache v1.1.0

サンプルアプリを動作確認してみる

まずは動作させて動きを見てみましょう。

といっても独自トークンを発行して送金するだけなので、だいたい想像つく方は飛ばして実装ポイントだけ見てもらえばと思います。

動作方法

ソースのクローンしてからgemのインストール

 

.env.sampleファイルをコピーして.envファイルの作成。適宜変えてご利用ください。

 

データベースの作成とテーブルの作成

 

アプリを起動する

 

Ganacheを起動する

Ganache

 

最後にトップ画面(http://localhost:3000)にアクセス。エラーが発生しなければOK!

 それでは次に動作を確認していきましょう。

動作確認

トップ画面にアクセスすると2アドレス分のトークン/ETH残高が表示されます。

画面アクセス時にデフォルトのトークンが発行されアドレス1に全て割り当てられます。

アドレス1はGanacheが自動で発行する最初のアドレスで、アドレス2が2番目のアドレスになります。またアドレス1 が独自トークンの発行を行います。

EthereumTokenSample 🔊

「アドレス2に送金する」をクリックして送金画面へ。送金量を入力して送金実行!

EthereumTokenSample 🔊

 アドレス1のトークン残高が減り、アドレス2のトークン残高が送金した分増えていればOK!

EthereumTokenSample 🔊

動作が確認できたので次は自分が実装をしていく中で色々ハマったので、その辺りを整理していきます。

実装ポイント

OpenZeppelinの導入

前回の記事でも少し書きましたが、Railsからコントラクトを実行する場合にライブラリの import ができず困っていました。

色々試したのですが、 Truffleでコンパイルする事で解決できましたので手順を解説します。

  • Railsプロジェクト直下にtruffleフォルダを作成(フォルダ名は何でも良い)
  • truffleフォルダ配下に移動して「truffle init」 してtruffleプロジェクトを作成
  • コントラクトのコード(import含む)を書く(※1)
  • OpenZeppelinをインストール(※2)
  • コントラクトをコンパイル(「truffle compile」)

※1 AppToken.sol

zeppelin-solidityライブラリのStandardToken.sol importして継承したクラスを少し実装しているだけのとてもシンプルなコードです。何とこれだけでERC20に準拠のトークンが作れちゃうから便利ですね。


※2 OpenZeppelinのインストール

下記コマンドを実行していインストールを行う。

 

truffle利用時のコントラクトの連携方法

Rails側でのコントラクトとの連携部分のコードです。

ポイントは2点。デプロイは1度だけ行うこと。あとはデプロイ時に発行されたコントラクトアドレスを使い回す。

そうしないとトークンの保管が初期化されてしまいます

もう1つはコントラクト作成時(Ethereum::Contract.create)にtruffleオプションを使うこと。そうすることでtruffleで作成したプロジェクトを利用できるようになります。

まつしん

仕組みを考えるとデプロイは1度だけとか当たり前なのだけど・・実装することで理解が深まる。

モデル名について

Rails側のモデル名とコントラクトのクラス名を同じにしてはいけません。 

詳しくはよくわかっていないのですが、同じにしてしまうと挙動がおかしくなってしまいました。

モデルのインスタンスを作るとコントラクト側のクラスのインスタンスができてしまうような感じ?

これめっちゃハマった。。

 

実装のポイントについては以上です!

まとめ

さて、今回は独自トークンの発行と送金の処理をRailsで行ってみました。 

Solidity側のコードはほとんど書いていないため、Solidity力はあまり上がりませんでした。ですがスマートコントラクトの連携部分を多少書いて動かしたので、仕組みの理解に繋がりました。あとライブラリのコードリーディングをしたりしたのでERC20の仕様の理解が進んだのがよかったです。 

また今回のサンプルアプリはトークンの発行者から決まったアドレスに送金するだけでしたが、トークンの保有者なら誰でも送金できるようにしたいです。例えば今回のサンプルアプリではアドレス1からアドレス2に送金した後、次はアドレス2からまた別のアドレスに送金するような。この辺り実装しようとしてうまくいかなかったのですよね。。

具体的にいうと StandardToken.solにあるtransferFromメソッドがうまく使えませんでした。

後まだローカル環境でしか動作させていないので、本番環境の手前のテスト環境で動かして見たいです。

この辺り知りたいですね〜。

 

参考

Rubyを使って、Ethereumへ接続し、Smart Contractを実行する

1 個のコメント

  • transferFromの問題について、実装の方は解決できましたでしょうか?
    もし既知であれば無視していただいて構わないのですが、僕もローカルで試してみてうまく動かなくて色々ためした結果、1つの解が見つかったのでお伝えしようかと思いまして。。。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です