概要
ビットコインは、仮想通貨の中でも最も広く認知され、利用されているデジタル通貨です。しかし、その技術的な裏側には多くの課題が存在しています。今回の記事では、ビットコインのトランザクション(取引)に焦点を当て、その構造と運用上の重要な課題について説明してみようと思います。今回は、前回の内容を復習しつつ、新たな技術的要素も掘り下げていきます。
公開鍵と秘密鍵の導出
前回の内容の復習
ビットコインのセキュリティは「公開鍵暗号」という仕組みで守られています。ここでは、秘密鍵と公開鍵という2つの鍵が使われます。秘密鍵は自分だけが知っている情報で、公開鍵は他の人に知られても問題ない情報です。秘密鍵を使って取引に署名し、公開鍵を使ってその署名が本物かどうか検証します。
アドレスの導出方法
ビットコインアドレスを作るには、まず公開鍵をSHA-256という方法でハッシュ(特殊な変換)し、その結果をさらにRIPEMD-160という方法で再ハッシュします。次に、この結果にネットワークバイトを追加し、再びSHA-256で2回ハッシュして、最初の4バイトをチェックサム(誤り検出用のデータ)として追加します。最後に、Base58という方法でエンコードしてビットコインアドレスが生成されます。
SHA-256とは?
SHA-256(Secure Hash Algorithm 256)は、電子署名に使われるハッシュ関数(要約関数)の一つです。 ビット長は256 ビット。 で、データの送信側と受信側でハッシュ値を比較することで、通信途中で原文が改ざんされていないかを検出することができます。
RIPEMD-160とは?
RIPEMD (RACE Integrity Primitives Evaluation Message Digest) は、1996年にルーヴェン・カトリック大学COSIC(英語版)のHans Dobbertin、Antoon Bosselaers、Bart Preneelによって開発された暗号学的ハッシュ関数である。RIPEMD-160は、オリジナルのRIPEMDでは128ビットであるハッシュ長を160ビットにしたうえで改良を加えたものであり、RIPEMDのファミリーの中で最も広く用いられている。
ネットワークバイトの追加とは?
ビットコインにおけるネットワークバイトは、アドレスがどのネットワークに属しているかを示す1バイトの識別子です。ビットコインには主に以下のネットワークが存在します:
- メインネット(Mainnet):実際のビットコインの取引が行われるネットワーク。ネットワークバイトは0x00です。
- テストネット(Testnet):開発やテストのために使用されるネットワーク。ネットワークバイトは0x6Fです。
ネットワークバイトを追加する目的は、生成されたアドレスがどのネットワーク用であるかを明確にするためです。メインネットのアドレスは通常「1」から始まり、テストネットのアドレスは「m」または「n」から始まります。
ベース58エンコーディング
ベース58エンコーディングは、ビットコインアドレスを表現するために使用されます。これは、特定の文字(例えば「0」や「O」、「l」や「I」など)が含まれておらず、間違えて入力することを防ぐためです。この方法により、ユーザーはアドレスを正確に入力しやすくなります。
ベース58エンコーディングの例
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
以下の文字が除外されています
0 (ゼロ)
O (大文字のオー)
I (大文字のアイ)
l (小文字のエル)
これらの文字は形が似ているため、視覚的な混乱を避けるために除外されています。
使われる理由
主にビットコインのアドレスや秘密鍵のエンコードに使用されます。ビットコインアドレスでは、エンコードされた文字列の一部が変更されると誤送金のリスクがあるため、ベース58の採用で誤解や入力ミスを減らすことが目的です。
エンコーディングの仕組み
バイナリデータのエンコーディング
元のデータ(通常はバイト列)を58進数に変換します。例えば、SHA-256などのハッシュ関数を使って得られたバイト列をベース58でエンコードします。
チェックサムの追加
ビットコインアドレスのエンコーディングには、データの最後に4バイトのチェックサムが追加されます。このチェックサムは、元データのSHA-256ハッシュから得られます。チェックサムを追加することで、誤入力やデータの転写ミスを検出しやすくします。
エンコード例
例えば、任意のバイト列が以下のようなバイト列であったとします
[0x01, 0x02, 0x03, 0x04]
これをベース58でエンコードすると、対応する文字列に変換されます。この際、各バイトは58進数の文字にマッピングされます。
デコードの仕組み
テキストデータのデコード
ベース58でエンコードされた文字列を受け取り、それを58進数として扱い、対応するバイナリデータに変換します。
デコード後、チェックサムを検証し、正しいデータであることを確認します。チェックサムが一致しない場合、データが改ざんされているか誤入力があったと判断されます。
ベース58エンコーディングのまとめ
ベース58エンコーディングは、視覚的に混乱しやすい文字を避けるために特定の文字を除外して、ビットコインのアドレスや秘密鍵などをエンコードする方法です。これによって、エンコードされたデータを見やすくし、誤入力のリスクを減らすことができます。また、チェックサムを使ってデータが正しいかどうか確認することができ、誤入力やデータの改ざんを見つけやすくしています。
ウォレットの構造
アドレス生成と管理
ウォレットはビットコインアドレスを生成し、それを管理するためのツールです。ウォレットは、秘密鍵と公開鍵のペアを作り、これをもとにアドレスを生成します。
ウォレットのフォーマットとベース58チェックエンコード
ビットコインウォレットは、一般的にBIP-32やBIP-44という規格に従います。これらの規格は、階層的決定性(HD)ウォレットと呼ばれ、親鍵から子鍵を作ることができます。アドレスを作る際には、ベース58チェックエンコードが使われ、これによりユーザーが簡単にアドレスを使用できるようになります。
トランザクションの仕組み
トランザクションのライフサイクル
ビットコイントランザクションは、送信者から受信者へビットコインを送る過程です。トランザクションデータには、送信者と受信者のアドレス、送金額、手数料などが含まれます。
No. | トランザクション | 内容 |
---|---|---|
1 | 生成 | ユーザーがビットコインウォレットを使用して新しいトランザクションを作成します。送信先アドレス、送信額、および手数料を指定します。 |
2 | 署名 | ウォレットが秘密鍵を使用してトランザクションにデジタル署名を行います。 |
3 | ブロードキャスト | 署名されたトランザクションがビットコインネットワークにブロードキャストされます。 |
4 | 検証 | ネットワーク内のノードがトランザクションを受信し、その有効性を検証します。 |
5 | メモリプールへの追加 | 有効なトランザクションがメモリプール(mempool)に追加され、次のブロックに含められるのを待ちます。 |
6 | マイナーによる選択 | マイナーがトランザクションを選択し、新しいブロックに含めるための候補にします。 |
7 | ブロックの生成 | マイナーがトランザクションを含む新しいブロックを生成し、ハッシュパズルを解きます。 |
8 | ブロックのブロードキャスト | 生成されたブロックがネットワークにブロードキャストされます。 |
9 | ブロックの検証と追加 | 他のノードがブロックの有効性を検証し、ブロックチェーンに追加します。 |
10 | トランザクションの確認 | トランザクションが含まれるブロックがチェーンに追加され、複数の確認(confirmations)を受けるまで待ちます。 |
コンピュータネットワーク、電気通信、情報理論において、ブロードキャストとは、同じメッセージを複数の受信者に同時に転送することである。
トランザクションのライフサイクルの手順
UTXOの概念
UTXO(未使用のトランザクション出力)は、トランザクションの出力で、まだ使われていないものを指します。新しいトランザクションは、以前のUTXOを入力として使用し、新しいUTXOを生成します。
ロッキングスクリプトとアンロッキングスクリプト
ロッキングスクリプトは、ビットコインを受け取るための条件を定義するスクリプトです。アンロッキングスクリプトは、ビットコインを使うために必要な条件を満たすスクリプトです。これらのスクリプトにより、トランザクションの整合性が保たれます。
ニーモニックコードとシード値
ニーモニックコードは、ランダムな12~24個の単語を使用してシード値を生成します。これにより、秘密鍵を安全に保管し、バックアップすることが可能です。
ニーモニックコード
ニーモニックコード(mnemonic code)は、ウォレットの秘密鍵を覚えやすいようにするために使われる一連の単語です。通常、12、15、18、21、または24個の単語から構成されます。これらの単語は、人間が覚えやすく入力しやすいように設計されています。
例えば、次のような単語のリストです。
apple banana cherry date elephant fig grape honey ice kiwi lemon mango
ニーモニックコードは、ウォレットのバックアップとして使われます。ウォレットを復元する必要がある場合、この単語リストを入力することで、同じ秘密鍵とアドレスを再生成することができます。
例)MetaMusk, Phantomなどのウォレットのバックアップに使われています。
シード値
シード値(seed value)は、ニーモニックコードから生成されるランダムな数値です。このシード値は、ウォレット内の全ての秘密鍵を生成するための基本となる数値です。シード値があれば、ウォレット内の全てのアカウントやアドレスを再現することができます。
シード値は非常に重要であり、失われたり盗まれたりすると、ウォレット内の全ての資産が危険にさらされる可能性があります。
シード値からの鍵生成
シード値は、HDウォレットの親鍵を生成するために使用されます。親鍵からは、複数の秘密鍵が生成され、それぞれが異なるビットコインアドレスに対応します。
まとめ
ニーモニックコードは、一連の覚えやすい単語で、ウォレットの秘密鍵をバックアップするために使われます。
シード値は、ニーモニックコードから生成されるランダムな数値で、ウォレットの秘密鍵を生成するための基礎となります。
HDウォレットの階層構造
HDウォレットは、親鍵から子鍵、孫鍵を生成する階層構造を持っています。これにより、一つのシード値から複数の鍵を安全に管理でき、複数のアドレスを効率的に利用することが可能です。
階層構造 | 内容 |
---|---|
マスターキー | シードフレーズから生成される最初のキー。 |
アカウントレベル | 異なるアカウントを区別するための階層。 |
チェーンレベル | 外部チェーンと内部チェーン(お釣り用アドレス)の区別。 |
アドレスインデックス | 各チェーン内で個別のアドレスを生成するためのインデックス。 |
結論
ビットコインの技術と運用には、トランザクションのサイズと手数料、マルチシグネチャの複雑さ、手数料設定の自由度、トランザクションデータ形式の理解、マークルツリーの複雑さなど、いくつかの課題が存在します。これらの問題を理解し、適切に対処することで、ビットコインの普及と利便性を高めることができます。
おわりに
ビットコインのトランザクションに関する理解は、仮想通貨の利用を進める上で非常に重要です。今回の講義で学んだ知識を活かして、今後の取引に役立ててください。次回は、ビットコインのセキュリティについてさらに深く掘り下げていきます。
参考文献
コメント