ls -al

仮想通貨やプログラミングに関する事などをつらつらと書き綴ります

自作gem'nem_websocket_client'の紹介

こちらの記事でRubyを使ってNEMのWebSocketを扱う方法を書きましたが、その内容をgemとして纏めて公開しました。本記事はその紹介と使い方の説明を行います。

リンク

github - nem_websocket_client
rubygems - nem_websocket_client

インストール

rubygemsに登録済み(ページはこちら)なのでgemコマンドからインストールできます。

gem install nem_websocket_client

使い方

こんな感じで使えます

require "nem_websocket_client"

host = "http://alice5.nem.ninja"
port = 7778
ws = NemWebsocketClient::connect(host,port)

ws.connected do
  p "Connected!"
end

ws.subscribe_block do |transaction|
  p transaction["timeStamp"]
end

ws.errors do |e|
  p e
end

ws.closed do |e|
  p e
end

loop do
  
end

Rubyのブロック記法を利用して受信時等のイベント処理を記述することが出来ます。上のソースコードの場合、接続時に”Connected”と出力し、最新のブロック情報を受信するとそれのタイムスタンプを出力し続けるような動作を行います。また、スレッドで動作しているので、どこかでloopするなどしてメインスレッドを終了させないようにする必要があります。

あるアカウントの直近のトランザクションを取得し続ける場合は以下のようになります。

ws = NemWebsocketClient.connect(host,port)
ws.subscribe_recenttransactions(address) do |transaction,address|
    p transaction
end

ws.request_recenttransactions(address)

このコードの場合、request_recenttransactions(address)でこちらからサーバーにデータを要求しています。よって、実行直後に必ず直近トランザクションがサーバーから取得でき、その後は直近トランザクションに変化がある度にサーバーからデータが送信されます。

詳細

メソッド名などはだいたいnem-sdkに準拠したものとしました。それぞれ、各メソッドで取得できる情報の対応は以下のとおりです。

メソッド 取得できる情報
subscribe_block() 最新のブロックの情報
subscribe_block_height() ブロックの高さ
subscribe_owned_namespace(address) 保有ネームスペース
subscribe_owned_mosaic(address) 保有モザイク量
subscribe_owned_mosaic_definition(address) 保有モザイク定義
subscribe_transaction(address) 承認済みトランザクション
subscribe_unconfirmed_transaction(address) 未承認トランザクション
subscribe_recenttransactions(address) 直近トランザクション
subscribe_account(address) アカウント情報

一部を除いた大多数のメソッドはアドレスを引数に必要とします。また、ブロックの引数は第一引数にサーバーから送信されたjsonをJSON.parse()したものが入り、アドレスを渡す必要のあるメソッドの場合はブロックの第二引数にアドレスが入ります。

SENDを送ってこちらからデータを要求できるメソッドも作りました。

メソッド 要求できる情報
request_account(address) アカウント情報
request_owned_namespace(address) 保有ネームスペース
request_owned_mosaic(address) 保有モザイク量
request_owned_mosaic_definition(address) 保有モザイク定義
request_recenttransactions(address) 直近トランザクション

こちらのrequest~メソッドを使うことでサーバーにデータを要求することが出来ます。上のsubscribe~メソッドで予め処理を登録していることでデータを受け取ることが出来ます。

他、以下のようなイベントに処理を登録できるメソッドがあります。

メソッド イベント
connected() サーバーとの接続時
closed() サーバーとの通信を切断した時
heartbeat() サーバーからのハートビート受信時
errors() エラーの発生時

この他にサーバーとの通信を終了するclose()メソッドがあります。

TODO

  • テスト用アカウントでネームスペースを作成できなかったのでsubscribe_owned_namespaceのテストをpendingしている。testnetのxemが充分に手に入り次第きちんとテストを行う。
  • 一つのメソッドで登録できる処理は一つまでとなっているので、例えばsubscribe_transactionを使って二つのアカウントの承認済みトランザクションを同時に受信することが出来ない。NemWebsocketClient::Clientのインスタンスを二つ生成することで対応可能だが、一つのインスタンスで複数のアカウントに対応できるようにしたい。
    • v0.1.2で修正しました。