SPRTS(Sprouts)コインのWalletをUbuntu 16.04でビルドする(daemon編)

以前の記事ではUbuntuでSproutsコインのGUI付きのビルド方法を書きましたが、VPSで常時稼働するのにGUIは邪魔なだけです。

daemonとしてビルドする、ほぼ正式(?)なやり方がわかったので記事に書いておきます。

GCEでUbuntu 16.04のインスタンスを作成

VPSは今回はGCEを使いました。

Ubuntu 16.04のイメージで

  • vCPU:1個
  • メモリ:1GB
  • SSD:20GB

で作成しています。

1 か月あたりの推定使用料金は $20.02 くらい。 単純比較できませんが、さくらのVPSの方がお得ですね。 SproutsはPoWではなくPoSなので、CPUリソースをあまり使いません。 一番安いプランでも十分です。 vps.sakura.ad.jp

今回はGCEでインスタンスを作っちゃったのでそのままいきます。

前準備

ここのビルド手順の通りにやると上手く行きません。(もう3年以上前の手順) github.com

まず以下のパッケージをインストールします。

sudo apt-get install build-essential
sudo apt-get install libssl-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libqrencode-dev
sudo apt-get install libminiupnpc-dev

手順にはlibdb4.8-devとlibdb4.8++-devもインストールしろと書いてありますが、そのままだと以下のようなエラーが出ます。

sudo apt-get install libdb4.8-dev
:中略
Package libdb4.8-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'libdb4.8-dev' has no installation candidate

以下のようにbitcoinのリポジトリを追加してからだとうまくいきます。

sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev

Sprouts Walletのビルド

sproutsのリポジトリを取ってきます。

git clone https://github.com/gjhiggins/sprouts.git

終わったら、ディレクトリを移動してビルド

cd ~/sprouts/src
make -f makefile.unix

と思ったら途中でメモリ不足のエラーが出てしまいました。

virtual memory exhausted: Cannot allocate memory
makefile.unix:128: recipe for target 'obj/bitcoinrpc.o' failed
make: *** [obj/bitcoinrpc.o] Error 1

ちょっとメモリをケチりすぎたようです。でも運用費が変わるのでベースは少ない方が良い。 そこで、swapファイルを導入して回避します。

※メモリが2GBあればビルドできると思うので、以下の手順はメモリ不足のエラーが出た時に試してください。

メモリ不足の場合の対処

以下のようにしてswapファイルを作って適用します。

sudo dd if=/dev/zero of=/var/swap/swap bs=1M count=1024
sudo chmod 600 /var/swap/swap
sudo mkswap /var/swap/swap
sudo swapon /var/swap/swap

正常に適用できたか確認するには以下のようにします。 ※適用できていない時はswapファイル名が出ません。

$ sudo cat /proc/swaps
Filename                               Type            Size    Used    Priority
/var/swap/swap                         file            1048572 53504   -1

また、再起動してもswapを有効にしたい場合はfstabを書き換えます。

sudo vi /etc/fstab

でfstabを開き、最終行に、

/var/swap/swap swap swap defaults 0 0

を追加して保存します。 swapが多すぎてゲシュタルト崩壊しそうですね。

正常にビルドできたら

最後の行に

g++ -pthread -Wall -Wextra -Wno-sign-compare -Wno-invalid-offsetof -Wno-unused-parameter -Wformat -Wformat-security
 -g -DBOOST_SPIRIT_THREADSAFE -DUSE_IPV6 -I/home/develop/sprouts/src -I/home/develop/sprouts/src/obj -DUSE_UPNP=0 -
DHAVE_BUILD_INFO -fno-stack-protector -fstack-protector-all -Wstack-protector -Wl,-z,relro -Wl,-z,now -D_FORTIFY_SO
URCE=2 -O2 -rdynamic -o sproutsd obj/version.o obj/checkpoints.o obj/netbase.o obj/addrman.o obj/crypter.o obj/key.
o obj/db.o obj/init.o obj/irc.o obj/keystore.o obj/main.o obj/net.o obj/protocol.o obj/kernelrecord.o obj/bitcoinrp
c.o obj/rpcdump.o obj/script.o obj/util.o obj/wallet.o obj/walletdb.o obj/noui.o obj/kernel.o   -Wl,-Bdynamic -l bo
ost_system -l boost_filesystem -l boost_program_options -l boost_thread -l db_cxx -l ssl -l crypto -l rt -l miniupn
pc -Wl,-Bdynamic -l z -l dl -l pthread

となど出ていたらビルドが完了しています。

今回はswapファイルを使ったのと、しょぼい環境のため10分近くかかりました。

real    9m34.293s
user    2m38.799s
sys     0m10.539s

