ビットコインとは何か? 第3回:ビットコインの仕組み(アドレスの作成から送金まで)

実際にアドレスの作成から送金までの流れを追い、ビットコインの仕組みについて見ていきます。ビットコインのウォレットソフト・アプリではこのような作業を自動的に実行し、仕組みを知らなくても誰でも簡単に使えるようになっています。

前提知識

公開鍵暗号とデジタル署名

このページでは、公開鍵暗号デジタル署名という前提知識を持っていると理解が早くなります。これらは、インターネットのセキュリティ技術の基本的知識のため、多くの日本語の解説サイトがあります。詳細は、リンク先やその他サイト等も参照してください。

ビットコインにおいては、公開鍵を変換したものがアドレスとなり、アドレスがつまり口座番号になります。アドレスは銀行の口座とは違いいくらでも簡単に作れるため、お金を受け取れる「メールアドレス」に例えられることもあります。公開鍵に対応するのが秘密鍵(プライベートキー)です。ビットコインの世界では大抵そのまま秘密鍵またはプライベートキーと呼ばれます。これは送金の際に使う暗証番号(パスワード)になります。

ビットコインを利用する上では、とりあえずアドレスは口座番号秘密鍵は暗証番号と覚えておけば十分でしょう。

秘密鍵とアドレスの作成

ここでは、実際に秘密鍵とアドレスを作成する流れを追ってみます。流れ的には秘密鍵→公開鍵→アドレスというかたちになります。

最初に作るのは秘密鍵です。秘密鍵の正体はランダム生成されたただの数字です。ビットコインの秘密鍵は256ビット(32バイト、16進数で64文字)で、1から2^256の範囲であればほぼすべての数字が秘密鍵として利用できます。最小の秘密鍵は「1」ですが、秘密鍵を処理する過程では16進数で表し、小さい数の場合には「000...0001」のように先頭に0を付加するため、64文字の固定長として扱われます。

ちなみに任意の文字列・データをハッシュ化することで元の長さに関係なく秘密鍵の基準である256ビットに合わせることもできます。このような方法で作ったウォレットは、秘密鍵を単純な覚えやすいパスワードとして暗記できるため、ブレインウォレット(脳内ウォレット)とも呼ばれますが、セキュリティが弱いためほとんど使われません。ここではランダムに生成した数字を秘密鍵として利用します。

取引の署名・検証等に使うため、ビットコインでは秘密鍵から公開鍵への変換はsecp256k1という楕円曲線を利用します(ECDSA)。ただし、説明には複雑な数学的説明が必要なためここでは省略します。

※本ページで作ったアドレス・秘密鍵は実際に使うことも可能ですが、セキュリティ上使用は止めてください

秘密鍵
secp256k1曲線変換
公開鍵(非圧縮公開鍵)
先頭の0x04の代わりにy座標(後半の32バイト)が偶数なら0x02、奇数なら0x03を付加
公開鍵(圧縮公開鍵、後半32バイトを省略)
SHA-256ハッシュ化
RIPEMD-160ハッシュ化+先頭に0x00
SHA-256ハッシュ化×2
先頭4バイト
チェックサム

※チェックサムはアドレスが正しい形式かどうか検証するための認証コードのようなものです。


チェックサムを後ろに付加
Base58エンコード
ビットコインアドレス

このように何回もハッシュを重ねたりすることによりビットコインのアドレスが作成されます。最後のBase58エンコードというのは人間が見ても分かりやすくするために、紛らわしいlと1,0とOを除外して短い文字列にする処理のことです。


秘密鍵(先頭に0x80、末尾に0x01を付加)
Base58エンコード等
秘密鍵(WIF)

ここでは詳細は省略しますが、秘密鍵も公開鍵と同様にチェックサムを生成・付加し、最終的にBase58エンコードを行うことにより、通常はWIF(Wallet Import Format, ウォレットインポート形式)というかたちに表します。文字通りウォレットにインポートする際はこの形式の秘密鍵を使用します。秘密鍵(WIF)は「K」や「L」からはじまります。

圧縮公開鍵と非圧縮公開鍵

公開鍵からアドレスへの最初の変換手順で見たように、公開鍵には圧縮公開鍵(compressed public key)と非圧縮公開鍵(uncompressed public key)があります。圧縮公開鍵は非圧縮公開鍵の短縮表現であり相互変換が可能です。非圧縮公開鍵はデータサイズが大きいだけでそのまま使うメリットがないため、使うことも可能ではありますが実際のウォレットでは使われていません。

参考までに、以下は同じ秘密鍵から非圧縮公開鍵を使って生成されるアドレスおよびWIFです。

公開鍵(非圧縮公開鍵)
アドレス変換
ビットコインアドレス

非圧縮公開鍵をそのまま使って変換すると、アドレスは同様に「1」から始まりますが圧縮公開鍵とは異なったものになります。


秘密鍵(先頭に0x80)
Base58エンコード等
秘密鍵(WIF)(非圧縮型)

秘密鍵のWIFへの変換過程では公開鍵は使われませんが、圧縮公開鍵を使ったアドレスに対応する秘密鍵と判別するために、生の秘密鍵の末尾に0x01を付加せずに同じ手順により変換して最終的な秘密鍵(WIF)は「5」から始まることになります。

アドレスの種類

