OpenAsset入門

bitcoinの流通の仕組みであるブロックチェーンを拡張して、bitcoin以外に色々な情報を付けることが可能になる「OpenAssetProtocol」の使い方をご紹介します。

bitcoinそのものの入門につきましては、[こちら](http://qiita.com/osada/items/39c63a146c203f4dc751)をご参照ください。


# 導入

標準のbitcoinのブロックチェーンでは、bitcoinの送金や残高照会等しかできません。例えば、金融取引でよくある「借用書」や「利子」の扱いなども現在の仕様では困難です。
但し、幸いなことに、bitcoinのブロックチェーンには拡張領域が準備されてあり、それの使い方を定める一つの方法として「OpenAssetProtocol」があります。このようなbitcoin互換の拡張仕様の総称を「カラードコイン（色つきコイン）」と呼び、現在世界中で標準化の取り組みがなされています。
その中でも、このOpenAssetは、比較的実装がシンプルでライブラリも充実していますので、ここでは、そのRuby実装版について、使い方をご紹介します。

公式サイト：https://github.com/haw-itn/openassets-ruby

# 実行環境・前提

* MacBook Pro (Retina 13-inch、Early 2015)
* Mac OSX El Capitan (10.11.3)
* bitcoind v0.12.99
* openassets-ruby v0.4.6
* ruby 2.2.2 (rvm利用)
* 実行日 = 2016-06-02

# ダウンロード＆インストール

ターミナルから以下を実行してください。

```
% git clone https://github.com/haw-itn/openassets-ruby.git
% cd openassets-ruby
% bundle install   (または、bundle update)
```

bitcoinについては、[こちら](http://qiita.com/osada/items/39c63a146c203f4dc751)を参考にしてください。

## インストール時のトラブルシュート
*  bundleが存在しないとき：最初に「gem install bundler」を実行してください。
* rubyのバージョンが合わないとき：先にrvmかrbenvを導入してください。（方法は割愛します）
*  rvmをお使いの方で、OpenSSLに関してエラーが発生するとき：以下をお試しください。rubyインストール時にdisable-binaryオプションを付けない場合、SSL接続時に端末内部の証明書リストを参照してしまうそうで、もし証明書更新がされていない場合、SSL接続ができなくなります。

```
% rvm osx-ssl-certs update all
% rvm install 2.2.2 --disable-binary
```

＜こういうケース＞

```
osada@mbp16a% ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/etc/openssl/cert.pem" # <- rubyの使う証明書

osada@mbp16a% /usr/local/etc/openssl/cert.pem # <- 期待値
```


# 動作確認

今回はirb経由で使い方を学びます。Webアプリケーション等から使う場合は、本サイトの後半をご覧ください。

## bitcoinの準備

bitcoindを動作させておいてください。（参考：[こちら](http://qiita.com/osada/items/39c63a146c203f4dc751)）

※テンポよく動作検証したい場合は、スタンドアロンで動作するregtest環境かzero-confirmation（別途説明）の利用をご検討ください。

## OpenAssetAPIの準備

最初に、OpenAssetProtocolのAPIを受け付けるインスタンスを作成します。
以下はtestnetのbitcoinのブロックチェーン上で動くAPIです。

```rb
% irb
> require 'openassets'  # <- コレ
> require 'pp'          # <- 画面表示整形用のオマケ
> # APIの作成
> api = OpenAssets::Api.new({:network => 'testnet',
>                      :provider => 'bitcoind', :cache => 'testnet.db',
>                      :dust_limit => 600, :default_fees => 10000,  
>                      :min_confirmation => 1, :max_confirmation => 9999999,
>                      :rpc => {:user => 'osada', :password => 'abc123', 
>                      :schema => 'http', :port => 18332, 
>                      :host => 'localhost'}})                      
```

## アセットの残高照会

```
> api.get_balance
```

## アセットの発行

アセット（例えば独自通貨）を新規に生み出します。以下の例では、oa_addrのアドレスについて、量が150のアセットを発行しています。第三引数にURLがついていますが、ここにはアセットに関する情報（小数点の位置や利用期限など規約）を記載することができます。

```
> oa_addr = 'akEJwzkzEFau4t2wjbXoMs7MwtZkB8xixmH'
> api.issue_asset(oa_addr, 150, 'u=http://hogehoge.com', oa_addr, nil, 'broadcast')
```

* ここで、oa_addrとはOpenAssetProtocolで使うアドレスを指します。bitcoinのアドレスとは異なりますのでご注意ください。このアドレスは、get_balanceなどで確認することができます。
* oa_addrの実態は、bitcoinのアドレスから計算されたものですので、bitcoinアドレスと一対一対応になっています。
* アセットには"asset_id"が自動で設定されます。このIDを使って、アセットの種類を管理します。このIDは、get_balanceなどで確認することができます。
* OpenAssetは、bitcoinのブロックチェーン上で動作するため、取引の一つである「アセットの発行」が確認（confirm）されるまで、利用（確認用の表示なども）することができません。
* 第5引数以降は今は気にしなくて構いません。

## アセットの送付
```
> oid = 'oZHPr3qzQHG63fPdyeKexdHx72HuRR2wML'
> from = 'bWzjcndf7TriQ46AUsgSvvZPDC5a6ukqnEQ'
> to = 'bXDUsHqNmNCtHWkd7uW4AUWaHvg8TvQP9Jc'
> api.send_asset(from, oid, 100, to, 10000, 'broadcast')
```
100は、assetの量。10000はトランザクション手数料です。

# 発展・議論
（別途まとめて記載します。）

# 付録
## 類似用語の理解
* ワレット(Wallet)とアドレス(address)の違い
0個以上のアドレスの集合体をワレットと呼ぶ。bitcoin送受信にはワレットではなく、アドレスを送受信の指定先に使う。ワレットの存在意義は、アドレスの管理。

* アカウント(Account）とアドレス(address)の違い
アカウントは、アドレスの備考欄の位置づけ。所有者や用途を書いていおくイメージ。アカウントは空白文字でも良い。アカウントを指定して送受信はできない。送受信に指定できるものは、あくまでアドレスのみ。

* アドレス（address）とOAアドレス（oa_address）の違い
前者はbitcoin送受信用、後者はOpenAsset送受信用。OAアドレスは、アドレスから計算によって求められるため、一対一対応である。では、なぜ、OAアドレスが存在するのか。その理由は、bitcoin/OpenAssetを送信するときに、間違えないようにするためだとか。

* AssetIDのイメージ
Assetの用途、マークといったもの。他のAssetと区別をするために使う。

* BitcoinとOpenAssetProtocolの違い
Bitcoinは、世の中で仮想通貨として価値があると考えられているもの。OpenAssetは、Bitcoinのおまけで付いている負荷情報。5円玉(bitcoin)にシールで紙(OpenAsset)が貼ってあるようなもの。

* Bitcoinから見たOpenAssetProtocolの振る舞い
OpenAssetの情報は意識しないため、ただのbitcoinが送受信されているだけに見える。そのため、OpenAssetを理解しないノードを経由するときには、OpenAssetの情報が落ちてしまう可能性あり。


# 参考
http://techmedia-think.hatenablog.com/entry/2015/05/03/190805