OP_RETURNしようぜ!

ビットコインと暗号を学んでブロックチェーンに永遠の文字列を遺そう!Let's engrave permanent message on BTC blockchain!

raspberrypi full node

ラズベリーパイ4は64ビットの立派なコンピューターですから、ビットコインのフルノードを運営することも可能です。ルーターのipv6ポートフィルタを解除して、ラズパイ4の4GBと、1TBのSATA-SSDと、USBアダプタが必要です。速度が心配なのでスワップファイルは設置しませんでした。GUIなしの ubuntu server を使いますが、メモリとディスクが限られているので、軽量化設定がいくつか必要です。現在もIBD(ブロックチェーン同期)中ですが、動作が安定してきましたのでレシピを公開致します。

USB-Disk を /mnt/ssd にマウントする。

$ lsblk #USB-SSDのパーティション名を調べる sda1 など

$ sudo mkdir -p /mnt/ssd #マウント先ディレクトリを作成

$ sudo mount /dev/sda1 /mnt/ssd #一時的にマウントする

マウントの永続化

UUID を調べる
$ blkid /dev/sda1
出力例:
/dev/sda1: UUID=”1234-ABCD” TYPE=”ext4″
/etc/fstab に追記
sudo nano /etc/fstab

追加行(ext4の場合):

UUID=1234-ABCD /mnt/ssd ext4 defaults,noatime 0 2

SSD の readahead を増やす

$ sudo blockdev --setra 2048 /dev/sda

bitcoind のインストール

snapインストールは簡単なのですが、snapサービスが重いので tarball から直接インストールしましょう。

sudo apt update
sudo apt install wget tar gnupg -y
wget https://bitcoincore.org/bin/bitcoin-core-29.1/bitcoin-29.1-aarch64-linux-gnu.tar.gz
tar -xzf bitcoin-29.1-aarch64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-29.1/bin/*

これで /usr/local/bin/bitcoind や /usr/local/bin/bitcoin-cli が使えるようになります。

UASP 無効化( USB-SATA アダプタでは 電源供給能力が不足してUASP の高速転送時に電源が落ちるトラブルが頻発しますので、電源を強化できない場合は、カーネル起動パラメータにUASP無効化設定を追加します。)

https://www.iodata.jp/product/storage/dvd/upac-ut07m

↑ 電源を強化する場合は、補助電源ケーブルを使うと良いでしょう。これから買う方は、USB電源が強化されたラズパイ5の8GBをお勧めします。

sudo nano /boot/firmware/cmdline.txt

末尾に

usb-storage.quirks=XXXX:YYYY:u

を追加。
(XXXX:YYYY は lsusb で確認したベンダID:プロダクトID)

メモリ節約のために使わないサービスを切る

sudo systemctl disable –now cups.service
sudo systemctl disable –now avahi-daemon.service
sudo systemctl disable –now ModemManager.service
sudo systemctl disable –now bluetooth.service
sudo systemctl disable –now snapd.service
sudo systemctl disable –now whoopsie.service
sudo systemctl disable –now rsyslog.service
sudo systemctl disable –now smartmontools
sudo systemctl disable –now fwupd

sudo systemctl disable --now apport.service \
  blk-availability.service \
  cloud-config.service cloud-final.service cloud-init-local.service cloud-init.service \
  console-setup.service keyboard-setup.service setvtrgb.service \
  e2scrub_reap.service finalrd.service getty@.service \
  lvm2-monitor.service multipathd.service open-iscsi.service open-vm-tools.service \
  pollinate.service smartd.service systemd-pstore.service
sudo systemctl mask fwupd.service
sudo systemctl mask polkit.service
sudo systemctl mask udisks2.service

MTU調整

インターネットプロバイダやルーターなどの設定により微妙に変わるので自分の環境に合わせたMTUを設定する必要があります。

ping -M do -s 1472 8.8.8.8

ping -6 -M do -s 1452 2001:4860:4860::8888

これが通らなければルーター設定などでMTUが1500よりも小さくなっているので、/etc/netplan/*.yaml に mtu: 1460 を追記します。

journald の設定変更

sudo mkdir -p /etc/systemd/journald.conf.d

sudo nano /etc/systemd/journald.conf.d/limits.conf

[Journal]
Storage=volatile
RuntimeMaxUse=30M

↑この3行を保存する。

sudo systemctl restart systemd-journald ←設定を反映

bitcoin.conf の編集

こちらのサンプルには記載していませんが、bitnodes.io のリーダーボードで高速なノードをいくつかピックアップしてconnect とか addnode とかの設定をするとbitnodes で UP の状態になりやすいです。

datadir=/mnt/ssd/.bitcoin
blocksonly=1 # 取引を受け取らずブロックのみ=帯域/CPU節約
par=2 # 署名検証スレッド(Pi4の4コアなら3推奨)
maxconnections=12 # ピア数を絞ってI/O・CPU負荷を低減
dbcache=100
server=1
prune=0
txindex=1
listen=1

daemon=1

disablewallet=1
onlynet=ipv6

bind=[::]:8333
maxmempool=50
logtimestamps=1
debug=0

動作確認

/usr/local/bin/bitcoin-cli -datadir=/mnt/ssd/.bitcoin getblockchaininfo
/usr/local/bin/bitcoin-cli -datadir=/mnt/ssd/.bitcoin getnetworkinfo

はいできました。$ bitcoin-cli getpeerinfo とやりまして、

“subver”: “/bitnodes.io:0.3/”, “inbound”: true,

というものが出てくれば bitnodes.io でも確認できるようになります。

シェルスクリプトで進捗を調べることもできます。

$ while true; do
  ts="$(TZ=Asia/Tokyo date '+%Y-%m-%d %H:%M:%S')"
  /usr/local/bin/bitcoin-cli -datadir=/mnt/ssd/.bitcoin -getinfo \
  | awk -v ts="$ts" '
      BEGIN{b="?"; p="?"; i="?"; o="?"}
      /^Blocks:/ {b=$2}
      /^Verification progress:/ {
        # 行末側にある「47.4712%」だけ抜き出す
        for(n=NF; n>=1; n--) if ($n ~ /%$/) { gsub(/%/,"",$n); p=$n; break }
      }
      /^Network:/ {
        gsub(/,/, "")  # 「in 0, out 2,」のカンマを除去
        for(k=1;k<=NF;k++){
          if ($k=="in")  i=$(k+1)
          if ($k=="out") o=$(k+1)
        }
      }
      END{printf "%s blocks=%s progress=%s%% in=%s out=%s\n", ts, b, p, i, o}
    '
  sleep 300
done

2025-09-23 15:59:37 blocks=405731 progress=9.671%
2025-09-23 16:10:07 blocks=405969 progress=9.698%
2025-09-23 16:20:26 blocks=406383 progress=9.748%
2025-09-23 16:30:32 blocks=406643 progress=9.771%
2025-09-23 16:40:41 blocks=406925 progress=9.804%
2025-09-23 16:50:55 blocks=407227 progress=9.839%
2025-09-23 17:01:27 blocks=407460 progress=9.867%
2025-09-23 17:11:33 blocks=407816 progress=9.904%

1日で6パーセントほど、IBDが進行するようです。2週間位で最新ブロックに追いつきそうです。ちなみに、chatgpt先生と話しているとzram入れましょうなどと推奨されることがありますが、非力なraspberry pi では逆効果となる場合もありますので、不要サービスを削るなど別の対策で乗り切ることを推奨致します。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です