前回のDApps学習ではTruffle Boxesを利用してブラウザから操作できるサンプルアプリを作成しました。
次は普段はRailsでプログラムを書いているのでRailsからスマートコントラクトを動作させたいなと。
で、調べるとgemでethreum.rbなるものを発見し他ので、早速サンプルアプリを作ってみました!
使ってみるととりあえず動作させるだけならすぐできました。
サンプルアプリ作成にあたって下記の記事をとても参考にさせてもらっています。
Rubyを使って、Ethereumへ接続し、SmartContractを実行する
また今回作ったコードはこちらにおいています。
サンプルアプリでは単純にコントラクトコードをデプロイして、書かれたメソッドを呼び出せることを試しているだけになります。
Contents
開発の流れ
開発の流れとしては以下の通りで、前提としてはRailsの開発環境が整っており、Ganacheはインストールしているものとします。
・rails newしてプロジェクトの作成
・gemのethereum.rbをインストール
・コントラクトコードを実装
・コントラクトコードの呼び出し処理を実装
・Ganacheを起動
・ブラウザで動作確認
動作させた環境は以下になります。
動作環境
- Rails v5.1.6
- ethreum.rb v2.2
- Ganache v1.1.0
rails newしてプロジェクトの作成
まずはRailsのプロジェクトを作成から。
1 |
$ rails new ethereum-sample |
gemのethereum.rbをインストール
Gemfileにethreum.rbを指定してインストールします。
1 |
gem ‘ethreum.rb' |
1 |
$ bundle install |
環境はこれで準備完了になり、次から実装に移ります。
コントラクトコードを実装
プロジェクトのルートパス配下にcontractsフォルダを作成し、コントラクトファイルを作成して実装。
処理としてはデプロイ時に渡した文字列を呼び出せるようにしたり、デプロイしたオーナーのアドレス/残高が取得できるだけのシンプルなものとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
pragma solidity ^0.4.23; contract HelloWorld { string public greeting; address public owner; function HelloWorld(string _greeting) { greeting = _greeting; owner = msg.sender; } function say() constant returns (string) { return greeting; } function getBalance() constant returns (uint balance) { return owner.balance; } function getAddress() constant returns (address) { return owner; } } |
コントラクトコードの呼び出し処理を実装
手前でコントラクトコードを実装したのでいよいよ ethereum.rbを利用したEthereumへの接続になります。
1 2 3 4 5 6 7 8 9 10 |
class HomeController < ApplicationController ETHEREUM_TOKEN_PATH = "#{Dir.pwd}/contracts/HelloWorld.sol" GANACHE_URL = 'HTTP://127.0.0.1:7545' def index @client = Ethereum::HttpClient.new(GANACHE_URL) # ① @contract = Ethereum::Contract.create(file: ETHEREUM_TOKEN_PATH, client: @client) # ② @contract.deploy_and_wait('Hello, World!’) # ③ end end |
急にHomeControllerと出てきていますが、Railsの細かいコードはGitHub上のコードを見てもらえればと思います。ここではethereum.rbの利用方法にのみフォーカスしています。
まず①でGanacheに接続するためにクライアントのオブジェクトを起動します。GANACHE_URLにはGanache起動後のRPC SERVER欄に表示されているURLを入力してください。
次に②でcreateメソッドでcontractというインスタンスを生成します。最後に③で作成したコントラクトをブロックチェーン上にデプロイを実行します。
view側では下記のようなメソッドでコントラクト側のメソッドを呼び出します。
1 |
@contract.call.say() |
たったこれだけでRailsとEthereumの連携できちゃいました。簡単!!
contract.callの後にコントラクト側のメソッドをしているすることで実行できますが、他にも contract.transact_and_wait.say() のような呼び方もできます。こちらはブロックチェーン上への書き込み処理を行う場合に利用します。トランザクションが発生し、実行が完了するまで待つことになります。call メソッドはトランザクションが発生しないので読み取り専用に利用します。
Ganacheを起動
アプリと連携させるためにGanacheを起動させる。まだインストールしていない場合はここからダウンロードして、インストールを。
Ganacheはイーサリアム開発用のパーソナルブロックチェーンです。
起動するだけでアカウント・残高・契約作成、ガスコスト等をGUIで確認できるのでとても便利です。
ブラウザで動作確認
それでは最後に動作確認をしたいのでアプリを起動しましょう。
1 |
$ bundle exec rails s |
起動後にhttp://localhost:3000/にアクセスして以下のような画面が表示されればOK!
まとめ
今回、RailsとEthereumを連携させてみましたがgemがすでにあったのでとても簡単に実現できることがわかりました。
てっきり手軽にRailsと連携ができるのはNEMだけかと思っていたので良い学びとなりました。
ただまだ初歩的な処理を書いただけなのでもう少し触ってみて利用方法を学んでいきたいです。
railsでsolidityの連携の基本はできたが、一歩進んでsolファイル内で zeppelin-solidityのファイルをimportしている場合はどうすれば良いんだ・・?そんなファイルないって当然怒られる。
まさかコピペするとか・・?もしくはyarnとか使えば良いのかな#solidity #ethereum.rb— まつしん@仮想通貨プログラマ (@matsushin11)
あとzeppelin-solidityのようなライブラリを使いたい。
やろうとしたのだけどどうしてもimportがうまくできない・・。この辺りもうもう少し探ってみたいですね。
ここがクリアできれば独自トークンの発行とかも簡単にできそう!
ちなみにNEMだとgemでnem-rubyがあります。