丸の内で働くブロックチェーンエンジニアのブログ

丸の内やその他でフリーのブロックチェーンエンジニアとして働いています。勉強している技術情報やニュースを紹介します。

Moneroの環境構築(フルノード)をDockerで行う

この記事では、Mac OS High Sierra 10.13.1を使っています。

個人的に匿名性最強の一角だと思っている匿名系仮想通貨のMoneroです。

Dockerでフルノードを作成する方法をまとめました。

Moneroの匿名性仕様についてはこちらです。

Coinhiveで採掘される匿名性通貨Moneroはどの程度匿名か、仕様を調べてみた

www.blockchainengineer.tokyo

はじめに(Dockerを使わない方法)

Moneroはめちゃくちゃフルノード構築が簡単です。 Monero公式ダウンロード先からOSに合うものをダウンロードして解凍するだけで一式揃います。

f:id:naomasabit:20171126221334p:plain

GUIの場合は、moneroのアプリケーションを実行するだけ、 CUIの場合は、解凍したフォルダ内にある「monerod」を実行するだけです。

f:id:naomasabit:20171126221518p:plain

ブロックの同期が済み次第、マイニングも簡単にできます。

以下は、GUIのウォレットをダウンロードして実行した画面です。 GUIでも簡単にマイニングの実行ができます。MoneroはCPUマイニングが可能なので、普段のPCで手軽にマイニングを楽しめます。

f:id:naomasabit:20171126221420p:plain

Dockerfileの作成(ダウンロード)

Dockerfileを自作しました。

Dockerfileは私のgithubリポジトリに公開しています。

#ubuntu:17.10をベースにする
FROM ubuntu:17.10
MAINTAINER naomasabit <naomasabit@gmail.com>

#wgetをインストールする
RUN apt-get update && \
    apt-get install -y wget

#wgetでmoneroのcliをダウンロードする。(versionを変えたい場合は対応が必要)
RUN wget https://downloads.getmonero.org/cli/monero-linux-x64-v0.11.1.0.tar.bz2 -P .

#ダウンロードしたcliを解凍し、解凍前ファイルを削除する
RUN apt-get install -y bzip2
#ダウンロードしたcliを解凍し、解凍前ファイルを削除する
RUN tar -xjvf ./monero-linux-x64-v0.11.1.0.tar.bz2 &&\
    rm ./monero-linux-x64-v0.11.1.0.tar.bz2

#ブロックチェーンデータの格納先
VOLUME /root/.bitmonero

EXPOSE 18080 18081

CMD ["./monero-v0.11.1.0/monerod"]

手っ取り早くダウンロードするには、以下cloneコマンドを実行してください。

git clone https://github.com/naomasabit/monero-docker.git

Dockerのイメージをビルド

dockerfileのある場所で、imageをビルドします。

Dockerfileを配置したディレクトリで、以下コマンドを実行してdockerイメージを作ります。

docker build -t monero-node . #monero-nodeという名前でdockerイメージを作成

うまくできていれば、docker imagesコマンドで存在を確認できます。

docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
monero-node          latest              d1ae00ca8572        23 minutes ago      398MB

ビルドしたイメージのコンテナを作成

docker run コマンドでイメージのコンテナを作成します。

  • --name引数:コンテナの名称をつけます。「--name=monero-docker」はmonero-dockerという名称をつけます
  • -dオプション:バックグラウンドで動かします
  • -vオプション:ホスト上にvolumeをマウント(ダウンロードする大量のトランザクションなどをコンテナ外に出しておくことができまう) 「-v $HOME/monero-docker/monero-data:/root/.bitmonero」はホストの「$HOME/monero-docker/monero-data」にコンテナ内の「/root/.bitmonero」をマウントします
  • -i ホストの入力をコンテナの標準出力をつなげます

ブロックチェーンデータは「/root/.bitmonero」に保存されます。

docker run -d -i --name=monero-docker \
 -p 127.0.0.1:18081:18081 \
  -v $HOME/monero-docker/monero-data:/root/.bitmonero monero-node

「docker ps」コマンドでコンテナができていることを確認します。

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                  NAMES
cf075402d632        monero-node            "./monero-v0.11.1...."   4 seconds ago       Up 2 seconds                18080/tcp, 127.0.0.1:18081->18081/tcp                  monero-docker

「docker logs」コマンドでMoneroのダウンロードも進んでいることを確認します。

docker logs

2017-11-26 12:43:37.879     7fd562604f40    INFO    global  src/daemon/main.cpp:279 Monero 'Helium Hydra' (v0.11.1.0-release)
2017-11-26 12:43:37.883     7fd562604f40    INFO    global  src/daemon/protocol.h:55    Initializing cryptonote protocol...
2017-11-26 12:43:37.884     7fd562604f40    INFO    global  src/daemon/protocol.h:60    Cryptonote protocol initialized OK
...
    
**********************************************************************
The daemon will start synchronizing with the network. This may take a long time to complete.

You can set the level of process detailization* through "set_log <level|categories>" command*,
where <level> is between 0 (no details) and 4 (very verbose), or custom category based levels (eg, *:WARNING)

Use the "help" command to see the list of available commands.
**********************************************************************

2017-11-26 12:44:41.088 [P2P2]  WARN    net.dns src/common/dns_utils.cpp:487    WARNING: no two valid MoneroPulse DNS checkpoint records were received
2017-11-26 12:45:30.567 [P2P3]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:305 [91.99.117.142:18080 OUT] Sync data returned a new top block candidate: 1 -> 15001 [Your node is 15000 blocks (10 days) behind] 
SYNCHRONIZATION started
2017-11-26 12:45:36.680 [P2P7]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:305 [178.63.96.4:18080 OUT] Sync data returned a new top block candidate: 1 -> 1451462 [Your node is 1451461 blocks (1314 days) behind] 
SYNCHRONIZATION started
2017-11-26 12:45:39.028 [P2P6]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:1154    [178.63.96.4:18080 OUT]  Synced 101/1451462
2017-11-26 12:45:39.715 [P2P0]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:1154    [178.63.96.4:18080 OUT]  Synced 201/1451462
2017-11-26 12:45:40.433 [P2P8]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:1154    [178.63.96.4:18080 OUT]  Synced 301/1451462
2017-11-26 12:45:41.138 [P2P5]  INFO    global  src/cryptonote_protocol/cryptonote_protocol_handler.inl:1154    [178.63.96.4:18080 OUT]  Synced 401/1451462

moneroのコマンド動作確認

bashでコンテナの中に入って、moneroのコマンドを叩いてみます。

docker exec -i -t monero-docker bash #dockerの中にbashで入る
root@:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  monero-v0.11.1.0  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@:/# cd monero-v0.11.1.0/ #moneroのフォルダに移動
root@:/monero-v0.11.1.0# ./monerod sync_info #同期情報を確認
#同期ブロック情報が見られる
Height: 67198, target: 1451467 (4.62966%)
Downloading at 1409 kB/s
8 peers

「./monerod help」を叩けばコマンド情報が見られます。

start_miningでマイニングが実行でき、引数にアドレスとスレッド数とバックグラウンド実行、バッテリーを無視するかを設定します。

./monerod start_mining <addr> [<threads>] [do_background_mining] [ignore_battery]

Dockerによる仮想通貨のノード構築シリーズ

qiita.com

www.blockchainengineer.tokyo

www.blockchainengineer.tokyo