Ringo:Raspberry Piでウォレットを動かす

仮想通貨のRingoの公式ウォレットのデーモンをRaspberry Piで動かす方法です。公式のGitHubにてLinux版のQTが公開されていますが、サーバ用途のためデーモンとして動かしたいため自分でビルドします。
※ソフトウェアのインストール・実行は自己責任です。特に仮想通貨はお金の絡むことなので、十分にお気をつけください。また基本的なことは知っている、もしくは調べられる人向けに書いているため、コマンドなど細かく説明していません。

<環境>

  • 型番:Raspberry Pi 3 Model B
  • OS:Rasbian Stretch
  • Ringo:1.1.1.1

https://github.com/dkwzjw/ringo
https://github.com/dkwzjw/ringo/releases

ソースコードからRingoをビルドする

1-1. apt-getで揃うパッケージのインストール

~ $ sudo apt-get update
~ $ sudo apt-get install build-essential
~ $ sudo apt-get install libtool autotools-dev autoconf
~ $ sudo apt-get install libboost-all-dev
~ $ sudo apt-get install pkg-config
~ $ sudo apt-get install libminiupnpc-dev
~ $ sudo apt-get install libqrencode-dev

OpenSSLをapt-getでインストールしないのは、Rasbian Stretchの標準のOpenSSL 1.1.0でコンパイルエラーとなるためです。

ここからはapt-getでインストールしたパッケージとバッティングするのが嫌なので、/home/wallet/commonに仮想通貨用のライブラリを配置します。

1-2. Berkeley DB 4.8のインストール

~ $ wget http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
~ $ tar xvzf db-4.8.30.NC.tar.gz
~ $ cd db-4.8.30.NC/build_unix/
~/db-4.8.30.NC/build_unix $ ../dist/configure --prefix=/home/wallet/common --enable-cxx
~/db-4.8.30.NC/build_unix $ make
~/db-4.8.30.NC/build_unix $ make install

1-3. OpenSSL(1.0.2系最新)のインストール

~ $ wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz
~ $ tar xvzf openssl-1.0.2n.tar.gz
~ $ cd openssl-1.0.2n/
~/openssl-1.0.2n $ ./config --prefix=/home/wallet/common --openssldir=/home/wallet/common/openssl -fPIC shared
~/openssl-1.0.2n $ make
~/openssl-1.0.2n $ make install

1-4. Ringoのビルド

今回はバージョン1.1.1.1のtar.gzをダウンロードしますが、コンパイルエラーとなるため1点変更が必要です。

  • src/net.cppのarrayの宣言をboost::arrayに変更する(最新版のソースを見たところ修正されています)

※ビルド中にエラーとなる場合は「Raspberry Piでウォレットビルド中にエラーとなる場合」を参照

~ $ wget https://github.com/dkwzjw/ringo/archive/v1.1.1.1.tar.gz
~ $ tar xvzf v1.1.1.1.tar.gz
~ $ ringo-1.1.1.1/src/

# src/net.cppの修正
~/ringo-1.1.1.1/src $ vi net.cpp

# 修正前 before
array<int, THREAD_MAX> vnThreadsRunning;
↓
# 修正後 after
boost::array<int, THREAD_MAX> vnThreadsRunning;

~/ringo-1.1.1.1/src $ OPENSSL_INCLUDE_PATH=/home/wallet/common/include \
OPENSSL_LIB_PATH=/home/wallet/common/lib \
BDB_INCLUDE_PATH=/home/wallet/common/include \
BDB_LIB_PATH=/home/wallet/common/lib \
make -f makefile.unix
~/ringo-1.1.1.1/src $ ls -l ringod
-rwxr-xr-x 1 wallet wallet 61397656  1月 11 14:38 ringod
net.cppを修正しなかった場合のエラー
net.cpp:60:1: error: reference to ‘array’ is ambiguous
 array<int, THREAD_MAX> vnThreadsRunning;

