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

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

openassets-rubyをrailsに組み込んでみる

openassets-rubyを組み込んでbitcoinを使うrailsプロジェクトを作ってみる。
github.com


1. まずはともあれbitcoinに接続できないと始まらないので以下の記事とか参考にbitcoinの環境を構築するqiita.com
2. bitcoindを起動する。confirmationとか自由にやりたいのでregtest環境で起動する

 % bitcoind -regtest -daemon

3. blockが何もないので101ブロック生成する。(※マイニング報酬は101ブロック目からもらえるので)

 % bitcoin-cli generate 101

4. railsプロジェクトを生成して移動

 % rails new bitcoin-sample
 % cd bitcoin-sample

5. Gemfileにopenassets-rubybitcoin-rubyを追加して

# bitcoin
gem 'openassets-ruby', '0.6.5'
gem 'bitcoin-ruby', '0.0.12'

↑これをGemfileにコピペ

bundle installする

 % bundle install --path vendor/bundle

6. openassets-rubyからbitcoin rpcに接続するための設定ファイルを作る。以下の内容をコピペして config/openassets.ymlに保存する。

# README: https://github.com/haw-itn/openassets-ruby#configuration
default: &default
  network:  mainnet
  provider: bitcoind
  cache:    tmp/cache/openassets.db
  dust_limit: 600
  default_fees: 10000
  min_confirmation: 1
  max_confirmation: 9999999
  rpc: &rpc
    <span style="color: #d32f2f">user:     bitcoinrpc</span>
    <span style="color: #d32f2f">password: rpcpassword</span>
    schema:   http
    <span style="color: #d32f2f">port:     8332</span>
    host:     localhost

mainnet: &mainnet
  <<: *default

testnet: &testnet
  <<: *default
  network: testnet
  rpc:
    <<: *rpc
    port: 18332

regtest: &regtest
  <<: *testnet
  network: regtest

development:
  <<: *regtest

test:
  <<: *regtest

production:
  <<: *mainnet

赤文字のところは、bitcoin環境構築の時に編集したbitcoin.confの内容と同じにする。

7. bitcoinの操作をするためのmoduleを作る。以下の内容でlib/util/bitcoin_util.rbを作成する。

require "openassets"

module BitcoinUtil
  class << self
    def api
      @@api ||= OpenAssets::Api.new(config)
    end

    def provider
      api.provider
    end

    def config
      YAML.load_file("#{Rails.root}/config/openassets.yml")[Rails.env].deep_symbolize_keys
    end

    def reload
      @@api = nil
    end
  end
end

8. lib/以下をautoloadして欲しいので、config/application.rbを編集する

module BitcoinRubySample
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    config.autoload_paths += Dir["#{config.root}/lib/*/"] # これを追加する

9. あとは rails c でirbを起動してBItcoinUtil.provider.listunspentでunspentが取得できるか確認。以下は実行例

$ rails c
Running via Spring preloader in process 48190
Loading development environment (Rails 5.1.4)
irb(main):001:0> BitcoinUtil.provider.listunspent
=> [{"txid"=>"c3b0010de3f00af02ccbf63519c26904b2c936a5f168625a4f44a9870ec6018f", "vout"=>0, "address"=>"mqufuvgnXTvfPu17arLvSY1VwJhTANowpe", "scriptPubKey"=>"210301e21b8ce18594be5c3d299196b59eede1f3abed3fe3cb28f02b41d976ae5ce7ac", "amount"=>50.0, "confirmations"=>101, "spendable"=>true, "solvable"=>true}]

以上で、とりあえずbitcoinを色々操作できる環境は完成。
それぞれのライブラリとしては次の通りの役割で使ってます。
・bitcoind - bitcoinの本体実際の処理のほとんどはこいつがやる(bitcoinネットワークにブロードキャストとかblockとってくるとか)
bitcoin-ruby - rubyのclassでblockとかtransactionとか扱うためのライブラリ群。今回はopenassets-rubyが依存してるので入れてるだけで直接は使ってない。
・openassets-ruby - openassets protocolのruby実装。colord coinを取り扱うためのライブラリとかあるらしい。まだ使ったことないから詳しくはわかない。今回ではOpenAssets::Apiクラスが内部でbitcoindとRPCで色々やりとりできるのでそれを使ってbitcoinの情報にアクセスするために使いました。

openassets-ruby使ってcolord coinの発行とかもそのうち書きます。