実際にアドレスの作成から送金までの流れを追い、ビットコインの仕組みについて見ていきます。ビットコインのウォレットソフト・アプリではこのような作業を自動的に実行し、仕組みを知らなくても誰でも簡単に使えるようになっています。
このページでは、公開鍵暗号とデジタル署名という前提知識を持っていると理解が早くなります。これらは、インターネットのセキュリティ技術の基本的知識のため、多くの日本語の解説サイトがあります。詳細は、リンク先やその他サイト等も参照してください。
ビットコインにおいては、公開鍵を変換したものがアドレスとなり、アドレスがつまり口座番号になります。アドレスは銀行の口座とは違いいくらでも簡単に作れるため、お金を受け取れる「メールアドレス」に例えられることもあります。公開鍵に対応するのが秘密鍵(プライベートキー)です。ビットコインの世界では大抵そのまま秘密鍵またはプライベートキーと呼ばれます。これは送金の際に使う暗証番号(パスワード)になります。
ビットコインを利用する上では、とりあえずアドレスは口座番号、秘密鍵は暗証番号と覚えておけば十分でしょう。
ここでは、実際に秘密鍵とアドレスを作成する流れを追ってみます。流れ的には秘密鍵→公開鍵→アドレスというかたちになります。
最初に作るのは秘密鍵です。秘密鍵の正体はランダム生成されたただの数字です。ビットコインの秘密鍵は256ビット(32バイト、16進数で64文字)で、1から2^256の範囲であればほぼすべての数字が秘密鍵として利用できます。最小の秘密鍵は「1」ですが、秘密鍵を処理する過程では16進数で表し、小さい数の場合には「000...0001」のように先頭に0を付加するため、64文字の固定長として扱われます。
ちなみに任意の文字列・データをハッシュ化することで元の長さに関係なく秘密鍵の基準である256ビットに合わせることもできます。このような方法で作ったウォレットは、秘密鍵を単純な覚えやすいパスワードとして暗記できるため、ブレインウォレット(脳内ウォレット)とも呼ばれますが、セキュリティが弱いためほとんど使われません。ここではランダムに生成した数字を秘密鍵として利用します。
取引の署名・検証等に使うため、ビットコインでは秘密鍵から公開鍵への変換はsecp256k1という楕円曲線を利用します(ECDSA)。ただし、説明には複雑な数学的説明が必要なためここでは省略します。
※本ページで作ったアドレス・秘密鍵は実際に使うことも可能ですが、セキュリティ上使用は止めてください
ビットコインの黎明期は、上のように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回にて解説します。
先ほどはトランザクション単位で見てきましたが、今度はアドレス単位で見ていきましょう。
アドレス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分以内であれば編集や削除が可能です。その後に削除したいコメントがあれば依頼していただければこちらで削除いたします。
質問については出来る限りお答えしていますが、個人が運営している関係上対応の遅れや見逃し等限界もあるのでご了承ください。