Blockstream Satelliteでフルノードを1から同期!
何かと話題の人であるイーロン・マスクについて考えたとき、SpaceXの社長として宇宙開発のイメージが強い人もいるかもしれません。
さて、宇宙とビットコインといえば、Blockstream Satelliteという企画でBlockstreamがお金を払って人工衛星からビットコイン・ブロックチェーンのデータ、ソースコード、ライトニングネットワークのグラフなどを配信しています。
今回の記事は、これを使ってインターネット接続に頼らず、イチからビットコインノードを同期してみます。
宇宙とビットコインについては@ogw_yuyaのこの記事がおすすめです。原文の英語の記事3つもワクワクします。→【ビットコインと火星】
購入編はこちら→【Liquid USDT払いでBlockstream Satellite受信機を買ってみた】
仕組み
Blockstreamが地上局からいくつかの衛星に向けてデータを送って、それらの衛星が地球に向けてそのデータを転送しています。ネットワークに詳しい人向けに言えば、SAT>IPアンテナから出力されるのは衛星ごとに異なるローカルIPアドレス(例:172.16.235.9)から239.0.0.2:4434宛のUDPマルチキャストです。
受信しかできないので、特に無線の免許等は必要ありません。(発信できたら出力によって免許が要ると思いますが、残念ながらそれはできません。Blockstream Satelliteから地球に向けてデータを配信したい場合はBlockstreamのウェブサイトかAPIからできます!)
開封
4/29に注文して5/10には届いたので、けっこう早く着いたと思います。関税などもかかりませんでした。(送料125ドル分の仕事はしてもらわないといけませんからね)
箱の重さは9kgくらいで、内容物はSelfsat SAT>IP 22本体と、PoEに対応していないルーターで使用する場合に必要なPoEインジェクター、あとは数種類の取付金具です。取り付け時のために、安っぽい方位磁針も入っています。通常必要な部品の多くがアンテナ内部に組み込まれているので非常にシンプルです。
アンテナ自体は5.5kgですが、普通のパラボラアンテナより重たいので、荒天時のことも考えてしっかり取り付けるか、荒天時は室内に入れたいところです。
また、特にBlockstream Satelliteの利用向けマニュアルの類のものは入っていませんが、GitHubに行けば利用手順が一応見つかります。あまりわかりやすくないと思います。
→【ユーザーガイド】
→【Selfsat SAT>IP 22 Receiverセットアップガイド】
→【Bitcoin Satelliteソフトウェアガイド】
さて、ここからBlockstream Satelliteを利用できるまで試行錯誤が始まるのでした…。
(皆さんはこの記事を読んで時短しましょう)
付属品は少ないので、自前で用意すべきものがいくつかあります。ルーターがPoE対応で、アンテナを屋外に設置する前提なら:
・屋外用イーサネットケーブル (断面が丸いもの) 1本
・隙間用イーサネットケーブル 1本 (窓のサッシに挟めるもの)
・イーサネットケーブル 1本 (ルーターから窓まで足りる長さ)
・LANケーブル中継コネクタ 2個
・絶縁テープ 少々 (屋外のLANケーブル中継コネクタの防水加工用)
もしルーターがPoE非対応なら、間取りにもよりますがイーサネットケーブルがもう1本要るかもしれません。(PoEインジェクターに直接隙間用イーサネットケーブルを挿せない場合)
図示するとこんな感じです。色が薄い部分は必ずしも必要ありません。
屋外用LANケーブルが平型だとアンテナの防水がうまくいかなさそうなので、必ず断面が丸い普通のケーブルにしてください。
あとは、ルーターにフルノードにしたいデバイスをつなげましょう。
組み立て
組み立てといってもそれほど手順はありませんが、とりあえず取り付け位置から衛星への方角等を確認しないといけません。
まずはDishPointerで取り付け位置から"138E Telstar 18V"への方角・仰角・傾きを確認しましょう。
ちなみにTelstar 18Vは史上2番目に大きい通信衛星だそうです。
下記は位置の逆算を防ぐために多少改変していますが、日本からであれば大体似たような数字になるでしょう。ちなみに日本以外に設置する場合は、Blockstream Satelliteのサイトで衛星を確認しましょう。
Elevation: 48° -仰角。傾きを変える金具で確認
Azimuth (true): 182°-方角。地図を使う場合はこちら
Azimuth (magn.): 190°-方角。方位磁針を使う場合はこっち
数値が出揃ったので、あとはアンテナをその方向に固定すれば設置は完了します。
家の向きなどによっても取り付け方に工夫が必要になるかもしれません。例えば、私は手すりに取り付けるつもりでしたが、手すりの形状が金具と合わず断念。別の取り付け方もいくつか試しましたが、アンテナ設置方向と角度があるためベランダの壁と干渉してしまったりして、うまく設置することができませんでした。
最終的には、ホームセンターで買ってきたパイン材の板をノコギリと電動ドリルで加工し、土台を作りました。これで台の上や地面に置いて使うことも、風が強いときは中に入れることもできます。(金具の向きも変わったので、角度も設定し直しました。)
落下を防ぐためにしっかり設置したいので、金具を加工したり、別のものと交換するのを避けた結果こうなりました。満足しています。
接続
さて、接続とセットアップを進めていきましょう。とりあえず動作確認がしたいので、一時的にアンテナを窓際に置くことにしました。(複数のLANケーブルを使ったり、防水に気を使ったり、ベランダとの出入りを減らして楽をする算段)
うちのルーターはPoE給電に対応していないので、ルーターからPoEインジェクターへとLANケーブルで接続し、PoEインジェクターからアンテナにも接続します。(コネクタを間違えるとルーター側に電流が流れて破損する可能性があるので、必ずPoEインジェクターのコネクタを確認してください)
さて、ハードウェアはとりあえず揃いました。残されたのはソフトウェアのセットアップだけです。(その後にアンテナの微調整を行います。)
ビットコインノードのインストールされていない、クリーンなOSから始めます。とりあえずはちゃんと動作を確かめたいだけなので、仮想マシン(VM)にUbuntuを入れることにしました。また、最終的にはオフラインで動作させたいですが、セットアップはインターネットに接続した状態で行うことにします。
まずはblocksat-cliをインストールします。
sudo pip3 install blocksat-cli
(pip3が入っていない場合は、sudo apt install python3-pip
を行ってからです)
次に、アンテナの設定をします。
blocksat-cli cfg
どの衛星を使うのか聞かれるので、日本ならば5番 (Telstar 18V Ku Band)を選びます。今回使うアンテナは4番のC Bandには対応していません。
受信機の機種を答える次の項目では3番のBlockstream Base Station Receiverを指定します。
ちなみに
blocksat-cli cfg
は再度実行すると、前回生成された設定ファイル(JSON)が確認できます。
次にセットアップの方法を見るためにblocksat-cli instructions
を実行します。表示される案内に従って次のコマンドを実行していきます:
blocksat-cli deps install
(依存関係のインストール)
blocksat-cli sat-ip
(アンテナの検出・向き調整)
ところがここでトラブルが起きます。
問題発生
私はblocksat-cli sat-ip
を何度実行しても
2021-05-17 14:16:00 ERROR Could not find a Sat-IP receiver
2021-05-17 14:16:00 INFO Check your network or specify the receiver address through option -a/--addr
このようなメッセージが出てしまい、ルーターのUPnPが有効化されていることを確認し、指示の通り-aまたは--addrオプションを使ってSAT-IPアンテナのものと思われるローカルIPアドレスを指定しましたが、今度は'Connection reset by peer'というエラーしか出ませんでした。詳しく見ると、どうも何らかのHTTPリクエストが拒否されている模様です。
とりあえずローカルIPアドレスのポート番号8000番にブラウザでアクセスすると以下のようなページが表示されることも確認できました。http://<LOCAL IP>:8000
というわけでソースコードの該当部分を調査することにしました。どうも、http://<LOCAL IP>:8000/cgi-bin/login.cgiへのログインのリクエストが失敗しているようです。というか、ページには特にログインフォームなんてないのに…
アンテナのファームウェアアップデートを試してみることにしました。ダウンロードはこちら。解凍後、gss4p_update_v3_1_18/Tftpd32フォルダ内からtdtpd32.exeが消えてないか確認し (消えている場合はアンチウイルスソフトを無効化して再度解凍からやり直しましょう)、管理者権限で起動したコマンドプロンプトで該当ディレクトリまで行き、
GSS4PUPDATE.bat -pass SELFSAT -ip <PCのIP> <アンテナのIP>
を実行します。Windows 10だと、実行前にタスクマネージャー>サービス>SSDPSRVとupnphostを一時的に停止する必要があるかもしれません。
暫く待つとアップデートが完了するはずです。完了後にイーサネットケーブルを抜き差しして電源を入れ直してからしばらくしてアンテナのページに再度行くと、変化がありました:
古いファームウェアではこのフォームがなかったせいでHTTPリクエストにエラーが返ってきてたんですね。無事解決。
アンテナの調整
気を取り直してblocksat-cli sat-ip -a <アンテナのLOCAL IP>
を実行します。
このようなログが2秒ごとに更新されます。これは目的の衛星からの電波強度です。Lock=falseなので信号が検出さえされず、全く向きが合っていませんね(笑)
室内ではやはり窓のサッシなどが邪魔かと思い、ベランダに出して方角を少しずつずらしていくと…
ロックオンしました!しばらく放っておくとSignal Qualityが100%に達したので、これ以上の調整は不要です。100%にならない方は、微調整を続けましょう。
ちなみにLevelは-69dBから-23dBまでの範囲を取り、-23dBに近いほどいいらしいので後ほど改善できるかやってみるのも手です。
このblocksat-cli sat-ip
はアンテナからの通信を受信するクライアントなので、生かしておく必要があります。このプロセスを終了するとビットコインノードは何も受信できません。ターミナルに新しいタブを開きましょう。
Bitcoin Satelliteのインストール
さて、受信環境が整ったのでビットコインノードを準備しましょう。
Bitcoin SatelliteはBitcoin Coreのフォークで、Blockstream Satelliteからのデータ受信をスムーズに行うための改変が入っています。Bitcoin Coreがすでに入っているマシンには入れることができません。
blocksat-cli btc
(bitcoin.conf設定ファイルの作成)
~/.bitcoin/bitcoin.confに生成された設定ファイルはこのようになります:
ここに以下の設定を追加しておきましょう:
connect=0
- 衛星経由のみで受信する (インターネットを使わない)prune=25000
- 保持するブロックチェーンデータを最新の25GBに制限rpcuser="blocksat"
- RPC接続用ユーザー名 (任意のもの)rpcpassword="satellite"
- RPC接続用パスワード (任意のもの)
【追記 2021/6/5】過去ブロックは順不同に受信することになるので、プルーニングはオフにしないと同期できないと思われます。
最後にインストールします。
blocksat-cli deps install --btc
(Bitcoin SatelliteのインストールLinuxのみ)
受信時に使うバッファサイズがOSで設定されている上限より大きいかもしれないので、下記のコマンドを実行します。
sysctl net.core.rmem_max
この結果が24660008より小さければ、下記のコマンドで変更します。
sudo sysctl -w net.core.rmem_max=24660008
さあ、bitcoindを起動して、進捗を見てみましょう!
sudo bitcoind --datadir=/home/<username>/.bitcoin
(sudoなしで
bitcoind
ってやるとUDP周りでエラーが発生したので)
このように、最新のブロックが見つかるたびに受信されています。古いブロックを持っていない("prev block not found")のでとりあえず"Future Blocks"として格納されます。
ちなみに、blocksat-cli、bitcoindとは別のタブを開いて、以下のコマンドで接続状況を確認することもできます。
bitcoin-cli getudpmulticastinfo
- ちゃんと衛星からデータを受け取っているか、ビットレート・累計受信データ量等で確認できる
bitcoin-cli getchunkstats
- 並行して受信しているブロック数などを確認できる
本来はビットレートが1.09Mbps程度まで上がるらしいのですが、自分はだいたい15~200kbpsに留まっているため、アンテナをもう少し調整したほうが良いのかもしれません。(追記:ちゃんと屋外に設置したら0.91Mbpsくらいになりました。かなり調整してもなかなか完璧にならないから、いらいらしますw)
衛星だけで同期するのは絶望的に時間がかかりそうですが、もう少し体制を整えてから試してみたいところですね。笑
Dockerイメージ
手間が面倒だ!という方や、環境を事前にダウンロードしておきたい方などは、Dockerイメージを利用したセットアップもできるようです。ていうか最初からそれやればよかった。。
方法はここに書いてあるので、ご自身でどうぞ。
次回予告
次回は、Blockstream Satellite APIで配信したデータを受信してみようと思います。