読者です 読者をやめる 読者になる 読者になる

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-json-rpc – JSON-RPC

↑を参考にして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するという仕組み。

 結果、

 

f:id:caffelover:20140322194805p:plain

 

 ボタンを押すことで無事情報を取得することができました(最初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>