補足

今回のように任意の場所にライブラリを配置し、かつ、/etc/ld.so.confにパスを通さない場合、Ringoを起動する際には環境変数LD_LIBRARY_PATHにライブラリのパスを設定しなければなりません。

~ $ export LD_LIBRARY_PATH=/home/wallet/common/lib
~ $ ./ringod
~ $ ./ringod stop

もしくは

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod
~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod stop

Ringoを起動する

2-1. Ringoの初回起動(エラー)

ringodを実行するとRingoのデーモンが起動しますが、設定ファイルが無いため、エラーになります。ただ初回起動時にデータのディレクトリを作成するため、エラーでもよいので起動します。
※初回起動は時間がかかります。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod
Error: To use ringod, you must set a rpcpassword in the configuration file:
 /home/wallet/.ringo/ringo.conf
It is recommended you use the following random password:
rpcuser=ringorpc
rpcpassword=FfYxDG7hNDddgFy3RSpNgntLbSuHgfJocXBXUvyPS4rV
(you do not need to remember this password)
The username and password MUST NOT be the same.
If the file does not exist, create it with owner-readable-only file permissions.
It is also recommended to set alertnotify so you are notified of problems;
for example: alertnotify=echo %s | mail -s "Ringo Alert" admin@foo.com

2-2. ringo.confの作成

/home/ユーザ名/.ringo配下にデータが作成されたため、設定ファイルのringo.confを作成します。rpcxxxの部分は自分の環境に合わせてください。
addnodeを設定しなければ同期が始まらないため、下記サイトより取得してください。
https://lapool.me/seed/

~ $ vi /home/ユーザ名/.ringo/ringo.conf
rpcuser=user
rpcpassword=pass
rpcallowip=127.0.0.1
rpcport=9292
daemon=1
server=1
gen=0
addnode=追加ノードIPアドレス

2-3. bootstrap.datの配置

同期が始まっても途中で止まることが多く、ウォレットの再起動が必要となります。そのため公式で公開されているbootstrap.datを使い、ある一定のブロックまでをファイルから読み込みます。
下記サイトからRingo_bootstrap_20180103.7zを取得し、解凍されたbootstrap.datを /home/ユーザ名/.ringo/ に配置します。
https://mega.nz/#F!79QwiQCK!uCX6lKEomVzfXgF1Y4iYIg
wgetLynxでは取得できないため、配置はscp等を使ってください。

2-4. bootstrap.datの読込み

設定ファイルの作成とbootstrap.datを配置したら、再度ringodを実行し、bootstrap.datを読み込ませます。読み込みが完了するとRingoが起動します。
マシンスペックによりますがbootstrap.datの読み込みには数日かかります。状況は /home/ユーザ名/.ringo/debug.log を確認します。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod
Ringo server starting
~ $ tail -f /home/ユーザ名/.ringo/debug.log
SetBestChain: new best=40a2ae4c9875ae9d12e4  height=822863  trust=11764414655884354  blocktrust=7210835832  date=04/03/16 16:51:57
ProcessBlock: ACCEPTED
SetBestChain: new best=e85caaf7befbd6cba36d  height=822864  trust=11764424270332130  blocktrust=9614447776  date=04/03/16 16:53:20
ProcessBlock: ACCEPTED
SetBestChain: new best=5617a5ff6d3cb79325d6  height=822865  trust=11764431220674781  blocktrust=6950342651  date=04/03/16 16:52:57
ProcessBlock: ACCEPTED
SetBestChain: new best=6915858ab3719a3bc205  height=822866  trust=11764440487798316  blocktrust=9267123535  date=04/03/16 16:54:14
ProcessBlock: ACCEPTED

heightはブロックナンバー、date=MM/dd/yy hh:mm:ssはブロックの発見された日時です。
読み込み中にシャットダウンとし場合、再度ringod実行後に読み込みを継続しますが、正しくシャットダウンされているとbootstrap.datがbootstrap.dat.oldにリネームされているため、bootstrap.datにファイル名を戻してください。

