BTC Core NodeをUbuntu 24.04に構築

# はじめに
## 前置き
これを書いているのは2024年12月の年末も押し迫ったさなかですが、今年は本当にいろいろなことがBreak Neckスピードで起きた年でした。今年の漢字も「金」と言うことでお金にまつわる話題が多かったことは確かですね。減税、年金、NISA、政治資金、新紙幣などなど。その中でも暗号資産がまた何度か取り上げられていましたが本稿ではDigital Goldとも呼ばれるビットコインをネタに取り上げてみたいと思います。
## そもそもなぜビットコイン？
私がビットコインに再び興味を持ったのは3回目の半減期の後、米国のマネジドファンド市場でBTCのETFが認可されて投資家コミュニティーがざわつき始めた2024年前半です。その前にも何度かその名前を聞いたことはあったり、実際に買ってみたりしたのですが、結局株式やFXなどの一種としてしか認識できず、すぐに忘れてしまっていました。でも今回は年金問題、NISAやIDECOなど老後の蓄えに対する関する不安をあおる様なマスコミの影響もあり少し真面目に見てみると、ぼんやりと少しずつなぜこの＄0からスタートした発行団体の存在しないトークンが時価総額で今や2兆ドルを超えるか超えないか（2024年12月末現在）にまで成長した理由がわかるような気がしてきました。（何冊も書籍を購入し、YouTubeやXを見まくった結果ですが、投資アドバイスではありませんし、仮想通貨BTCの値動き予想ではありませんのでその点はあしからずご了承ください。）

本投稿では、その過程で私が学んだ中で、「あ、ひょっとしてそういうことだったのね！」と最もその理由についての理解を深め実感するのに役立った経験を共有したいと思います。

# やりたいこと
Sound Money（最も健全なお金）と言われるBitcoinで本当の意味での経済的自立（インフレ圧力を強めるFiat Moneyに対する自衛）を目指してBitcoin Coreノードを自宅のPC環境に構築します。
## Miningではありません
10年以上前であれば別ですが、今や700ExaHashを超える途方もないCPUパワーを必要するBTCのMiningは、一般の人はもちろんデータセンタ業者の中でも気弱な者は卒倒するぐらいの熾烈な競争で勝ち続けるモノだけがTokenを手にすることが出来ると言う正にWild-Wild-Westの世界です。従って我々庶民は、日本でも最近数々運営されている取引所を通じてお金を払ってBTCトークンを購入する事になります。
## なぜBitcoin Core Nodeを立ち上げることが必要なのか？
でもSelf-custodyという形で自分のWalletにそのBTC（もしくはその1億分の1のSat）をTransferしない限り、折角お金を出して取引所で買ったBTCトークンもビットコインのブロックチェーンに存在することがありません。取引所がハッキングされてトークンが流失したと言う記事を最近を目にした方も多くいらっしゃると思いますが、ビットコインを買っても自分のWalletに「出庫」しなければ、あなたのものだと思っているビットコインもその取引所が発行する「預かり書」に過ぎません。じゃあ自分のWalletに「出庫」すれば安全かというと、今度は別の不安が頭を持ち上げます。「出庫」は自分のPublic Keyがさらされるだけだからいいけど、今後自分のWalletからさらにTransferするときには自分のSignature情報がIPアドレスと一緒にどこかに記録されることによりハッキングのターゲットになったり、または当局の取り調べ対象にならないかなどなど・・・
## 立ち上げればあなたもBitcoinネットワークの立派な一員！
そこで一般的に推奨されているのが自分でBitcoin Core Nodeを立ち上げて匿名ネットワークを通じて他の多数のノードとつながることにより、自分のIdentifyの秘匿性を保ちながらBitcoinのRobustnessを担保するネットワークの一端をささやかでも担っていこうという試みです。
因みに日本は世界中にある2万以上のノード（2024年12月末現在）の内12番目でしたが、これはReachableなノードということで外からのコネクションを受け入れているオープンなノードですね。私のノードも含め匿名でTORを経由してつながるノードは含まれていないのではと推測します。
https://bitnodes.io/

Hardware Wallet（私の場合は今回Sparrow Walletを使いました）を自宅のBitcoin Core Node経由で接続、Hardware Walletにセキュアに保存し運用できる環境を作りたいと思います。
本編ではBitcoin Core Nodeの立ち上げとTORによるPeeringネットワークの設定までを行います。

