Umbrel導入時におけるIBDの省略手順

UmbrelでLightning Nodeを利用するためには1からBitcoin Nodeをインストールする必要がある。この際に500GBほどあるブロックチェーンのデータを同期する必要があり、Umbrelで実行すると同期に数日かかる。(これはInitial Block Download (IBD)と呼ばれている)

私の場合はUmbrelを導入する前からBitcoin Nodeを利用していたので、このデータを利用してIBDを省略できないかと検索。

https://github.com/getumbrel/umbrel-os/issues/119#issuecomment-691949967GIthubのissueを参考にしてコピー。具体的手順としては

  • HPのUmbrelのセットアップ手順に従ってインストール
  • Bitcoin Coreをインストールした後に設定画面からUmbrelをshutdown
  • 手元のPCにUmbrelに先程セットアップしたSSDを接続して一番最新のコメントに従ってディレクトリをコピー(Umbrelv0.5からはディレクトリの場所が変わったようで正確なディレクトリを記載してる資料が少ない。)

Same here! I had to finally reindex from scratch... Too bad I didn't scroll all the way down. One more thing, now the default paths for the three folders are:

• ~/umbrel/app-data/bitcoin/data/bitcoin/blocks

• ~/umbrel/app-data/bitcoin/data/bitcoin/chainstate

• ~/umbrel/app-data/bitcoin/data/bitcoin/indexes

"blocks"と"chainstate","indexes"を既存のBitcoin Nodeからコピーする。コピーの際にはデータが大きいのでcpではなくrsyncを使用する。その際進捗を確認したいのでoptionに—progressをつける。実際には以下のようなコマンドを使用(/path/to/umbrelは各々の環境によって変えること)。

rsync -avr ―progress --partial --append-verify ~/.bitcoin/blocks {/path/to/umbrel}/app-data/bitcoin/data/bitcoin/

進捗見てる限りblocksのコピーには数時間ほどかかりそうだったので寝た。朝起きたら完了していたので実際にかかった時間は分からないが、Githubのissueには2時間ほどという報告があるので1からIBDを行うよりかは短縮になる。

Umbrel用にSATAとUSBの変換アダプターを購入していると思うがSATAとType-C変換アダプターでつなぐと転送速度が早くなるのでなお良い。

ラズパイへSSDを再接続した後、Umbreを起動する。問題なければBitcoin Coreの同期状態が100%になる。

通常はここまでの手順でIBDを省略できるが、私同様にトラブルが発生した人のために以下のトラブルシューティングの記録を記述する。

私の場合は再起動後に問題が発生。Bitcoin Coreアプリを開いてもsyncが正常に動作せずにスタック。

データ転送の際に初めからrsyncで送信せず何度か中断を挟んだので、送信途中でデータが破損したと推測。chainstateは容量が少ないのですべて再転送して試すもそれでも起動してこない。

rsyncには送信先にすでに存在するファイルの中身を実際に確認して同一性を保証する--checksumオプションが存在するがこれは.bitcoin/blocks/*以下のblk****.datファイルのように大きなサイズのファイルをやる場合には時間がかかりすぎる。それでもやるか迷っていたときに、blk***.datファイルは最新のもの以外一度作成されると更新されないことに気づく。(indexesやchainstateを作成するために使用するrawデータなので当たり前だが、知らなかった)

そこでrsyncに上に記載した--append-verifyをつけて転送。これでいくつかの転送先のファイルが更新され無事にUmbrelが起動。Lightnig Nodeも起動してホッとして数時間経ったところで再び問題発生。

.bitcoin/debug.logを確認すると以下のエラー文。

Assertion failed: !setBlockIndexCandidates.empty() (validation.cpp: PruneBlockIndexCandidates: 2745)

--append-verifyは転送先のファイルのほうが大きい場合は書き換えないので、そこが問題で不正なblkファイルが転送先に残っていたようである。

md5sumコマンドを使って比べると実際に転送元と転送先でファイルのハッシュ値が違うので該当のファイルのみを再コピー。エラーログが正確に出るって素晴らしい...

以上のようにIBDを再利用するために想定していたより苦労したので結果的にはすべてUmbrelに任せて放置したほうが楽だったかもしれない。

ちなみに.bitcoin/indexesディレクトリは転送しなくてもBitcoin Coreを立ち上げることが可能であり、ない場合は転送先でindexは再作成される。再作成されるまでの3日程度の間mempoolなどindexsを要求するアプリケーションが使えないが、indexsが壊れたかもしれない人は最悪転送しなくとも問題ない。

皆さんのUmbrelセットアップ手順が楽になることを祈ります。🙏

Remaining : 0 characters / 0 images
100

Sign up / Continue after login

Related stories

Writer

Share