2023年12月にブロック高821,628時点のUTXOセットの内訳について以前調べてみたけど↓
techmedia-think.hatenablog.com
これが現状どう変化したかブロック高910,000時点(2025年8月14日あたり)のUTXOセットで確認してみた。
UTXOセットの入手
先日Bitcoin Core v30.0がリリースされて、AssumeUTXOのスナップショットもブロック高910,000分が追加されたので、今回は配布されているスナップショットを使用する。ブロック高910,000のスナップショットは、以下のマグネットリンクを使って入手できる。
magnet:?xt=urn:btih:7019437a2b1530624b100c0795cfc5f90b8322ca&dn=utxo-910000.dat&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.bitcoin.sprovoost.nl%3A6969
サイズは約9.6GB。
UTXOセットのデータ構造
Bitcoin Core v28.0から、最適化のためUTXOセットをダンプする際のフォーマットが変更された。PRでは、ブロック高830,000時点の10.82 GBのスナップショットが新しいフォーマットに変更することで8.94 GBまで最適化できた模様(17.4%のスペースの削減)。そのため、↑のスナップショットをパースする際も新しいフォーマットで解釈する必要がある。新しいフォーマットの仕様は以下のとおり。
メタデータ
スナップショットは以下のメタデータから始まる。
| フィールド | バイト数 | 内容 |
|---|---|---|
| マジックバイト | 5 | utxoというascii文字と0xffを連結したデータ |
| バージョン | 2 | 現在のバージョンは2 |
| ネットワークマジックバイト | 4 | 使用しているネットワーク(mainnetやtestnetなど)を識別するためのマジックバイト(P2Pメッセージで使用されているものと同じ) |
| ブロックハッシュ | 32 | スナップショットに含まれる最新ブロックのブロックハッシュ |
| コイン数 | 8 | スナップショットに含まれるUTXOの総数 |
※ 基本的にリトルエンディアンでエンコードされてる。
各UTXOデータ
メタデータの後に、各UTXOのエントリーが続く。各UTXOのフォーマット仕様は以下のとおり。
| フィールド | バイト数/型 | 内容 |
|---|---|---|
| TXID | 32 | UTXOのOutPointのTXID |
| アウトプットの個数 | CompactSize | UTXOセット内で、上記のTXIDと同じ値を持つアウトプットの個数 |
| インデックス | CompactSize | UTXOのアウトプットのTx内のインデックス |
| ブロック高+コインベース | varint | UTXOが含まれるブロック高と、コインベースかどうかを示すフラグ。ブロック高を31 bitとして扱い、最下位ビットをコインベースのフラグ(コインベースであれば1、そうでなければ0)として扱った数値をvarintsエンコード。 |
| 金額 | varint | UTXOに格納されている金額(フォーマットはこちら) |
| scriptPubkey | 可変 | UTXOのscriptPubkey: P2PKHの場合は、プレフィックス0x00の後に20バイトの公開鍵のハッシュ値 P2SHの場合は、プレフィックス0x01の後に20バイトのスクリプトのハッシュ値 P2PKの場合は、公開鍵の値 (0x04で始まる)非圧縮公開鍵も33バイトの圧縮形式に変換されている。それが圧縮形式で表現されていることが分かるよう、プレフィックスを0x04 | y座標の偶奇ビットとしている。結果、P2PKの場合のプレフィックスは、0x02, 0x03, 0x04, 0x05のいずれかになる。 それ以外のスクリプトタイプの場合は、スクリプトサイズ+6*3をvartintsエンコードした後にスクリプト全体が続く。 |
以前のフォーマットでは、先頭がOutPointで36バイト固定だったけど、同じトランザクション内のアウトプットが複数UTXOセット内に存在する場合、TXIDは同じ値で冗長になるため、重複するTXIDを削除することでスペースの最適化を図った模様。Bitcoin CoreではUTXOセットはLevelDBに格納されているけど、その際のキーはOutPointで、かつLevelDBはデータをキーの辞書準に格納するため、このような最適化がしやすい構造になっている。また、TXIDほどの効果はないけどブロック高も冗長なので、まだ最適化の余地はありそう。
ちなみに、ダンプしたUTXOセットをSQLite3にエクスポートするユーティリティツールなども新たに提供されている(サイズは大きくなるけど)。
UTXOセットの内訳
ブロック高910,000時点のUTXOセットをパースした結果は↓

