Chia Networkをdocker(Linux/CLI)を使ってマイニングする方法

スポンサーリンク

HDDやSSDで始めるマイング。Chia NetworkをLinux (docker, docker-compose)で使ってみた記録。CLIを使った操作の記事があまり無かったので、すぐに風化しそうですがメモ書きで残しておきます。Chia公式のdockerコンテナを使用します(執筆時に使用しているのはv1.2.7)。

GUI環境がやや不安定&バックグラウンドでどうなっているか分からないのが嫌、ログを細かく見たい、CLIだけの環境等で掘りたい方への情報です。間違ってることを書いていたらコメント欄で教えていただけると嬉しいです。

スポンサーリンク

Chiaのdocker環境でのインストール方法

最新の情報

このブログの情報はすぐに風化しそうなので、一次情報とユーザコミュニティの場所を書いておきます。困ったらこちらをご覧ください。

公式ページ

最新の情報はこちらで。英語が苦手でもgoogle翻訳かけたらある程度は把握できるかと。

その他

よく分からないエラーが出る、みんなの設定を見てみたいなどはこちら。

とりあえず起動

dockerホストはUbuntu 20.04を使用。とりあえず公式コンテナで起動し中に入ります。コンテナを起動するとfarmer, harvester, full node, walletのサービスが自動起動しています。

// dockerホスト側でディレクトリ作成
mkdir -p ./chia/homedir
mkdir -p ./chia/plots

// コンテナ起動
docker run --name chia -v ./chia/homedir:/root -v ./chia/plots:/plots -d ghcr.io/chia-network/chia:latest 

// アレコレするのは一旦中に入ってしまったのほうが楽なので
docker exec -it chia /bin/bash

既存の鍵の削除

コンテナを起動するといきなりキーが作られますが、作成時に表示されるmnemonic(24個の単語)が分からないので、一旦鍵は削除して作り直します。

venv/bin/chia keys delete_all

鍵の作成

既存の鍵を持っていない場合は新規作成し、fingerprintの番号とmnemonicの単語をコピペして残しておきます。持っている場合は下部の”鍵の追加”をします。

venv/bin/chia keys generate

例)
root@chia:/chia-blockchain# venv/bin/chia keys generate
Generating private key
Added private key with public key fingerprint 00000000000 and mnemonic
apple orange .... ここに24個の単語が出てくるのでコピペしておく(mnemonic)

鍵の追加

既に他の場所で作っていれば下記のコマンドを入力し、mnemonicを入力します。

venv/bin/chia keys add

鍵 / 口座番号の確認

鍵が1個であることを確認。複数ある場合は下部の削除で消します。ファーミング用と振込口座用を分ける場合は2つでも構いません(後述)。

venv/bin/chia keys show

Showing all public keys derived from your private keys:

Fingerprint: XXXXXX
Master public key (m): XXXXXX
Farmer public key (m/00000/0000/0/0): XXXXX
Pool public key (m/00000/0000/1/0): XXXXXX
First wallet address: XXXXXXX ← 口座番号(Wallet Address)

walletの確認

自分の財布の確認(後述のnodeにつながっていないと結果は出ません)。初回のみキーボード入力が発生するので、コンテナにexec /bin/bashで接続してから実行するか、コンテナ外から直接実行する場合は -it等でttyを開く必要があります。

venv/bin/chia wallet show

初回)
root@chia:/chia-blockchain# venv/bin/chia wallet show
No online backup file found,
 Press S to skip restore from backup
 Press F to use your own backup file: S
Wallet height: 0
Balances, fingerprint: 000000000
Wallet ID 1 type STANDARD_WALLET
   -Confirmed: 0 mojo (0.0 xch)
   -Unconfirmed: 0 mojo (0.0 xch)
   -Spendable: 0 mojo (0.0 xch)
   -Pending change: 0 mojo (0.0 xch)

同期後)
Wallet height: xxxxxx
Sync status: Synced
Balances, fingerprint: xxxxxxx
Wallet ID 1 type STANDARD_WALLET
  -Total Balance: 1e-10 xch (100 mojo)
  -Pending Total Balance: 1e-10 xch (100 mojo)
  -Spendable: 1e-10 xch (100 mojo)

ファーム(畑)の確認

Farming statusがいつまで経ってもSyncingから変わらない場合は下部の”同期されない”を参照してください。

venv/bin/chia farm summary

例)
root@chia:/chia-blockchain# venv/bin/chia farm summary
Farming status: Farming
Total chia farmed: 0.0
User transaction fees: 0.0
Block rewards: 0.0
Last height farmed: 0
Plot count: 3
Total size of plots: 304.001 GiB
Estimated network space: 779.706 PiB
Expected time to win: 1 year and 3 months
Note: log into your key using 'chia wallet show' to see rewards for each key