上手くビルドができていれば、カレントディレクトリに

sproutsd

が生成されているはずです。

walletのデーモンを起動するには

./sproutsd -daemon

で起動できます。 しかし、

Sprouts server starting
Error: To use the "-daemon" option, you must set a rpcpassword in the configuration file:
 /home/develop/.sprouts/sprouts.conf
It is recommended you use the following random password:
rpcuser=bitcoinrpc
rpcpassword=91bxR62uShfrRvPWvaeia4ZHTW5DjBnghM9oMJNMLFJ5
(you do not need to remember this password)
If the file does not exist, create it with owner-readable-only file permissions.

のようなエラーが出ます。 daemonとのやり取りが、jsonrpcなのでそれ用のuserとpasswordを設定してやる必要があります。 ~/.sprouts以下にsprouts.confファイルを作成してrcpuserとrpcpasswordを設定しておきます。

vi ~/.sprouts/sprouts.conf

※先頭あたりに入れる
rpcuser=jibundekangaetausername
rpcpassword=jibundekangaetapassword

上手くいけば以下のように表示されるはずです。

./sproutsd -daemon
Sprouts server starting

ポートについて

GCPVPS ネットワーク設定で9901のポートを開放した構成を作成します。 ターゲットタグをsproutsにしておきます。 f:id:MichaeL:20180124172502p:plain

GCEのインスタンスを編集して、ネットワークタグにsproutsを入力して保存。 f:id:MichaeL:20180124172701p:plain

ノードについて

sprouts.confにノードを書いておく必要があります。 ログから、最近繋がった実績のあるノードをsprouts.confに入れて置いたものを以下で配布しています。 sprouts.conf - Google ドライブ

bootstrapについて

日本から参照しにくかったので、公式が配布していたbootstrapをGoogleDriveに上げ直しました。 Sprouts_Bootstrap_2017-10-12.zip - Google ドライブ

これを解凍して、sproutsのdaemonを停止した状態で、~/.sprouts/以下に中身を上書きしてください。 sproutsdを止めるには

./sproutsd stop

で止まります。

walletのコマンドについて

./sproutsd help

addmultisigaddress <nrequired> <'["key","key"]'> [account]
backupwallet <destination>
checkwallet
createmultisig nrequired ["key",...]
createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...}
decoderawtransaction <hex string>
dumpprivkey <peercoinaddress>
encryptwallet <passphrase>
getaccount <peercoinaddress>
getaccountaddress <account>
getaddressesbyaccount <account>
getbalance [account] [minconf=1]
getblock <hash> [txinfo] [txdetails]
getblockcount
getblockhash <index>
getblocktemplate [params]
getcheckpoint
getconnectioncount
getdifficulty
getgenerate
gethashespersec
getinfo
getmininginfo
getnetworkghps
getnewaddress [account]
getpeerinfo
getrawmempool
getrawtransaction <txid> [verbose=0]
getreceivedbyaccount <account> [minconf=1]
getreceivedbyaddress <peercoinaddress> [minconf=1]
gettransaction <txid>
gettxout "txid" n ( includemempool )
getwork [data]
help [command]
importprivkey <peercoinprivkey> [label]
keypoolrefill
listaccounts [minconf=1]
listminting [count=-1] [from=0]
listreceivedbyaccount [minconf=1] [includeempty=false]
listreceivedbyaddress [minconf=1] [includeempty=false]
listsinceblock [blockhash] [target-confirmations]
listtransactions [account] [count=10] [from=0]
listunspent [minconf=1] [maxconf=9999999]  ["address",...]
makekeypair [prefix]
move <fromaccount> <toaccount> <amount> [minconf=1] [comment]
repairwallet
reservebalance [<reserve> [amount]]
sendalert <message> <privatekey> <minver> <maxver> <priority> <id> [cancelupto]
sendfrom <fromaccount> <topeercoinaddress> <amount> [minconf=1] [comment] [comment-to]
sendmany <fromaccount> {address:amount,...} [minconf=1] [comment]
sendrawtransaction <hex string> [checkinputs=0]
sendtoaddress <peercoinaddress> <amount> [comment] [comment-to]
setaccount <peercoinaddress> <account>
setgenerate <generate> [genproclimit]
settxfee <amount>
signmessage <peercoinaddress> <message>
signrawtransaction <hex string> [{"txid":txid,"vout":n,"scriptPubKey":hex},...] [<privatekey1>,...] [sighashtype="ALL"]
stop
submitblock <hex data> [optional-params-obj]
validateaddress <peercoinaddress>
verifymessage <peercoinaddress> <signature> <message>

で確認できます。

