ブロックチェーンの作り方 #7(ノード用サーバーの準備)

ブロックチェーン
ブロックチェーン
スポンサーリンク

前回の記事 #6 まででブロックチェーンの実装がほぼ終わり、残すところ各ノード間のデータ同期処理の実装のみになりました。各ノード間のデータ同期処理を検証するため、実装に先立って検証用のサーバーを何台か用意しておく必要がありますので、今回 #7 ではノード用サーバーの構築手順をまとめてみました。

関連記事:開発環境の準備とファイル構成

サーバーの準備

ノード間のデータ同期の検証を行うことになりますので、サーバーを3台程度用意してください。サーバー本体はオンプレでもクラウドでも構いませんが VitrualBox などの仮想マシンを利用するのが費用もかからず手軽です。

サーバーOSも Python バージョン3 が動けばなんでも構いませんが、この記事では Ubuntu Server 24.04 での構築手順になることをご了承ください。

Python 実行環境の構築

Python バージョン3がインストールされていることを確認します。

python3 --version

Python 3.12.3

Python のパッケージング管理システム pip をインストールします。

sudo apt install python3-pip

Python 仮想環境の作成

続いて必要な Python モジュール(正確には「Python パッケージ」と呼ばれます)をインストールするのですが、モジュールをシステム全体で利用できる領域にインストールする場合、使いたいバージョンのモジュールがインストールできないことがあります。その場合、システム全体で利用するモジュールをアンインストールして、使いたいバージョンのモジュールをインストールすることになるのですが、アンインストールしたモジュールを利用しているツールなどに不具合が発生する可能性があります。

このような問題を解決するために Python には仮想環境という仕組みが用意されていますので、今回はこの Python の仮想環境にブロックチェーンプログラムの実行環境を構築します。

Python 仮想環境の作成や管理を行う venv というツールをインストールします。

sudo apt install python3-venv

ホームディレクトリに仮想環境を作成します。(「venv」というディレクトリが作成されそこに仮想環境が作成されます)

cd ~
python3 -m venv venv

仮想環境を起動します。

source venv/bin/activate

ターミナルの先頭に仮想環境名が表示されていると思います。

(venv)

この状態でブロックチェーンプログラムに必要なモジュールをインストールします。

(venv) pip install ecdsa
(venv) pip install pandas
(venv) pip install fastapi
(venv) pip install uvicorn
(venv) pip install requests
(venv) pip install pydantic

サーバーにブロックチェーンプログラムをアップロードして実行できることを確認してください。

(venv) python blockchain/node.py

INFO:     Started server process [2427]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

ブロックチェーンプログラムを実行できることが確認できたら仮想環境を終了してください。

deactivate

起動スクリプトの作成

続いてノードの起動スクリプト(正確には systemd の「unit file」)を作成します。

事前に仮想環境の python のフルパスを確認しておいてください。

source venv/bin/activate
(venv) which python
/home/bcadmin/venv/bin/python (←仮想環境の python のフルパス)

/etc/systemd/system/ の配下にノードの起動スクリプトを作成します。

sudo vi /etc/systemd/system/blockchain.service
[Unit]
Description=blockchain node
After=network.target

[Service]
Type=simple
Restart=always
User=bcadmin
WorkingDirectory=/home/bcadmin/blockchain
ExecStart=/home/bcadmin/venv/bin/python /home/bcadmin/blockchain/node.py

[Install]
WantedBy=multi-user.target

【起動スクリプトの要点】
User
ノードの実行ユーザーを指定します。今回は bcadmin というユーザーのホームディレクトリにブロックチェーンプログラムを配置し、Python 仮想環境を作成しましたので、そのユーザーを指定しています。

WorkingDirectory
ブロックチェーンプログラムのディレクトリをフルパスで指定します。

ExecStart
事前に調べておいた <仮想環境の python のフルパス> <ノードの実行ファイルのフルパス> の形式で指定してください。

作成した起動スクリプトを systemd に反映させます。

sudo systemctl daemon-reload

systemd に反映していることを確認します。

systemctl list-unit-files | grep blockchain

blockchain.service                           disabled        enabled

ノードの自動起動を設定します。

sudo systemctl enable blockchain

ノードを起動します。

sudo systemctl start blockchain

ノードが起動していることを確認してください。

systemctl status blockchain

● blockchain.service - blockchain node
     Loaded: loaded (/etc/systemd/system/blockchain.service; enabled; preset: enabled)
     Active: active (running) since Sun 2025-03-16 07:40:03 UTC; 2min 46s ago
   Main PID: 2679 (python)
      Tasks: 1 (limit: 2212)
     Memory: 65.9M (peak: 66.2M)
        CPU: 692ms
     CGroup: /system.slice/blockchain.service
             └─2679 /home/bcadmin/venv/bin/python /home/bcadmin/blockchain/node.py

Mar 16 07:40:03 vb14 systemd[1]: Started blockchain.service - blockchain node.
Mar 16 07:40:03 vb14 python[2679]: INFO:     Started server process [2679]
Mar 16 07:40:03 vb14 python[2679]: INFO:     Waiting for application startup.
Mar 16 07:40:03 vb14 python[2679]: INFO:     Application startup complete.
Mar 16 07:40:03 vb14 python[2679]: INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

また、サーバーを再起動してノードが自動起動することも確認しておきましょう。

sudo shutdown -r now

最後にブラウザで「http://<サーバーのIPアドレス>:8000/chain」にアクセスしてチェーンが表示できることを確認してください。(表示できない場合は ufw などのファイアウォールが有効になっている可能性があります)

ログの確認方法(おまけ)

ノードのログを確認するためによく使いそうなコマンドです。

ノードが起動してからのログを表示

journalctl -u blockchain -b

追記されるログをリアルタイムに表示(tail -f と同じ)

journalctl -u blockchain -f

ログの最後の3行を表示

journalctl -u blockchain -n 3

今回のまとめ

今回は、データ同期処理を検証するためのノード用サーバーを構築しました。次回は本題の各ノード間のデータ同期処理の実装を行います。

>>次のページ 【記事作成中】【記事作成中】ブロックチェーンの作り方 #8(データ同期処理)
 
<<前のページ ブロックチェーンの作り方 #6(各アカウントの残高チェック)

コメント

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