nodeの確認

Current Blockchain StatusがFull Node Syncedになるまで時間がかかる場合があります。いつまで経ってもFull Node Syncedにならない場合は、下部の”同期されない”を参照してください。

venv/bin/chia show -s -c

例)
root@chia:/chia-blockchain# venv/bin/chia show -s -c
Current Blockchain Status: Full Node Synced

色々出てくる

コンテナの停止&再起動

一度コンテナを停止して再度起動して正常に動くかを試してみます。-e keys=””を付けないと新たな鍵が自動的に作られてややこしいことになるのでつけます。

docker stop
docker rm chia

docker run --name chia -v ./chia/homedir:/root -v ./chia/plots:/plots -e keys="" -d ghcr.io/chia-network/chia:latest 

docker exec -it chia /bin/bash

venv/bin/chia keys show
//身に覚えの無いキーがあったら、起動時にキーが作られてるので設定間違ってる。

キーの削除

身に覚えの無いキーがあったら削除します。起動時にキーが作られてるので設定間違ってるかも。

venv/bin/chia keys delete -f {fingerprintid}

//1つだけキーが出てくることを確認
venv/bin/chia keys show

plots(耕地)の作成

バックグラウンドで実行するためにnohup ~ & を付けて実行しました。

後述の方法でfarmerをstopさせて、plot作成専用コンテナを作ることもできます。他の場所でplotだけを作る場合、鍵の情報は合わせて作る必要があります。-kはv.1.1.6ではデフォルト32。時間差で作りたい場合や複数台PCを使ってplotsを作りたい場合は、後述の専用のplotterソフトを使ってみても良いかもしれません。

コンテナ内で
mkdir -p /plots/plots
mkdir -p /plots/tmp
mkdir -p /plots/logs

-d 出来上がりのディレクトリ(HDDで良い。今回はNAS)
-t テンポラリのディレクトリ(SSD推奨)
nohup venv/bin/chia plots create -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

-n キュー追加個数(キューに何個入れるか。plotsを連続何個作るか(一つ終わったら次を作る)。下記の場合1つ作り終わってから次を作り、計2個作る)
nohup venv/bin/chia plots create -n 2 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

-r CPUスレッド数(作成にCPUを何スレッド使うか。公式では2が推奨されていたが、CPUが暇なら増やすとフェーズ1(Forward Propagation)で早くなる。もちろん-nと組み合わせても使える)
nohup venv/bin/chia plots create -r 2 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

並列で作る(CPUも余裕があり、SSD等を使用して並列で何個も作りたい場合は同時にバックグラウンドで複数起動させる。下記の場合2並列で10個づつ作る。)
nohup venv/bin/chia plots create -n 10 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`_1.log 2>&1 &
nohup venv/bin/chia plots create -n 10 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`_2.log 2>&1 &

docker-compose化

基本の形

version: '3.6'

# chia
  chia.local:
    hostname: chia
    image: ghcr.io/chia-network/chia:latest
    volumes:
      - "./chia:/root"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
       keys: ""
    restart: always
    logging:
      driver: syslog

起動

docker-compose up -d chia.local

CPU、メモリに制限をかける / plot作成用コンテナを分離

今回は他の用途でも使用しているサーバ内で動かしており、あまりリソースを使ってもらうと困るので、CPUとメモリにリミットをかけ(deploy ~ limits)ました。

また、設定変更や何か調子悪い時にコンテナを止めたい(再起動したい)事が多々あったのですが、plot作成が止まるのは嫌なのでplot専用のコンテナを作り、そちらでplot作成のみをさせています。コンテナを分けることによりfarming, wallet側だけ最新バージョンのコンテナを使ったりと柔軟に運用できます。

version: '3.6'

# chia farming
  chia.local:
    hostname: chia
    image: ghcr.io/chia-network/chia:latest
    volumes:
      - "./chia:/root"
      - "/export/plots:/plots"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
       keys: ""
    restart: always
    deploy:
      resources:
        limits:
          memory: 4g
          cpus: '1'
    logging:
      driver: syslog

# chia plotter
  chia-plot.local:
    hostname: chia-plot
    image: ghcr.io/chia-network/chia:latest
    volumes:
      - "./chia:/root"
      - "/export/plots:/plots"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
       keys: ""
    restart: always
    deploy:
      resources:
        limits:
          memory: 4g
    logging:
      driver: syslog

起動

docker-compose --compatibility up -d chia.local
 docker-compose --compatibility up -d chia-plot.local

