「Mastering Bitcoinを読み解く」、第3回は物理ファイル編です。マニアックですね笑
Mastering Bitcoinからの情報も参考にしていますが、以下のフォーラム上の回答が非常に分かりやすくまとまっています(もう少し調べるとWikiに書いてありました笑)。物理的には、主に4つのデータフォーマットからBitcoinは構成されています。
Bitcoinのデータ構造
ブロックチェーン
まずはブロックチェーンそのもの。データベースは使用せず、Rawデータの形式で保存されています。ファイルパスは、blocks/blk*.dat。
インデックス
通常のデータベース同様、データへのアクセススピードをあげるために、ブロックチェーンを要約したインデックス情報を保持しています。ここには全ブロックのメタ情報とブロックへの参照情報が含まれています。
このインデックスの作成には、Key-Value型のデータベースであるLevelDBが使用されています。ファイルパスは、blocks/index/*。
Chainstate (UTXO管理DB)
UTXO (Unspent Transaction、まだ次の支払いに使用されていないトランザクション)を管理するファイルです。トランザクションの検証には、トランザクションで使用されている、過去のトランザクション情報がまだ未使用であるかを検証する必要があります。
このUTXO専用の管理ファイルを使用することで、トランザクションの検証を高速に実施することができます。なお、UTXOの管理にもインデックス同様Level DBが使用されています。ファイルパスは、chainstate/*。
UNDOファイル
通常のデータベース同様、データをRoll Backする必要がある場合に、このファイルが使用されます。Roll Backとは通常データベースに記録した情報が間違っていたり、不完全だった場合に、決められた復旧ポイントに戻ることを指します。
Bitcoinの場合は、Chainstate用にUNDOファイルが作成されています。具体的にどのような場面で使用されるかというと、ブロックチェーンが分岐して、そのクライアントが最長とみなしていたチェーン (A) よりも長いチェーン (B) が見つかった場合に使用されます。この場合、Bに含まれるUTXOを使用済みとマークするとともに、Aに含まれているUTXOをRoll Backする必要があります。BitcoinではUNDOファイルを利用して、このRoll Backを実現しているというわけです。ファイルパスは、blocks/rev*.dat。
まとめ
基本的にはブロックデータとそのインデックス、Roll BackのためのUNDOファイルに、高速に検証するためのキャッシュ構造(UTXOファイル群)から構成されており、一般的なデータベースと思想は似ていますね。
ちなみに、Bitcoinの本体とは少し離れますが、Bitcoin CoreのWalletアプリにはBerkeley DBが使用されているようです。WalletをLevelDBに統合してしまうと既存ユーザへのインパクトが大きすぎるので、Berkeley DBからLevelDBに統合されることはないでしょう。