5年運用した自作仮想通貨とマイニングプール復旧記

UkkeyCoin
スポンサーリンク

はじめに

「最後のメンテナンスから3年…いや、サービス開始から数えると5年半も経っていた」

自作した仮想通貨UkkeyCoinのマイニングプールを久しぶりにメンテナンスすることになった。きっかけはサーバーOSのサポート期限が近づいてきたこと。Ubuntu 20.04 LTSから22.04 LTSへのアップグレードを決行した記録である。

2019年4月にスタートしたこのプロジェクト。DASHをベースにした自作コイン、マイニングプール、ブロックチェーンエクスプローラー、そしてマスターノード。すべて自分で構築し、5年半もの間、ほぼノーメンテで動き続けていた。

しかし、今回のOSアップグレードで予想外のトラブルが続出。最終的にすべて解決するまでの長い1日の記録をここに残す。

プロジェクト概要

構成

  • 仮想通貨:UkkeyCoin(DASHベース、マスターノード対応)
  • マイニングプール:ukkey3-nomp(Node.js製)
  • エクスプローラー:Iquidus Explorer
  • サーバー台数:3台(プール、エクスプローラー、マスターノード)
  • 稼働期間:2019年4月〜現在(5年半)
  • 前回メンテ:2022年10月(3年前)

第一章:OSアップグレードの決行

2025年10月某日、午前

「Ubuntu 20.04のサポートが2025年4月で切れている…」メモを見ると、前回のメンテナンスは2022年10月。3年も放置していたことに気づく。

まずは1台目のサーバーからアップグレードを開始した。

基本的なアップグレード手順

まずは王道の手順で進める。

# システムを最新状態に
sudo apt update
sudo apt upgrade
sudo apt full-upgrade

# 保留パッケージの処理
sudo apt install cloud-init

# クリーンアップ
sudo apt autoremove
sudo apt autoclean

# 再起動
sudo reboot

# アップグレード開始
sudo do-release-upgrade

トラブル1:ModuleNotFoundError地獄

しかし、そう簡単には終わらなかった。

$ sudo do-release-upgrade
Traceback (most recent call last):
  File "/usr/bin/do-release-upgrade", line 8, in <module>
    from DistUpgrade.DistUpgradeVersion import VERSION
ModuleNotFoundError: No module named 'DistUpgrade'
問題:Python依存関係が壊れている。Pythonモジュールが次々とエラーを出す。

一つずつ地道に解決していった。

# DistUpgradeモジュールを再インストール
sudo apt install --reinstall python3-distupgrade python3-update-manager

# distro_infoモジュールの問題
sudo apt purge python3-distro-info
sudo apt install python3-distro-info

# lsb_releaseモジュールの問題
sudo apt install --reinstall lsb-release

3つのエラーを解決し、ようやくアップグレードが開始した。

第二章:設定ファイルとの戦い

アップグレード中、何度も設定ファイルの上書き確認が表示される。

重要な判断ポイント

  • libc6の自動再起動:「Yes」を選択(毎回確認されるのを防ぐ)
  • SSH設定ファイル:「現在の設定を維持」(カスタムポート設定を保持)
  • Nginx設定ファイル:「現在の設定を維持」(カスタマイズした設定を保持)
教訓:本番環境でカスタマイズした設定は必ず「現在の設定を維持」を選択する。特にSSH設定は要注意。変更すると接続できなくなるリスクがある。

SSH接続の保険:ポート1022

SSH経由でアップグレードを実行すると、自動的にポート1022に予備のSSHデーモンが起動する。これがトラブル時の命綱となる。

# ファイアウォールでポート1022を開放
sudo ufw allow 1022/tcp

# 万が一メイン接続が切れても、こちらで再接続可能
ssh -p 1022 user@server-ip

第三章:1台目の成功、そして2台目へ

約1時間後、1台目のアップグレードが無事完了。Ubuntu 22.04.5 LTSへの移行に成功した。
$ lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy

勢いに乗って2台目も同じ手順で進める。1台目の経験があるため、2台目はスムーズに完了。

「順調すぎて逆に怖い…」

そんな予感は的中する。3台目で地獄を見ることになる。

第四章:MongoDB互換性問題との遭遇

エクスプローラーサーバー(2台目)でIquidus Explorerを起動しようとしたところ、MongoDBが起動しない。

$ sudo systemctl status mongod
× mongod.service - MongoDB Database Server
     Active: failed (Result: exit-code)

ログを確認すると、決定的なエラーメッセージが。

Failed to start up WiredTiger under any compatibility version. 
This may be due to an unsupported upgrade or downgrade.

原因:データベースファイルの互換性

Ubuntu 20.04で使用していたMongoDB 3.6のデータファイルが、新しくインストールされたMongoDB 6.0と互換性がない。アップグレード中にMongoDBが自動削除され、再インストールされた結果、古いデータファイルが読めなくなっていた。