プロセスの再起動、停止

farmer, harvester, full node, wallet のセットで再起動

venv/bin/chia start -r farmer

full nodeだけ再起動

venv/bin/chia start -r node

停止は stop。

plot作成のみさせるコンテナを作りたい時はvenv/bin/chia stop farmerで farmer, harvester, full node, wallet を止めてしまいます。

ホームディレクトリをホスト側にマウント

volumes:"./chia:/root"の部分。公式マニュアルにはホスト側にマウントしましょうとは書いてありません。

ただ、

  • ~/.chia/mainnet/db/や ~/.chia/mainnet/wallet/db/内のsqliteファイルに最新情報を保存している(そして同期には時間がかかる)。
  • コンテナ再作成のたびにadd keyするのが面倒だった。説明書にある -e keys=”/path/in/container” の使い方が分からない。
  • 様々な設定が ~/.chia/mainnet/config/config.yaml に書かれている。

のでマウントしてコンテナを破棄しても残るようにしました。Chiaのバージョンアップ等で不具合などが起こったら、ホスト側の.chiaは消してしまえば良いかなと思っています。

コンテナのバージョンアップ

docker pull ghcr.io/chia-network/chia:latest すると最新のコンテナが落ちてきます。

1.1.1→1.2.7までは~/.chia はそのままでも問題ありませんでした。

その他 (dockerとは関係ない話)

ファームやnodeのステータスが同期中から変わらない場合

Wallet の同期にかなり時間がかかります(WalletのDBがない状態だと数日)。

chia show -s -c したときに出る Current Blockchain Status がSyncing になっていて、その後の数字が上がっていれば問題ないため、X/Xが同じ数値になるまで放置しましょう。

$ venv/bin/chia show -s -c
Current Blockchain Status: Syncing 4832/873786
....                                ↑ここの数字が少しづつ上がっていれば問題ない

数字が一向に進まない場合は、ルーターでこのコンテナIPのポート 8444へ穴を開けたほう(ポートフォワード)が良さそうです(IPv6環境だとppoe契約しないと駄目など色々めんどくさそうだけど)。あとdockerホスト側の時刻もntp等でちゃんと合わせます。コンテナ内をJSTにする必要は無くUTCでも大丈夫です。

また、~/.chia/mainnet/log/debug.log に怪しげなメッセージが出ていないかを見てみます。バージョンアップ後などは、~/.chia/mainnet/db/ や  ~/.chia/mainnet/wallet/db/ 内のsqliteファイルを削除してから再起動すると同期する方も多いようです。

コンテナバージョンアップ後 farmer_server : INFO Cannot connect to host 127.0.0.1:8444 ssl でずっとつながらなかったときは、~/.chia/mainnet/db/blockchain_v1_mainnet.sqlite を削除して、再起動したらエラーはなくなりました。

詳細:
https://github.com/Chia-Network/chia-blockchain/wiki/FAQ#why-does-my-node-have-no-connections-how-can-i-get-more-connections

当初はずっとこの状態で止まっていました。

Farming status: Syncing
Total chia farmed: 0.0
User transaction fees: 0.0
Block rewards: 0.0
Last height farmed: 0
Plot count: 1
Total size of plots: 101.304 GiB
Estimated network space: 250.611 PiB
Expected time to win: 1 year and 4 months
Note: log into your key using 'chia wallet show' to see rewards for each key

plotファイルのチェック

plotファイルが有効なものかどうか、-k 32で作られているなどを見られます。他の場所で作ったplotsを使うときなどはやってみても良いかもしれません。無効と判断されるもの、Proofsの小数点が極端に低い場合は-n(デフォルトは-n 30)を上げて再度チェックするようです。

venv/bin/chia plots check

例)
2021-04-29T15:43:57.211  chia.plotting.check_plots        : INFO     Loading plots in config.yaml using plot_tools loading code
2021-04-29T15:44:01.549  chia.plotting.plot_tools         : INFO     Searching directories ['/plots', '/chia-blockchain', '/plots/plots']
...
2021-04-29T15:44:03.441 chia.plotting.check_plots : INFO Testing plot /plots/plots/plot-xxxxxxxxxxxxxxxx.plot k=32 (k=32で作られてる)
...
2021-04-29T15:47:10.092  chia.plotting.check_plots        : INFO        Proofs 42 / 30, 1.4  (1.4の部分が極端に低い場合は-n 100等でチェックするぽい?。詳しくは不明)
....
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     Summary
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     Found 8 valid plots, total size 0.79177 TiB  (有効なplotsの数)
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     8 plots of size 32

plotファイルを認識させる

