アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

OmiseGoのeWalletをRuby on Railsで利用する

OmiseGoのeWalletのv1.0.0-pre.1がリリースされました。今回の記事ではeWalletの構築とRuby on RailsからeWalletを利用する方法についてまとめます。
github.com


eWalletのsetUp方法は、Docker, Vagrant, Bare‑metalの3つ用意されています。今回はBare‑metalでsetUpしていきます。
また、今回の記事はMacOS上でのsetUp方法となります。
基本的には公式のsetUp方法に従って進めていきます。
ewallet/bare_metal.md at master · omisego/ewallet · GitHub

1. eWalleのsetUp

1-1. 必要なlibraryをインストール

homebrewでインストールするもの

PostgreSQL, ImageMagick, Git をhomebrewでインストールします。

$ brew install postgresql, imagemagick, git
nvmをインストールしてnodeの環境を整える

nvmとnode 8.7.0のインストール
以下の記事を参考にnvmとnodeをインストールします。nodeのバージョンは僕は8.7.0を利用しました。(というか他のプロジェクトで使っていたので流用)
qiita.com

yarnのインストール
homebrewでもインストールできますが今回はnpmでインストールします。

$ npm install -g yarn
exenvを利用してElixir 1.6.5をインストール

brewでインストールすると最新バージョンの1.7.1がインストールされますが、現状(2018/07/30)のeWalletはelixir 1.7.0以降でbuildするとcompile時にwarningが発生してbuildに失敗します。
バージョン1.6.5ではwarningが出ずにbuildが完了するので今回はElixirのバージョン管理ができるexenv経由でElixirを入れる事にします。
(warnings-as-errosオプションをoffにしてもこの問題を回避できます。)
という事で以下の記事を参考に、Erlangとexenvをインストールします。
qiita.com

elixir 1.6.5のインストール
上記記事を参考に以下のexenv経由でインストールします。

exenv install -l
exenv install 1.6.5
exenv global 1.6.5

1-2. リポジトリのチェックアウト

必要なライブラリの準備は終わったのでeWalletをbuildしていきます。
公式の手順に従ってeWalletのリポジトリをチェックアウトします。

git clone https://github.com/omisego/ewallet && cd ./ewallet

1-3. Elixirの依存ライブラリをインストール

mix deps.get

1-4. admin panelの依存ライブラリをインストール

(cd apps/admin_panel/assets/ && yarn install)

1-5. 環境変数の設定

設定可能なパラメータは公式を参照してください。
1.3-configure-environment-variables
僕はデフォルトで問題なかったので特に設定変更はしていません。

1-6. DBのマイグレーション

DBマイグレーションをする前にpostgresqlを起動してください。postgresqlの起動方法等は以下の記事が参考になります。
qiita.com

その後、公式にある通り以下のコマンドでdb schemeの作成、テーブル作成を行います。

mix do ecto.create ecto.migrate

テスト用のDBも作成します。

MIX_ENV=test mix do ecto.create, ecto.migrate

1-7. testの実行

elixirのバージョンやDBのmigrationが正常かチェックするためにtestを実行します。

mix test

テストが実行できない場合はelixirのバージョンを確認してください。テストの失敗が多い時はDBの初期化に失敗している可能性が高いです。

1-8. 初期データを投入

seedデータを投入します。今回は以下のコマンドでsampleデータも一緒に投入します。

mix do seed --sample

注意:公式ではmix do ecto.seedとなっていますが、実際は mix do seed です。
mix do seedすると、admin panelへログインするためのメールアドレスとパスワードの入力を求められます。これは後で使うので覚えておいてください。
seedをやり直したい場合は以下のコマンドでdbを作り直してseedをやり直せます。

mix do reset
mix do seed --sample

1-9. eWalletの起動

mix do omg.server

上記コマンドでewalletが起動します。
http://localhost:4000 を表示した時に、{status:true}が表示されたら正常に起動しています。eWalletでは以下の3つの機能にアクセスできます。

2. Ruby on Railsから利用する

OmiseGo eWalletは以下の3つの言語用のeWallet SDKが用意されています。

今回はRuby向けのSDKを用いて先ほど起動したeWalletへ接続してみたいと思います。
今回も公式のドキュメントを元に進めていきます。
github.com

ゴールとしてはsampleデータとして準備されているtransactionの一覧を表示するまでとします。

2-1. Ruby on Railsの環境構築

まずは以下の記事などを参考にしてRuby on Railsの環境を構築してください。
qiita.com

2-2. omisego のgemをインストール

Gemfileをひらいて以下の2行を追加します。

# use omiseGo SDK
gem 'omisego'

その後、bundle installしてomisegoのgemをインストールします。

bundle install