解決方法:データベースのリセット

# MongoDBを停止
sudo systemctl stop mongod

# 古いデータをバックアップ
sudo mv /var/lib/mongodb /var/lib/mongodb.backup

# 新しいデータディレクトリを作成
sudo mkdir /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/lib/mongodb

# MongoDBを起動
sudo systemctl start mongod

MongoDBは起動したが、ユーザーとデータベースが消えているため、再作成が必要だった。

# MongoDBシェルに接続
mongosh

# データベースとユーザーを再作成
use explorerdb
db.createUser({
  user: "ユーザー",
  pwd: "パスワード",
  roles: [{role: "readWrite", db: "explorerdb"}]
})
Iquidus Explorerが起動し、ブロックチェーンの再同期が始まった。約190万ブロック分のデータを一から同期し直すことになったが、動作自体は問題なかった。

第五章:3台目、そしてマイニングプール復旧への長い道のり

午後、プールサーバー(3台目)のアップグレード開始

「もう慣れたもんだ。3台目も余裕だろう」

そう思っていた時期が私にもありました。

トラブル2:OpenMPI依存関係エラー

3台目のアップグレード中、突如エラーが発生。

Exception during pm.DoInstall(): E:Sub-process /usr/bin/dpkg returned an error code (1)

処理中にエラーが発生しました:
 openmpi-bin
 libboost-all-dev
 (その他多数...)

`update-alternatives` の設定が壊れていた。

# 壊れたalternativesファイルを削除
sudo rm /var/lib/dpkg/alternatives/mpi

# 問題のあるパッケージを強制削除
sudo dpkg --purge --force-all openmpi-bin

# 依存関係を修復
sudo apt --fix-broken install
エラーは出たものの、Ubuntu 22.04へのアップグレード自体は成功していた。修復作業で完全復旧。

第六章:マイニングプール、起動せず

OSアップグレードは完了。さあ、マイニングプールを起動しよう。

$ cd ~/ukkey3-nomp
$ npm start
しかし、期待とは裏腹に、プールは起動しなかった。

[Pool] [ukkeycoi] Daemon is still syncing with network (download blockchain)

このメッセージが延々と繰り返される。

トラブル3:getblocktemplate地獄

デーモンは完全に同期しているはずなのに、`getblocktemplate` RPCがエラーを返す。

$ ukkey-cli getblockchaininfo
{
  "blocks": 1932920,
  "headers": 1932920,
  "verificationprogress": 1
}

$ ukkey-cli getblocktemplate
error code: -10
error message: Ukkey Core is downloading blocks...

完全に同期しているのに「まだダウンロード中」と言われる。謎だった。

原因究明:マスターノード同期の罠

プールのソースコードを追跡していくと、`getblocktemplate` を呼び出す前に `IsInitialBlockDownload()` という関数でチェックしていることが判明。

さらに、DASHベースのコインでは、マスターノード同期も完了している必要があった。

$ ukkey-cli mnsync status
{
  "AssetName": "MASTERNODE_SYNC_INITIAL",
  "IsSynced": false
}

マスターノード同期が完了していない!

解決への試行錯誤

マスターノード同期を手動で進めてみる。

ukkey-cli mnsync reset
ukkey-cli mnsync next
ukkey-cli mnsync next
ukkey-cli mnsync next

$ ukkey-cli mnsync status
{
  "AssetName": "MASTERNODE_SYNC_FINISHED",
  "IsSynced": true
}

同期完了!これでいけるはず。

$ ukkey-cli getblocktemplate
error code: -10
error message: Ukkey Core is downloading blocks...
まだダメ。マスターノード同期が完了してもエラーが消えない。

真の原因:最後のブロックが古すぎる

ログとソースコードを詳細に調査した結果、`IsInitialBlockDownload()` が「最後のブロック時刻が古すぎる」と判断していることが判明。

最後にマイニングされたブロックは約19時間前。誰もマイニングしていない状態が続いていたため、デーモンが「まだ初期ダウンロード中」と誤認識していた。

解決の鍵:新しいブロックのマイニング

「そうだ、別のプールでマイニングしよう!」

幸い、コミュニティメンバーが運営している別のプールがあった。そこでマイニングを開始。

数分後…

新しいブロックを発見!

ブロックチェーンに新しいブロックが追加され、タイムスタンプが更新された。

$ ukkey-cli getblocktemplate
{
  "version": 536870912,
  "previousblockhash": "...",
  "transactions": [...],
  ...
}

ついに動いた!

第七章:プール起動、そしてブロック発見

$ cd ~/ukkey3-nomp
$ npm start