plots create -dで指定したディレクトリにxxxx.plotを入れたら、harvesterが定期的に見に来てくれて、新しいファイルがあったらfarmingの対象にしてくれます。plotsファイルが入っているディレクトリは、~/.chia/mainnet/config/config.yaml のplot_directories: に書かれています(chia plots create -d すると自動的に書かれているぽいです)。

鍵が同じ別の環境で作ったplotsもちゃんと認識してくれましたが、コピー中の中途半端なxxxx.plotがharvesterに認識されるとエラーになってしまうので、xxxxx.plot.yyy等リネームしてからコピー完了後 mv xxxxx.plot.yyy xxxxx.plot する方が安全です。別環境でplotファイルを作る場合は後述の専用ソフトを使うとその当たりをよろしくやってくれる機能も入っています。

plot作成の中止

plots createのプロセスをkillします。途中で中止したtempのplostsは再利用できないので、create時のログを見てちゃんとplotsが完成してからkillしたほうが無駄が無いかと思います。

root@chia:/chia-blockchain# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Apr26 ? 00:00:03 bash ./entrypoint.sh
root 234 1 0 Apr26 ? 00:01:19 chia_daemon
...
root 897 451 1 Apr26 ? 00:47:03 chia_full_node
root 1139 0 87 Apr26 ? 16:55:13 /chia-blockchain/venv/bin/python3.8 venv/bin/chia plots create -n 75 -d /plots/plots -t /plots/tmp ←これがplots createなのでpidをメモする
...
root@chia:/chia-blockchain# kill -9 1139    //plots createしてる pidをkillする
root@chia:/chia-blockchain# rm /plots/tmp/*.tmp  //一時ファイルは再利用できない

plotの並列作成 / plot管理ソフト

1 plot作成のtmp用にだいたい230GBくらい容量(k=32の場合)を使うので、tmp作成用のディスクが500GB程度の空きがあれば並列作成が可能です。様々なplot用ソフトが出ていますが、私はplotmanと言うソフトを使ってます。ユーザーの方が作った様々なソフトが出ているので、良い感じのものを使ってみると良い気がします。128GB以上のメモリを積んでいればmadMAxとかも早いみたい。

plotman
https://github.com/ericaltendorf/plotman

madMAx
https://github.com/madMAx43v3r/chia-plotter

上記のような並列作成や作成状態の管理、出来上がったplotファイルのコピー、標準ではできないplot作成の一時停止→再開等が可能です(失敗することもあるけど)。設定はtmpディレクトリを複数作成し1ディレクトリ当たり何並列動かすか? で設定します。

私の場合は500GBのSSD(実質使用できるのは450GBくらい)でplotを作っているので、並列なし(並列1)でやっています。

plotman.yaml(並列1での例)

user_interface:
  use_stty_size: True
directories:
  log: /home/chia/logs
  tmp:
    - /home/chia/tmp/00
  dst:
    - /export_chia/plots/plots
scheduling:
  tmpdir_stagger_phase_major: 2
  tmpdir_stagger_phase_minor: 1
  tmpdir_stagger_phase_limit: 1
  tmpdir_max_jobs: 1
  global_max_jobs: 2
  global_stagger_m: 30
  polling_time_s: 20
plotting:
  k: 32

ファーミングと振込口座の秘密鍵を分ける(コールドウォレットにする)

ファーミング・プロット作成に使用する鍵と、XCH管理用鍵を分けることができます。

  1. chia keys showで現在使用しているフィンガープリントをメモ
  2. chia keys generateで新しく鍵を作る(ニーモニックをメモする。これがXCH管理用)
  3. chia keys showで新しい方のフィンガープリントを選択→wallet addressをメモ
  4. ~/.chia/mainnet/config/config.yamlのfarmerとpoolのxch_target_addressを3のwallet addressに書き換え
  5. chiaの再起動
  6. 旧walletにXCHが入っているなら、新walletに送金(chia wallet send ~)
  7. chia wallet showで新walletに転送されていることを確認
  8. chia keys delete -f <fingerprint>で新しい方の鍵を削除(これで新walletの操作ができなくなる)

 

  1. walletの操作をしたい時はchia keys addで2のニーモニックを入れて鍵を追加して操作
  2. 終わったら8でキーを削除する

鍵削除後も新walletの残高を見たい場合は chia wallet show -f <fingerprint> で確認可能です。

詳細:
https://github.com/Chia-Network/chia-blockchain/wiki/Chia-Keys-Management

監視とグラフ

v.1.1.6の場合まだWebインタフェース等は無い。いちいちCLIで情報を見に行くのが面倒&監視とグラフが好きなので、plotの個数、nodeの数、walletやfarmingの状態をZabbixに投げてグラフにしています。