まず必要なのはWalletへの入金アドレスを知ることでしょう。 初回起動時にアドレスが作成されているので、 getaddressesbyaccountで入金用のアドレスが確認できます。 引数が""なのはデフォルトのアカウント名が空だからです。

$ ./sproutsd getaddressesbyaccount ""
[
    "実際のアドレス"
]

その後に使うのは、getinfolistmintingでしょう。

  • getinfo
    • 現在の残高やその他の情報が確認できます。
  • listminting
    • PoS鋳造の状態を確認することができます。

外部に送信するにはsendfromコマンドです。

sendfrom "" <topeercoinaddress> <amount> 

で送信できます。

ここまで書いておいて何ですが、walletのコマンド操作を誤ると、セルフGOXする可能性が非常に高いので、覚悟を持って慎重に使用しましょう。

SPRTS(Sprouts)コインのWalletをUbuntu 16.04でビルドする

あまり日本語の情報がないようなので、スプラウトのWalletをUbuntuでビルドする方法を共有したいと思います。

スプラウトのWalletのソースコードはいくつかあり、どこに最新があるのかがメチャクチャわかりにくかったですが、以下のリポジトリが最新のようです。

github.com

今回はUbuntu 16.04で作業を行いました。 他の環境でもだいたい同じだと思います。

上記に書いてあるものをまずインストールします。

sudo apt-get install ntp git build-essential libssl-dev libdb-dev libdb++-dev libqrencode-dev libboost-dev qt5-default qt5-qmake -y
sudo apt-get install libprotoc-dev libprotobuf-dev -y
sudo apt-get install libpng-dev qrencode -y
sudo apt-get install libqrencode-dev -y

※ここでインストールするqrencodeが何故か後でリンクエラーになってしまう

いくつか不足しているので追加で以下のものもインストールします。

sudo apt-get install qttools5-dev-tools -y
sudo apt-get install libminiupnpc-dev -y
sudo apt-get install libboost-system-dev -y
sudo apt-get install libboost-filesystem-dev -y
sudo apt-get install libboost-program-options-dev -y
sudo apt-get install libboost-thread-dev -y

そして、qrencodeを以下のリポジトリからクローンして持ってきます。

github.com

git clone https://github.com/fukuchi/libqrencode.git
cd libqrencode

そのままqrencodeのビルド手順通りに./configureすると後でうまくいかないので、configureする時の引数を以下のようにします。

./configure --enable-static --disable-shared --without-tools --disable-dependency-tracking

それからqrencodeをビルドしてインストールします。

make
sudo make install
sudo ldconfig

ここで一旦戻り、sproutsのリポジトリをクローンします。

cd ../
git clone https://github.com/gjhiggins/sprouts
cd sprouts
qmake USE_O3=1 USE_QRCODE=1 FIRST_CLASS_MESSAGING=1 RELEASE=1 USE_UPNPC=1

ここでmakeするとリンクエラーになるため、Makefileを少しいじります。

LIBS          = $(SUBLIBS) -L/usr/X11R6/lib64 -Wl,-Bstatic -lqrencode -lminiupnpc -lrt -lssl -lcrypto -ldb_cxx -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread -Wl,-Bdynamic -lQt5Widgets -lQt5Gui -lQt5Network -lQt5Core -lpthread -lGL

となっているところを

LIBS          = $(SUBLIBS) -L/usr/X11R6/lib64 -Wl,-Bstatic -lqrencode -lminiupnpc -lrt -lssl -lcrypto -ldb_cxx -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread -Wl,-Bdynamic -lQt5Widgets -lQt5Gui -lQt5Network -lQt5Core -lpthread -lGL -ldl

に変更します。 そこからmakeします。

make

うまくいけば、makeしたディレクトリにsproutsという実行ファイルができているでしょう。

環境設定ファイル群を作成するため、一度実行させます。 そして、node設定を行うためにすぐに終了させます。

終了させたら https://www.coinexchange.io/network/peers/SPRTS のページの左の方の「Addnodes」の下にあるノードのリストをコピーします。

こういうやつ

addnode=34.228.227.193
addnode=88.198.68.186
addnode=2601:589:c400:f2a0:d47:4d21:a966:4c0a
addnode=73.204.161.55
addnode=84.226.191.14
addnode=84.50.52.174
addnode=51.254.45.117
以下略
:

全部コピーしたら

~/.sprout/sprouts.conf

に貼り付けて保存します。

これをしてからもう一度sproutsを起動させて、しばらく(まる一日以上かかるかも?)ほっとくと同期が完了します。 そのうち同期が簡単に終わるようにbootstrapを配布しようかと思います。

あとGUIなし版のWalletのビルド方法の需要があればそれも。