読者です 読者をやめる 読者になる 読者になる

25歳海外駐在員のマネー、資格奮闘記

25歳の東南アジア某国に生息する海外駐在員。Bitcoinをメインに、英語や駐在生活に関して情報発信中。

Bitcoinのデータ構造

仮想通貨(暗号通貨)

もともとOracleデータベースの技術者をしていたので、前々からBitcoinの物理的なデータ格納方法が気になっていました。以下のフォーラム上の回答が非常に分かりやすかったので紹介します(もう少し調べるとWikiに書いてありました笑)。どうやら、物理的には主に4つのデータフォーマットから構成されているようです。

bitcoin.stackexchange.com

Data directory - Bitcoin Wiki

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に統合されることはないでしょう。

why need both level db for index of blockchain and Berkeley db for wallet? · Issue #4123 · bitcoin/bitcoin · GitHub