これで、OmiseGo eWalletが用意しているREST APIとデータをオブジェクト経由で扱えるようになります。

2-3. access key, secret keyを発行する。

外部アプリからeWalletのadmin apiにアクセスするためには、eWalletで発行されたaccess keyとsecret keyが必要です。
ので、このaccess keyとsecret keyをeWalletから発行します。

eWalletにログイン

まずはeWalletのadmin panel(http://localhost:4000/admin)にログインしてdashboardを開きます。

access keyを発行する
  1. dashboard左メニューの「API」を選択してAPI Key管理画面を表示します。
  2. 次に下の方に画面をスクロールすると「Generate Access Key」のボタンが表示されるのでそれを押下します。

  1. Access Keyを生成するか確認する画面が出るので「Confirm」ボタンを押下します。

  1. Access KeyとSecret Keyが新しく生成され表示されます。この2つのkeyを保存しておきます。特にsecret keyはこの画面を閉じたら2度と確認できなくなるのでご注意ください。


2-4. Ruby on Rails App から eWalletへ接続するための設定ファイルを作成する

次にRuby on RailsからeWalletの各種REST APIを呼び出せるようにするために、接続設定を行っていきます。

config/initializers/omisego.rbを作成

以下の内容でconfigを作成します。この時に、2-3で生成したaccess keyとsecret keyを入力します。
# ここではとりあえず動かすことを目的にしてます。正式運用する場合は公式ドキュメントに書いてあるようにaccess keyとsecret keyは環境変数から読み込むようにしましょう。

# config/initializers/omisego.rb
OmiseGO.configure do |config|
  config.access_key = 2-3で作ったaccess key
  config.secret_key = 2-3で作ったsecret key
  config.base_url   = localhost:4000
end

2-5. 一覧ページの作成

routing, controller, viewを一から作るのは大変なので今回はrailsのscaffoldを利用して作成します。

scaffoldでtransaction用の各種ページを生成
bundle exec rails g scaffold transaction
db:migrateの実行

scaffoldではActiveModelも自動で作られるためdb:migrateをする必要があります。今回はDBは使いませんがエラーになるのでdb:migrateしてテーブルを作成します。

bundle exec rake db:migrate
controllerでeWalletのtransaction一覧を取得

app/controllers/transactions_controller.rbの7行目を以下のように変更します。

class TransactionsController < ApplicationController
  before_action :set_transaction, only: [:show, :edit, :update, :destroy]

  # GET /transactions
  # GET /transactions.json
  def index
    @transactions = OmiseGO::Transaction.all.data # これに書き換える
  end
index.html.erbでtransactionの内容を表示

app/views/transactions/index.html.erbの内容を以下のように書き換えます。

<p id="notice"><%= notice %></p>

<h1>Transactions</h1>

<table>
  <thead>
    <tr>
      <th>id</th>
      <th>idempotency_token</th>
      <th>from</th>
      <th>to</th>
    </tr>
  </thead>

  <tbody>
    <% @transactions.each do |transaction| %>
      <tr>
        <td><%= transaction.id %></td>
        <td><%= transaction.idempotency_token %></td>
        <td><%= transaction.from.address %>, <%= transaction.from.amount %>, <%= transaction.from.token["id"] %></td>
        <td><%= transaction.to.address %>, <%= transaction.to.amount %>, <%= transaction.to.token["id"] %></td>

<!--        <td><%#= link_to 'Show', transaction %></td>-->
<!--        <td><%#= link_to 'Edit', edit_transaction_path(transaction) %></td>-->
<!--        <td><%#= link_to 'Destroy', transaction, method: :delete, data: { confirm: 'Are you sure?' } %></td>-->
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Transaction', new_transaction_path %>

このページで表示するtransactionはOmiseGO::Transactionであり、ActiveModelを継承していないので、Show, Edit, Destroyのリンク生成に失敗するため、各種リンクをコメントアウトしています。

2-5. Transaction一覧をブラウザで表示してみる

編集が全て終わったら、rails sでサーバを起動してhttp://localhost:3000/transactionsにアクセスするとtransactionの一覧が表示されると思います。

まとめ

今回はbare-metalでeWalletの環境を構築しましたが、dockerやvagrantを使う方が環境差異に悩まされなくて済むのでオススメです。
運営としてもできるだけ簡単にテストしてfeedbackを得られるようにするために、stagingサーバを準備中とのことでした。なので運営が用意したstagingサーバを利用するのもありと思います。

今回はgetting startedな内容のみです。eWalletを使うとすでに運営中のECサイトにTokenでの支払い方法を追加したりといったことが簡単に行えるそうです。
eWalletのバージョンアップに伴い、仮想通貨だけでなく既存の電子決済の仕組みも統合されていくとのことで非常に楽しみです。