# 利用環境
Ubuntu 24.04 を中古で買ったFujitsu Esprimo（FMVD27002　＋　SSD 2T　＋　Mem 16G）にインストール
※この中で一番高価だったのは2TのSSDで1．5万円。PC本体はメモリ込みで1万円ちょいでした。（2024年7月現在）
## 参考にした動画サイト（Ministry of Node）
https://www.youtube.com/watch?v=fx_mLXISrfM&t=1442s

UNB22 - 04 - Bitcoin Core
こちらの動画は2年前に作成されたBitcoin Node構築運用シリーズ物で、未だに多くのViewerを集める人気サイトであります。
今回は、2024年時点でのUbuntuとBitcoin Node最新バージョンで立ち上げを行いましたが、基本的な流れはサイト通りで完了することができました。
## その他Bitcoin Coreに関する情報はこちら
https://bitcoin.org/en/full-node
フルノードの立ち上げについて
https://github.com/bitcoin/bitcoin/blob/master
自動起動の為のコンフィグやRPCの設定を作るスクリプトなど
# 手順
## Bitcoin Node用専用ユーザの作成
Bitcoin Nodeを事項するユーザはSUDO特権を持たないユーザであることがセキュリティーの観点から望ましいので、専用のユーザを作ります。
```
~$ sudo adduser satoshi
info: Adding user `satoshi' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `satoshi' (1001) ...
info: Adding new user `satoshi' (1001) with group `satoshi (1001)' ...
info: Creating home directory `/home/satoshi' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for satoshi
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] Y
info: Adding new user `satoshi' to supplemental / extra groups `users' ...
info: Adding user `satoshi' to group `users' ...
hiro@BTCNODE:~$ 
```

## Bitcoin Coreのダウンロード
ダウンロードするソフトウェアの正当性を確認することは常に大事ですが、ことBitcoinに関してはお金の関わることなので特に気をつけたいところです。
信頼できるソース：
https://bitcoin.org/en/bitcoin-core/

```ruby:Ubuntu24.04

$cat /etc/issue
Ubuntu 24.04 LTS \n \l
$ cd Downloads/
hiro@BTCNODE:~/Downloads$ ls
hiro@BTCNODE:~/Downloads$ 
hiro@BTCNODE:~/Downloads$ wget https://bitcoin.org/bin/bitcoin-core-27.0/bitcoin-27.0-x86_64-linux-gnu.tar.gz
--2024-07-15 02:56:34--  https://bitcoin.org/bin/bitcoin-core-27.0/bitcoin-27.0-x86_64-linux-gnu.tar.gz
Resolving bitcoin.org (bitcoin.org)... 2606:4700:10::ac43:289a, 2606:4700:10::6816:44b0, 2606:4700:10::6816:45b0, ...
Connecting to bitcoin.org (bitcoin.org)|2606:4700:10::ac43:289a|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 48849225 (47M) [application/octet-stream]
Saving to: ‘bitcoin-27.0-x86_64-linux-gnu.tar.gz’

bitcoin-27.0-x86_64 100%[===================>]  46.59M  11.0MB/s    in 4.2s    

2024-07-15 02:56:39 (11.0 MB/s) - ‘bitcoin-27.0-x86_64-linux-gnu.tar.gz’ saved [48849225/48849225]

hiro@BTCNODE:~/Downloads$ 

```
## チェックサムでファイルの正当性を確認する
YouTubeの動画でも強調されていますが、ことお金に関わることなのでセキュリティー要件は十分に気をつけたいところですね、特にBitcoin Coreは基本24−365放置する運用の場合。
```
$ wget https://bitcoin.org/bin/bitcoin-core-27.0/SHA256SUMS.asc
--2024-07-15 02:59:47--  https://bitcoin.org/bin/bitcoin-core-27.0/SHA256SUMS.asc
Resolving bitcoin.org (bitcoin.org)... 2606:4700:10::ac43:289a, 2606:4700:10::6816:44b0, 2606:4700:10::6816:45b0, ...
Connecting to bitcoin.org (bitcoin.org)|2606:4700:10::ac43:289a|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7590 (7.4K) [application/octet-stream]
Saving to: ‘SHA256SUMS.asc’

SHA256SUMS.asc      100%[===================>]   7.41K  --.-KB/s    in 0s      

2024-07-15 02:59:47 (19.8 MB/s) - ‘SHA256SUMS.asc’ saved [7590/7590]

hiro@BTCNODE:~/Downloads$ wget https://bitcoin.org/bin/bitcoin-core-27.0/SHA256SUMS
--2024-07-15 03:05:29--  https://bitcoin.org/bin/bitcoin-core-27.0/SHA256SUMS
Resolving bitcoin.org (bitcoin.org)... 2606:4700:10::6816:45b0, 2606:4700:10::ac43:289a, 2606:4700:10::6816:44b0, ...
Connecting to bitcoin.org (bitcoin.org)|2606:4700:10::6816:45b0|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2842 (2.8K) [application/octet-stream]
Saving to: ‘SHA256SUMS’

