Ubuntu+bottle.pyでjson-rpcでmonacoindをいじってみた。
先日行われたモナーコイン・ビットコイン勉強会に触発され、僕も何かmonacoinのサービスを作ってみたいと思い立ち、まずはmonacoindをいじってみることにしました(17歳の開発者さん、本当に素晴らしいと思います)。
やったことは以下の4点。
1. monacoindのインストール
2. bottle.pyのインストール
3. python-jsonrpcのインストール
4. json-rpc経由でmonacoindの情報を表示
色々な言語が使えますが、とりあえずpythonを使うことに。
フレームワークはお手軽なbottle.pyを選択。
OSはUbuntu13.10を使っています。
1. monacoindのインストール
これは既に良い記事があります。
暗号通貨用Webサービスを立ち上げるためのmonacoind(bitcoind)のビルドと運用 - Qiita
この記事を参考にしてインストールを完了(ただ、supervisordがうまく動かなかったので手動で立ち上げています)。
2. bottle.pyのインストール
bottle.pyとは、python用の超軽量フレームワークで、何とファイルはたったの一つだけ。このため色々なソフトウェアをインストールして「あーあれが動かん、これが動かん!」と悩む心配はありません。安心。
1ファイルだけなので、インストールは公式サイトからファイルを落として解凍するだけ。コマンドでインストールする場合は
sudo apt-get install python-bottle
でOK. /usr/local/bin 配下にbottle.pyが落ちてきます。
これで環境設定は完了。開発時も作業用ディレクトリにbottle.pyを置くだけなので楽ちんです。
3. python-jsonrpcのインストール
↑を参考にしてpython-jsonrpcをインストール。python-jsonrpcのインストールにはbzrが必要なので、入ってない場合はインストールします。
4. json-rpc経由でmonacoindの情報を表示
さて、いよいよ表示ですね。
bottle.pyと同じディレクトリにmona.pyを配置し、ここに処理を記述します。
また、bottle.pyではテンプレートも利用可なので、ここではshow.tplというテンプレートファイルを作り、bottle.pyと同階層に作ったviewsディレクトリに配置しています。
ディレクトリはこんな感じになります。
work
|ーbottle.py
|ーmona.py
|ーviews
|ー show.tpl
mona.pyですが、中身としてはここのpython部分とリクエストを受ける部分で出来てます。
from jsonrpc import ServiceProxy
access = ServiceProxy("http://user_name:password@127.0.0.1:19402")
jsonrpcのインポートとインスタンス作成。ServiceProxyの中身はmonacoindインストール時に設定したユーザ名:パスワードを使います。
@app.route('/mona',method=['POST'])
def mona():
return(str(access.getinfo()))
リクエストを受ける部分。access.getinfo()は簡略化のためstrに変換してますが、本来はjson形式で返ります。
show.ptlのほうはというと、
<button id="dif">difficulty</button>
でボタンを設置。
$("button#dif").click(function(){
$.ajax({
type:'POST'
, url:'/mona'
, dataType:'text'
, success: function(text){
$("p#dif").append(text);
}
});
});
でボタンクリック時にPOSTでリクエストを投げてます。
その後、返ってきたtextを<p id="dif"></p>にappendするという仕組み。
結果、
ボタンを押すことで無事情報を取得することができました(最初getdifficulty()で試してたのでボタン名がアレですがご愛嬌ということで)。
API一覧を見ると、アドレスを新しく作ったり、残高確認したりできる模様。もう少しいじってみたいですね。
よろしければ投げ銭をどうぞ。。。
MONA:
MNQkDTM2kfauWEA7QX6m7ix7iiuiWF7CVc
mona.py
from jsonrpc import ServiceProxy
from bottle import Bottle, route,run,template,post,get
app = Bottle()
access = ServiceProxy("http://user_name:password@127.0.0.1:19402")
@app.route('/hello',method=['POST','GET'])
def hello():
return template('show')
@app.route('/mona',method=['POST'])
def mona():
return(str(access.getinfo()))
run(app, host='localhost', port=8080)
show.tpl
<html> <head> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript"> jQuery(document).ready(function() { $("button#dif").click(function(){ $.ajax({ type:'POST' , url:'/mona' , dataType:'text' , success: function(text){ $("p#dif").append(text); } }); }); }); </script> </head> <body> <button id="dif">difficulty</button> <p id="dif"></p> </body> </html>