2-5. bootstrap.datの読込み後

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod getinfo
{
    "version" : "v1.0.0.0-g32a928e",
    "protocolversion" : 60013,
    "walletversion" : 60000,
    "balance" : 0.00000000,
    "newmint" : 0.00000000,
    "stake" : 0.00000000,
    "blocks" : 1655903,
    "timeoffset" : 0,
    "moneysupply" : 46108622.04524344,
    "connections" : 16,
    "proxy" : "",
    "ip" : "xx.xx.xx.xx",
    "difficulty" : {
        "proof-of-work" : 38.54486305,
        "proof-of-stake" : 3.26976853
    },
    "testnet" : false,
    "keypoololdest" : 1516264796,
    "keypoolsize" : 100,
    "paytxfee" : 0.00010000,
    "mininput" : 0.00000000,
    "errors" : ""
}

ウォレットを停止するには、ringod stopを実行します。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod stop
Ringo server stopping

2-6. ウォレットの暗号化

ウォレット(wallet.dat)を暗号化するには、ringod encryptwalletを実行します。実行後にはRingoが停止するため、再度起動が必要です。暗号化すると送金等一部の処理にパスフレーズが必要となります。
Linux上ではコマンド履歴が残るため、Windowsで暗号化したwallet.datをLinuxへアップロードして使う、.bash_historyを削除するなどすることをオススメします。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod encryptwallet パスフレーズ
~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod

2-7. 受け取り用のアドレスを作る

ringod getnewaddress で受け取り用のアドレスを作ります。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod getnewaddress ikuyani
RFhgy8AzkqriwYm8ZUbt3R4f6DqWowW2kE
~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod getaddressesbyaccount ikuyani
[
    "RFhgy8AzkqriwYm8ZUbt3R4f6DqWowW2kE"
]

PoSでマイニングする

ウォレットにある程度の枚数が入っていればPoSでマイニングできます。

3-1. 状態の確認

ringod getstakinginfo でPoSの状態を確認できます。

~ $ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod getstakinginfo
{
    "enabled" : true,
    "staking" : false,
    "errors" : "",
    "currentblocksize" : 1000,
    "currentblocktx" : 0,
    "pooledtx" : 0,
    "difficulty" : 6.36319329,
    "search-interval" : 1,
    "weight" : 0,
    "netstakeweight" : 296804588,
    "expectedtime" : -1
}

起動して間もない頃はPoSの条件(後述)を満たしていてもstakingはfalseとなっています。後述するPoSの有効化の条件を満たした上でtrueになるまで放っておきましょう。

3-2. PoSの有効化

PoSを有効化するためには下記の条件が必要となります。

  • ウォレットにある程度の枚数のコインがある
  • staking=1となっている(デフォルト)
  • ロックが解除されている(暗号化した場合)

まずringo.confや起動オプションでstaking=1以外を指定するとPoSは無効("enabled" : false)になります。未指定の場合はstaking=1となるため、PoSを止める必要がなければ特に指定する必要はありません。
また暗号化している場合はロックを解除します。

$ LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod walletpassphrase パスフレーズ 999999999

条件を持たし放っておくと、PoSによるマイニングが始まります。

LD_LIBRARY_PATH=/home/wallet/common/lib ./ringod getstakinginfo
{
    "enabled" : true,
    "staking" : true,
    "errors" : "",
    "currentblocksize" : 2193,
    "currentblocktx" : 1,
    "pooledtx" : 1,
    "difficulty" : 2.95135711,
    "search-interval" : 1,
    "weight" : 4679,
    "netstakeweight" : 256371100,
    "expectedtime" : 3287511
}

 
参考になりましたらRingoを寄付していただけると幸いです。
Ringoアドレス:RFhgy8AzkqriwYm8ZUbt3R4f6DqWowW2kE