Bitcoinフルノード、稼働開始!!

動機

Bitcoinの買付けを既に始めている。予算枠いっぱいまで買い付ける。その後は放置だ。将来の機関投資家の資金流入によるBitcoinの終末的な価格上昇を狙っている。Bitcoinの発行高上限は2100万Bitcoinまで。そこに青天井に発行可能な不換通貨である各国フィアット通貨が流れ込んでくるのである。時間が経つにつれて、Bitcoinを欲する者はより高いカネを支払わねばならなくなる。産出量の有限対無限。その比率のいびつさを見れば、Bitconinはまだ上値を追う余地があるのがわかるであろう。

Bitcoinはオープンソースの分散型台帳とよばれる仕組みである。すべての取引が記録されるブロックチェーンの台帳が多数のコンピュータ上に複製されて保管・更新されていく。地球が壊滅するのでない限り、インターネットが停止してもそれぞれの台帳は存在し続けるし、再びインターネットが利用できるようになればBitcoinネットワークも台帳も復活する。

それでも。自分のサーバ上にBitcoinの台帳があると安心だよね?自分が保有するBitcoinの記録もそこにあるからね。そういう次第でBitcoinフルノードを建てるわけだ。

Running A Full Node
https://bitcoin.org/en/full-node

が、Bitcoinフルノードを立てたからと言って、トランザクション・フィーが入ってくるわけではない。

Can I earn transaction fees by running as a full node, verifying transactions, but not mining?
https://bitcoin.stackexchange.com/questions/21668/can-i-earn-transaction-fees-by-running-as-a-full-node-verifying-transactions-b

The Complete Guide to Bitcoin Fees
https://99bitcoins.com/bitcoin/fees/

まぁ、「マイニング」をしなければ、フィー(手数料)は入ってこないのよ。Bitcoinフルノードの役目は、最新台帳の維持と他のノードへのデータ転送。マイニングと違って、桁違いなスペックのマシンは不要。Bitcoin Coreを一言でいえば、全台帳付きのウォレットと呼べるであろう。私はプライベート・ウォレットにはLedger Nano S Plusを利用しているので、ウォレット機能は使わないけどね。

Bitcoin Coreの入手

Bitcoinフルノード作成用のBitcoin Coreは以下からダウンロードできる。

Download - Bitcoin
https://bitcoincore.org/en/download/

まぁ、ダウンロードしたバイナリのベリファイは各人の力量に応じてご随意に。

とはいえ、私がダウンロードしたバイナリをベリファイした方法を以下に記録しておこう。

まず。ダウンロードすべきは、Linux用バイナリ(bitcoin-27.0-x86_64-linux-gnu.tar.gz)、SHA256 binary hasshes(SHA256SUMS)およびSHA256 hash signatures(SHA256SUMS.asc)の3つである。これらをすべてを同じディレクトリに配置する。

$ ll
合計 47744
drwxrwxr-x 4 user user     4096  5月 19 11:17 ./
drwxrwxr-x 4 user user     4096  5月 19 14:08 ../
-rw-rw-r-- 1 user user     2842  5月 14 16:18 SHA256SUMS
-rw-rw-r-- 1 user user     7590  5月 14 16:18 SHA256SUMS.asc
-rw-rw-r-- 1 user user 48849225  5月 14 16:16 bitcoin-27.0-x86_64-linux-gnu.tar.gz
$

バイナリファイルのチェックサムを確認することにより、改ざんを検出することができる。

$ sha256sum --ignore-missing --check SHA256SUMS
bitcoin-27.0-x86_64-linux-gnu.tar.gz: OK
$

バイナリは大丈夫そうだ。

Bitcoin Core開発者の署名(SHA256SUMS.asc)であるが、これを検証するにはBitcoin Core開発者の公開鍵を予め自分のGPGキーリングに登録して置かなければならぬ。

Developer's GPG public keys
https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys

これらの開発者のGPG公開鍵をGPGキーリングに登録するのだが。これ、まとめて落とすにはgit cloneするしかないのかな・・・さもなくば、一個ずつ落としてきて登録するという手間がかかるよなぁ。

全部の開発者を信用するならば全員の公開鍵をダウンロードして一つづつ登録する。私は"Wladimir J. van der Laan"の公開鍵を登録したが。なぜならば、Linux Instructionsに彼が筆頭としてあがっていたから。version25の頃のページだけどね。あともう一つ公開鍵を登録した。CoinForensicsという企業の公開鍵。

$ gpg --import laanwj.gpg
$ gpg --import CoinForensics.gpg

Verify your downloadのLinux用のインストラクションによると、このGithubの開発者公開鍵を一気にまとめて登録することができるようだ。あまりオススメされたものではないが。

