post Image
Monacoinオンラインウォレットを作ってみよう

アイスタイル Advent Calendar 2017、10日目の記事です。

みなさん、仮想通貨持ってますか?
仮想通貨の中でもMonacoin(モナーコイン)は日本初のもので、1MONA=1600円近くで取引されています。(2017年12/11月現在)

この記事ではMonacoinのオンラインウォレットを作成してみます。

環境

OS: Ubuntu 14.04.5 LTS (vagrantのゲストOSとして使用しました)
monacoin: v0.14.2

monacoin インストール

sudo add-apt-repository -y ppa:visvirial/monacoin
sudo apt update -y
sudo apt install -y monacoind

インストールが完了すると~/.monacoinが作成され、以下のコマンドが有効になります。

$ which monacoind
/usr/bin/monacoind

$ which monacoin-cli
/usr/bin/monacoin-cli

monacoinの起動にはmonacoindコマンドを、アドレスの作成や送金といったコマンドはmonacoin-cliを使って操作していくことになります。

設定ファイルの作成

~/.monacoin/monacoin.conf を作成します。以下はサンプルです。

# 1にすることでJSON-RPC APIが叩けるようになる
server=1

# デーモンとして起動
daemon=1

# RPCユーザ・ポート設定(適宜変更してください)
rpcuser=username
rpcpassword=password
rpcport=9332

# RPC接続許可設定(ローカルのみ)
rpcallowip=127.0.0.1/24
# 全許可
# rpcallowip=0.0.0.0/0

# マイニングするか(今回はウォレット機能のみ使うので0)
gen=0

# testnet設定
testnet=4

testnetについて

testnetとは開発のためのBlockchainネットワークです。
testnet内の仮想通貨には価値がなく、ネット上で無料で手に入れることが可能です。仮想通貨を利用したアプリケーションを開発する際はtestnetを利用するのが普通です。
リリースノートを見ると

Testnet3 has been deprecated and replaced with Testnet4. The server port has been changed to 19403 however the RPC port remains the same (19402).

とあるので、4を指定します。

monacoind起動

それでは起動してみましょう。

$ monacoind
Monacoin server starting

これだけでOKです。
正常に起動されているか確認してみましょう。

$ monacoin-cli getinfo
{
  "version": 140200,
  "protocolversion": 70015,
  "walletversion": 130000,
  "balance": 0.00000000,
  "blocks": 256,
  "timeoffset": 0,
  "connections": 1,
  "proxy": "",
  "difficulty": 0.0009979965449690071,
  "testnet": true,
  "keypoololdest": 1512289024,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "relayfee": 0.00100000,
  "errors": ""
}

ちゃんとtestnetが有効になっていますね。
実際に取引を開始するにはBlockchainネットワークに存在するブロックを全て入手する必要があります。

“blocks”: 256,

このブロック数は起動直後だと少ないかもしれませんが、testnetなら数分で安定します。

monacoin-cliについて

monacoinに関する様々な操作を行うことができるmonacoin-cliですが、コマンドの種類はbitcoinと同様なので
こちらのコマンドリストを参照すると良いでしょう。
https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list

新規アドレスを発行する

getnewaddress <account> で、アカウント名を指定してアドレスを新規作成できます。

$ monacoin-cli getnewaddress alice
mvoKjf93xPmqgaUPe3jiCvR9AAbuetWjiu

指定したアカウント名が存在しなければ作成されます。
一つのアカウントに複数のアカウントを作成することも可能です。alice にもうひとつアドレスを作成してみましょう。

$ monacoin-cli getnewaddress alice
migTzrD7Ac78nQ148HD5jFNf5T2cqu7T2h

これで、mvoKjf93xPmqgaUPe3jiCvR9AAbuetWjiumigTzrD7Ac78nQ148HD5jFNf5T2cqu7T2h の2つのアドレスがaliceアカウントに作成されました。
MonacoinのアドレスはMから始まりますが、testnetの場合はmから始まります。