ビットコインの黎明期は、上のように1からはじまるアドレスしかありませんでした。このようなアドレスはレガシー(Legacy)アドレスと呼ばれており、現在でもまだ一部で使われてはいます。

しかし、セキュリティの向上や取引処理能力の向上のための仕様変更その他機能拡張などに伴い、3やbc1などからはじまる新たなタイプのアドレスも登場しています。これらのアドレスでは細かい部分の生成方法が異なりますが、根本的には同じような流れで公開鍵→アドレスの変換が行われています。

取引の作成と送信・検証

ビットコインにおける取引(送金)について、重要な仕組み・仕様があります。

お釣りの図

上図はビットコインの取引(送金)データの構造を簡単に表したものです。取引データのことはトランザクションとも呼ばれます。ビットコインのトランザクションはInput(入力)とOutput(出力)から構成されており、送信額(input)と受信額(output)+取引手数料(トランザクションフィー、transaction fee)は必ず等しくなければなりません。

このため、例えば10BTCの残高があるうちの1BTCを送信したい場合、トランザクションとしては、1BTCを相手に送信し残りの9BTCは自分のアドレスに再度送信することになります。実際には取引手数料が必要であり、InputとOutputの差額が取引手数料として支払われます。

この仕様は「お釣り用アドレス(change address)」の仕組みを知るうえで重要です。上図のように、ビットコインのウォレットソフトのなかには、プライバシー保護のために毎回お釣り用アドレスを新規作成し、元のアドレスにいくら大量のビットコインがあったとしても、全てをお釣り用アドレスに送信し、元のアドレスの残高を空っぽにするという作業を行っているものが多くあります。もし元のアドレスから全額がなくなっていたとしても混乱しないようにしましょう。

このように最も一般的なトランザクションは、送信元である1つのinputと、送信先及びお釣りの2つのoutputから構成されています。当然、送信したい金額が足りなかったり複数アドレスから送信したければ二つ以上のinputになることもありますし、全額送信したければoutputが一つになったり、複数アドレスに送信したい場合はoutputが三つ以上になったりします。

ちなみに取引手数料というのは、取引が正しいものであることを検証してもらうのに第三者の取引承認者であるマイナー(採掘者)に払うものです。一般的に取引手数料が高いほど、早く取引が承認されると言われています。詳細は、第4回にて解説します。

UTXO(ビットコインの残高管理システム)

UTXO

先ほどはトランザクション単位で見てきましたが、今度はアドレス単位で見ていきましょう。

アドレスBに先ほどアドレスAから送った1BTCに加え、2BTC、3BTC、5BTCが送られているとします。さらにそこから1BTC+2BTCをまた別のアドレスに送ると、アドレスの残高は計8BTCになります。

1BTC、2BTC、3BTC、5BTCはトランザクション単位で見るとOutputとして設定されたものです。このときアドレスBにまだ残っている3BTCと5BTCのことをUTXOと呼びます。UTXOはUnspent Transaction Outputの略で未使用のトランザクションアウトプットと訳されます。

UTXOは、その後のトランザクションのInputとして使うことが出来ます。そして、Inputに使用したUTXO(1BTCと2BTC)はSTXO(Spent Transaction Output、使用済みのトランザクションアウトプット)になり、これ以上Inputに使用することはできず、残高にも算入されません。ビットコインのアドレスの残高は、ブロックチェーンに「アドレスBの残高は8BTC」と直接書き込まれているわけではなく、全てのUTXOの金額を集計することで算出されます。UTXOは、現実の財布の中の小銭や紙幣と同じコインそのものとも言えるでしょう。

UTXOの仕組みはビットコインの取引手数料を考える上で有用になります。手数料は取引データのサイズあたりの価格で比較されるので、取引データサイズが大きいほど必要手数料は高くなります。このため、Inputとして使用するUTXOの数が多ければ多いほど取引データに記載しなければならないデータ量が増え、取引手数料も増加するのです。

取引への署名と検証

普段ビットコインを使う上では以上の仕組みを知っていれば十分ですが、せっかくなので前半で作った秘密鍵と公開鍵を使って最後に取引に署名を行ってみます。

jsrsasignというライブラリを使用して実際に署名・検証を行っています。

秘密鍵: 公開鍵: 取引データ:

本当は取引データはもっと複雑な内容ですが、ここでは省略して簡単な文字列として表記しています。

署名済の取引データ:

これで署名済みの取引データが完成しました。ビットコインでは、この署名済みの取引データと公開鍵を元の取引データに組み込んで、ネットワークに向けて送信(ブロードキャスト)することによりビットコインの送金が完了します。

送信された取引データが正しいものかどうかは、先ほど組み込まれた署名済取引データと公開鍵を使うことにより検証が可能です。

検証結果:

そのまま検証ボタンをクリックすれば「有効な取引データです。」と表示されるはずです。しかし、取引データ欄の文字列を削除したり変更して改ざんすると「不正な取引データです。」と表示され、取引の改ざんができないことがわかります。

最終更新日: 2023年03月05日

コメント欄

コメントシステムを試験的に変更し、メールアドレスの入力やSNSからのログインを廃止しました。投稿後5分以内であれば編集や削除が可能です。その後に削除したいコメントがあれば依頼していただければこちらで削除いたします。

質問については出来る限りお答えしていますが、個人が運営している関係上対応の遅れや見逃し等限界もあるのでご了承ください。