bitcoinの流通の仕組みであるブロックチェーンを拡張して、bitcoin以外に色々な情報を付けることが可能になる「OpenAssetProtocol」の使い方をご紹介します。
bitcoinそのものの入門につきましては、こちらをご参照ください。
導入
標準の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については、こちらを参考にしてください。
インストール時のトラブルシュート
- 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を動作させておいてください。(参考:こちら)
※テンポよく動作検証したい場合は、スタンドアロンで動作するregtest環境かzero-confirmation(別途説明)の利用をご検討ください。
OpenAssetAPIの準備
最初に、OpenAssetProtocolのAPIを受け付けるインスタンスを作成します。
以下はtestnetのbitcoinのブロックチェーン上で動くAPIです。
% 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の情報が落ちてしまう可能性あり。
参考