今更と言えば今更な内容ですが、最近シングルボードコンピュータを使ってビットコインのフルノードを立ち上げ始めたので、そのレポート記事を書く前に一本解説記事を書いておきます。
定義と役割
定義というのは変わるもので、「フルノード」の定義についてもあれこれ追加の条件を付けくわえる人はいますが、最も一般的には「すべてのブロックとトランザクションをダウンロードし検証するノード」と言えると思います。ちなみにビットコインネットワークに接続しているコンピュータのことは総称して「ノード」と呼ばれます。
普段ウォレットで使うような、いわゆる軽量型クライアントはSPVクライアント(正確には軽量型の中にはサーバー・クライアント型と呼ばれるものもあり、さらにサーバー・クライアント型のものでもSPV型の検証を行っているソフトもあるので、細かく説明するとややこしくなります)とも呼ばれフルノードとは区別されます。こちらは、過去のすべてのブロック・トランザクションをダウンロード・検証するわけではなく、起動後すぐにウォレットとして使用できるため、ほとんどの人はフルノードのウォレットを利用することはありません。
フルノードとマイナー
よく混同されるのがフルノードとマイナーです。マイナーはブロックやトランザクションの検証も行いますが、主目的はブロックを生成して(nonceを探索)採掘報酬を得ることです。一方フルノードの役割は、ブロックやトランザクションを検証し、各ブロック・トランザクションがビットコインの基本ルールを守っていることを確認し、有効なもののみを他のノードやマイナーに伝達する役割があります。
マイナーも無効なトランザクションなどをブロックに含めてしまったり、無効なブロックを生成してしまってはせっかく採掘に成功しても報酬が無駄になってしまうので、フルノードと同じくすべてのブロックとトランザクションの検証を行うのが基本となりますが、ソフトフォークの記事で少し書いたように、SPVマイニングと呼ばれるようなすべて検証せずに採掘を行うような方法もあるので、「フルノードの一部をマイナーと呼ぶ」と単純に言うとやや語弊がある気がします。
悪意のあるマイナーによるビットコインへの攻撃はしばしば話題にあがりますが、その時に重要な防御策となるのがフルノードの存在です。単一のマイナー・マイニングプールが多くのハッシュレートを確保することによる51%攻撃では、何もないところからお金を生成したり採掘報酬を勝手に増やしたりして、ビットコインネットワークのルールを破るようなことは通常できず、攻撃の範囲が限られますが、それは善良なフルノードが存在するという前提での話です。
軽量型のウォレットノードはいちいちブロックの正当性を検証しないので、悪意のあるマイナーが生成したトランザクションを有効なものとしてほとんど無条件に受け入れてしまうことがあります。実際は多くの善意のフルノードの存在により、不正なトランザクション・ブロックはフルノードから弾かれ、軽量型のウォレットはフルノードから情報を受け取るので、悪意のあるマイナーからのトランザクションを直接受け取るようなことはなく攻撃が防がれることになります。
アーカイブノード(Archival Node)と剪定ノード(Pruning Node)
かつては、フルノードの説明として「すべてのブロックチェーン、取引履歴を保存するノード」という表現が使われることがしばしばあり、当時は間違いではなかったのですが、現在ではやや不十分な説明になってしまっています。
それは、Bitcoin Core 0.11.0へのバージョンアップにより、剪定モード(Pruning Mode)というものが実装されたためです。ブロックチェーンのサイズは現在では100GBを超えるため、フルノードの運用は大きな負担となっています。その負担を少しでも減らすため、過去の不要なトランザクション・ブロックを削除して保存しないようにしようという試みが剪定モードです。剪定モードでは、最初は全てのブロック・トランザクションをダウンロード・検証しますが、不要になったものは削除し、最終的にはすべてのUTXOと直近のブロックのみを残します。二重支払いがない有効な取引かどうかは、ブロックチェーン全てを検証するまでもなくUTXOだけを検証すればよい話なので、いらないデータは削除してしまおうというわけです。
この剪定モードを採用しているノードは剪定ノード(Pruning Node)と呼ばれますが、一度は全てのブロック・トランザクションのダウンロード・検証を行うので、一般的には「フルノード」に含められます。
対して、従来のように過去のデータを削除せずすべてのブロックチェーンを保存するノードは、アーカイブノード(Archival Node)と呼ばれます。最新の取引の有効性を確認するのは、剪定ノードだけで十分ですが、剪定ノードも最初はすべてのブロックをダウンロードする必要があります。当然他の剪定ノードはもう古いデータを削除してしまっているため、他のノードからダウンロードしなくてはなりません。そのときデータを提供するのがアーカイブノードです。剪定ノードもアーカイブノードもどちらもフルノードであり、直近の取引の検証という意味では違いがありませんが、アーカイブノードもビットコインネットワークのためには重要な存在と言えます。
フルノードを運用するメリット
ビットコインはフルノードを運用するインセンティブがない!とよく言われ、確かにそれに反対する人は少ないでしょうが、全くゼロかというとそういうわけでもないので、簡単に説明してみたいと思います。
セキュリティとプライバシー
前半で説明したように、軽量型のSPVウォレットは、ブロックチェーン全体やブロック自体、トランザクションそのものの正当性を自分では検証できず無条件に正しいものと信じるようになっています。ただし、軽量型であっても現実的には一つではなく複数のフルノードからの情報を比較・検証するので、単一のノードから送信された不正なブロックは実際上は弾かれることになります。たまたま接続したいずれのフルノードもビットコインのルールに違反する不正なブロックを有効なものとして伝達していた場合は、防ぐことができませんが、現状そこまでフルノード数は減少していないので、リスクは無視できるほど小さいものです。
フルノードを利用していれば自分ですべてのブロックチェーンを検証できるので、他のノードをそもそも信用する必要がありません。もちろん前述のように、不正なブロックチェーンを有効と認識してしまうような現実的なリスクはかなり少ないと思われるので、気分以外に普通のユーザーがフルノードウォレットをセキュリティ面で利用するメリットは、フルノードの運用コストと比較するとほぼゼロと言えるでしょう。
もう一点がプライバシー面です。軽量型のウォレットは実装によって多少の差はあるものの、基本的には特定の複数または単一のフルノードに自分のアドレス情報などを伝達しないといけないので、そのノードにIPアドレスとアドレス情報などが結び付けられてしまいプライバシーがダダ漏れになってしまう可能性があります。フルノードは自分が作成したトランザクションだけではなく他のノードから受け取ったトランザクションも同時に伝達するので、他人のトランザクションと紛れてどれが自分のトランザクションかわからなくなりますが、軽量型のSPVノードは自分が作成したトランザクションしか送信しないと考えると、プライバシーのリスクの差が分かりやすいと思います。
とはいえ通常のユーザーであれば、そもそもフルノード側もいちいちそれが誰のトランザクションなのかなんて気にしないと思いますし実質的に気持ちの問題以外のリスクはないと思います。
攻撃のターゲットになりやすい多額のBTCを保有している資産家の人や有名人なんかはプライバシー面が大きなメリットになる場合もあります。
セキュリティ・プライバシー面を考えてフルノードを運用するには?
実際にセキュリティやプライバシーの観点からウォレットにフルノードを利用したい!となった場合、いろいろな困難が付きまといます。
まず、ブロックチェーンが常に同期状態でないといけないため、コンピュータを常時起動しておく必要があります(1日放置しただけで検証に結構な時間がかかります。)。さらに問題となるのが、自分が自宅サーバーなりVPSとして運用している特定のフルノードに直接接続できるウォレットがかなり少ないということです。
フルノードをインストールしているコンピュータに直接ウォレットをインストールするのはいろいろと不便ですし、他のPCのウォレットからであったり、スマホのウォレットからであったり、外出先であっても自分のフルノードに接続できると便利でしょう。しかし、知る限り現状では特定のIPを指定してノード(Bitcoin Core)に接続、通信が可能なのは、PC用のmSIGNA、Android用のBitcoin Wallet(Schildbath wallet)のみです。
例えばCopayであったりElectrumであったりは専用のサーバーを別に立ち上げなければなりませんし、そもそも特定のサーバーに接続できないSPVウォレットも多く存在します。
ウォレット用途でフルノードの運用を考える場合は、そこらへんをよく調べておいたほうが良いかもしれません。
ネットワークへの貢献
もう一つのメリットがネットワークの貢献です。とはいえこちらも気分の問題なのでメリットといえるかどうかは怪しいところです。
現状、ビットコインのノード数はかなりの減少傾向にあるとはいえ、問題となる領域には達しておらずまだまだ安全な状況だと思います。とはいえ危険領域になってからでは遅いので今から貢献しておいてもいいかもしれません。
実際フルノードを運用するとなったときいくつかの選択肢があります。
外部からのノード接続を受け入れるか(ポート開放するか)
通常、フルノードを運用するにはポートを開ける必要はありません。ただし、ポートが空いていないと外部からのノード接続は受け入れないので、自分が一方通行的に適当なノードと接続するだけで、ネットワークへの貢献としては小さくなります(ネットワーク帯域を消費するだけの存在なのでむしろ害であると主張する人もいます。)。
ただしノードとの接続数が多くなればなるほどメモリの消費量などが多くなるので、使用するコンピュータによってはスペック上難しい場合もあります。
ちなみによくビットコインノード数として公開されているデータはポート解放されているノードの数だけであり、実際に運用されているフルノードはもっと多いと考えられます(そもそもポート解放されていないと、自分から接続しに行かない限り、第三者からはそのコンピュータがノードであると認識・接続できないので取得しようがありません。)。
アーカイブノードか剪定ノードか
前述のようにブロックチェーンをすべて保存するかしないか、を選ぶことが可能です。アーカイブノードのほうが役割は多いですが、剪定ノードでも十分フルノードとしての役割を果たせるので、コストを考えて選ぶと良いでしょう。
VPS・クラウドか自宅ノードか
ネットワークへの貢献を考えるなら自宅ノードのほうが良いでしょう。VPSのノードがいくら増えたところで、VPSはあくまでも仮想サーバーでしかなく分散されていないので、攻撃などにより同一のVPSを利用しているノードが同時に影響を受けるリスクがあります。また、例えばAmazon AWSがビットコインノード利用禁止!と掲げた場合には一斉にAWS上のノードは中止を強いられます。
実際の運用コストや安定性を考える場合にはVPSのほうがいいかもしれません。AWSなんかはノードを運用しようと思うとコストがかさんでしまいますが、海外の格安VPSを利用すればかなり安く運用することができます。
自宅ノードではインターネット回線の帯域制限があったり、コンピュータの故障リスクなども大きいので、ビットコイン関連のサービス運用に利用するにはVPSやクラウドを利用するのが安定だと思います。
終わりに
ということで、割と本気を出してアーカイブノード&自宅ノードの運用をはじめましたが、100GBを超えるブロックチェーンの同期にあと1日~2日ぐらいかかりそうなので、同期が終わった後にまた記事を書きたいと思います。