[Pool] [ukkeycoi] Stratum Pool Server Started for ukkeycoin [UKY] {yespower}
                  Network Connected:      Mainnet
                  Current Block Height:   1932924
                  Network Hash Rate:      0.07 KHash
                  Stratum Port(s):        3001
プール起動成功!

マイナーからの接続も確認。そして…

ブロック発見!

5年半動き続けたマイニングプールが、Ubuntu 22.04上で再び稼働を開始した。

第八章:マスターノードとSentinelの復旧

プールは動いたが、マスターノードがまだ起動していない。

Sentinelの環境再構築

DASHベースのマスターノードには、監視ツール「Sentinel」が必要。Python 3.10への移行で動かなくなっていた。

cd /home/mobile/sentinel

# 古い仮想環境を削除
rm -rf venv

# Python 3.10で仮想環境を再構築
python3 -m venv venv
source venv/bin/activate

# 依存関係の問題を解決
nano requirements.txt
# peewee==2.8.3 を peewee>=3.14.0 に変更

pip install -r requirements.txt

マスターノード起動の試練

マスターノードの起動には、コントローラーウォレット(担保を持つウォレット)からのコマンド実行が必要。しかし、PCのウォレットが同期中で使えない。

問題:PCウォレットの同期には2日かかる見込み。

暫定対応として、Sentinelのcronを停止し、PCウォレットの同期完了を待つことにした。マスターノード報酬は一時的に受け取れないが、プール運営には影響しない。

第九章:Wallet.datの肥大化問題

「そういえば、wallet.datが重くなってたな…」

確認してみると、1.2GBまで肥大化していた。

$ ukkey-cli dumpwallet wallet_dump.txt
{
  "keys": 410112,
  "warning": "wallet_dump.txt file contains all private keys"
}

41万個のキー!

5年半のマイニング報酬の蓄積により、大量の小さなUTXO(未使用トランザクションアウトプット)が生成されていた。

コイン統合作業

すべてのコインを新しいアドレスに送金してUTXOを統合することに。

# 新しいアドレスを作成
ukkey-cli getnewaddress "consolidated"

# 分割して送金(一度に送ると巨大すぎる)
ukkey-cli sendtoaddress "新アドレス" 23000
# 確認を待って繰り返し...

トランザクション作成に時間はかかったが、着実に統合作業が進んでいる。

最終章:5年半の軌跡

本日の完全達成リスト

  • ✅ Ubuntu 20.04 → 22.04 アップグレード(3台完了)
  • ✅ Python依存関係問題 解決
  • ✅ MongoDB 3.6 → 6.0 移行
  • ✅ Iquidus Explorer 復旧・再同期開始
  • ✅ マイニングプール 起動成功
  • ✅ ブロック発見成功
  • ✅ Sentinel環境構築完了
  • ✅ Wallet統合作業開始

学んだこと・まとめ

技術的な学び

  • DASHベースのgetblocktemplate問題:`IsInitialBlockDownload()` とマスターノード同期の両方が必要
  • MongoDB互換性:メジャーバージョンアップ時はデータ移行が必要
  • Python依存関係:OSアップグレード時は複数のモジュールエラーに注意
  • SSH設定の保持:本番環境でのカスタム設定は必ず維持
  • Wallet肥大化:定期的なUTXO統合メンテナンスが重要

運用の学び

  • バックアップの重要性:すべての作業前にバックアップ必須
  • 段階的アプローチ:1台ずつ確実に進める
  • ログの重要性:問題解決の鍵はログにある
  • コミュニティの力:別のプールでのマイニングが救世主に

ブロックチェーンの素晴らしさ

5年半、ほぼノーメンテで稼働し続けたこのシステム。ブロックチェーン技術の堅牢性と、分散型システムの強さを改めて実感した。

  • 単一障害点がない設計
  • 自律的な稼働
  • 透明性とトレーサビリティ
  • コミュニティによる相互支援

エピローグ

2019年4月、生成AIなど存在しなかった時代。Stack OverflowとGitHubのissuesを延々と読み、試行錯誤を重ねて構築したシステム。

2025年10月、生成AIの力を借りながらも、当時の知識と経験が活きた復旧作業。

そして、システムはまた動き出した。次の5年に向けて。

マイニングは続く。ブロックチェーンは動き続ける。

今後の課題

  • PCウォレット同期完了後のマスターノード起動
  • Wallet統合作業の完了
  • 定期メンテナンススケジュールの確立
  • 監視・アラートシステムの構築

長い1日だった。しかし、充実した1日でもあった。

5年半前に作ったシステムが、今日も、そしてこれからも動き続ける。それが何よりも嬉しい。

To be continued…

UkkeyCoinの冒険は、まだまだ続く。


※ 本記事は実際の復旧作業を基にしていますが、一部時系列やエラーメッセージは読みやすさのため編集しています。


コメント