Develop with pleasure!

福岡でCloudとかBlockchainとか。

BitcoinのUTXOセットの内訳(2025年版)

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がリリースされた際にでも確認してみよう。

*1:P2SHになっていない素のマルチシグスクリプト

*2:小数点以下四捨五入