| タイプ | 個数 | 前回(2023年12月)との差 |
|---|---|---|
| P2PK | 44,667 | −870 |
| P2PKH | 45,509,393 | −5,280,453 |
| P2SH | 13,189,668 | −6,000,697 |
| P2WPKH | 46,414,797 | -1,117,338 |
| P2WSH | 2,202,900 | 877,881 |
| P2TR | 58,074,567 | 31,891,290 |
| ベア・マルチシグ*1 | 2,360,369 | 1,426,247 |
| その他 | 24,781 | 15,177 |
| 合計 | 167,821,142 | 21,811,237 |
レガシーアドレス(P2PKHやP2SH)がガッツリ減って、P2TRの数が増え最も多いアウトプットタイプになっている。P2WPKHが減ってるのもP2TRへ移行してるのか?
一方、P2WSHは増加してるけど、ライトニングネットワークのチャネル数は2023年12月頃(約65,500)と比べると8月時点(約54,200)では減少してるので、LNとは関係なさそう。なんだろう?
ベア・マルチシグも増えている。特に1-of-2や1-of-3のマルチシグで、その中には明らかに有効な公開鍵ではないデータが記録されている。要はデータ記録系に使ってるものと思われる。ベアマルチシグでは標準ルールで3つまで公開鍵を含められるので圧縮公開鍵を使った場合のサイズは105 byte、非圧縮公開鍵を使った場合は201 byteとP2TR(34 byte)と比べると3〜6倍になる。UTXOセットは現状プルーニングできないので、こういう使い方が増えるのは困りもの。Bitcoin Core v30.0からOP_RETURNのサイズ制限なくなったので、やるならそっちを使って記録して欲しい。
標準のアウトプットタイプに該当しない「その他」のデータを分類すると↓
| 分類 | 個数 | 割合 | 内容 |
|---|---|---|---|
| OP_TRUE (OP_1のみ) | 11,177 | 45.10% | "1" のみのスクリプト - 誰でも使用可能 |
| OP_FALSE (OP_0のみ) | 2 | 0.01% | "0" のみ - 誰も使用不可 |
| OP_1系 | 216 | 0.87% | "1" + データのパターン |
| OP_15系 | 72 | 0.29% | "15" (OP_15) で始まるスクリプト |
| BLOCK形式 | 8,813 | 35.56% | "2 3 BLOCK:..." で始まる特殊形式 |
| OP_2SWAP系 | 3,651 | 14.73% | "12" (OP_2SWAP) で始まるスクリプト |
| オペコード混在 | 254 | 1.02% | 人間が読める形式のオペコード |
| 数値プレフィックス | 113 | 0.46% | 様々な数値で始まるスクリプト |
| P2PKH風 | 34 | 0.14% | P2PKH形式だが不正なスクリプト |
| 純粋Hexデータ | 12 | 0.05% | Hexデータのみ |
| 未分類 | 437 | 1.76% | その他のパターン |
ちなみに、UTXOにセットされているsatoshiの量が0のアウトプットのタイプ別の内訳は↓
| タイプ | 個数 | 前回(2023年12月)との差 |
|---|---|---|
| P2PK | 2 | 0 |
| P2PKH | 6,024 | -7 |
| P2SH | 69 | 1 |
| P2WPKH | 4 | 1 |
| P2TR | 17 | 17 |
| その他 | 9,064 | 218 |
一方、各アウトプットタイプ毎のコインの量は↓

| タイプ | sats | BTC*2 |
|---|---|---|
| P2PK | 171,837,024,575,676 | 1,718,370 |
| P2PKH | 605,764,963,529,800 | 6,057,650 |
| P2SH | 407,781,428,065,803 | 4,077,814 |
| P2WPKH | 667,585,874,500,912 | 6,675,859 |
| P2WSH | 121,211,371,385,085 | 1,212,114 |
| P2TR | 16,153,804,643,822 | 161,538 |
| ベア・マルチシグ | 6,976,711,604 | 70 |
| その他 | 261,763,296,644 | 2,618 |
Taprootは、UTXOの個数はダントツなもののロックされてるBitcoinの量はかなり少ない。OrdinalsなどBitcoinの取引とは関係ないところでの需要が多いのか?
次はまた一年後Bitcoin Core v32.0がリリースされた際にでも確認してみよう。