$ git clone https://github.com/bitcoin-core/guix.sigs
$ gpg --import guix.sigs/builder-keys/*

こうして自分のGPGキーリングにBitcoin開発者の公開鍵を登録できたら、署名ファイル(SHA256SUMS.asc)の内容を確認することができる。

$ export LANG=C
$ gpg --verify SHA256SUMS.asc
gpg: assuming signed data in 'SHA256SUMS'
gpg: Signature made Tue Apr 16 20:25:32 2024 JST
gpg:                using RSA key D1DBF2C4B96F2DEBF4C16654410108112E7EA81F
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 22:27:09 2024 JST
gpg:                using RSA key 6A8F9C266528E25AEB1D7731C2371D91CB716EA7
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 19:45:59 2024 JST
gpg:                using RSA key E61773CD6E01040E2F1BD78CE7E2984B6289C93A
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 18:39:56 2024 JST
gpg:                using RSA key CFB16E21C950F67FA95E558F2EEB9F5CC09526C1
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Wed Apr 17 02:04:07 2024 JST
gpg:                using RSA key 9DEAE0DC7063249FB05474681E4AED62986CD25D
gpg: Good signature from "Wladimir J. van der Laan " [unknown]
gpg:                 aka "Wladimir J. van der Laan " [unknown]
gpg:                 aka "Wladimir J. van der Laan " [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 71A3 B167 3540 5025 D447  E8F2 7481 0B01 2346 C9A6
     Subkey fingerprint: 9DEA E0DC 7063 249F B054  7468 1E4A ED62 986C D25D
gpg: Signature made Tue Apr 16 22:04:53 2024 JST
gpg:                using RSA key 152812300785C96444D3334D17565732E08E5E41
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 20:03:08 2024 JST
gpg:                using ECDSA key C388F6961FB972A95678E327F62711DBDCA8AE56
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 23:26:16 2024 JST
gpg:                using RSA key ED9BDF7AD6A55E232E84524257FF9BDBCC301009
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 18:51:23 2024 JST
gpg:                using RSA key 637DB1E23370F84AFF88CCE03152347D07DA627C
gpg: Can't check signature: No public key
gpg: Signature made Tue Apr 16 19:52:54 2024 JST
gpg:                using RSA key F4FC70F07310028424EFC20A8E4256593F177720
gpg:                issuer "[email protected]"
gpg: Can't check signature: No public key
$ 

Verify your downloadのLinux用のベリファイ手順に記載されたように確認するために、ロケールをC(英語)として出力を英語にしてある。'Good signature from "Wladimir J. van der Laan "' とあるよね。これならばOKだ。それと"Primary key fingerprint"の値が、GPGキーリングの一覧のWladimir J. van der Laanのものに該当する事を確認する。

$ gpg --list-keys
/home/user/.gnupg/pubring.kbx
--------------------------------
pub   rsa2048 2021-01-06 [SC] [expires: 2026-01-05]
      101598DC823C1B5F9A6624ABA5E0907A0380E6C3
uid           [ unknown] CoinForensics (SigningKey) <[email protected]>
sub   rsa2048 2021-01-06 [E] [expires: 2026-01-05]

pub   rsa2048 2011-08-24 [SC] [expires: 2027-02-08]
      71A3B16735405025D447E8F274810B012346C9A6
uid           [ unknown] Wladimir J. van der Laan 
uid           [ unknown] Wladimir J. van der Laan 
uid           [ unknown] Wladimir J. van der Laan 
sub   rsa2048 2017-05-17 [S] [expires: 2027-02-08]
sub   rsa2048 2017-05-17 [A] [expires: 2027-02-08]
sub   rsa2048 2011-08-24 [E]

$ 

OKだ。今回はCoinForensicsは署名していなかったようだね。まぁ、カイシャだから。別件で忙しいとね。オープンソースの方は「お留守」になるよね。

GPG公開鍵には有効期限がある。GPGキーリング中の鍵が古い時には更新してやる必要がある。

$ gpg --keyserver hkps://keys.openpgp.org --refresh-keys
gpg: refreshing 2 keys from hkps://keys.openpgp.org
gpg: key 74810B012346C9A6: "Wladimir J. van der Laan " not changed
gpg: key A5E0907A0380E6C3: "CoinForensics (SigningKey) <[email protected]>" not changed
gpg: Total number processed: 2
gpg:              unchanged: 2
$ 

まぁ、今回登録した2件については、変更なしと。

Bitcoin Coreのインストール

Bitcoinフルノードを稼働するには、何しろ大容量のストレージが必要となる。現時点でBitcoin台帳データは600GB程度ある。これが毎月10GB程度ずつ増えていく。なので、専用の外付けHDD(6TB)を購入して予め準備しておいた。

Bitcoin Coreは ~/.bitcoin ディレクトリにデータ構造を構築していくので、外付けUSBディスクへのシンボリックリンクとしておき、6TBの外付けUSBディスクにデータを保存している。

インストールそのものは簡単だ。展開して/usr/local/binへバイナリファイルをコピーするだけ。以下が参考となろう。

Linux Instructions
https://bitcoin.org/en/full-node#linux-instructions

私のサーバはAlmaLinux9なのだが、bitcoin-qtコマンドを実行すると不足するライブラリがあるようでエラーを吐いて起動しない。調べてみるとxcb-util-*なるパッケージが必要らしいので、インストール手順をまとめたシェルを作成した。

#!/bin/bash
#
# https://bitcoin.org/en/full-node#linux-instructions
#

tar xvzf bitcoin-27.0-x86_64-linux-gnu.tar.gz

sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-27.0/bin/*

sudo dnf -y install xcb-util-wm
sudo dnf -y install xcb-util-image
sudo dnf -y install xcb-util-keysyms
sudo dnf -y install xcb-util-renderutil


# EOF

スクリプトのファイル名は何でも良いが、inst-bitcoin.shとした。こいつを実行すると、bitcoin-qtが起動するようになる。グッドだ。

IBD

bitcoin-qtが起動すると、IBD(Initial Block Download)が始まる。600GBのデータをダウンロードするわけだ。

IBD中は外部からの接続は受け付けない。このノードから外部のノードへの接続が10本できる。

$ ss -antp|grep 8333
LISTEN 0       128                     0.0.0.0:8333                  0.0.0.0:*     users:(("bitcoin-qt",pid=442274,fd=45))
ESTAB  1416096 0               192.168.101.202:38090             46.4.34.186:8333  users:(("bitcoin-qt",pid=442274,fd=9))
ESTAB  2485568 0               192.168.101.202:59766              3.15.11.47:8333  users:(("bitcoin-qt",pid=442274,fd=49))
ESTAB  505440  0               192.168.101.202:36626           58.136.189.51:8333  users:(("bitcoin-qt",pid=442274,fd=15))
ESTAB  4326256 0               192.168.101.202:42146            136.49.12.42:8333  users:(("bitcoin-qt",pid=442274,fd=8))
ESTAB  1174690 0               192.168.101.202:43914           95.216.242.49:8333  users:(("bitcoin-qt",pid=442274,fd=11))
ESTAB  1835440 0               192.168.101.202:58058             99.246.87.2:8333  users:(("bitcoin-qt",pid=442274,fd=12))
ESTAB  3118958 0               192.168.101.202:54560           92.219.42.198:8333  users:(("bitcoin-qt",pid=442274,fd=50))
ESTAB  3003400 0               192.168.101.202:46696           217.64.47.200:8333  users:(("bitcoin-qt",pid=442274,fd=10))
ESTAB  1112760 0               192.168.101.202:45714          62.210.145.144:8333  users:(("bitcoin-qt",pid=442274,fd=16))
ESTAB  3520505 0               192.168.101.202:50572          78.111.193.227:8333  users:(("bitcoin-qt",pid=442274,fd=14))
LISTEN 0       128                        [::]:8333                     [::]:*     users:(("bitcoin-qt",pid=442274,fd=44))
$

うちはNURO光を通しているんだけど。週末土曜日昼にbitcoin-qtを起動してIBDを開始。翌日曜日朝には600GBのブロックチェーンデータのダウンロードが終わっていた。

外部接続を受け付ける

自宅サーバをグローバルIPで運用している人はいないであろう。普通はプライベートセグメントに配置し、インターネットへつながるルータにてDNAT設定を行って特定ポートのみをサーバへ通すのである。

私の場合。自分で設置したルータ、Yamaha RTX1200の設定でTCP/8333がサーバのbitcoin-qtへと通るように設定しておいた。

user@ragnarok:~/.bitcoin $ expr $(ss -antp|grep 8333|awk '{print $4}'|grep 8333|wc -l) - 2
56
user@ragnarok:~/.bitcoin $

この時点で外部から56個の接続を受け入れている。exprにて2個を差し引いているのはIPv4およびIPv6でlistenしているソケットの分を除外するためである。

ウォレットの作成

私はLedger Nano S Plusというプライベート・ウォレットを使っているので、このBitcoinフルノードのウォレットを使うことは無いと思うが。bitcoin-qtの初回起動時にウォレット作成を急かされるので作成した。どうも、デフォルトではウォレットを作成してくれないらしい。

なので、ウォレットについては自分で初期設定をする必要がある。私はとりあえずパスフレーズを指定して暗号化しておいた。パスフレーズはきちんと記録に残しておこう。試しに自分に送金するときには利用できるよね。

終わりに

Bitcoinフルノードが稼働し始めた。マイニングと違って、ウチのサーバであるSycomの静音PCは、その名前に違わず静かに稼働中である。若干ネットワーク帯域を消費するが、ウチの閑散としたブログへの影響はまず無いであろうさね。

家庭のサーバなので、不慮の停電によるダウンなどもありえる。Bitcoinの台帳データが破壊されることもありえるだろう。その時はまたIBDをやり直すだけ。自分以外にも外部にたくさんフルノードが存在するのだから。

自らBitcoinを所有するというのもあるし、Bitcoinネットワークの安定稼働に微力を尽くすことはできるのかなと。