SHA256SUMS          100%[===================>]   2.78K  --.-KB/s    in 0s      

2024-07-15 03:05:29 (11.1 MB/s) - ‘SHA256SUMS’ saved [2842/2842]

hiro@BTCNODE:~/Downloads$ ls
bitcoin-27.0-x86_64-linux-gnu.tar.gz  SHA256SUMS  SHA256SUMS.asc

$ sha256sum --ignore-missing --check SHA256SUMS
bitcoin-27.0-x86_64-linux-gnu.tar.gz: OK
hiro@BTCNODE:~/Downloads$ 
```
```
hiro@BTCNODE:~/Downloads$ tar xzf bitcoin-27.0-x86_64-linux-gnu.tar.gz 
hiro@BTCNODE:~/Downloads$ ls -la
total 47736
drwxr-xr-x  3 hiro hiro     4096  7月 15 20:16 .
drwxr-xr-x 18 hiro hiro     4096  7月 15 02:56 ..
drwxr-xr-x  6 hiro hiro     4096  4月 16 01:28 bitcoin-27.0
-rw-rw-r--  1 hiro hiro 48849225  5月 24 02:40 bitcoin-27.0-x86_64-linux-gnu.tar.gz
```

```
hiro@BTCNODE:~/Downloads$ sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-27.0/bin/*
```
ここまではSUできるユーザで作業しましたが、ここからはBitcoin Coreを動かすユーザ（satoshi）で作業します。
CLIでBitcoin CoreをDaemonとしてバックグラウンドでスタートする場合のコマンド
```
> bitcoind -daemon
satoshi@FMVD27002:~/.bitcoin$ bitcoind -daemon
satoshi@FMVD27002:~/.bitcoin$ ls -la
total 78916
drwx------ 5 satoshi satoshi     4096 10月  4 22:50 .
drwxr-x--- 3 satoshi satoshi     4096 10月  4 22:45 ..
-rw------- 1 satoshi satoshi      221 10月  4 22:05 banlist.json
-rw------- 1 satoshi satoshi        6 10月  4 22:05 bitcoind.pid
drwx------ 3 satoshi satoshi    16384 10月  4 23:00 blocks
drwx------ 2 satoshi satoshi    16384 10月  4 22:58 chainstate
-rw------- 1 satoshi satoshi       75 10月  4 22:05 .cookie
-rw------- 1 satoshi satoshi 80206242 10月  4 23:00 debug.log
-rw------- 1 satoshi satoshi        0 10月  4 22:05 .lock
-rw------- 1 satoshi satoshi   530683 10月  4 22:50 peers.dat
```
Bitcoin Coreのコンフィグファイルを作成します。
```
satoshi@FMVD27002: cat bitcoin.conf
server=1
txindex=1
daemon=1
rpcport=8332
rpcbind=0.0.0.0
rpcallowip=127.0.0.1
rpcallowip=10.0.0.0/8
rpcallowip=172.0.0.0/8
rpcallowip=192.0.0.0/8
zmqpubrawblock=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334
whitelist=127.0.0.1

```
さらにRPCに関する内容を追加します。
追加する内容を生成するコマンドはGithubからダウンロード
https://github.com/bitcoin/bitcoin/blob/master/share/rpcauth/rpcauth.py


## RPC情報のCONFファイルへの追加
後ほど立ち上げる暗号資産管理用お財布Sparrowとプライベートで通信を行うために必要な作業です。
![スクリーンショット 2024-07-15 21.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51403/1f0390a3-deb9-d1f4-6b51-9f10b04c1d7f.png)
https://github.com/bitcoin/bitcoin/blob/master/share/rpcauth/rpcauth.py

```
satoshi@BTCNODE:~/.bitcoin$ ./rpcauth.py bitcoin bitcoin
String to be appended to bitcoin.conf:
rpcauth=bitcoin:aecb54d0956ee956c8553963c55f07cec08....bf788b89fa103fe41db0970e
```
ユーザ名(例：bitcoin)とパスワード(例：bitcoin)をここで指定します。
（本稿ではWalletでBitcoin Coreと通信する設定は省きますが基本ここでセットするRPCの情報が必要になります。）
ここのrpcauth=ではじまる1行をbitcoin.confに追加する
追加した後のファイル：bitcoin.conf
 ファイルの中身↓
 
```
satoshi@BTCNODE:~/.bitcoin$ cat bitcoin.conf
erver=1
txindex=1
daemon=1
rpcport=8332
rpcbind=0.0.0.0
rpcallowip=127.0.0.1
rpcallowip=10.0.0.0/8
rpcallowip=172.0.0.0/8
rpcallowip=192.0.0.0/8
zmqpubrawblock=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334
whitelist=127.0.0.1
rpcauth=bitcoin:aecb54d0956ee9・・・3fe41db0970e
```

## Bitcoindの自動スタート
UbuntuのSystemctlで自動立ち上げするために必要なファイルをGITHUBからダウンロードする
以下のアドレスからファイルServiceファイルを取得して編集する

https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service

変更箇所一覧
```
$sudo vi /etc/systemd/system/bitcoind.service

#　以下bitcoind.serviceの中身
[Service]
#conf fileとData Dirの場所を変更する。bitcoindのパスは/usr/local/binとする。
ExecStart=/usr/local/bin/bitcoind -pid=/run/bitcoind/bitcoind.pid \
                            -conf=/home/satoshi/.bitcoin/bitcoin.conf \
                            -datadir=/home/satoshi/.bitcoin \
                            -startupnotify='systemd-notify --ready' \
                            -shutdownnotify='systemd-notify --stopping'

#コメントアウト
# Make sure the config directory is readable by the service user
PermissionsStartOnly=true
#ExecStartPre=/bin/chgrp bitcoin /etc/bitcoin

#ユーザとグループを変更
# Run as bitcoin:bitcoin
User=satoshi
Group=satoshi

#コメントアウト
# Deny access to /home, /root and /run/user
#ProtectHome=true

```
BOOTとともに自動スタートするように設定する
```
~$ sudo systemctl enable bitcoind.service
Created symlink /etc/systemd/system/multi-user.target.wants/bitcoind.service → /etc/systemd/system/bitcoind.service.

~$ sudo systemctl start bitcoind.service
hiro@BTCNODE:~$ sudo systemctl status bitcoind.service
● bitcoind.service - Bitcoin daemon
     Loaded: loaded (/etc/systemd/system/bitcoind.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-07-16 00:20:27 JST; 3s ago
       Docs: https://github.com/bitcoin/bitcoin/blob/master/doc/init.md
   Main PID: 4161 (bitcoind)
      Tasks: 19 (limit: 18916)
     Memory: 583.1M (peak: 681.0M)
        CPU: 7.599s
     CGroup: /system.slice/bitcoind.service
             └─4161 /usr/local/bin/bitcoind -pid=/run/bitcoind/bitcoind.pid -conf=/home/satoshi/>

 7月 16 00:20:21 BTCNODE systemd[1]: Starting bitcoind.service - Bitcoin daemon...
 7月 16 00:20:21 BTCNODE bitcoind[4160]: Bitcoin Core starting
 7月 16 00:20:27 BTCNODE systemd[1]: Started bitcoind.service - Bitcoin daemon.
```
TIP：　もしもスタートに失敗した場合は、bitcoind.serviceファイルの中身が間違えていないかもう一度チェック。bitcoindの絶対パスやCONFarahファイル、データディレクトリの場所など間違いやすいので注意

## ネットワークの匿名性を確保するためにTORをインストールする
ここからはSUで作業します。
```
 $ sudo apt install tor

$ cat /etc/tor/torrc
## Configuration file for a typical Tor user
## Last updated 9 October 2013 for Tor 0.2.5.2-alpha.
## (may or may not work for much older or much newer versions of Tor.)
.....
## a private bridge, for example because you'll give out your bridge
## address manually to your friends, uncomment this line:
#PublishServerDescriptor 0

# THREE LINES ADDED
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
#END OF TORRC

 $ sudo systemctl status tor
● tor.service - Anonymizing overlay network for TCP (multi-instance-master)
     Loaded: loaded (/usr/lib/systemd/system/tor.service; enabled; preset: enabled)
     Active: active (exited) since Tue 2024-07-16 00:32:38 JST; 3s ago
    Process: 5272 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 5272 (code=exited, status=0/SUCCESS)
        CPU: 1ms

 7月 16 00:32:38 BTCNODE systemd[1]: Starting tor.service - Anonymizing overlay network for TCP >
 7月 16 00:32:38 BTCNODE systemd[1]: Finished tor.service - Anonymizing overlay network for TCP >
lines 1-9/9 (END)
```
TORを利用するためには
①bitcoin.confの最後に4ライン追加が必要

```
$ cat /home/satoshi/.bitcoin/bitcoin.conf
erver=1
txindex=1
daemon=1
rpcport=8332
rpcbind=0.0.0.0
rpcallowip=127.0.0.1
rpcallowip=10.0.0.0/8
rpcallowip=172.0.0.0/8
rpcallowip=192.0.0.0/8
zmqpubrawblock=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334
whitelist=127.0.0.1
rpcauth=bitcoin:b54d0956e・・・db0970e76c

# ADDING FOLLOWIING FOUR LINES
proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1
onlynet=onion
```
②TORのサービスファイル(/etc/tor/torrc)にも以下の3ラインの追加が必要

```
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
```
torのユーザグループに satoshiを追加する
```
$ sudo usermod -a -G debian-tor satoshi
```
ここでBitcoin-Coreを再スタートする
```
$ sudo systemctl restart bitcoind.service
```
TOR　NETWORKのみからアクセス可能であることを確認する。つまり、以下のコマンドで確認すると、IPV4やV6からはReachableがFaulseでOnion(TOR）からはReachableがTrueになっている。
```
$ bitcoin-cli getconnectioncount
9

$ bitcoin-cli getnetworkinfo
{
  "version": 270000,
  "networks": [
    {
      "name": "ipv4",
      "limited": true,
      "reachable": false,
    },
    {
      "name": "ipv6",
      "limited": true,
      "reachable": false,
    },
    {
      "name": "onion",
      "limited": false,
      "reachable": true,
    },

$ bitcoin-cli getconnectioncount
10
```
Bitcoin Nodeを再起動してTOR経由でPeerが確立されていることを確認する。

# お疲れ様でした！
これでBitcoin Coreのノードが立ち上がりました。
SSDだとほぼ音もなく静かに動いていますが、HDDだとひっきりなしにガリガリ書き込みが行われているのがわかります。

```
$ bitcoin-cli -netinfo
Bitcoin Core client v27.0.0 - server 70016/Satoshi:27.0.0/

        onion   total   block
in          0       0
out        10      10       2
total      10      10

Local addresses: n/a
```
ここまでくれば、後はBlock HightがMempoolで見える高さと同じ（100％）になるまで辛抱強く待つだけです。私の非力な（5年くらい昔の）マシーンでは2〜3日かかりました。
ちなみにMempoolというのはPublicなブロックチェーンエクスプローラーで次々と新たなブロックが10分ごとに生成されているのがわかります。
https://mempool.space/

コアノードを立ち上げたホームディレクトリの下に.bitcoinというディレクトリが作られ、その下にすべてのファイルが格納されていますが、その中のdebug.logというファイルをTailすると今何が起きているのかわかります。

立ち上げ直後のDebug.log
ブロックの作られた日(2018-01-25)と進行状況(0.267654 = 26%)
```
:~/.bitcoin$ tail -f debug.log 

2024-10-05T00:59:20Z UpdateTip: new best=0000000000000000004c7fa4207e4161d2e85efeb5060eea25474c8617a08bfd 
height=506110 version=0x20000000 
log2_work=87.962944 tx=295411019 
date='2018-01-25T22:42:51Z' progress=0.267654 cache=136.2MiB(1258436txo)
```
最新のところまでキャッチアップしたところ
ブロックの作られた日(2024-12-22)と進行状況(1.000000 = 100%)
```
2024-12-22T13:49:16Z UpdateTip: new best=000000000000000000024f942a3e715887c5cea73f17f8ad6245590cbb4d3084 
height=875886 version=0x20e00000 log2_work=95.341768 tx=1134921191 
date='2024-12-22T13:49:01Z' progress=1.000000 cache=65.2MiB(560215txo)
```
# まとめ
立ち上げて数ヶ月たちますが、その間リブートしたことはありますが、ほぼノートラブルで動き続けています。今回立ち上げたのはバリデータと呼ばれるノードでデータは800GB弱のサイズですが、これはVCトレードやCoinBaseなどの大手取引所が運用するのと内容は同一です。
```
:~/.bitcoin$ du . -h
55G	./indexes/txindex
55G	./indexes

200M	./blocks/index
662G	./blocks
12G	./chainstate
728G	.
```

14年の間にBTCトークンの価値は何十万倍になったにも関わらず、サトシ＝ナカモトのGenesis Blockから綿々と続く鎖がすべて含まれていて、運用母体もないプログラムが黙々と、何の拘束力にも縛られない参加者のコンセンサスのみで動き続けているというのはちょっとロマンを感じませんか？
2025年はFintechが本格的に動く年と言われていますので、BCTの値動きにも期待したいですね。以上ご参考になれば幸いです。