ビットコインアドレスの仕組み:P2PKHからBech32mまで
ビットコインアドレスタイプの総合技術ガイド — P2PKH (1...), P2SH (3...), P2WPKH (bc1q...), P2TR (bc1p...). Base58Check vs Bech32/Bech32mエンコーディング、チェックサムメカニズム、鍵導出、Bech32mの優位性を詳細に解説します。
ビットコインアドレスはアカウントではない。ブロックチェーンに保存されているわけでもない。どこにも登録されていない。ビットコインアドレスとは、ロックスクリプト — ビットコインを使える条件を指定するプログラム — をコンパクトで人間が読める形式にエンコードしたものだ。「アドレスにビットコインを送る」とは、そのアドレスがエンコードするスクリプトによってロックされたトランザクション出力を作成するということだ。
ビットコインはその歴史を通じて4つの主要なアドレス形式を経ており、それぞれがエンコーディング効率、エラー検出、基盤となるスクリプト能力の進化を表している。P2PKHからP2TRへの進化は単なる外見の変更ではなく、ビットコインのセキュリティ、プライバシー、スケーラビリティの根本的な改善を反映している。
導出パス:秘密鍵からアドレスまで
ステップ1:秘密鍵の生成
ビットコインの秘密鍵は256ビット(32バイト)の乱数で、1からn-1の範囲で選択される。nはsecp256k1楕円曲線の位数(約1.158 x 10^77)だ。ビットコインのセキュリティはこの数の無作為性に完全に依存する。推測、予測、計算できれば、ビットコインは盗まれる。
可能な秘密鍵の数は、観測可能な宇宙の推定原子数(約10^80)を超える。
ステップ2:公開鍵の導出(楕円曲線乗算)
公開鍵はsecp256k1曲線上の楕円曲線点乗算によって秘密鍵から導出される。秘密鍵kと曲線の生成点Gが与えられると、公開鍵Kは:
K = k * G
これは一方向演算だ — kとGからKを計算するのは簡単だが(数ミリ秒)、KとGからkを計算するのは現在の技術では宇宙の年齢より長くかかるほど計算不可能だ。
非圧縮公開鍵は65バイト:0x04接頭辞 + x 32バイト + y 32バイト。 圧縮公開鍵は33バイト:0x02または0x03接頭辞(yが偶数か奇数か) + x 32バイト。曲線上の各xに対して可能なy値は2つだけなので、圧縮形式で十分であり、現在の標準だ。
ステップ3:ハッシュ(レガシーおよびSegWit v0アドレス)
P2PKH、P2SH、P2WPKHアドレスでは、公開鍵がハッシュされてより短い固定長識別子が生成される:
HASH160(publicKey) = RIPEMD-160(SHA-256(publicKey))
これは20バイト(160ビット)ハッシュを生成する。二重ハッシュの目的:
- サイズ削減: 33バイト(圧縮公開鍵)→ 20バイト(ハッシュ)
- 量子耐性レイヤー: 攻撃者が楕円曲線を逆転できても(公開鍵から秘密鍵を抽出)、まずハッシュから公開鍵を見つけなければならない — RIPEMD-160を破る必要がある。ただしこれは公開鍵がまだ明らかになっていないアドレス(受取のみで送金していないアドレス)にのみ有効だ。
ステップ4:エンコーディング
生のハッシュは2つのエンコーディングスキームのいずれかで人間が読める文字列にエンコードされる:Base58Check(レガシー)またはBech32/Bech32m(モダン)。
アドレスタイプ1:P2PKH — Pay-to-Public-Key-Hash
形式: 1で始まる
例: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa(サトシのジェネシスブロックアドレス)
エンコーディング: Base58Check
P2PKHはオリジナルのビットコインアドレス形式だ。ロックスクリプト:
OP_DUP OP_HASH160 <20-byte pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
Base58Checkエンコーディング
Base58は視覚的に紛らわしい文字を除去したBase64のサブセットだ:
0(ゼロ)とO(大文字O)を除去 — 似て見えるI(大文字I)とl(小文字L)を除去 — 似て見える+と/を除去 — URLやファイル名で問題を起こす
文字セット:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Base58CheckはBase58にチェックサムを追加する:
- バージョンバイト + ペイロード:
0x00+<20-byte pubKeyHash> - チェックサム計算:
SHA-256(SHA-256(version + payload))の最初の4バイト - 連結:
version + payload + checksum - Base58でエンコード
Base58Checkの限界
大文字小文字の区別。 Base58は大文字と小文字の両方を使うため、アドレスは大文字小文字に敏感。1文字の大小を間違えるとアドレスが完全に変わる可能性がある。
エラー検出の弱さ。 4バイトチェックサムは高確率でエラーを検出するが、特定のエラーパターンに最適化されていない。
非効率的なQRエンコーディング。 QRコードには大文字のみサポートするアルファニューメリックモードがある。Base58は小文字を含むため、バイナリモードを使わなければならず、より大きなQRコードが生成される。
アドレスタイプ2:P2SH — Pay-to-Script-Hash
形式: 3で始まる
エンコーディング: Base58Check
活性化: BIP-16(2012年)
P2SHアドレスは公開鍵のハッシュではなく任意のスクリプトのハッシュをエンコードする。バージョンバイトが0x05(3で始まるアドレスを生成)。
主な用途:
- マルチシグウォレット
- ラッピングされたSegWit(P2SH-P2WPKH)
アドレスタイプ3:P2WPKH — Pay-to-Witness-Public-Key-Hash(SegWit v0)
形式: bc1qで始まる
例: bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
エンコーディング: Bech32
活性化: BIP-141/143/173(2017年)
Bech32エンコーディング
Bech32(BIP-173)はPieter WuilleとGreg Maxwellが設計した、Base58Checkに対する包括的な改善だ。
Bech32アドレスの構造:
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
│ │ │ │
│ │ └──────── データ ──────────────────────┘
│ └── セパレータ
└── 人間が読める部分(HRP)
文字セット: 32文字のみ使用:qpzry9x8gf2tvdw0s3jn54khce6mua7l。すべて小文字(またはすべて大文字 — エンコーディングは大文字小文字無関係)。
BCHチェックサム: Bech32はエラー検出にBCH(Bose-Chaudhuri-Hocquenghem)コードを使用し、Base58Checkの二重SHA-256チェックサムより根本的に優れている:
- 最大4文字に影響するすべてのエラーを保証検出
- エラー位置特定 — エラーが存在するだけでなく、どこにあるかも特定可能
- 32文字アルファベットと一般的なアドレス長に特別に最適化
QRコード効率: Bech32は小文字のアルファニューメリック文字のみを使うため、アドレスを大文字に変換するとQRコードがより効率的なアルファニューメリックモードを使える。Base58Checkアドレスより約30-40%小さいQRコードが生成される。
Bech32の弱点
アドレス末尾(チェックサムの直前)でq文字を挿入または削除しても、有効なチェックサムが生成される場合がある。SegWitバージョン0アドレスでは固定長要件で軽減されるが、可変長プログラムが可能な将来のSegWitバージョンでは危険になりうる。
この弱点がBech32mの開発に直接つながった。
アドレスタイプ4:P2TR — Pay-to-Taproot(SegWit v1)
形式: bc1pで始まる
エンコーディング: Bech32m
活性化: BIP-341/350(2021年11月)
ロックスクリプト:
OP_1 <32-byte tweaked public key>
なぜハッシュではなく生の公開鍵なのか?
P2TRは20バイトハッシュの代わりに公開鍵の生の32バイトx座標を使用する:
シュノア署名検証に公開鍵が必要。 ECDSA(署名から公開鍵を復元できる)と異なり、シュノア検証は公開鍵を明示的な入力として要求する。支出者がいずれにせよ公開鍵を明らかにしなければならないので、アドレスでハッシュすることは追加のセキュリティを提供しない。
空間効率。 ハッシュ方式では出力にハッシュとウィットネスに公開鍵の両方が必要。生の鍵方式では鍵だけが現れる。
Bech32mエンコーディング
Bech32m(BIP-350)は挿入/削除の弱点を修正するBech32の最小限の変更だ。唯一の違いはチェックサム計算の定数1つ:
Bech32チェックサム定数: 1
Bech32mチェックサム定数: 0x2bc830a3
互換性ルール:
- SegWitバージョン0(P2WPKH、P2WSH)はBech32を使用 — アドレスは
bc1qで始まる - SegWitバージョン1+(P2TRおよび将来のバージョン)はBech32mを使用 — P2TRアドレスは
bc1pで始まる
Bech32mが優れている理由
すべてのエンコーディング形式の比較:
| 特性 | Base58Check | Bech32 | Bech32m |
|---|---|---|---|
| 大文字小文字の区別 | あり | なし | なし |
| エラー検出保証 | 確率的(4バイトハッシュ) | 4個のエラーまで保証 | 4個のエラーまで保証 |
| エラー位置特定 | 不可 | 可能 | 可能 |
| QRコード効率 | 低(バイナリモード) | 優秀(アルファニューメリック) | 優秀(アルファニューメリック) |
| 挿入/削除検出 | 可能 | 末尾で弱い | 可能 |
| 使用箇所 | P2PKH (1…), P2SH (3…) | P2WPKH (bc1q…) | P2TR (bc1p…) |
ネットワーク別アドレスプレフィックス
| ネットワーク | P2PKH | P2SH | P2WPKH | P2TR |
|---|---|---|---|---|
| メインネット | 1... | 3... | bc1q... | bc1p... |
| テストネット | m.../n... | 2... | tb1q... | tb1p... |
| シグネット | m.../n... | 2... | tb1q... | tb1p... |
| レグテスト | m.../n... | 2... | bcrt1q... | bcrt1p... |
どのアドレスタイプを使うべきか?
可能な限りP2TR(bc1p…)を使う。 以下を提供する:
- 最高のプライバシー(基盤スクリプトの複雑さに関係なく、すべてのTaproot出力が同一に見える)
- 最低のトランザクション手数料(鍵パス支出で最小のウィットネスデータ)
- 最も先進的なスクリプト機能(シュノア署名、MAST、Tapscript)
- 最高のエラー検出(Bech32mエンコーディング)
代替としてP2WPKH(bc1q…)を使う。 サービスがP2TRをサポートしていない場合、P2WPKHが次善の選択肢だ。
新規使用ではP2PKH(1…)とP2SH(3…)を避ける。 これらのレガシー形式はより高いトランザクション手数料、より大きなトランザクションサイズ、劣ったエラー検出を持つ。
2026年時点で、ビットコインウォレットとサービスの大多数は少なくともP2WPKHをサポートしており、P2TRサポートはますます普遍的になっている。
関連トピックはビットコインウォレットアドレス、SegWit、Taprootのガイドを参照。