plotとwalletに関してはZabbixの機能で数値が変わったら(= plotが完成した、walletに入った)、fullnode数が0になったりfarming statusがfarming以外の時は、slackに通知するようにしてあります。

dockerホストで下記のスクリプトを定期実行、これをzabbixで監視しています。

#!/bin/bash
cd /home/homedir
PLOT=`docker-compose exec -T chia.local venv/bin/chia farm summary | grep "Plot count" | awk {'print $3'}`
WALLET=`docker-compose exec -T chia.local venv/bin/chia wallet show | grep Confirmed | awk {'print $2'}`
NODE=`docker-compose exec -T chia.local venv/bin/chia show -s -c | grep FULL_NODE | wc -l`
FARMING=`docker-compose exec -T chia.local venv/bin/chia farm summary | grep "Farming status: Farming" | wc -l`
echo "WALLET:"${WALLET} "NODE:"${NODE} "PLOT:"${PLOT} "FARMING:"${FARMING}

plotsとwalletに関しては変更があったらZabbixの機能でSlackに通知している

ちゃんと抽選に参加してるか?、応答速度のチェック

GUIの場合はplotが抽選(フィルター)に通った数が出ていますが、CUIの場合は一覧では出ていないので何だか心配になります(一向に当選しないし)。システムとしてちゃんとフィルターを通過しているかをチェックする場合は、harvesterのログレベルをINFOに変更し chia.harvester.harvester の x plots were eligible for farming を見ます。

~/.chia/mainnet/config/config.yaml   / 別ログにする例

harvester:
  ....
  logging:
    log_filename: log/debug_harvester.log
    log_level: INFO
    log_maxfilesrotation: 7
    log_stdout: false
  ....

harvesterの再起動。

venv/bin/chia start -r harvester

~/.chia/mainnet/log/debug_harvester.log

2021-05-22T08:39:21.588 harvester chia.harvester.harvester: INFO 0 plots were eligible for farming xxxxx... Found 0 proofs. Time: 0.02684 s. Total xx plots
2021-05-22T08:39:22.588 harvester chia.harvester.harvester: INFO 1 plots were eligible for farming xxxxx... Found 0 proofs. Time: 0.19423 s. Total xx plots

フィルターに通ったか?は x plots were eligible for farming のところを見るらしいです。1 plots were eligible for farmingが出たら 1/512の確率(2021/05現在)で当たります。

また、プロットフィルターを通過するときのルックアップの速度は2秒以内、当選時は最終的に30秒以内に返答しないと駄目らしいので時間が遅すぎる場合はCPUの割当やあれこれを見直したほうが良いかと思います(上記の Time: ?? s の部分がどちらを表しているのかは分からないのです…)。

詳細:
https://github.com/Chia-Network/chia-blockchain/wiki/FAQ#what-is-the-plot-filter-and-why-didnt-my-plot-pass-it

ピア数を制限する

nodeでつながるピア数。ポート8444を開けると外部から結構つなげられ、それなりに転送量も食っています。ルーターやfullnodeを起動しているマシンがしょぼい場合はちょっとだけ少なくしても良いかもしれません(動作への影響はわかりません)。

~/.chia/mainnet/config/config.yaml (40接続に制限する例)

full_node:
  ....
   target_peer_count: 40
  ....

full nodeの再起動

venv/bin/chia start -r node

当選したときのログ

現在はChia network全体で1日で4,608ブロックが作られ、1当選2 Chia Coin取得できます。

抽選に当選すると harvester で下記のようなログが出ます。予め上部の「ちゃんと抽選に参加してるか?」欄の設定(ログをINFOレベルに設定)をしておく必要があります。eligible for farming xxxxxxxxのxxx欄にhash値ぽいのが出ているのですが、plotのファイル名とは一致しません。どのplotが当選したかをどうやって見るのかは分かりませんでした。

2021-06-XXT00:XX:XX.XXX harvester chia.harvester.harvester: INFO 1 plots were eligible for farming xxxxxxxx... Found 1 proofs. Time: 0.66357 s. Total 77 plotsvenv/bin/chia start -r node

儲かりそうか?

見るたびにExpected time to winが凄い数で増えてて、この速度でplotを作っていては、どう考えても厳しそうです。ただ、GPUを使うタイプとは違い特別な機材は要らないので手軽に始められ、(HDD等を買い足さない限りは)ある程度plotを作れば省電力で基本放置できるので、宝くじを買ってる気分(当たらないかなぁと受け身で待つ)でそれなりに楽しいです。

コメント

タイトルとURLをコピーしました