アカウント一覧を確認する

$ monacoin-cli listaccounts
{
  "": 0.00000000,
  "alice": 0.00000000
}

aliceのみ確認できます。数字はそのアカウントに紐づくアドレスの残高の合計を示しています。

アカウントを指定して残高を確認する

$ monacoin-cli getbalance alice
0.00000000

アカウントに紐づくアドレスを確認する

$ monacoin-cli getaddressesbyaccount alice
[
  "migTzrD7Ac78nQ148HD5jFNf5T2cqu7T2h",
  "mvoKjf93xPmqgaUPe3jiCvR9AAbuetWjiu"
]

先程作成したアドレス2つが確認できます。

testnet用のコインを入手する

今回はtestnet4用のFaucetを提供しているこちらのサイトを利用します。
ちゃんとバナークリックしてあげましょうね。
「Address」欄に先ほど作成したアドレスのうちのひとつを入力し、「Send」ボタンを押します。

スクリーンショット 2017-12-03 17.45.14.png

合計127.88 MONAが送金されたようです。
トランザクションがBlockchainネットワークにより承認され、自分のアカウントに反映されるには時間がかかる場合もありますが、testnetなら数分で反映されるはずです。

残高を確認する

$ monacoin-cli getbalance alice
127.88000000

ちゃんと反映されてますね!

送金する

先に送金先のアカウントbobを作っておきましょう。

$ monacoin-cli getnewaddress bob
mxzLyPYfXYc2RePDqYF43xKgAQcJBzvqjC

これで、このウォレット内にはalicebobの2アカウントが存在することになります。

$ monacoin-cli listaccounts
{
  "": 0.00000000,
  "alice": 127.88000000,
  "bob": 0.00000000
}

aliceからbob7.88 MONAだけ送金してみます。
同一ウォレットの場合moveコマンドが使えます。
同一ウォレット内でのMONAを移動させるだけなので、手数料は不要です。

moveコマンドの引数は以下になります。

move <送金元アカウント> <送金先アカウント> <送金額> [最低承認数=1] [コメント]

それでは送金します。

$ monacoin-cli move alice bob 7.88
true

アカウント毎の残高を確認しましょう。

$ monacoin-cli listaccounts
{
  "": 0.00000000,
  "alice": 120.00000000,
  "bob": 7.88000000
}

想定した通りの結果になりましたね。
今回は触れませんが、別のウォレットのアドレスを指定して送金するには sendfromコマンドを使います。

curlから叩いてみる

monacoinはJSON-RPCを提供しているため、HTTPリクエストすることでリモートからの操作が容易に可能です。
先程のmove操作をcurlでやってみます。
aliceからbob1 MONA移動させましょう。

$ curl -s --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"move","params":["alice","bob","1"]}' -H 'content-type:text/plain;' http://username:password@127.0.0.1:9332

以下のようなJSONが返ってくればOKです。

{
  "id": "curltext",
  "error": null,
  "result": true
}

アカウント毎の残高を確認してみましょう。

$ curl -s --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"listaccounts","params":[]}' -H 'content-type:text/plain;' http://username:password@127.0.0.1:9332 | jq .
{
  "id": "curltext",
  "error": null,
  "result": {
    "bob": 8.88,
    "alice": 119,
    "": 0
  }
}

うまくいってるようです。
今回はローカルにたてたmonacoinウォレットに対してリクエストしましたが、monacoin.confrpcallowipで許可するIPを適切に指定してあげれば、リモートから叩くことも可能です。

monacoindを停止する

最後に、停止する方法です。

$ monacoin-cli stop
Monacoin server stopping

まとめ

今回はMonacoinでしたが、Bitcoinや、Bitcoinを元にしたLitecoin系の仮想通貨はほとんど似たような操作でオンラインウォレットを立ち上げることが可能なはずです。
JSON-RPCでやり取りできるためアプリケーションにも組み込みやすいのではないかと思います。


『 Bitcoin 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。