分散化の土台
暗号技術(Cryptography)は、暗号通貨(cryptocurrency)の「暗号(crypto)」そのものです。それは、中央当局なしで分散型ネットワークが機能することを可能にする、セキュリティ、所有権、および不変性の数学的保証を提供します。
このガイドでは、BitcoinやEthereumなどの主要なブロックチェーンで使用されている特定の暗号アルゴリズムについて詳しく説明します。なぜ特定の選択がなされたのか、それらが標準的なWeb暗号技術とどのように異なるのか、そしてそれらがどのように連携して数十億ドルの資産を保護しているのかを検証します。
1. ハッシュ戦略:Bitcoinのダブルハッシュと HASH160
Bitcoinは、マイニングからアドレス生成まで、あらゆることにハッシュを使用します。しかし、単一の SHA-256 ハッシュが使用されることは稀です。
ダブル SHA-256 (SHA-256d)
Proof of Work やブロック ID の構築を含む Bitcoin のほとんどの操作では、SHA-256 を2回使用します。
- 計算式:
SHA256(SHA256(データ)) - 理由:サトシ・ナカモトは、当時の Merkle-Damgård 構造における理論的な懸念であった**長さ拡張攻撃(length extension attacks)**に対する防御として、主にこれを実装しました。
HASH160:スペース効率
アドレスを生成するために、Bitcoin は HASH160 を使用します。
- 計算式:
RIPEMD160(SHA256(公開鍵)) - 理由:RIPEMD-160 は 20 バイト(160 ビット)のハッシュを生成します。これは SHA-256(32 バイト)よりも短いです。これにより、アドレス識別としてのセキュリティレベルを維持しながら、UTXO セットやブロックチェーン上の重要なスペースを節約できます。
2. Ethereum の Keccak-256:「真の」SHA-3
Ethereum は、主要なハッシュ関数として Keccak-256 を選択しました。Keccak-256 は NIST SHA-3 コンペティションの勝者ですが、最終的な FIPS 202 SHA-3-256 標準と完全に同じではないため、しばしば混乱の元となります。
Keccak-256 vs. NIST SHA-3-256
標準化プロセスの過程で、NIST は Keccak のパディング(埋め込み)に軽微な変更を加えました。
- Keccak-256:パディング
0x01を使用。 - NIST SHA-3-256:パディング
0x06を使用。
Ethereum は Keccak がまだ標準化プロセスにある間に構築されたため、オリジナルの Keccak-256 を使用しています。これは、標準の SHA-3-256 ハッシュジェネレーターが Keccak-256 ハッシュジェネレーターとは異なる結果を生成することを意味します。Ethereum 開発者にとって、関数シグネチャやマークルルートを計算するために正しいバージョンを使用することは不可欠です。
3. secp256k1 曲線と ECDSA 署名
Bitcoin と Ethereum はどちらも、トランザクションの署名に楕円曲線デジタル署名アルゴリズム (ECDSA) を使用しており、具体的には secp256k1 曲線を使用しています。
なぜ secp256k1 なのか?
ほとんどの Web 標準(TLS など)は NIST 曲線(P-256 など)を使用していますが、ブロックチェーンコミュニティは secp256k1 を好みます。
- Koblitz 曲線:これは「Koblitz」曲線であり、非 Koblitz 曲線よりも効率的な計算(スカラー倍算)が可能です。
- 「バックドア」がない:NIST 曲線は、そのパラメータの選択方法により、隠された「バックドア」が含まれている可能性があるという懸念があります。secp256k1 のパラメータは、より透明性が高く決定論的な方法で選択されました。
トランザクションに署名するとき、秘密鍵と ECDSA を使用して署名 $(r, s)$ を生成します。ネットワークは secp256k1 曲線とあなたの公開鍵を使用して、署名が有効であることを検証します。
4. マークルツリーとマークルルート
マークルツリー(Merkle Tree、またはハッシュツリー)は、大規模なデータセットの整合性を効率的に要約し、検証するために使用される構造です。
仕組み
- 葉(Leaves):ブロック内の各トランザクションがハッシュ化されます。
- ノード:ハッシュがペアにされ、再帰的にハッシュ化されます。
- ルート(Root):頂点にある最終的な単一のハッシュが**マークルルート(Merkle Root)**です。
ブロックヘッダー内のマークルルート
マークルルートはブロックヘッダーに含まれます。1つのトランザクションの1ビットでも変更されると、マークルツリー全体が変化し、異なるマークルルートになります。これにより、「簡易支払い検証」(SPV)クライアントは、ブロックチェーン全体をダウンロードすることなく、トランザクションがブロックの一部であることを検証できます。
マークルツリー計算機は、ブロックヘッダーの検証やトランザクションの包含証明に不可欠です。
5. 比較:ハッシュおよび署名アルゴリズム
| プロトコル | 主要ハッシュ | 署名曲線 | アドレスハッシュ |
|---|---|---|---|
| Bitcoin | SHA-256d | secp256k1 | HASH160 |
| Ethereum | Keccak-256 | secp256k1 | Keccak-256 (最後の 20 バイト) |
| Solana | SHA-256 | Ed25519 | Base58 公開鍵 |
| Polkadot | Blake2b | Ed25519/sr25519 | SS58 |
FAQ:ブロックチェーン暗号技術
Q: Keccak-256 は SHA-256 よりも安全ですか?
A: どちらも暗号学的に安全であると考えられています。Keccak(スポンジ構造)は本質的に長さ拡張攻撃に対して耐性がありますが、SHA-256(Merkle-Damgård 構造)は同様の耐性を得るために「ダブルハッシュ」の手法を必要とします。
Q: なぜすべてに Ed25519 を使用しないのですか?
A: Ed25519 は ECDSA/secp256k1 よりも高速で安全です。しかし、Bitcoin と Ethereum が作成された当時、Ed25519 は比較的新しく、ECDSA ほどハードウェアでの検証やサポートが進んでいませんでした。Solana や Cardano などの新しいチェーンは Ed25519 を使用しています。
Q: 「衝突(Collision)」とは何ですか?
A: 衝突とは、2つの異なる入力が同じハッシュ出力を生成することです。Keccak-256 や SHA-256 の場合、現在の技術で衝突を見つけることは計算上不可能です。
Q: トランザクションハッシュはどのように計算されますか?
A: 通常、シリアル化されたトランザクションデータをハッシュ化することによって行われます。Bitcoin では SHA256d(tx_data)、Ethereum では Keccak256(rlp_encoded_tx) です。
結論
ブロックチェーン暗号技術は、高いセキュリティ、効率性、および透明性のために慎重に選択されたアルゴリズムの集まりです。secp256k1 の効率性から Keccak-256 独自のスポンジ構造まで、これらのプリミティブが分散型の信頼を可能にしています。この分野で働く開発者にとって、これらの基礎を理解することは単なる学問的な練習ではなく、安全で互換性のある分散型アプリケーションを構築するための鍵となります。